dependency-confusion 是做什么的?
通过包管理器依赖混淆进行供应链测试:当内部包名解析到攻击者控制的公共注册表时,会导致恶意安装和脚本执行。适用于 npm/pip/gem/Maven/Composer/Docker 的清单审查以及授权的红队供应链演练。
概述
依赖混淆是一种供应链攻击技术,其中攻击者在公共包注册表上注册与内部私有包同名的包。当包管理器安装依赖时,可能会错误地优先使用公共注册表中的恶意包,从而导致任意代码执行或数据泄露。该技能自动化了发现这种漏洞的过程。
支持的包管理器
| 包管理器 | 清单文件 | 注册表 |
|---|---|---|
| npm | package.json | https://registry.npmjs.org |
| pip | requirements.txt / setup.py / Pipfile | https://pypi.org/simple |
| gem | Gemfile | https://rubygems.org |
| Maven | pom.xml | https://repo.maven.apache.org/maven2 |
| Composer | composer.json | https://packagist.org |
| Docker | Dockerfile | N/A (检查镜像来源) |
使用示例
自动检测
- 提供包含依赖声明文件的目录路径。
- 技能将解析所有已安装的依赖。
- 对于每个依赖,它会在公共注册表中检查是否存在同名包。
- 若存在,则会发出警告,指出潜在的依赖混淆风险。
CLI 命令
# 扫描当前目录中的所有清单文件
yaklang dependency-confusion --scan .
# 指定特定文件
yaklang dependency-confusion --file package.json
# 显示详细 JSON 输出
yaklang dependency-confusion --scan . --json
工作原理
技能利用 yaklang 的包管理器和 HTTP 客户端 API 向包注册表发送查询。对于每个依赖项,它执行以下步骤:
- 解析清单:使用
yaml.Unmarshal或json.Unmarshal解析依赖清单。 - 识别依赖:提取所有依赖项的名称和版本约束。
- 检查注册表:向公共注册表的搜索或获取端点发送 HTTP GET 请求(例如
https://registry.npmjs.org/{包名})。 - 比较结果:如果注册表返回 200 OK 状态,则该包存在于公共注册表中。
- 报告风险:输出结果,标记所有符合混淆条件的包。
安全注意事项
⚠️ 仅供授权测试使用。此技能用于在受控环境中执行授权的红队演练或安全评估。在未获得明确许可的生产系统上使用依赖混淆技术可能违反可接受使用政策。
始终确保您拥有测试范围内依赖项的合法权利。
自定义
您可以通过设置环境变量来调整行为:
DEPCONF_PRIVATE_REGISTRY:用于检查的私有注册表的 URL(默认为空,仅检查公共注册表)。DEPCONF_TIMEOUT:HTTP 请求的超时时间(秒),默认为 10。DEPCONF_IGNORE:要忽略的包名逗号分隔列表(例如,express, lodash)。
许可证
MIT