danielwanwx/leakwall
GitHub: danielwanwx/leakwall
LeakWall 是一个用于 npm/pip 包的预发布供应链安全扫描器,能在发布前检测源码泄露、凭证与恶意依赖。
Stars: 12 | Forks: 2
# LeakWall
npm 和 pip 包的预发布供应链安全扫描器。零依赖。
源于供应链崩溃的一周:**axios 被植入木马**(通过 postinstall 的 RAT)、**telnyx 被篡改**(WAV 隐写载荷)、**Claude Code 源码泄露**(npm 中的 60MB sourcemap)——全部发生在 7 天之内。LeakWall 在你发布前捕获这些问题。
## 安装
```
pip install leakwall
```
## 快速开始
```
# 扫描项目后再发布
leakwall .
# 扫描已构建的软件包
leakwall dist/
leakwall my-package-1.0.0.tar.gz
leakwall my_package-1.0.0-py3-none-any.whl
# CI 模式(JSON 输出,高风险及以上失败)
leakwall --json --fail-on high .
```
## 检测能力
### 9 大检测类别
| 类别 | 检测内容 | 严重等级 |
|----------|----------------|----------|
| **Source Map 泄露** | `.js.map` 文件、内联 `sourceMappingURL`、外部引用 | 严重 |
| **凭证泄露** | API 密钥(Anthropic/OpenAI/GitHub/AWS/Slack/npm)、私钥、硬编码密码 | 严重 |
| **被篡改的依赖** | 已知恶意版本(axios@1.14.1、telnyx@4.87.1 等)通过实时威胁情报检测 | 严重 |
| **锁文件审计** | package-lock.json、pnpm-lock.yaml、yarn.lock、Pipfile.lock、uv.lock、poetry.lock 中的被篡改版本 | 严重 |
| **拼写劫持** | 通过编辑距离检测与流行包高度相似的包名(`axois`、`reqeusts`、`lodashe`) | 高 |
| **二进制载荷** | PE/ELF/Mach-O 可执行文件、嵌入在 `.node`/`.so`/`.dll`/`.wasm` 文件中的脚本 | 高 |
| **危险文件** | `.env`、`.pem`、`.key`、`.npmrc`、`.pypirc`、`credentials.json` | 高 |
| **危险脚本** | postinstall 中的 `curl \| bash`、`eval(base64...)`、install 钩子中的 `child_process` | 高 |
| **特性标记** | `feature("KAIROS")`、`INTERNAL_*` 环境变量、`__DEBUG__` 常量、`dangerouslyDisable*` | 中 |
### 实时威胁情报源
LeakWall 不依赖硬编码列表。它从多个来源拉取数据:
```
Built-in (18 known malicious packages)
+ GitHub-hosted JSON (updated without release)
+ OSV.dev API (Google's vulnerability database)
= Always up-to-date
```
```
# 强制刷新安全咨询缓存后再扫描
leakwall --refresh .
# 检查软件包版本与实时注册表
leakwall --online .
```
威胁情报缓存:`~/.cache/leakwall/advisories.json`(24 小时 TTL,自动刷新)。
### 锁文件支持
扫描 **全部 6 种主流锁文件格式** 中的传递性依赖:
| 锁文件 | 生态 |
|----------|-----------|
| `package-lock.json` | npm |
| `pnpm-lock.yaml` | pnpm |
| `yarn.lock` | Yarn |
| `Pipfile.lock` | Pipenv |
| `uv.lock` | uv |
| `poetry.lock` | Poetry |
### 拼写劫持检测
对依赖名称使用 Levenshtein 距离与 40 个流行 npm/pypi 包进行比对。捕获:
- 字符交换:`axois`(axios)、`reqeusts`(requests)
- 后缀攻击:`expresss`、`lodashjs`
- 组合攻击:与流行包编辑距离在 2 以内的任意名称
### 智能误报抑制
- 测试文件(`tests/`、`test_*.py`)中的凭证发现自动降为 INFO 级别
- 常见占位符值(`"test-key"`、`"placeholder"`、`"example"`)直接跳过
- 始终跳过 `node_modules/`、`.git/`、`.venv/` 目录
## CLI 参考
```
leakwall Scan directory, .tar.gz, .tgz, or .whl
Options:
--json Output results as JSON
--fail-on {critical,high,medium}
Exit non-zero at this severity (default: high)
--refresh Refresh advisory cache before scanning
--online Check registry for yanked/unpublished versions
```
## CI 集成
### GitHub Actions
```
name: Security
on: [push, pull_request]
jobs:
leakwall:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with: { python-version: "3.11" }
- run: pip install leakwall
- run: leakwall --fail-on high .
```
### 预发布钩子(npm)
```
{
"scripts": {
"prepublishOnly": "leakwall ."
}
}
```
### 预发布钩子(Python)
```
# pyproject.toml(使用 hatch)
[tool.hatch.build.hooks.custom]
pre-build = "leakwall ."
```
## 示例输出
```
LeakWall Scan: ./my-package
Files scanned: 142
Duration: 230ms
[CRIT] Source map reference found -- exposes original source code
dist/index.js:7601
Match: //# sourceMappingURL=index.js.map
[CRIT] COMPROMISED: axios@1.14.1 is a known malicious version
package-lock.json (lockfile)
[HIGH] Possible typosquat of 'requests': reqeusts
requirements.txt:3
[HIGH] Windows PE executable found in package
vendor/helper.node
LeakWall [FAILED]: 2 critical, 2 high (142 files)
```
## 与众不同
| | LeakWall | npm audit / pip-audit | Snyk / Socket |
|---|---|---|---|
| **扫描自身包** | 是 | 否(仅扫描依赖) | 部分 |
| **Source Map 检测** | 是 | 否 | 否 |
| **凭证扫描** | 是 | 否 | 是 |
| **拼写劫持** | 是 | 否 | 是(付费) |
| **二进制载荷** | 是 | 否 | 部分 |
| **锁文件审计** | 是 | 是 | 是 |
| **特性标记检测** | 是 | 否 | 否 |
| **零依赖** | 是 | 否 | 否 |
| **离线可用** | 是(内置列表) | 否 | 否 |
| **免费** | 是 | 是 | 免费(有付费层) |
## 贡献
欢迎提交威胁情报更新。编辑 `data/compromised.json` 并打开 PR —— 对所有使用 `--refresh` 的用户立即生效,无需新发布。
## 许可证
MIT
标签:CI 安全, npm 扫描, pip 扫描, SEO, 二进制载荷, 依赖安全, 关键词优化, 凭证泄露, 功能标志, 危险文件, 危险脚本, 恶意依赖, 泄漏检测, 源映射泄露, 类型劫持, 逆向工具, 锁定文件审计, 零依赖, 预发布扫描