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

本文详细分析了curl源代码测试脚本中存在的任意文件删除漏洞,通过os.unlink()函数未验证输入文件路径导致的安全风险,包含复现步骤和相关CWE分类说明。

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

漏洞概述

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

复现步骤

  1. 使用 https://github.com/curl/curl.git 克隆curl仓库

  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
    6
    
    # 原始代码:
    os.unlink(options.pidfile)
    
    # 恶意输入模拟:
    options.pidfile = "/etc/passwd"   # 替换为关键或敏感文件
    os.unlink(options.pidfile)
    
  5. 运行漏洞脚本:

    • 修改输入后执行脚本
    • python3 negtelnetserver.py
  6. 观察结果:

    • 脚本执行时会导致指定文件被删除

相关CWE分类

  • CWE-20: 输入验证不当 示例:允许用户控制options.pidfile的值,而不确保它们引用允许目录中的有效文件

  • CWE-22: 路径名限制不当到受限目录(路径遍历) 示例:攻击者提供类似../../../etc/passwd的路径进行删除

  • CWE-732: 关键资源权限分配错误 示例:允许os.unlink()在敏感文件上执行

  • CWE-552: 外部方可访问的文件或目录 示例:允许外部方将options.pidfile设置为敏感文件路径

  • CWE-610: 对外部领域资源的受控引用 示例:允许攻击者指定任意文件路径进行删除

影响

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

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

项目方回应

dfandrich (curl工作人员) 评论:

我不理解这个漏洞。在这些实例中删除的文件是由脚本自己创建的文件。“恶意输入模拟"如何模拟攻击者能做的事情?pidfile位置由测试框架提供,该框架提供已知有效的位置。

bagder (curl工作人员) 关闭报告并将状态改为"不适用”:

测试服务器仅用于curl测试,从不用于其他服务。因此这不是安全问题。

bagder (curl工作人员) 请求披露此报告:

根据项目的透明度政策,我们希望所有报告都被披露并公开。

报告详情

  • 报告时间: 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 设计