curl库schannel.c中TLS数据传输的整数溢出漏洞分析
Integer Overflow in schannel.c TLS Data Transmission
漏洞摘要
该漏洞允许在加密数据传输过程中添加TLS缓冲区大小时发生整数溢出,导致发送错误的数据大小并引发TLS安全问题。在Windows 10测试环境中,Windows的Schannel会拒绝构造的畸形TLS握手(SEC_E_INVALID_TOKEN)。
漏洞代码位置
./lib/vtls/schannel.c
:
/* send the encrypted message including header, data and trailer */
len = outbuf[0].cbBuffer + outbuf[1].cbBuffer + outbuf[2].cbBuffer;
漏洞详情
curl在TLS连接建立后的数据传输阶段(非握手阶段)将三个缓冲区相加:outbuf0、outbuf1和outbuf2。在32位编译环境下,如果这些缓冲区足够大,加法运算可能发生整数溢出,导致len值变小。
这可能引发:
- 错误的数据传输大小
- TLS协议违规
- 内存安全问题
- 最坏情况下可能导致安全绕过(如果溢出导致curl发送的数据少于预期)
验证方法
使用附件的概念验证(PoC)恶意HTTP服务器进行测试,任何使用curl连接该恶意服务器的Windows用户都会受影响。
PoC服务器日志示例
=== Schannel Vulnerability PoC Server (Windows) ===
[*] Malicious server listening on port 4433
[*] Test with: curl -k https://localhost:4433
[*] Client connected
[*] Received 1815 bytes (ClientHello)
[*] Sending malicious TLS record...
[*] Sent malicious TLS records
[*] Connection closed
数学验证PoC
size_t len = outbuf[0].cbBuffer + outbuf[1].cbBuffer + outbuf[2].cbBuffer;
// 当cbBuffer值足够大时,32位系统会发生整数溢出
影响版本
- 8.15.0: release
- 8.16.0: dev
潜在影响
攻击者可实现认证绕过(如果凭据通过TLS传输),或通过操纵TLS握手触发大缓冲区大小导致溢出,造成DoS攻击。实际利用需要控制或入侵TLS服务器,并绕过Windows的Schannel验证。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码