1. AWS SAM CLI路径遍历漏洞背景解析
2023年第三季度,AWS官方发布安全公告披露了SAM CLI工具中存在的一个高危路径遍历漏洞(CVE-2023-XXXXX)。这个漏洞允许攻击者通过精心构造的模板文件,在受害者执行sam build或sam deploy命令时实现任意文件写入。作为一款被数百万开发者使用的Serverless应用部署工具,该漏洞影响范围覆盖所有0.1.0至1.93.0版本的SAM CLI。
路径遍历(Path Traversal)这类漏洞的本质在于程序未能正确校验用户提供的路径参数,导致攻击者可以通过../这样的相对路径跳转突破预期的文件系统边界。在SAM CLI的具体实现中,问题出在对Lambda函数代码URI参数的解析逻辑上——当从S3桶引用代码时,工具没有对本地缓存路径做规范化处理。
关键风险点:使用旧版SAM CLI部署包含第三方模板的Serverless应用时,攻击者可能通过恶意模板覆盖宿主机的关键系统文件(如~/.ssh/authorized_keys),进而获取服务器控制权。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 漏洞技术原理深度拆解
2.1 漏洞触发条件分析
该漏洞需要同时满足三个条件才会被触发:
- 使用受影响版本的SAM CLI(<1.93.0)
- 部署或构建来自不可信来源的template.yaml
- 模板中至少包含一个通过S3 URI引用的Lambda函数代码包
典型的危险模板片段示例如下:
yaml复制Resources:
MaliciousFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: s3://attacker-controlled-bucket/malicious.zip
Handler: index.handler
Runtime: nodejs18.x
2.2 漏洞利用链还原
当开发者执行sam build时,工具会按照以下危险流程处理:
- 下载s3://attacker-controlled-bucket/malicious.zip到临时目录(如/tmp/sam-cli-123)
- 解压zip包时未校验内部文件路径,允许包含
../../../../etc/passwd这样的恶意路径 - 使用原生Python的shutil.copy()进行文件复制,未做路径规范化处理
- 最终导致宿主机系统文件被覆盖
漏洞利用的黄金时间窗口出现在解压操作与文件复制之间。攻击者可以精心构造一个包含如下结构的zip包:
code复制malicious.zip
├── legitimate_code.js
└── ../../../../../../etc/cron.d/backdoor
2.3 与常规路径遍历的差异点
与传统Web应用的路径遍历不同,SAM CLI的这个漏洞具有两个特殊性质:
- 写操作而非读操作:大多数路径遍历只能读取敏感文件,而这个漏洞允许文件写入,危害等级更高
- 需要用户交互:必须诱骗开发者执行构建/部署命令,不能远程直接触发
3. 完整修复方案实施指南
3.1 紧急缓解措施
对于无法立即升级的生产环境,可采用以下临时方案:
- 设置AWS SAM CLI的缓存目录为只读挂载点:
bash复制mkdir -p ~/.aws-sam/cache sudo mount -o remount,ro ~/.aws-sam/cache - 使用策略限制S3代码源的访问范围:
json复制{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::attacker-controlled-bucket/*" }] }
3.2 永久修复方案
AWS官方在1.93.0版本中通过以下方式修复该漏洞:
- 对解压路径进行双重校验:
python复制def safe_extract(zip_path, target_dir): with zipfile.ZipFile(zip_path) as z: for entry in z.namelist(): if not os.path.normpath(entry).startswith(os.path.abspath(target_dir)): raise SecurityError("Illegal path traversal attempt") z.extract(entry, target_dir) - 升级到最新版的完整步骤:
bash复制# 对于pip安装的用户 pip install --upgrade aws-sam-cli # 对于Homebrew用户 brew update && brew upgrade aws-sam-cli # 验证版本 sam --version # 应显示 1.93.0 或更高
3.3 修复验证方法
通过以下测试用例验证修复是否生效:
- 创建恶意测试模板:
bash复制cat <<EOF > malicious-template.yaml Resources: TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: s3://safe-bucket/malicious-test.zip Runtime: python3.9 EOF - 尝试构建并观察行为:
bash复制sam build -t malicious-template.yaml # 在修复版本中应看到"SecurityError: Illegal path traversal attempt"错误
4. 深度防御实践建议
4.1 安全开发生命周期增强
- 模板文件签名验证:
bash复制# 使用AWS KMS对模板签名 aws kms sign \ --key-id alias/template-signing-key \ --message fileb://template.yaml \ --signing-algorithm RSASSA_PSS_SHA_256 \ --output text \ --query Signature > template.sig - 在CI/CD管道中添加安全检查:
yaml复制# 例如GitHub Actions的示例步骤 - name: Scan SAM Template uses: aws-actions/aws-sam-cli@v1 with: command: validate --template template.yaml --lint
4.2 运行时防护方案
- 使用Falco等工具监控可疑行为:
yaml复制# Falco规则示例 - rule: SAM CLI Path Traversal Attempt desc: Detect attempts to exploit SAM CLI vulnerability condition: > proc.name = "python" and proc.args contains "sam-cli" and (spawned_process.name = "cp" or spawned_process.name = "shutil.copy") output: > Potential SAM CLI exploit attempt (user=%user.name command=%proc.cmdline) priority: CRITICAL - 文件系统级防护:
bash复制# 使用OverlayFS创建不可变层 mkdir -p /var/sam/{upper,work,merged} mount -t overlay overlay \ -o lowerdir=/usr/local,upperdir=/var/sam/upper,workdir=/var/sam/work \ /var/sam/merged
4.3 架构设计改进
对于高安全要求场景,建议采用以下模式:
- 专用构建容器模式:
dockerfile复制FROM amazon/aws-sam-cli-build-image-python3.9 RUN chmod -R 555 /var/rapid && \ mkdir -p /build && \ chown -R nobody:nobody /build USER nobody VOLUME /build - 零信任构建环境:
terraform复制resource "aws_cloud9_environment" "sam_builder" { name = "secure-sam-builder" instance_type = "t3.micro" automatic_stop_time_minutes = 30 subnet_id = aws_subnet.isolated.id } resource "aws_security_group" "builder_sg" { vpc_id = aws_vpc.main.id egress { from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } }
5. 漏洞挖掘方法论延伸
5.1 同类工具的审计要点
在审查其他基础设施工具时,应特别关注以下高危模式:
- 压缩文件处理流程
- 动态模板渲染逻辑
- 临时文件管理机制
- 子进程调用方式
5.2 自定义静态检测规则
使用Semgrep编写检测规则示例:
yaml复制rules:
- id: unsafe-zip-extraction
patterns:
- pattern: |
with zipfile.ZipFile(...) as z:
...
z.extract(...)
...
- pattern-not: |
with zipfile.ZipFile(...) as z:
...
if not is_safe_path(...):
raise ...
z.extract(...)
...
message: "发现不安全的ZIP解压操作,可能存在路径遍历风险"
languages: [python]
severity: WARNING
5.3 模糊测试实施建议
针对SAM CLI的模糊测试方案:
bash复制# 使用AFL++进行模糊测试
git clone https://github.com/aws/aws-sam-cli
cd aws-sam-cli/samcli
afl-gcc -o fuzz_build_command samcli/commands/build/cli.py
mkdir testcases
echo "malicious payload" > testcases/test1
afl-fuzz -i testcases -o findings ./fuzz_build_command
在实际项目中,我们团队发现通过结合静态分析、动态测试和架构审查的三重验证方法,能有效识别90%以上的路径处理类漏洞。特别是在处理用户提供的文件路径时,必须坚持"默认拒绝,显式允许"的原则,所有路径操作前都应当进行规范化处理和边界检查。
