flawopen.com/参考/Dependency Confusion
Dependency Confusion:软件包来源混淆如何发生
High Severity
CWE-829: Inclusion of Functionality from Untrusted Control Sphere
软件供应链
通俗解释 — 名称相似的供应商
想象团队从供应商目录订购组件,但两家供应商使用相同的商品名。如果规则没有指定可信供应商,构建可能拿到非预期组件。Dependency Confusion 是软件包来源选择失败:构建从组织并未打算信任的 registry 或命名空间解析依赖。
Boundary: 包名、命名空间、registry 配置和锁文件来源
Failure: 解析器可能从非预期来源获取同名包
Impact: 未经审查的第三方代码可能进入构建;启用时安装脚本也可能运行
Remediation: 明确命名空间与 registry 策略、审查锁文件、使用最小权限构建
Dependency Confusion 如何发生
具体行为取决于包管理器及其配置。以 pip 为例:其文档警告,将私有 --index-url 与公共 --extra-index-url 组合,可能导致选择同名公共包。npm 根据包 scope 或默认配置选择 registry;它并非总会比较私有和公共版本并选更高者。共同根因是来源策略含糊。如果安装了该包且启用了脚本,脚本会以构建任务可用的权限运行。
pip.conf 与 requirements.txt(来源含糊)风险配置
[global]
index-url = https://packages.example.internal/simple
extra-index-url = https://pypi.org/simple
corp-auth-utils
.npmrc 与 package.json(显式 scope 路由)加固示例
@corp:registry=https://packages.example.internal/repository/npm/
{
"dependencies": {
"@corp/billing-engine": "1.2.0"
}
}
Dependency Confusion 的一种故障路径
- 1内部包名或命名空间在组织外泄露。
- 2公共 registry 中存在同名的无 scope 包,或当前来源策略允许该 registry 响应请求。
- 3解析器选中非预期来源;如果锁文件缺失、重新生成或未经审查就被接受,审查流程可能无法发现替换。
- 4若启用了安装或构建脚本,包代码会以构建任务权限运行。影响取决于凭据、网络访问和隔离情况;以 root 运行并非此类攻击的必然条件。
工程防护措施
- ✓明确来源策略:支持时使用组织专属 scope 或命名空间,将其路由到预期 registry,并阻止私有包名回退到公共来源。Python 私有包不要同时配置私有索引和
--extra-index-url;改用受控代理或唯一权威索引。 - ✓控制命名空间所有权:registry 支持时可预先保留组织名称,但不能用名称保留替代解析策略。盘点内部包名,并监控公共命名冲突。
- ✓审查并强制使用锁文件:提交锁文件,并使用包管理器的冻结/CI 安装模式(npm 使用
npm ci)。审查包名、registry URL、版本和完整性值的变化。锁文件提高可重复性,但不能证明来源属于预期发布者。 - ✓限制构建执行:项目不依赖时禁用依赖脚本,并审查例外。为构建任务使用短期、最小权限凭据;与生产机密隔离并限制出站网络。
浏览相关安全主题与事件分析:安全目录 →