不安全全局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
复现步骤
- 克隆或下载curl GitHub仓库。
- 打开
packages/OS400/make-incs.sh
并使用以下命令搜索IFS的出现:1
grep -n IFS packages/OS400/make-incs.sh
- 观察全局重新分配IFS的行(例如
IFS="$IFS,"
),未进行作用域限制或恢复其先前值。 - 审查脚本逻辑,确认IFS未包含在子shell或临时赋值中,从而实现持久的全局效果。
- 与Semgrep/静态分析规则交叉参考,检查shell注入/不安全IFS使用。
支持材料/参考
- 文件:
packages/OS400/make-incs.sh
(任何操作IFS的行) - Semgrep/静态分析结果,突出显示shell脚本中IFS的不当使用
- curl/curl GitHub仓库
- (如果可用,附上扫描日志/截图)
缓解计划
- 审计所有修改IFS的脚本位置:
使用
grep -n IFS packages/OS400/make-incs.sh
识别不安全或全局IFS赋值。 - 对IFS更改应用局部作用域和恢复:
- 将IFS修改限制在最小可能的作用域内——理想情况下,在循环或子shell中声明,而不是在脚本全局级别。
- 使用内联赋值,例如
while IFS=, read ...; do ...; done
。 - 或者,始终在更改前保存原始IFS值,并在之后立即恢复:
1 2 3 4
old_IFS="$IFS" IFS=, # ... 使用新IFS的命令 ... IFS="$old_IFS"
- 在CI/CD中集成静态分析: 在CI流水线中添加Semgrep或ShellCheck规则,以在合并前自动检测和阻止不安全的全局变量操作和shell注入模式。
- 记录安全的shell脚本和输入解析实践: 为贡献者添加清晰的开发指南,突出全局变量更改的风险和安全解析的最佳实践。
- 审查和测试: 重构后,在所有支持的环境中测试所有受影响的脚本,确保没有功能回归,并且环境状态始终可预测。
实施这些步骤将防止命令注入、解析错误和意外副作用——大大提升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:无
- 赏金:隐藏
- 账户详情:无