curl源代码中通过os.unlink()实现的任意文件删除漏洞
漏洞摘要
curl源代码的测试脚本中存在使用os.unlink()函数删除文件时未验证输入文件路径的情况。当这些脚本在恶意或操纵的输入下执行时,可能引发任意文件删除风险。尽管该漏洞存在于测试脚本中,但如果这些脚本在共享或自动化环境中使用,仍可能导致意外后果。
复现步骤
-
克隆curl仓库:
git clone https://github.com/curl/curl.git
-
进入tests目录
-
识别受影响脚本:
- tests/negtelnetserver.py (第366行)
- tests/dictserver.py (第183行)
- tests/smbserver.py (第96、450行)
-
模拟恶意输入:
- 识别受影响代码中的特定脚本和输入选项(如options.pidfile)
- 修改options.pidfile或相关变量指向敏感系统文件(如/etc/passwd)
- 触发脚本导致指定文件被删除
示例(negtelnetserver.py):
|
|
-
运行漏洞脚本:执行修改输入后的脚本
1
python3 negtelnetserver.py
-
观察结果:脚本执行导致指定文件被删除
相关CWE分类
-
CWE-20: 输入验证不当 示例:允许用户控制options.pidfile的值,但未确保其指向允许目录中的有效文件
-
CWE-22: 路径名限制不当(路径遍历) 示例:攻击者提供类似../../../etc/passwd的路径进行删除
-
CWE-732: 关键资源权限分配错误 示例:允许os.unlink()在敏感文件上执行
-
CWE-552: 外部可访问的文件或目录 示例:允许外部方将options.pidfile设置为敏感文件路径
-
CWE-610: 外部控制的跨域资源引用 示例:允许攻击者指定任意文件路径进行删除
影响
传递给os.unlink()的未验证文件路径可能允许攻击者:
- 删除任意文件,可能导致系统不稳定或停机
- 针对关键系统文件进行删除(如日志、配置文件)
- 在多用户系统中删除属于其他用户的文件
项目方回应
dfandrich (curl staff) 评论: “我不理解这个漏洞。在这些实例中删除的文件是由脚本自身创建的。‘恶意输入模拟’如何模拟攻击者可能做的事情?pidfile位置由测试框架提供,该框架提供已知有效的位置。”
bagder (curl staff) 关闭报告并将状态改为"不适用": “测试服务器仅用于curl测试,从不用于其他服务。因此这不是安全问题。”
报告详情
- 报告时间: 2024年11月25日 11:43 UTC
- 报告者: aadityaathehacker
- 报告对象: curl
- 报告ID: #2864414
- 严重性: 高 (7 ~ 8.9)
- 披露时间: 2025年7月7日 10:17 UTC
- 弱点类型: 输入验证不当
- CVE ID: 无
- 赏金: 隐藏