检测与防护完整指南)
Anthropic-Cybersecurity-Skills 技能库实战依赖混淆Dependency Confusion检测与防护完整指南【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills依赖混淆Dependency Confusion是 2021 年被 Alex Birsan 公开演示并攻破 Apple、Microsoft、PayPal 等数十家巨头内部构建系统的供应链攻击手法其根因在于多数包管理器在私有仓库 公共仓库混合解析时选择版本号更高的包而非来源正确的包。本文基于本仓库的 detecting-dependency-confusion 技能系统讲解如何用confused与 OWASPdep-scan枚举可被认领的内部包名、如何通过.npmrc、pip.conf/pyproject.toml与 Mavensettings.xml彻底封死公共替换路径并深入解析仓库内置的批量分诊脚本实现。读完你将掌握一套从检测、三线验证、修复到 CI 落地的完整供应链安全加固方案。合法使用声明本技能仅用于授权的安全测试、防御性工程与教育目的。未经授权注册包命名空间或在未经书面授权的情况下对构建流水线进行解析测试可能违反法律与公共注册服务条款。只允许针对你拥有或明确获准评估的命名空间与基础设施开展认领与解析验证活动。攻击原理为什么解析器会选中恶意包依赖混淆也称替换攻击 / namespace-shadowing的本质是很多包管理器允许同时从内部/私有注册表与公共注册表解析依赖解析时优先选择版本号更高的那一个而不是校验来源。假设你的内部私有注册表里有一个名为acme-billing-sdk的内部包版本1.2.0它从未发布到公共注册表。攻击者一旦获知这个包名——可能来自提交进仓库的 lockfile、sourcemap、公共 JS bundle、Docker 镜像层甚至是错误堆栈——就可以在公共注册表npmjs.com、PyPI、Maven Central发布一个同名包版本设置为极高的99.0.0受害者的 CI/CD 构建机或开发机在混合解析时因公共包版本更高而选中它攻击者的preinstall/postinstall安装脚本随即在构建环境执行恶意代码供应链被整体攻陷。因此本技能将内部包名泄露视为攻击面管理问题而不是一次性检查内部包名会持续从 lockfile、sourcemap、公共 JS bundle、Docker 层与错误堆栈中泄露出去必须建立周期性检测控制。本技能覆盖问题的两个半边检测Detection枚举内部依赖名找出那些在公共注册表上未被注册、因而可被认领claimable的名字工具为confused与 OWASPdep-scan防护Prevention将作用域/命名空间固定到私有注册表、注册防御性占位包并通过.npmrc、pip.conf/pyproject.toml、Mavensettings.xml施加来源限制使公共替换在机制上不可能发生。技能概览与仓库中的位置本技能遵循 agentskills.io 开放标准目录结构如下skills/detecting-dependency-confusion/ ├── SKILL.md ← 技能定义YAML frontmatter Markdown 主体 ├── references/ │ ├── api-reference.md ← 命令与 API 速查confused、dep-scan、注册表探测端点、修复配置键 │ └── standards.md ← MITRE ATTCK / NIST CSF 2.0 / OWASP / NIST SP 800-161r1 / SLSA 映射 ├── scripts/ │ └── agent.py ← 批量分诊辅助脚本 └── LICENSE ← Apache-2.0技能 frontmatter 声明了领域归属domain: cybersecurity、subdomain: supply-chain-security、核心标签dependency-confusion、namespace-hijacking、supply-chain-security等、NIST CSF 映射ID.RA-09以及 MITRE ATTCK 映射T1195.001方便 AI Agent 在检索 817 个技能时精准命中。该技能归属仓库的Supply Chain Security领域与 SBOM、恶意包分诊、SLSA/Sigstore 等技能共同构成供应链安全能力集。何时使用为新仓库/组织接入供应链安全计划时基线化哪些内部包在公共注册表上可被认领CI/CD 流水线从私有与公共注册表混合解析依赖混合/虚拟源时任何内部包名可能已泄露的事件之后源码泄露、公共 bundle、仓库被攻破审计package.json、requirements.txt、pom.xml、composer.json、Gemfile.lock中的可混淆依赖时作为周期性计划任务检测新增内部包是否尚未防御性注册。前置条件Go 1.20安装confusedgo install github.com/visma-prodsec/confusedlatest # 二进制文件位于 $(go env GOPATH)/bin/confusedPython 3.10安装 OWASP dep-scanpip install owasp-depscan # 或使用容器docker pull ghcr.io/owasp-dep-scan/dep-scanNode.js npm用于.npmrc与npm config修复且需要能访问你的私有注册表Artifactory、Nexus、Azure Artifacts、GitHub Packages、AWS CodeArtifact 等对被评估的仓库/lockfile 具备读权限对私有注册表具备写权限用于防御性注册。检测目标枚举项目清单中 npm、PyPI、Maven、Composer、RubyGems 的全部内部依赖判断哪些内部包名在对应公共注册表上不存在、因而可被认领区分真实暴露与误报scoped 包、已被镜像的名字应用注册表固定与作用域限制控制使公共替换在机制上不可能发生为未认领的内部包名防御性注册占位包在 CI 中建立周期性检测控制捕获新引入的可混淆依赖。安全框架映射MITRE ATTCKTechnique ID技术名称相关性T1195.001供应链攻陷攻陷软件依赖与开发工具核心技术——攻击者用恶意公共包替换内部依赖T1195.002供应链攻陷攻陷软件供应链混淆成功后被污染构建产物的更广类别T1059.007命令与脚本解释器JavaScriptnpmpreinstall/postinstall生命周期脚本在解析时执行攻击者 JST1071.001应用层协议Web 协议被替换的包向攻击者 HTTP(S) 端点回连窃取环境变量与凭据NIST Cybersecurity Framework 2.0ID名称理由ID.RA-09在获取与使用前评估硬件与软件的完整性与真实性检测可混淆包名并固定注册表可验证解析到的包确为真实内部产物而非公共替身支撑标准OWASP CI/CD Top 10 — CICD-SEC-03: Dependency Chain Abuse依赖混淆是依赖链滥用的典型案例修复指引与该控制项对齐NIST SP 800-161r1 — 网络供应链风险管理实践为命名空间治理与注册表固定提供组织级 C-SCRM 控制框架SLSA软件制品供应链等级源码与构建来源验证要求可缩小一次成功替换的爆炸半径。详细映射见 references/standards.md。实战工作流十个步骤1. 盘点代码库中的全部清单文件先定位所有依赖清单避免遗漏任何一个# 在 monorepo 中查找所有受支持的清单 find . -type f \( \ -name package.json -o \ -name requirements.txt -o \ -name pom.xml -o \ -name composer.json -o \ -name Gemfile.lock \ \) -not -path */node_modules/* -print2. 用 confused 扫描 npm 清单confused读取清单并报告所有在公共注册表上查不到的依赖名——这些就是混淆候选# npm默认语言即 npm confused -l npm package.json # 将已知安全的作用域视为安全抑制误报支持通配符 confused -l npm -s acme/*,acme-internal/* package.json # 详细模式查看每一次查询 confused -l npm -v package.json3. 扫描 PyPI、Maven、Composer 与 RubyGems 清单-l标志选择生态每个生态映射到其标准清单文件confused -l pip requirements.txt # PyPI - requirements.txt confused -l mvn pom.xml # Maven - pom.xml confused -l composer composer.json # PHP - composer.json confused -l rubygems Gemfile.lock # Ruby - Gemfile.lock各生态映射关系npm→package.json、pip→requirements.txt、mvn→pom.xml、composer→composer.json、rubygems→Gemfile.lock。4. 用 OWASP dep-scan 私有命名空间模式交叉验证dep-scan 可确认已声明的私有命名空间的混淆暴露并汇入更广泛的风险审计# 标记在公共注册表上意外可认领的私有命名空间 depscan --src $PWD --reports-dir ./reports \ --private-ns acme,acme_internal,acme # 启用深度包风险审计npm pypityposquat、接管风险等 depscan --src $PWD --reports-dir ./reports --risk-audit5. 分诊候选包并确认可认领性对每个被标记的名字验证它在公共注册表上确实不存在404 即意味着可认领# npmHTTP 404 表示该名字在公共注册表上未注册 curl -s -o /dev/null -w %{http_code}\n https://registry.npmjs.org/acme%2finternal-utils # PyPIJSON API 返回 404 表示项目名可用 curl -s -o /dev/null -w %{http_code}\n https://pypi.org/pypi/acme-billing-sdk/json注意 npm scoped 包中的/必须做 URL 编码acme/internal-utils→acme%2finternal-utils否则请求会 404 在错误的路径上造成误判。6. 用 npm 作用域到注册表固定进行修复将每个内部作用域绑定到私有注册表使同名公共包永远不可能被解析# .npmrc项目根目录提交入库 acme:registryhttps://artifactory.example.com/api/npm/npm-internal/ //artifactory.example.com/api/npm/npm-internal/:_authToken${NPM_TOKEN} # 将默认注册表强制为单一代理该代理不合并公共与私有源 registryhttps://artifactory.example.com/api/npm/npm-virtual/安装前验证解析来源npm config get acme:registry npm install --dry-run # 确认 acme/* 从私有主机解析7. 修复 PyPI 与 Maven固定 Python 索引解析与 Maven 镜像使公共源无法遮蔽内部制品# pyproject.tomlPEP 621 / pip 23显式索引固定 [tool.pip] index-url https://artifactory.example.com/api/pypi/pypi-internal/simple/ # 内部包不要使用 extra-index-url —— pip 会合并源并选择最高版本!-- ~/.m2/settings.xml通过单一虚拟仓库镜像全部坐标 -- mirrors mirror idinternal-virtual/id mirrorOf*/mirrorOf urlhttps://artifactory.example.com/artifactory/maven-virtual/url /mirror /mirrors关键陷阱pip 的extra-index-url会合并多个源并挑选最高版本这恰恰是依赖混淆的温床内部包严禁使用Maven 则应使用mirrorOf*/mirrorOf把所有坐标都指向虚拟仓库阻断对 Maven Central 的直连。8. 防御性注册占位包对于无法完全隔离的名字先下手为强用空壳的、无实际功能的占位包认领公共名使攻击者无从下手# npm 占位认领scoped公共可见 mkdir acme-internal-utils cd acme-internal-utils npm init -y npm pkg set version0.0.1-placeholder descriptionReserved internal name. Do not use. npm publish --access public9. 将检测接入 CI只要出现新的可混淆依赖就让流水线失败# .github/workflows/depconfusion.yml name: dependency-confusion on: [push, pull_request] jobs: confused: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - uses: actions/setup-gov5 with: { go-version: 1.22 } - run: go install github.com/visma-prodsec/confusedlatest - name: Scan npm manifest run: $(go env GOPATH)/bin/confused -l npm -s acme/* package.json10. 运行内置辅助脚本进行批量分诊使用技能目录自带的agent.py扫描目录树输出结合confused与实时注册表探测的结构化报告python scripts/agent.py --path . --ecosystem npm \ --secure-namespaces acme/*,acme-internal/* \ --output report.json源码级解析内置批量分诊脚本 agent.py脚本位于 scripts/agent.py它把前面手工执行的步骤自动化扫描源码树中的依赖清单 → 提取声明的依赖名 → 逐一探测对应公共注册表 → 给出可认领 / 公共源上已存在 / 未知三类判定并在安装了confused时自动调用其交叉验证。注册表端点与清单映射脚本用两个字典集中维护生态配置agent.py 第 26-31 行REGISTRY { npm: https://registry.npmjs.org/{name}, pip: https://pypi.org/pypi/{name}/json, rubygems: https://rubygems.org/api/v1/gems/{name}.json, } MANIFEST {npm: package.json, pip: requirements.txt, rubygems: Gemfile.lock}从代码结构可以推断脚本目前内置支持 npm、pip、rubygems 三个生态Maven 与 Composer 的探测可交由confused完成脚本会把它作为交叉验证器输出。后续如需扩展生态只需在REGISTRY、MANIFEST、PARSERS三处各补一条记录并新增解析函数。注册表探测与网络错误处理http_status()第 34-43 行负责发起 HTTP 探测并返回状态码404 表示可认领、200 表示公共源上已存在对网络异常返回-1并在 stderr 打印警告而不是让脚本崩溃——这是将探测失败与名字可认领严格区分的关键设计。三类清单解析器parse_npm()第 46-55 行解析package.json合并dependencies、devDependencies、optionalDependencies、peerDependencies四个字段的键并用集合去重parse_pip()第 58-70 行按行解析requirements.txt跳过注释#、选项行-、git与http开头的行用正则^([A-Za-z0-9._-])提取包名parse_rubygems()第 73-82 行解析Gemfile.lock用正则^\s{4}([a-z0-9_-]) \(匹配四空格缩进后带括号版本的 gem 名。三个解析器都采用解析失败只告警不致命的策略捕获JSONDecodeError/OSError保证单个损坏清单不会阻断整棵目录树的扫描。scoped 包名编码与安全命名空间过滤encode_name()第 88-92 行对 npm 以开头的 scoped 包保留而对其余字符做 URL 编码把/转为%2fis_secure()第 95-96 行用fnmatch通配符匹配--secure-namespaces传入的已知安全作用域如acme/*命中的名字直接跳过用于压制误报。判定逻辑与报告输出主流程第 114-161 行--ecosystem为必选参数可选值限定在REGISTRY键内递归查找清单时排除node_modules目录第 129 行对每个名字给出三态判定CLAIMABLE (404 on public registry)、present on public registryHTTP 200或unknown (HTTP code)其中只有 200 会从 findings 中排除第 146-149 行即网络失败也不放过宁可误报不可漏报若检测到confused可执行文件run_confused()第 99-111 行会为每个清单自动调用confused -l eco [-s secure] manifest并把输出打印出来供人工交叉比对--output指定 JSON 报告路径报告结构为{ecosystem, root, findings}每个 finding 含manifest、name、status、verdict四个字段方便下游工具解析与追踪。命令与 API 参考速查完整的命令参数表见 references/api-reference.md核心速查如下。confusedvisma-prodsec/confused安装go install github.com/visma-prodsec/confusedlatest语法confused [-l LANGUAGE] [-s SECURE_NAMESPACES] [-v] MANIFEST标志取值 / 示例说明-lnpm默认、pip、mvn、composer、rubygems选择包生态 / 清单类型-sacme/*,acme-internal/*逗号分隔的已知安全命名空间支持*通配符抑制误报-v标志详细输出打印每次注册表查询OWASP dep-scan安装pip install owasp-depscan参数示例说明--src--src $PWD源码仓库或容器镜像路径--reports-dir--reports-dir ./reportsJSON/HTML 报告输出目录--private-ns--private-ns acme,acme逗号分隔的私有命名空间检查混淆暴露--risk-audit标志深度包风险审计npm/pypi接管、typosquat、维护风险-t/--type-t nodejs限定项目类型公共注册表探测端点可认领性检查注册表端点404 的含义npmhttps://registry.npmjs.org/namescoped 包将/编码为%2f名字未注册 / 可认领PyPIhttps://pypi.org/pypi/name/json项目名空闲Maven Centralhttps://search.maven.org/solrsearch/select?qg:groupANDa:artifact空response.numFound坐标未发布RubyGemshttps://rubygems.org/api/v1/gems/name.jsonGem 未发布修复配置键生态文件关键配置npm.npmrcscope:registryprivate-url、顶层registrypippyproject.toml/pip.confindex-url内部包避免extra-index-urlMaven~/.m2/settings.xmlmirrormirrorOf*/mirrorOfComposercomposer.jsonrepositoriespackagist.org: false工具与资源清单工具用途confused检测已声明依赖的遗留空闲命名空间ConfusedDotnet对 NuGet/.NET 执行同样的检查OWASP dep-scan风险审计含--private-ns混淆检查OWASP CI/CD Top 10CICD-SEC-03 依赖链滥用控制Birsan 研究依赖混淆原始研究文章npm scopes 文档作用域到注册表固定参考验证清单代码库中所有依赖清单均已枚举对每个相关生态均运行了confused并提供了安全命名空间运行了 OWASP dep-scan--private-ns并与confused输出相互核对每个被标记的名字都已确认为可认领404或判定为误报内部作用域已在.npmrc/ pip 配置 / Maven mirror 中固定到私有注册表已审查extra-index-url与合并的虚拟源是否存在取最高版本风险为无法隔离的名字注册了占位包CI 作业在每次 push/PR 时强制执行检查发现项已记录负责人与修复状态。总结依赖混淆的修复不是一次性动作而是一套持续运行的攻击面管理程序用confused与 OWASPdep-scan持续枚举可认领的内部包名用真实注册表探测404 判据三线确认再用.npmrc、pip索引、Maven mirror 与 Composer 仓库配置把内部命名空间从机制上绑定到私有源最后以占位包注册与 CI 门禁收尾。本仓库技能目录中的 SKILL.md、api-reference.md 与 agent.py 提供了开箱即用的完整方案可直接复制进你的供应链安全基线。【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考