curl源码测试脚本中的任意文件删除漏洞解析

本文详细分析了curl源码测试脚本中因未验证输入路径而导致的任意文件删除漏洞,包括漏洞复现步骤、相关CWE分类及项目团队的回应,尽管最终被评估为不适用,但仍具有重要的安全警示意义。

curl源码测试脚本中的任意文件删除漏洞

摘要

curl源码的测试脚本中存在使用os.unlink()函数删除文件时未验证输入文件路径的情况。当这些脚本在恶意或受操纵的输入下执行时,可能引发任意文件删除风险。尽管漏洞存在于测试脚本中,但如果这些脚本在共享或自动化环境中使用,可能导致意外后果。

漏洞复现步骤

  1. 克隆curl仓库:https://github.com/curl/curl.git
  2. 进入tests目录。
  3. 识别受影响的脚本:
    • tests/negtelnetserver.py(第366行)
    • tests/dictserver.py(第183行)
    • tests/smbserver.py(第96、450行)
  4. 模拟恶意输入:
    • 识别受影响代码中的特定脚本和输入选项(例如options.pidfile)。
    • 修改options.pidfile或相关变量,指向敏感系统文件(例如/etc/passwd)。
    • 触发脚本,导致指定文件被删除。 例如,在negtelnetserver.py中:
    1
    2
    3
    4
    5
    
    # 原始代码:
    os.unlink(options.pidfile)
    # 恶意输入模拟:
    options.pidfile = "/etc/passwd"   # 替换为关键或敏感文件
    os.unlink(options.pidfile)
    
  5. 运行漏洞脚本: 修改输入后执行脚本:
    1
    
    python3 negtelnetserver.py
    
  6. 观察结果: 脚本执行后,将删除指定文件。

支持材料/参考

  • CWE-20:不当的输入验证 示例:允许用户控制options.pidfile的值,而未确保它们引用允许目录中的有效文件。
  • CWE-22:路径名限制不当(路径遍历) 示例:攻击者提供类似../../../etc/passwd的路径进行删除。
  • CWE-732:关键资源权限分配不正确 示例:允许os.unlink()在敏感文件上执行。
  • CWE-552:外部可访问的文件或目录 示例:允许外部方将options.pidfile设置为敏感文件路径。
  • CWE-610:对外部领域资源的受控引用 示例:允许攻击者指定任意文件路径进行删除。

影响

传递给os.unlink()的未验证文件路径可能允许攻击者:

  • 删除任意文件,可能导致系统不稳定或停机。
  • 针对关键系统文件进行删除(例如日志、配置文件)。
  • 通过删除属于其他用户的文件影响多用户系统。

项目团队回应

  • dfandrich(curl工作人员) 评论于2024年11月25日15:28 UTC: “我不理解这个漏洞。在这些实例中删除的文件是由脚本自己创建的。‘恶意输入模拟’如何模拟攻击者可能做的事情?pidfile位置由测试工具提供,这些工具提供了已知的有效位置。”

  • bagder(curl工作人员) 于2024年11月25日15:53 UTC关闭报告并将状态更改为“不适用”: “测试服务器仅用于curl测试,从不用于其他服务。因此这不是安全问题。”

  • bagder(curl工作人员) 于2025年7月6日21:18 UTC请求披露此报告: “根据项目的透明度政策,我们希望所有报告都被披露并公开。”

  • bagder(curl工作人员) 于2025年7月7日10:17 UTC披露此报告。

报告详情

  • 报告时间:2024年11月25日11:43 UTC
  • 报告者:aadityaathehacker
  • 报告对象:curl
  • 报告ID:#2864414
  • 严重性:高(7 ~ 8.9)
  • 披露时间:2025年7月7日10:17 UTC
  • 弱点:不当的输入验证
  • CVE ID:无
  • 赏金:隐藏
  • 账户详情:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计