AWS SAM CLI 路径遍历漏洞分析与修复详解

13 阅读6分钟

项目概述

本文档详细分析了在AWS无服务器应用模型命令行工具(AWS SAM CLI)中发现的CVE-2025-3047和CVE-2025-3048两个安全漏洞。这两个漏洞均涉及在使用Docker容器构建过程中对符号链接(symlinks)的不当处理,可能允许攻击者通过恶意符号链接访问主机上的敏感文件,影响使用sam build --use-container命令的本地开发环境。

漏洞详情

CVE-2025-3047 - 容器构建中的符号链接路径遍历

影响版本: AWS SAM CLI v1.132.0及更早版本
修复版本: v1.133.0及以上
安全公告: GHSA-px37-jpqx-97q9

漏洞原理

当使用sam build --use-container在Docker容器内构建无服务器应用时,SAM CLI会默认跟随项目中的符号链接。攻击者可以在项目中植入恶意符号链接,指向主机上的敏感文件(如/etc/passwd、SSH密钥等)。由于Docker容器通常以提升的权限运行,攻击者可利用此特性将主机文件挂载到容器内并复制到容器内可访问的位置,从而实现路径遍历攻击。

核心问题

  • 符号链接跟随: SAM CLI在容器构建过程中无条件跟随所有符号链接
  • 权限提升: Docker容器的高权限使得可以访问主机文件系统
  • 文件暴露: 敏感主机文件被挂载到容器环境

修复方案

升级至SAM CLI v1.133.0+,该版本引入了符号链接验证机制,防止恶意符号链接指向项目目录外的文件。

CVE-2025-3048 - 构建缓存目录中的符号链接路径遍历

影响版本: AWS SAM CLI v1.133.0及更早版本
修复版本: v1.134.0及以上

漏洞原理

该漏洞存在于SAM CLI的构建缓存机制中。当使用--use-container--cached选项时,SAM CLI会将构建工件缓存到本地目录以供后续构建使用。攻击者可以通过在构建缓存目录中植入符号链接,指向主机上的敏感位置。在后续构建过程中,当SAM CLI解压或处理缓存的构件时,可能跟随这些符号链接,导致主机文件被意外暴露或覆盖。

核心问题

  • 缓存目录污染: 恶意符号链接可以存储在构建缓存中
  • 持久化攻击: 缓存的符号链接在多次构建间保持有效
  • 自动跟随: 在缓存处理过程中自动跟随符号链接

修复方案

升级至SAM CLI v1.134.0+,该版本改进了缓存目录的处理逻辑,在解压和处理缓存文件时验证符号链接的目标位置。

技术影响

受影响的环境

  • 仅限本地开发: 这两个漏洞仅影响使用sam build --use-container的本地开发环境
  • 不影响生产: 已部署的AWS服务或资源不受影响
  • 权限要求: 攻击者需要能够在项目目录中创建或修改文件

攻击场景

  1. 恶意依赖包: 包含恶意符号链接的第三方依赖包
  2. 供应链攻击: 通过污染构建环境植入符号链接
  3. 协作项目: 在团队协作项目中植入恶意符号链接

修复与缓解措施

立即行动

  1. 升级SAM CLI: 立即升级到最新版本(v1.134.0+)

    pip install --upgrade aws-sam-cli
    
  2. 验证当前版本:

    sam --version
    

配置最佳实践

  1. 容器使用策略:

    # 考虑仅在必要时使用--use-container
    # 对于简单项目,可使用本地构建
    sam build
    
  2. 目录权限控制:

    • 限制对项目目录的写入权限
    • 定期审查项目中的符号链接
    • 使用最小权限原则运行Docker容器
  3. 缓存管理:

    # 定期清理构建缓存
    rm -rf .aws-sam/build/
    

开发环境加固

  1. 使用Docker安全选项:

    # 在Dockerfile中指定非root用户
    USER 1000:1000
    
  2. 实施代码审查:

    • 审查项目中的符号链接
    • 验证第三方依赖的安全性
    • 使用静态分析工具检测可疑文件操作

漏洞检测与响应

检测方法

  1. 符号链接扫描:

    # 检查项目中的符号链接
    find . -type l -exec ls -la {} \;
    
    # 检查指向项目外的符号链接
    find . -type l -exec readlink -f {} \; | grep -v $(pwd)
    
  2. 版本验证脚本:

    import subprocess
    import sys
    
    def check_sam_version():
        try:
            result = subprocess.run(['sam', '--version'], 
                                  capture_output=True, text=True)
            version_str = result.stdout.strip()
            # 解析版本号并检查
            # ... 版本检查逻辑
        except Exception as e:
            print(f"检查失败: {e}")
            return False
    
    if __name__ == "__main__":
        check_sam_version()
    

应急响应

  1. 发现漏洞迹象:

    • 立即停止使用sam build --use-container
    • 检查构建日志中的异常文件访问
    • 审查项目中的符号链接
  2. 证据收集:

    • 保存构建缓存目录状态
    • 记录异常的符号链接
    • 收集相关时间戳和用户信息
  3. 系统恢复:

    • 升级SAM CLI到安全版本
    • 清理构建缓存
    • 重置可能受影响的凭据

长期安全建议

开发流程

  1. 依赖管理: 使用锁定文件(如requirements.txtpackage-lock.json)固定依赖版本
  2. 安全扫描: 在CI/CD流水线中集成安全扫描工具
  3. 最小权限: 在开发和构建环境中应用最小权限原则

监控与审计

  1. 文件系统监控: 监控对敏感文件的异常访问
  2. 构建日志分析: 定期审计构建日志中的安全事件
  3. 依赖漏洞跟踪: 订阅安全公告并及时响应

团队培训

  1. 安全意识: 教育开发人员了解符号链接相关的安全风险
  2. 安全编码: 培训安全编码实践,特别是文件操作安全
  3. 应急响应: 建立清晰的安全事件响应流程

总结

CVE-2025-3047和CVE-2025-3048揭示了在容器化构建过程中处理符号链接时的重要安全隐患。这些漏洞虽仅影响本地开发环境,但可能为攻击者提供访问主机敏感文件的途径。AWS已通过发布SAM CLI v1.133.0和v1.134.0及时修复了这些漏洞。

关键要点:

  • 始终使用最新版本的SAM CLI
  • 谨慎使用容器构建模式
  • 定期审查项目中的符号链接
  • 实施分层安全防御策略

通过采取这些措施,开发团队可以显著降低相关安全风险,确保无服务器应用开发环境的安全可靠。 6HFtX5dABrKlqXeO5PUv/z+el6LrqwwUpRLILLg6GZP1C7ofNwVZUfriI0Cl23fF