curl库在旧版Apple系统中的证书验证漏洞
漏洞概述
当libcurl使用USE_APPLE_SECTRUST选项编译,并在缺乏SecTrustEvaluateWithError功能的Apple操作系统版本(macOS <10.14 / iOS <12)上运行时,传统的验证路径会错误地将OSStatus与SecTrustResultType进行比较,而从未检查SecTrust结果。这可能导致系统接受不受信任的证书。
受影响版本
在当前主分支(截至2025年10月7日)上重现。影响启用USE_APPLE_SECTRUST并在macOS <10.14 / iOS <12上运行的构建。该缺陷位于lib/vtls/apple.c中,与TLS后端选择无关(当使用原生CA存储时,通过OpenSSL或GnuTLS可达)。
复现步骤
代码验证(任何现代macOS):
- 检查
lib/vtls/apple.c第263-275行的易受攻击代码 - 观察类型混淆:status(OSStatus)与kSecTrustResultType枚举值进行比较
- 创建测试程序演示逻辑错误
- 创建不受信任的证书并验证系统curl是否拒绝它
运行时利用(需要macOS <10.14或iOS <12):
在运行macOS 10.13.6(High Sierra)或更早版本的系统上构建curl:
|
|
创建不受信任的证书,启动测试服务器:
|
|
测试连接:
|
|
预期安全行为:连接被拒绝 实际错误行为:连接成功
问题代码分析
有问题的传统回退代码使用SecTrustEvaluate,将status与SecTrustResultType进行比较,而不是检查sec_result:
|
|
正确的现代代码路径(仅在10.14+/iOS 12+上可用):
|
|
影响分析
在受影响的配置(使用USE_APPLE_SECTRUST构建,在10.14之前的Apple OS上运行,并启用原生CA验证)下,攻击者可以绕过TLS证书验证。这使得中间人拦截成为可能,危及HTTPS和其他TLS保护传输的机密性和完整性。
范围注意事项:
- 该功能在编译时受控(
USE_APPLE_SECTRUST),在CMake中默认关闭 - 运行时可达性取决于后端条件
- 该错误仅影响缺乏
SecTrustEvaluateWithError的较旧Apple OS版本;现代Apple OS使用正确的代码路径
项目响应
curl开发团队确认此代码尚未在任何发布版本中发布,因此不将其视为安全问题,而是作为"普通错误"处理。根据项目的透明政策,该报告已被公开披露。