跳转至

Dependency Confusion

依赖混淆

描述

依赖混淆(Dependency confusion)或替换攻击是一种可能导致远程代码执行的新型攻击技术。该攻击通常会影响构建环境、CI/CD 管道和开发人员工作站。

在大多数编程语言中,可以使用外部包管理系统来获取第三方依赖项。

包管理器通常提供部署私有存储库(private repositories)以托管仅供内部使用的包的功能。

在构建过程中,包管理器不会优先考虑私有存储库,而是优先考虑版本最高的存储库。攻击者可以利用这种行为,通过在公共存储库上创建恶意包并使用足够高的版本,来确保在构建时使用的是恶意包。

建议

在管理项目依赖项时,必须利用作用域包(scoped packages)来实现更好的组织和安全性。对于 NPM,请按照以下步骤创建作用域包、设置作用域注册表(scoped registry)、防止作用域接管(scope takeover)并有效定义依赖项:

1. 创建作用域包 (Scoped Package):

如果您还没有这样做,请为您的项目创建一个作用域包。您可以按照说明进行操作:

  1. 在 npm“Sign In”页面上,输入您的帐户详细信息,然后单击 Sign In。
  2. 在页面右上角,单击您的个人资料图片,然后单击 Add an Organization。
  3. 在组织创建页面上,在 Name 字段中键入组织的名称。您的组织名称也将成为您的组织作用域。
  4. 在 Name 字段下,选择“Unlimited private packages”付费计划或“Unlimited public packages”免费计划,然后单击 Buy 或 Create。
  5. (可选)在组织邀请页面上,输入您希望作为成员添加到您的组织的用户的 npm 用户名或电子邮件地址,并选择要邀请他们的团队,然后单击 Invite。
  6. 单击 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"
  }
}

通过遵循这些可操作的步骤,您可以有效利用作用域包、确保注册表配置安全,并减轻未经授权的实体接管作用域的风险。

链接

标准

  • 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