供应链安全实战:基于 typomania 与 OSSGadget 的依赖包 Typo 仿冒(Typosquatting)检测 API 与命令全参考 供应链安全实战基于 typomania 与 OSSGadget 的依赖包 Typo 仿冒Typosquatting检测 API 与命令全参考【免费下载链接】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本指南以仓库 skills/detecting-typosquatting-packages 技能模块的 API 与命令参考文档为核心系统梳理检测 npm、PyPI、crates.io 三大生态中仿冒依赖包的四个层次工具链typomania 库与 Harness API、OSSGadgetoss-find-squats、pypi-scan以及用于人工研判的注册表元数据端点与风险评分信号。读完本文你将掌握在安装依赖前、PR 合入前、AI 生成依赖清单审计场景下如何一键生成仿冒候选集、交叉比对已知恶意包语料、并用年龄/下载量/安装脚本等信号完成风险打分与拦截。一、为什么需要一套「API 与命令参考」Typosquatting 检测的技术栈定位Typosquatting 是 MITRE ATTCKT1195.002Supply Chain Compromise: Compromise Software Supply Chain的典型投递方式攻击者注册一个与热门合法包仅一字之差的包reqeusts之于requests、loadsh之于lodash开发者手滑、复制被投毒的教程命令或信任 AI 生成的依赖清单即 slopsquatting 变体时就会把仿冒包装进环境。由于 npm 的postinstall、PyPI 的setup.py构建钩子会在安装时自动执行载荷会以开发者权限即刻运行。防御侧的工作在安装前完成先用名称变异原语mutation primitives从合法包名生成候选仿冒集再把候选名与热门包语料比对最后用注册表元数据研判。这个流程横跨 Rust、Go、Python 三套工具因此一份准确的 API/命令参考是让流程可复制、可自动化的前提。仓库技能模块给出了三份配套文档SKILL.md完整工作流与背景第 17 步references/api-reference.md本文主体即 API/命令/端点/评分信号速查表references/standards.mdMITRE ATTCK 与 NIST CSF 2.0 的映射依据。授权使用提示本技能仅用于防御性供应链安全、包筛查与授权研究。仅可对你被允许规模化查询的注册表、以及为你所在组织评估的包使用语料匹配与注册表查询技术大规模自动化抓取注册表可能违反其服务条款见 SKILL.md 顶部声明。二、typomaniaRust 侧检测库的 API 参考typomania 是 Rust Foundation 维护的 typosquat 检测库也是学术工具 typogardDefending Against Package TyposquattingUniversity of Kansas的 Rust 移植目前支撑着 crates.io 的实时仿冒检查。其核心 API 抽象如下表Item说明Harness主结构体Harness::check(name)将候选名与语料库逐一比较Corpustrait实现它即可为任意注册表提供「热门合法名」参考集Packagetrait实现它可将某个包的名称/元数据暴露给 Harnessrayonfeature默认启用跨大量包并行化Harness::checkcargo run --example registry针对一个伪造注册表运行内置示例这种「双 trait 主结构体」的设计把检测算法与数据源解耦检测逻辑Harness 变异原语与数据供给Corpus完全分离因此接入新生态只需实现一套Corpus。rayon默认开启意味着对大型语料如 top-5000 包逐名比对时无需手动多线程改造。构建与运行示例git clone https://github.com/rustfoundation/typomania cd typomania cargo build --release cargo run --example registry # 演示 Harness 对一个伪造注册表的检测结合仓库自带脚本可直观复现同款原语见下文第五节验证Harness::check背后到底检查了什么。三、OSSGadgetoss-find-squats跨生态仿冒探测命令参考Microsoft OSSGadget 的oss-find-squats面向真实注册表工作它查询目标注册表、生成给定包的名称变异并报告哪些变异名已作为包发布存在。命令速查命令用途oss-find-squats pkg:npm/name生成某个 npm 包的仿冒候选并报告哪些已存在oss-find-squats pkg:pypi/name同上针对 PyPIoss-find-squats pkg:cargo/name同上针对 crates.iooss-find-squats --quiet purl抑制非命中非发现输出Package URLpurl格式为pkg:type/namespace/nameversion。注意namespace段在无命名空间如 PyPI 包、crates.io 包时可直接省略。典型用法分两个方向与 SKILL.md 的 Step 3 对应# 正向以合法包为起点找哪些仿冒名真实存在于注册表 oss-find-squats pkg:npm/lodash oss-find-squats pkg:pypi/requests # 反向给定可疑名找出它在仿冒哪个合法包 oss-find-squats --quiet pkg:npm/loadsh--quiet在反向筛查场景尤其有用你手上是一个待审的可疑依赖名只需要输出命中结论不需要噪声。四、pypi-scanPyPI 仿冒枚举器命令参考IQTLabs 的 pypi-scan 聚焦 PyPI 生态命令速查命令用途python pypi_scan.py -p package查找某个包的可疑仿冒名python pypi_scan.py -n N扫描下载量最高的前 N 个 PyPI 包寻找已存在的仿冒git clone https://github.com/IQTLabs/pypi-scan cd pypi-scan pip install -r requirements.txt # 针对单个包 python pypi_scan.py -p requests # 批量扫描 top-50 热门包 python pypi_scan.py -n 50-n模式适合做常态化巡检定时扫一遍最新 top 榜-p模式适合接到某个依赖新增请求时的单点核查。五、注册表元数据端点仿冒研判的数据来源仅凭名字相似不能定罪——必须用元数据佐证「年轻、低下载、带安装脚本」这些攻击者特征。官方参考给出五个端点端点返回内容https://registry.npmjs.org/pkg完整 npm 包文档time、maintainers、versions、scriptshttps://api.npmjs.org/downloads/point/last-week/pkgnpm 周下载量https://pypi.org/pypi/pkg/jsonPyPI 的 info、releases、author、urlshttps://crates.io/api/v1/crates/pkgcrates.io crate 元数据需带 User-Agenthttps://registry.npmjs.org/-/v1/search?text...popularity1.0npm 热门度搜索其中 crates.io 强制要求合法 User-Agent否则返回 403npm search 接口的popularity1.0让结果按下载热度排序可直接用于构建「热门名语料」。这三类端点在技能工作流 Step 5元数据富化中的实战形态为# npm取创建时间与最新版安装脚本 curl -s https://registry.npmjs.org/loadsh | \ python -c import sys,json;djson.load(sys.stdin);vd[dist-tags][latest];print(created:,d[time][created]);print(scripts:,d[versions][v].get(scripts,{})) # npm周下载量 curl -s https://api.npmjs.org/downloads/point/last-week/loadsh # PyPI作者与发布历史 curl -s https://pypi.org/pypi/reqeusts/json | \ python -c import sys,json;djson.load(sys.stdin);id[info];print(i[name],i[author],i[home_page]);print(releases:,list(d[releases].keys()))六、风险评分信号从「名字可疑」到「判定高风险」官方参考把富化后的元数据归纳为一张可落地的评分表信号高风险取值与热门名的编辑距离Edit distance1–2包年龄Package age 90 天周下载量 1000安装脚本存在preinstall/postinstall或setup.py中出现网络请求维护者重叠与合法包维护者不同仓库地址缺失或指向合法项目冒名顶替组合逻辑对应 SKILL.md Step 6高风险的判定 与热门名编辑距离小 且包龄 90 天 或 下载量 1000 或 含 postinstall/preinstall/setup 期网络调用。随后用 ecosyste-ms 的已知仿冒数据集交叉验证grep -i loadsh typosquatting-dataset/data/*.csv确证恶意性需在沙箱/虚拟机中检查安装脚本与源码压缩包——绝不要在开发机上npm install或pip install可疑包。七、仓库自带脚本把参考 API 落地为可执行的筛查工具仓库在 scripts/agent.py 中提供了纯标准库stdlib-only的实现将上文全部参考 API 折叠成三个子命令可直接对接 CI/CD# 查看某个合法名的完整变异集对应 typomania 变异原语 python agent.py mutate --name requests # 用热门语料筛查候选名对应 Harness::check Corpus python agent.py screen --ecosystem pypi --corpus top-pypi-packages.json --name reqeusts # 从 stdin 读取依赖变更如 requirements.txt 的 diff批量筛查 git diff | python agent.py screen --ecosystem npm --corpus npm-top.json --stdin # 拉取注册表元数据富化对应第五节端点 python agent.py enrich --ecosystem pypi --name reqeusts与参考文档互相印证的三个实现细节值得展开变异原语逐条复现mutations()agent.py源码实现了省略、重复、相邻字符换位、QWERTY 键盘相邻键替换内置QWERTY_ADJ邻接表agent.py、分隔符互换-/_/./空、复合名词换序以及js/py/lib/cli/2/-ng等常见后缀拼接——与 SKILL.md 中列出的 9 类变异原语一一对应编辑距离阈值screen_name()agent.pyLevenshtein 距离默认阈值为 2且要求名字长度差不超过阈值命中结果按距离升序输出输出形如[FLAG] cand - resembles legit(d1)命中任意候选即返回非零退出码天然适合作为 CI 拦截闸门语料格式自适应load_corpus()agent.py兼容 top-pypi-packages 的rows结构、npm search 的objects结构、纯列表与纯字典——对应第三节语料构建命令的多种输出形态。该脚本的设计与参考文档的评分表直接对齐screen输出近邻命中的距离enrich返回created、maintainers、scripts、repository、home_page等字段正是第六节评分信号的输入。需要强调agent.py 的网络调用基于urllib且带默认超时20 秒HTTP 404 会被捕获并返回error字段——这意味着对不存在的名字做 enrich 不会中断流程可安全用于批处理。八、拼装为 CI/CD 拦截门参考文档的最终落地形态将各层参考 API 组装即得到 SKILL.md Step 7 的阻断式门禁——在每个 PR 引入新依赖时自动筛查利用screen --stdin的非零退出码# .github/workflows/typosquat-gate.yml name: typosquat-gate on: [pull_request] jobs: screen: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Screen new dependencies run: | git diff origin/${{ github.base_ref }}...HEAD -- package.json requirements.txt \ | grep ^ | python scripts/agent.py screen --ecosystem npm --corpus top.json --stdingrep ^只取新增行screen --stdin自动剥离引号、逗号与-:^~等依赖声明符号后逐个筛查。命中即退出码 1PR 被拦截需人工走 Step 6 研判流程。九、最佳实践与要点总结三个工具分层使用typomania 适合在自有语料上做大规模离线比对oss-find-squats适合针对真实注册表做「哪些仿冒名已存在」的实况探测pypi-scan 覆盖 PyPI 生态的 top-N 常态化巡检。三者可以串成「语料比对 → 存在性确认 → 元数据富化」的完整链路。语料是检测上限无论用top-pypi-packages、npmpopularity1.0搜索还是 crates.io 下载量排序SKILL.md Step 1语料必须覆盖你生态的热门包否则编辑距离比对无从谈起crates.io 请求务必携带 User-Agent。评分信号缺一不可编辑距离 1–2 仅是初筛年龄 90 天、周下载 1000、安装脚本含网络行为、维护者不同、仓库地址缺失或冒名这些信号叠加才能把「名字像」升级为「高风险」同时压制合法 fork 与 scoped 包这类误报对应 SKILL.md 的 Validation Criteria。把参考表变成流水线仓库的 agent.py 将全部参考 API 收敛为三个可编程子命令配合非零退出码即可零成本接入 GitHub Actions 等 CI 平台对 AI 生成的依赖清单slopsquatting 场景尤其建议在合入前全量过一遍screen。相关文档与验证依据技能主文档与完整 7 步工作流SKILL.md标准与威胁模型映射MITRE T1195.002 / NIST ID.RA-09references/standards.md筛查辅助脚本源码scripts/agent.py参考文档自身references/api-reference.md依赖包的 typosquatting 是当前供应链攻击成本最低、命中率最高的入口之一以上 API 与命令参考提供了从「名字相似」到「元数据坐实」再到「CI 自动拦截」的完整可操作路径。【免费下载链接】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),仅供参考