简易高效的供应链攻击—依赖混淆
字数 1942 2025-08-12 11:34:18

依赖混淆(Dependency Confusion)攻击技术详解

1. 漏洞概述

依赖混淆(Dependency Confusion)是一种供应链攻击方式,攻击者通过上传与内部包同名的恶意包到公共包管理库,利用包管理工具的默认行为导致系统错误安装外部恶意包而非内部合法包。

1.1 漏洞背景

  • 首次报告时间:2020年7月17日
  • 报告者:alexbirsan
  • 典型赏金金额:\(30,000/每个(部分高达\)40,000)
  • 受影响公司:Apple、PayPal、Shopify、Microsoft、Netflix、Yelp、Uber、Tesla等35+大型企业

2. 漏洞原理

2.1 核心机制

当项目同时使用内部私有包和公共包时,包管理工具在解析依赖时的默认行为会导致漏洞:

  1. 工具会检查内部包索引中是否存在指定包
  2. 同时检查公共包索引中是否存在同名包
  3. 如果两者都存在,默认安装版本号更高的包

2.2 攻击流程

  1. 攻击者识别目标公司使用的内部包名称
  2. 创建同名恶意包并设置更高版本号
  3. 上传到公共包管理库(npm/PyPI/RubyGems)
  4. 等待目标系统错误安装恶意包

3. 具体包管理工具实现

3.1 Python pip

pip install library --extra-index-url [内部源URL]

问题参数:--extra-index-url会同时检查内部源和PyPI,优先安装高版本

安全替代方案:使用--index-url仅指定内部源

3.2 Node.js npm

类似问题存在于npm包管理中,通过package.json配置混合使用公共和私有包时可能出现混淆

3.3 Ruby RubyGems

gem install --source [内部源URL]

存在与pip类似的混淆问题

4. 漏洞挖掘技术

4.1 内部包名称收集方法

  1. GitHub代码搜索:查找package.json等配置文件
  2. JavaScript文件分析:扫描公开的JS文件查找require()调用
  3. 互联网论坛:开发人员讨论中可能泄露内部包名
  4. 自动化扫描:针对目标公司域名扫描数百万JS文件提取包名

4.2 攻击验证技术

  1. 恶意包构造

    • 利用preinstall脚本执行代码
    • 收集基本信息(用户名、主机名、路径、外部IP)
    • 避免收集敏感信息以符合道德测试要求
  2. 数据回传

    • 使用DNS协议外传数据
    • 十六进制编码数据作为DNS查询子域
    • 配置权威DNS服务器记录查询

5. 实际攻击案例

5.1 Shopify案例

  • 攻击包:shopify-cloud Ruby gem
  • 时间:上传几小时后即被自动安装
  • 响应:24小时内修复,奖励$30,000

5.2 Apple案例

  • 影响系统:Apple ID认证相关系统
  • 多台内部机器执行了恶意代码
  • 奖励:$30,000

5.3 Microsoft案例

  • 影响:Office 365云服务
  • 奖励:$40,000(Azure最高奖励)

6. 根本原因分析

6.1 包管理工具设计问题

  1. pip的--extra-index-url:不安全的设计导致同时查询多个源
  2. JFrog Artifactory:虚拟库混合内部和公共包时采用相同的高版本优先逻辑
  3. RubyGems的--source:类似pip的问题

6.2 开发实践问题

  1. 混合使用公共和私有包时缺乏明确区分
  2. 构建系统自动化程度高但缺乏安全验证
  3. 内部包命名未采用专用命名空间

7. 防御措施

7.1 配置修复

  1. pip

    • 使用--index-url替代--extra-index-url
    • 或使用--no-index确保不查询PyPI
  2. npm

    • 使用作用域包(@company/package)
    • 配置.npmrc严格指定registry
  3. RubyGems

    • 避免使用--source
    • 使用bundler的source优先级配置

7.2 系统级防护

  1. 网络层

    • 限制构建系统对外访问
    • 监控异常DNS请求
  2. 流程层

    • 代码审核所有依赖变更
    • 自动化构建前验证依赖来源
  3. 工具层

    • 使用私有包管理服务器(如Azure Artifacts)的安全配置
    • 启用依赖验证和签名检查

8. 厂商响应

8.1 Microsoft建议

《3 Ways to Mitigate Risk When Using Private Package Feeds》白皮书提出:

  1. 使用作用域包
  2. 实施包签名验证
  3. 配置上游源优先级

8.2 JFrog Artifactory

  • 将问题标记为"feature request"
  • 建议用户通过系统策略缓解

9. 总结

依赖混淆攻击展示了供应链的脆弱性,其高成功率源于:

  1. 包管理工具的默认不安全行为
  2. 大型组织中内部包管理的复杂性
  3. 自动化构建系统的广泛使用

防御关键在于:

  1. 正确配置包管理工具
  2. 采用专用命名空间
  3. 实施多层防御策略
依赖混淆(Dependency Confusion)攻击技术详解 1. 漏洞概述 依赖混淆(Dependency Confusion)是一种供应链攻击方式,攻击者通过上传与内部包同名的恶意包到公共包管理库,利用包管理工具的默认行为导致系统错误安装外部恶意包而非内部合法包。 1.1 漏洞背景 首次报告时间:2020年7月17日 报告者:alexbirsan 典型赏金金额:$30,000/每个(部分高达$40,000) 受影响公司:Apple、PayPal、Shopify、Microsoft、Netflix、Yelp、Uber、Tesla等35+大型企业 2. 漏洞原理 2.1 核心机制 当项目同时使用内部私有包和公共包时,包管理工具在解析依赖时的默认行为会导致漏洞: 工具会检查内部包索引中是否存在指定包 同时检查公共包索引中是否存在同名包 如果两者都存在,默认安装版本号更高的包 2.2 攻击流程 攻击者识别目标公司使用的内部包名称 创建同名恶意包并设置更高版本号 上传到公共包管理库(npm/PyPI/RubyGems) 等待目标系统错误安装恶意包 3. 具体包管理工具实现 3.1 Python pip 问题参数: --extra-index-url 会同时检查内部源和PyPI,优先安装高版本 安全替代方案:使用 --index-url 仅指定内部源 3.2 Node.js npm 类似问题存在于npm包管理中,通过 package.json 配置混合使用公共和私有包时可能出现混淆 3.3 Ruby RubyGems 存在与pip类似的混淆问题 4. 漏洞挖掘技术 4.1 内部包名称收集方法 GitHub代码搜索 :查找package.json等配置文件 JavaScript文件分析 :扫描公开的JS文件查找require()调用 互联网论坛 :开发人员讨论中可能泄露内部包名 自动化扫描 :针对目标公司域名扫描数百万JS文件提取包名 4.2 攻击验证技术 恶意包构造 : 利用preinstall脚本执行代码 收集基本信息(用户名、主机名、路径、外部IP) 避免收集敏感信息以符合道德测试要求 数据回传 : 使用DNS协议外传数据 十六进制编码数据作为DNS查询子域 配置权威DNS服务器记录查询 5. 实际攻击案例 5.1 Shopify案例 攻击包:shopify-cloud Ruby gem 时间:上传几小时后即被自动安装 响应:24小时内修复,奖励$30,000 5.2 Apple案例 影响系统:Apple ID认证相关系统 多台内部机器执行了恶意代码 奖励:$30,000 5.3 Microsoft案例 影响:Office 365云服务 奖励:$40,000(Azure最高奖励) 6. 根本原因分析 6.1 包管理工具设计问题 pip的--extra-index-url :不安全的设计导致同时查询多个源 JFrog Artifactory :虚拟库混合内部和公共包时采用相同的高版本优先逻辑 RubyGems的--source :类似pip的问题 6.2 开发实践问题 混合使用公共和私有包时缺乏明确区分 构建系统自动化程度高但缺乏安全验证 内部包命名未采用专用命名空间 7. 防御措施 7.1 配置修复 pip : 使用 --index-url 替代 --extra-index-url 或使用 --no-index 确保不查询PyPI npm : 使用作用域包(@company/package) 配置.npmrc严格指定registry RubyGems : 避免使用 --source 使用bundler的source优先级配置 7.2 系统级防护 网络层 : 限制构建系统对外访问 监控异常DNS请求 流程层 : 代码审核所有依赖变更 自动化构建前验证依赖来源 工具层 : 使用私有包管理服务器(如Azure Artifacts)的安全配置 启用依赖验证和签名检查 8. 厂商响应 8.1 Microsoft建议 《3 Ways to Mitigate Risk When Using Private Package Feeds》白皮书提出: 使用作用域包 实施包签名验证 配置上游源优先级 8.2 JFrog Artifactory 将问题标记为"feature request" 建议用户通过系统策略缓解 9. 总结 依赖混淆攻击展示了供应链的脆弱性,其高成功率源于: 包管理工具的默认不安全行为 大型组织中内部包管理的复杂性 自动化构建系统的广泛使用 防御关键在于: 正确配置包管理工具 采用专用命名空间 实施多层防御策略