leitwacht/malicious-packages
GitHub: leitwacht/malicious-packages
Leitwacht 发布的恶意 npm 包 CC0 开源威胁情报数据库,采用 OSV 格式,可被 osv-scanner 等工具直接消费以在构建阶段拦截恶意依赖安装。
Stars: 1 | Forks: 0
# Leitwacht malicious-packages
由 [Leitwacht](https://leitwacht.eu) 检测到的恶意 npm 包的公开、**宽松许可** ([CC0-1.0](./LICENSE)) 数据源,采用 [OSV](https://ossf.github.io/osv-schema/) 格式 — 这是一个 CC0 OSV **源数据库**,可被 `osv-scanner` / `deps.dev` 消费,并可供 `osv.dev` 摄取。
采用 CC0 协议发布,因此它可以被 OSV 吸收并嵌入到任何地方,且不会给消费者带来任何归属或许可负担。
## 这里面有什么
记录位于 `osv//.json` 路径下,其中 id 是我们自己的 **`LWA-YYYY-NNNN`**(“Leitwacht Advisory”)—— 因此仅凭 id 就可以推导出记录的路径。根目录下的 [`index.json`](./index.json) 将每个 id 映射到其文件、包,以及(一旦 OSV 分配了的话)规范的 `MAL-YYYY-NNNN`,我们会将其导入到记录的 `aliases` 中。每条记录都永久链接到其在 `https://threatintel.leitwacht.eu/d/` 的详细报告。
这些记录**在构建上具有高精度**:只有在从包源本身独立验证了其不良行为之后,才会在此处命名某个包。
该数据源**仅记录后续内容**,且记录具有**粘性** —— 一旦某个包拥有了 `LWA-` 记录,它就会被保留,只有在其 [下架请求](https://threatintel.leitwacht.eu/policy#dispute) 得到支持时才会被移除(标记为 `withdrawn`,绝不会无声无息地被删除)。
**范围 —— 任何你都不希望安装的东西。** 每条记录都包含一个 `database_specific.leitwacht.category`,以便你分辨*它到底是什么*:
- `malware` — 攻击者植入的恶意代码(凭据/钱包窃取、后门、木马投放器、安装时 RCE);
- `dependency_confusion` — 名称/作用域抢注,其 payload 来自不受信任的外部来源(获取的 tarball 或被命名为恶意的依赖项),而不是直接植入在包本身中;
- `pua` — 风险软件(代理软件、远程二进制执行、挖矿程序、强制遥测);
- `research_poc` — 安全研究 / 概念验证包。
所有这些都表现出你绝对不希望在构建过程中运行的行为 —— 这就是底线。我们对每一项进行**基于事实的**描述,绝不会将研究 PoC 定性为犯罪恶意软件。CWE 标签在类别上是准确的:`malware` 带有 **CWE-506**(植入恶意代码);`dependency_confusion` 带有 **CWE-829**(包含来自不受信任控制范围的功能 —— 代码是从外部依赖项/tarball 中拉取的,并非植入于此);`pua` 和 `research_poc` 不带有 CWE。请注意,OSV 消费者会拦截*所有*记录,无论其类别如何;该标签是为了向人类说明情况,而不是为了降低其严重程度。
被刻意**排除在外**的内容:空壳 / 无代码的命名空间预留(不含任何可执行内容交付,因此安装时不会发生任何事情),以及良性发布者意外造成的凭据泄露(这是一种需要轮换的真实暴露风险 —— 而非攻击你的包)。所有通过门槛的检测都会被发布 —— 包括 OSV 已经覆盖的那些:我们会发布我们自己独立的第一方记录,并将 OSV 的 `MAL-` id 导入到 `aliases` 中作为交叉引用。OSV 已覆盖绝不被用作省略记录的理由;一旦发布,该记录即具有粘性并被保留。
发布的文本已经过净化处理:移除了泄露的机密、对 IOC 进行了脱敏处理、且不含任何个人数据。
## 使用它来拦截安装
预构建的 osv-scanner 离线 DB 作为滚动发布的 **Release** 资产进行发布(不放入 git 中,以保持代码库的精简)。获取它并离线校验你的 lockfile:
```
base=https://github.com/leitwacht/malicious-packages/releases/download/db-latest
mkdir -p leitwacht-osv/osv-scanner/npm && cd leitwacht-osv/osv-scanner/npm
# 下载最新的离线 DB 及其签名:
curl -sSLO $base/all.zip
curl -sSLO $base/all.zip.cosign.bundle
# 在信任之前请验证其确实属于我们(无密钥 Sigstore —— 无需分发
# 密钥;签名与我们的确切构建 workflow 身份绑定):
cosign verify-blob all.zip \
--bundle all.zip.cosign.bundle \
--certificate-identity \
'https://github.com/leitwacht/malicious-packages/.github/workflows/build-offline-db.yml@refs/heads/main' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com'
# 然后进行离线扫描(osv-scanner 仅读取 all.zip,绝不读取 osv/ tree):
cd - && osv-scanner scan source --offline --local-db-path ./leitwacht-osv -L package-lock.json
```
DB 在每次重建时都使用 [Sigstore](https://www.sigstore.dev/) 无密钥签名进行签名;同时还发布了 `sha256sum -c all.zip.sha256` 用于基础的完整性校验。
要浏览或审计原始检测数据,请 `git clone` 该代码库 —— `osv/` 下的 JSON 记录是事实来源;Release 资产只是为 osv-scanner 打包的这些记录。
或者 —— 一旦此数据源被摄取为 OpenSSF 源 —— 你将自动通过 `osv.dev`、`osv-scanner`、GitHub/Dependabot 以及任何消费 OSV 的工具获取我们的检测。无需任何 Leitwacht 集成。
## 争议 / 下架
被错误标记了?检测属于研究性质,按原样发布。请在 请求更正(或提交一个 issue)。获得支持的争议将被**撤销**(即 OSV 的 `withdrawn` 字段),而不是被无声无息地删除 —— 审计跟踪会被保留,且消费者将停止强制执行它。
标签:DAST, Homebrew安装, npm生态, OSV格式, 威胁情报, 开发者工具, 恶意软件分析, 暗色界面