漏洞概述
在cURL的krb5_read_data()
函数中发现两个关键问题:
问题一:整数溢出导致缓冲区越界读取
|
|
当len
值经过网络字节序转换后变为负数时,会绕过长度检查。后续代码:
|
|
如果len
为-1,nread
将被转换为(size_t)-1
(极大的数值),最终传递给recv()
函数,导致越界读取。
问题二:解码逻辑错误
代码中的do-while循环在len
非零时持续执行,但循环结束后将len=0
传递给decode()
函数,而正确的参数应该是curlx_dyn_len(&buf->buf)
。
影响版本
自该功能引入以来的所有cURL版本。
复现步骤
服务端代码(repro_server.py)
|
|
客户端测试代码
完整的测试代码模拟了漏洞触发条件,演示了内存分配失败和内核限制导致的错误。
漏洞利用性分析
虽然存在缓冲区溢出,但由于内核对recv()
调用的大小限制,实际利用可能受限。测试显示系统会返回"Bad address"错误。
修复方案
开发团队提供了修复补丁,主要改动包括:
- 将
len
类型从int
改为uint32_t
- 修复解码函数的参数传递
- 完善类型转换和边界检查
最终处理决策
cURL团队决定不将此问题归类为安全漏洞,主要原因是:
- 存在漏洞的代码自8.8.0版本起已因解码bug而无法正常工作
- 没有证据表明该功能被实际使用
- 计划完全移除Kerberos FTP支持以彻底解决问题
时间线
- 2025-09-16:漏洞报告提交
- 2025-09-18:报告公开披露
- 状态:Informative(信息性),非安全漏洞