curl库在旧版Apple系统中的证书验证漏洞分析

本文详细分析了curl库在启用USE_APPLE_SECTRUST编译选项时,在macOS 10.14和iOS 12之前的系统中存在的证书验证漏洞,该漏洞会导致系统接受不受信任的证书,存在中间人攻击风险。

curl库在旧版Apple系统中的证书验证漏洞

漏洞概述

当libcurl使用USE_APPLE_SECTRUST选项编译,并在缺乏SecTrustEvaluateWithError功能的Apple操作系统版本(macOS <10.14 / iOS <12)上运行时,传统的验证路径会错误地将OSStatusSecTrustResultType进行比较,而从未检查SecTrust结果。这可能导致系统接受不受信任的证书。

受影响版本

在当前主分支(截至2025年10月7日)上重现。影响启用USE_APPLE_SECTRUST并在macOS <10.14 / iOS <12上运行的构建。该缺陷位于lib/vtls/apple.c中,与TLS后端选择无关(当使用原生CA存储时,通过OpenSSL或GnuTLS可达)。

复现步骤

代码验证(任何现代macOS):

  1. 检查lib/vtls/apple.c第263-275行的易受攻击代码
  2. 观察类型混淆:status(OSStatus)与kSecTrustResultType枚举值进行比较
  3. 创建测试程序演示逻辑错误
  4. 创建不受信任的证书并验证系统curl是否拒绝它

运行时利用(需要macOS <10.14或iOS <12):

在运行macOS 10.13.6(High Sierra)或更早版本的系统上构建curl:

1
2
cmake -DUSE_APPLE_SECTRUST=ON -DCURL_USE_OPENSSL=ON \
      -DCMAKE_BUILD_TYPE=Release .

创建不受信任的证书,启动测试服务器:

1
openssl s_server -accept 8443 -www -key leaf.key -cert leaf.pem

测试连接:

1
./src/curl -v https://localhost:8443/

预期安全行为:连接被拒绝 实际错误行为:连接成功

问题代码分析

有问题的传统回退代码使用SecTrustEvaluate,将status与SecTrustResultType进行比较,而不是检查sec_result

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#ifndef REQUIRES_SecTrustEvaluateWithError
SecTrustResultType sec_result;
status = SecTrustEvaluate(trust, &sec_result);

if(status != noErr) {
  failf(data, "Apple SecTrust verification failed: error %i", (int)status);
}
else if((status == kSecTrustResultUnspecified) ||
        (status == kSecTrustResultProceed)) {
  /* "unspecified" means system-trusted with no explicit user setting */
  result = CURLE_OK;
}
#endif /* REQUIRES_SecTrustEvaluateWithError */

正确的现代代码路径(仅在10.14+/iOS 12+上可用):

1
2
result = SecTrustEvaluateWithError(trust, &error) ?
         CURLE_OK : CURLE_PEER_FAILED_VERIFICATION;

影响分析

在受影响的配置(使用USE_APPLE_SECTRUST构建,在10.14之前的Apple OS上运行,并启用原生CA验证)下,攻击者可以绕过TLS证书验证。这使得中间人拦截成为可能,危及HTTPS和其他TLS保护传输的机密性和完整性。

范围注意事项:

  • 该功能在编译时受控(USE_APPLE_SECTRUST),在CMake中默认关闭
  • 运行时可达性取决于后端条件
  • 该错误仅影响缺乏SecTrustEvaluateWithError的较旧Apple OS版本;现代Apple OS使用正确的代码路径

项目响应

curl开发团队确认此代码尚未在任何发布版本中发布,因此不将其视为安全问题,而是作为"普通错误"处理。根据项目的透明政策,该报告已被公开披露。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计