Dependency Confusion
依赖混淆
描述
依赖混淆(Dependency confusion)或替换攻击是一种可能导致远程代码执行的新型攻击技术。该攻击通常会影响构建环境、CI/CD 管道和开发人员工作站。
在大多数编程语言中,可以使用外部包管理系统来获取第三方依赖项。
包管理器通常提供部署私有存储库(private repositories)以托管仅供内部使用的包的功能。
在构建过程中,包管理器不会优先考虑私有存储库,而是优先考虑版本最高的存储库。攻击者可以利用这种行为,通过在公共存储库上创建恶意包并使用足够高的版本,来确保在构建时使用的是恶意包。
建议
在管理项目依赖项时,必须利用作用域包(scoped packages)来实现更好的组织和安全性。对于 NPM,请按照以下步骤创建作用域包、设置作用域注册表(scoped registry)、防止作用域接管(scope takeover)并有效定义依赖项:
1. 创建作用域包 (Scoped Package):
如果您还没有这样做,请为您的项目创建一个作用域包。您可以按照说明进行操作:
- 在 npm“Sign In”页面上,输入您的帐户详细信息,然后单击 Sign In。
- 在页面右上角,单击您的个人资料图片,然后单击 Add an Organization。
- 在组织创建页面上,在 Name 字段中键入组织的名称。您的组织名称也将成为您的组织作用域。
- 在 Name 字段下,选择“Unlimited private packages”付费计划或“Unlimited public packages”免费计划,然后单击 Buy 或 Create。
- (可选)在组织邀请页面上,输入您希望作为成员添加到您的组织的用户的 npm 用户名或电子邮件地址,并选择要邀请他们的团队,然后单击 Invite。
- 单击 Continue。
2. 设置作用域注册表 (Scoped Registry):
通过将以下行添加到您的 .npmrc 文件来配置您的作用域注册表:
@[ORG]:registry = https://reg.[ORG].internal/
3. 防止作用域接管:
确保您打算使用的作用域(@ORG)是安全的,不能被攻击者接管。这包括验证所有权并保持对相关组织或用户帐户的控制。
4. 定义依赖项:
在您的 package.json 文件中定义依赖项,确保使用前面定义的作用域。例如:
{
"name": "@org/dep1",
"version": "1.2.3",
"description": "Scoped dependency 1",
"dependencies": {
"@ostorlab/dep2": "1.2.3"
}
}
通过遵循这些可操作的步骤,您可以有效利用作用域包、确保注册表配置安全,并减轻未经授权的实体接管作用域的风险。
链接
- Microsoft warns enterprises of new 'dependency confusion' attack technique
- Dependency Confusion: How I Hacked Into Apple, Microsoft and Dozens of Other Companies
- Avoiding npm substitution attacks
标准
- OWASP_MASVS_L1:
- MSTG_CODE_5
- OWASP_MASVS_L2:
- MSTG_CODE_5
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_3
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_4_2
- CC_6_6
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_8_1
- CC_9_1