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, 二进制载荷, 依赖安全, 关键词优化, 凭证泄露, 功能标志, 危险文件, 危险脚本, 恶意依赖, 泄漏检测, 源映射泄露, 类型劫持, 逆向工具, 锁定文件审计, 零依赖, 预发布扫描