OS400 Shell脚本中的全局IFS不安全修改导致命令注入与解析缺陷(CWE-78/CWE-20)

本文详细分析了curl项目中OS400初始化脚本存在的全局IFS变量修改漏洞,该漏洞可能导致命令注入和解析错误,影响自动化构建流程和系统安全,并提供了复现步骤与修复方案。

不安全全局IFS修改在OS400 Shell脚本中导致命令注入与解析缺陷(CWE-78/CWE-20)

在curl源代码仓库中,OS400初始化脚本(packages/OS400/make-incs.sh)修改了全局shell变量IFS(内部字段分隔符),而未进行局部作用域限制或恢复。这种模式使得用户和CI/CD系统在环境或调用者受到攻击者控制或不可信时,面临意外的解析、命令注入和逻辑错误风险。以这种方式改变进程范围环境变量的shell脚本容易受到权限提升和不可预测执行的影响,特别是在涉及用户输入或自动化工具的情况下。

该问题及其报告是在AI安全代理的协助下识别和编译的,以确保彻底的技术审查和复现。

受影响版本

在curl主分支(截至2025年8月)确认存在,并出现在所有当前/活跃的类Unix系统版本中,其中执行了OS400构建脚本。示例版本: curl 8.1.2 (x86_64-pc-linux-gnu) libcurl/8.1.2 OpenSSL/3.0.7 zlib/1.2.13 brotli/1.0.9 zstd/1.5.2 libidn2/2.3.4 nghttp2/1.51.0

平台:Linux/macOS/AIX/OS400

复现步骤

  1. 克隆或下载curl GitHub仓库。
  2. 打开packages/OS400/make-incs.sh并使用以下命令搜索IFS的出现:
    1
    
    grep -n IFS packages/OS400/make-incs.sh
    
  3. 观察全局重新分配IFS的行(例如IFS="$IFS,"),未进行作用域限制或恢复其先前值。
  4. 审查脚本逻辑,确认IFS未包含在子shell或临时赋值中,从而实现持久的全局效果。
  5. 与Semgrep/静态分析规则交叉参考,检查shell注入/不安全IFS使用。

支持材料/参考

  • 文件:packages/OS400/make-incs.sh(任何操作IFS的行)
  • Semgrep/静态分析结果,突出显示shell脚本中IFS的不当使用
  • curl/curl GitHub仓库
  • (如果可用,附上扫描日志/截图)

缓解计划

  1. 审计所有修改IFS的脚本位置: 使用grep -n IFS packages/OS400/make-incs.sh识别不安全或全局IFS赋值。
  2. 对IFS更改应用局部作用域和恢复:
    • 将IFS修改限制在最小可能的作用域内——理想情况下,在循环或子shell中声明,而不是在脚本全局级别。
    • 使用内联赋值,例如while IFS=, read ...; do ...; done
    • 或者,始终在更改前保存原始IFS值,并在之后立即恢复:
      1
      2
      3
      4
      
      old_IFS="$IFS"
      IFS=,
      # ... 使用新IFS的命令 ...
      IFS="$old_IFS"
      
  3. 在CI/CD中集成静态分析: 在CI流水线中添加Semgrep或ShellCheck规则,以在合并前自动检测和阻止不安全的全局变量操作和shell注入模式。
  4. 记录安全的shell脚本和输入解析实践: 为贡献者添加清晰的开发指南,突出全局变量更改的风险和安全解析的最佳实践。
  5. 审查和测试: 重构后,在所有支持的环境中测试所有受影响的脚本,确保没有功能回归,并且环境状态始终可预测。

实施这些步骤将防止命令注入、解析错误和意外副作用——大大提升curl项目中脚本的安全态势和稳定性。

影响

摘要: 在共享或多用户shell环境中全局操作IFS变量可能导致:

  • 攻击者利用解析逻辑进行命令注入、权限提升或意外代码执行。
  • 通过引入解析错误或不可预测的脚本行为破坏自动化和CI/CD工作流。
  • 破坏任何共享shell会话的脚本、进程或用户的预期环境安全。
  • 在某些情况下,导致在自动化构建管道或开发人员系统中的横向移动。

严重性通常为,因为在CI和脚本上下文中风险升高,特别是如果处理了不可信输入。最相关的CWE是CWE-78:OS命令中使用的特殊元素的不当中和(‘OS命令注入’)和CWE-20:不当输入验证。

时间线

  • 7小时前:spectre-1向curl提交报告。
  • 7小时前:bagder(curl工作人员)关闭报告并将状态更改为“不适用”,评论:“这只是一个构建脚本。不是安全问题。”
  • 7小时前:bagder请求披露此报告,评论:“根据项目透明政策,我们希望所有报告被披露并公开。”
  • 7小时前:bagder披露此报告。
  • 7小时前:spectre-1发表评论,解释报告原因,包括供应链风险、高严重性、用户和生态系统保护、安全卫生及负责任披露。
  • 7小时前:curl锁定此报告。

报告详情

  • 报告时间:2025年8月12日,8:35 AM UTC
  • 报告者:spectre-1
  • 报告对象:curl
  • 报告ID:#3295656
  • 严重性:高(7 ~ 8.9)
  • 披露时间:2025年8月12日,8:40 AM UTC
  • 弱点:不当输入验证
  • CVE ID:无
  • 赏金:隐藏
  • 账户详情:无
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计