maxgfr/package-checker.sh

GitHub: maxgfr/package-checker.sh

一款零依赖的轻量级 shell 脚本,用于检测 Node.js/Bun/Deno 项目中的 vulnerable npm 依赖包。

Stars: 3 | Forks: 0

# package-checker.sh 一款灵活、轻量的 shell 脚本,用于检测存在漏洞的 npm 包。内置 GHSA 和 OSV 漏洞源,包含 200,000+ 条漏洞数据,也支持使用自定义数据库。 ## 📦 概述 **package-checker.sh** 可扫描您的 JavaScript/TypeScript 项目中的漏洞依赖。支持 npm、Yarn、pnpm、Bun 和 Deno 项目。 ### 核心功能 - **内置漏洞源**:包含 GHSA 和 OSV 源,涵盖 200,000+ 条 npm 漏洞(每 12 小时自动更新) - **提供 Docker 镜像**:完整镜像(约 43MB,含数据源)或轻量镜像(约 27MB) - **自定义数据源**:添加您自己的 JSON、CSV 或 PURL 漏洞列表 - **扫描器集成**:导入外部工具生成的 SARIF、SBOM 或 Trivy JSON - **版本范围**:支持定义如 `>=1.0.0 <2.0.0` 的范围,无需列出每个版本 - **多包管理器支持**:全面支持 npm、Yarn (Classic & Berry/v2+)、pnpm、Bun 和 Deno - **GitHub 集成**:直接从 GitHub 扫描整个组织或单个仓库 - **零依赖**:仅需 `bash`、`awk` 和 `curl` - **灵活配置**:支持使用 CLI 参数或 `.package-checker.config.json` 配置文件 ### 前置条件 - **bash** — Shell 解释器 - **awk** (gawk 或 mawk) — 通常已预装 - **curl** — 用于访问远程源和 GitHub API - 或者使用 Docker 镜像(无需安装) ## 🚀 快速开始 ### 方式 1:Homebrew 安装(推荐 macOS/Linux 使用) 安装和使用 `package-checker` 的最简单方法: ``` # 安装 package-checker brew install maxgfr/tap/package-checker # 直接使用(自动使用默认 GHSA feed) package-checker # 或显式指定 GHSA feed package-checker --default-source-ghsa # 或同时使用 GHSA 和 OSV feeds package-checker --default-source-ghsa-osv # 检查特定 package 版本 package-checker --package-name express --package-version 4.17.1 # 使用自定义漏洞文件扫描 package-checker --source custom-vulns.json ``` ### 方式 2:一键安装并运行(最快) 配合您自己的漏洞数据,直接从网络运行: ``` # 使用远程漏洞源运行 curl -sS https://raw.githubusercontent.com/maxgfr/package-checker.sh/main/script.sh | bash -s -- --source https://raw.githubusercontent.com/maxgfr/package-checker.sh/refs/heads/main/data/ghsa.purl # 或使用本地源文件 curl -sS https://raw.githubusercontent.com/maxgfr/package-checker.sh/main/script.sh | bash -s -- --source ./vulns.json ``` ### 方式 3:使用 Docker 获取内置漏洞源最简单的方法: ``` # 扫描当前目录(自动使用默认 GHSA feed) docker run -v $(pwd):/workspace ghcr.io/maxgfr/package-checker.sh:latest # 或显式使用 GHSA feed docker run -v $(pwd):/workspace ghcr.io/maxgfr/package-checker.sh:latest --default-source-ghsa # 或同时使用 GHSA 和 OSV feeds 以获得全面覆盖 docker run -v $(pwd):/workspace ghcr.io/maxgfr/package-checker.sh:latest --default-source-ghsa-osv # 扫描特定子目录 docker run -v $(pwd):/workspace ghcr.io/maxgfr/package-checker.sh:latest /workspace/my-project --default-source-ghsa-osv # 配合您自己的数据文件使用 docker run -v $(pwd):/workspace ghcr.io/maxgfr/package-checker.sh:latest --source my-vulns.json ``` ### 基本用法示例 ``` # 扫描当前目录(自动使用默认 GHSA source) package-checker # 扫描特定目录(相对或绝对路径) package-checker ./my-project package-checker /absolute/path/to/project # 同时使用 GHSA 和 OSV sources 以获得全面覆盖 package-checker --default-source-ghsa-osv # 仅使用 OSV source 而非默认 GHSA package-checker --default-source-osv # 检查特定 package 版本 package-checker --package-name express --package-version 4.17.1 # 使用版本范围检查 package-checker --package-name lodash --package-version '^4.17.0' # 使用自定义漏洞文件扫描 package-checker --source custom-vulns.json # 使用自定义 source 扫描特定文件夹 package-checker ./subfolder --source custom-vulns.json # 多 sources(内置 + 自定义) package-checker --default-source-ghsa-osv --source custom-vulns.csv # 使用配置文件 package-checker --config .package-checker.config.json # 扫描 GitHub organization package-checker --default-source-ghsa-osv --github-org myorg --github-token $GITHUB_TOKEN ``` ## 👀 命令行选项 ``` ARGUMENTS: PATH Directory to scan (default: current directory) Can be relative (./my-project) or absolute (/path/to/project) OPTIONS: -h, --help Show help message -s, --source SOURCE Vulnerability source (repeatable for multiple sources) --default-source-ghsa Use default GHSA source (default if no source specified) --default-source-osv Use default OSV source --default-source-ghsa-osv Use both default GHSA and OSV sources (recommended for comprehensive coverage) -f, --format FORMAT Data format: json, csv, purl, sarif, sbom-cyclonedx, or trivy-json (auto-detected from extension) --csv-columns COLS CSV columns: "name,versions" or "1,2" --package-name NAME Check vulnerability for a specific package name --package-version VER Check specific version (requires --package-name) -c, --config FILE Path to configuration file --no-config Skip loading configuration file --export-json FILE Export vulnerability results to JSON format (default: vulnerabilities.json) --export-csv FILE Export vulnerability results to CSV format (default: vulnerabilities.csv) --github-org ORG GitHub organization to scan --github-repo owner/repo Single GitHub repository to scan --github-token TOKEN GitHub token (or use GITHUB_TOKEN env var) --github-output DIR Output directory for fetched files (default: ./packages) --github-only Only fetch from GitHub, skip local analysis --create-multiple-issues Create one GitHub issue per vulnerable package (requires --github-token) --create-single-issue Create a single consolidated issue with all vulnerabilities (requires --github-token) --fetch-all DIR Fetch all vulnerability feeds (osv.purl, ghsa.purl) to specified directory --fetch-osv FILE Fetch OSV vulnerability feed to specified file --fetch-ghsa FILE Fetch GHSA vulnerability feed to specified file --only-package-json Scan only package.json files (skip lockfiles) --only-lockfiles Scan only lockfiles (skip package.json files) --lockfile-types TYPES Comma-separated list of lockfile types to scan (npm, yarn, pnpm, bun, deno) ``` ## ⚙️ 数据格式与配置 package-checker.sh 支持多种漏洞数据格式: ### 支持的格式 **内置源(推荐):** - `data/ghsa.purl` - GitHub Security Advisories(约 5,000 条漏洞) - `data/osv.purl` - Open Source Vulnerabilities(约 207,000 条漏洞) **自定义格式:** - **JSON** - 带版本范围的简单键值格式 - **CSV** - 表格格式 - **PURL** - Package URL 标准格式 - **SARIF** - 静态分析结果(Trivy, Semgrep, CodeQL) - **SBOM CycloneDX** - 软件物料清单 - **Trivy JSON** - 原生 Trivy 输出格式 ### 快速示例 **JSON 格式:** ``` { "express": { "versions": ["4.16.0", "4.16.1"], "versions_range": [">=4.0.0 <4.17.21"] } } ``` **CSV 格式:** ``` name,versions express,4.16.0 lodash,">=4.17.0 <4.17.21" ``` **PURL 格式:** ``` pkg:npm/lodash@4.17.20 pkg:npm/express@>=4.0.0 <4.17.21 pkg:npm/@babel/traverse@7.23.0 ``` **配置文件 (`.package-checker.config.json`):** ``` { "sources": [ { "source": "https://example.com/vulnerabilities.json", "name": "Company Security Database" } ], "options": { "ignore_paths": ["node_modules", ".yarn", ".git", "dist"] } } ``` 完整的格式规范请参阅 [数据格式文档](docs/data-formats.md)。 ### 扫描内容 **Lockfiles**(精确版本匹配): - `package-lock.json`, `npm-shrinkwrap.json` (npm) - `yarn.lock` (Yarn Classic & Yarn Berry/v2+) - `pnpm-lock.yaml` (pnpm) - `bun.lock` (Bun) - `deno.lock` (Deno) **package.json**(依赖检查): - `dependencies`, `devDependencies`, `optionalDependencies`, `peerDependencies` ### 过滤文件类型 默认情况下,package-checker **同时**扫描 lockfiles 和 package.json 文件。您可以控制扫描内容: **仅扫描 package.json 文件:** ``` # 跳过所有 lockfiles,仅扫描 package.json package-checker --source vulns.json --only-package-json ``` **仅扫描 lockfiles:** ``` # 跳过 package.json 文件,仅扫描 lockfiles package-checker --source vulns.json --only-lockfiles ``` **扫描特定类型的 lockfile:** ``` # 仅扫描 yarn.lock 文件 package-checker --source vulns.json --lockfile-types yarn # 仅扫描 npm 和 yarn lockfiles(跳过 pnpm, bun, deno) package-checker --source vulns.json --lockfile-types npm,yarn # 与 --only-lockfiles 结合使用 package-checker --source vulns.json --only-lockfiles --lockfile-types yarn ``` 可用的 lockfile 类型:`npm`, `yarn`, `pnpm`, `bun`, `deno` ### 导出结果 您可以将扫描结果导出为 JSON 或 CSV 格式,以便进一步分析、报告或与其他工具集成。 **导出为 JSON:** ``` # 使用自定义文件名导出 package-checker --source vulns.json --export-json results.json ``` **导出为 CSV:** ``` # 使用自定义文件名导出 package-checker --source vulns.json --export-csv results.csv ``` **同时导出两种格式:** ``` package-checker --source vulns.json --export-json output.json --export-csv output.csv ``` **JSON 导出格式:** JSON 导出包含详细的漏洞元数据信息: ``` { "vulnerabilities": [ { "package": "express@4.16.0", "file": "./package-lock.json", "severity": "medium", "ghsa": "GHSA-rv95-896h-c2vc", "cve": "CVE-2022-24999", "source": "ghsa" } ], "summary": { "total_unique_vulnerabilities": 5, "total_occurrences": 12 } } ``` **CSV 导出格式:** CSV 导出以表格格式包含相同的元数据: ``` package,file,severity,ghsa,cve,source express@4.16.0,./package-lock.json,medium,GHSA-rv95-896h-c2vc,CVE-2022-24999,ghsa lodash@4.17.20,./package-lock.json,high,GHSA-p6mc-m468-83gw,CVE-2020-8203,ghsa ``` **注意:** - 导出内容仅包含发现漏洞的包 - 当漏洞数据库中存在相应信息时,将包含元数据字段 - 有关向漏洞源添加元数据的详细信息,请参阅 [数据格式文档](docs/data-formats.md) ## 🔄 CI/CD 集成 使用可复用的 GitHub Actions 工作流实现零配置漏洞扫描: ``` name: Security Check on: push: branches: [ main ] pull_request: workflow_dispatch: schedule: - cron: '0 0 * * 1' # Weekly on Monday jobs: vulnerability-check: uses: maxgfr/package-checker.sh/.github/workflows/reusable-check.yml@main with: use-osv: true # Add OSV in addition to default GHSA fail-on-vulnerabilities: true ``` **优势:** - 无需安装或配置 - 默认使用内置 GHSA 源(每 12 小时自动更新,包含 200,000+ 条漏洞) - 可选添加 OSV 源以获得更全面的覆盖 - 支持 npm、Yarn、pnpm、Bun 和 Deno 项目 - 在 PR 检查中自动生成安全报告 更多示例以及其他 CI 系统(GitLab CI 等),请参阅 [CI/CD 集成文档](docs/ci.md)。 ## 🧑‍💻 GitHub 集成 **扫描整个组织:** ``` package-checker --github-org myorg --github-token ghp_xxx --source vulns.json ``` **扫描单个仓库:** ``` # 公开 repo(无需 token) package-checker --github-repo owner/repo --source vulns.json # 私有 repo(需要 token) package-checker --github-repo owner/private-repo --github-token ghp_xxx --source vulns.json ``` **仅获取(不进行分析):** ``` package-checker --github-org myorg --github-token ghp_xxx --github-only --github-output ./packages ``` **自动为漏洞创建 GitHub Issues:** ``` # 为每个有漏洞的 package 创建一个 issue package-checker --github-org myorg --github-token ghp_xxx --source vulns.json --create-multiple-issues # 创建包含所有漏洞的单个汇总 issue package-checker --github-repo owner/repo --github-token ghp_xxx --source vulns.json --create-single-issue ``` **Issue 创建模式:** | 标志 | 描述 | |------|-------------| | `--create-multiple-issues` | 为**每个有漏洞的包创建一个 Issue**,包含详细的漏洞信息 | | `--create-single-issue` | 创建**一个合并的 Issue**,在单个报告中包含所有漏洞 | 两种模式均包含: - 带有视觉指示器的严重级别 (🔴 Critical, 🟠 High, 🟡 Medium, 🟢 Low) - GHSA 公告和 CVE 详情链接 - 受影响的文件和版本 - 修复建议 - 自动标记 `security`、`vulnerability` 和 `dependencies` 标签 **注意:** 两个标志都需要具有 `repo` 权限的 GitHub token 才能创建 Issue。 ## 😎 直接查询包 您**无需数据源或扫描项目**即可检查特定的包或版本是否存在漏洞: ``` # 检查特定版本是否有漏洞 package-checker --package-name next --package-version 16.0.3 # 使用版本范围检查 package-checker --package-name lodash --package-version '^4.17.0' # 列出 package 在您项目中的所有出现位置 package-checker --package-name express ``` 此功能会在内部创建一个虚拟 PURL 并在您的项目中扫描它。 **使用场景:** - 安装前检查:“在我执行 `npm install` 之前,这个版本安全吗?” - 快速查询:“正在使用这个包的哪些版本?” - 安全研究:“这个有漏洞的包在我的代码库的什么位置?” - 版本范围测试:“`^4.17.0` 是否覆盖了有漏洞的版本?” **支持的版本范围:** - 精确版本:`1.2.3` - 大于/小于:`>=1.0.0 <2.0.0` - 波浪号范围:`~1.2.3` (等同于 `>=1.2.3 <1.3.0`) - 插入号范围:`^1.2.3` (等同于 `>=1.2.3 <2.0.0`) - 通配符:`*` (匹配任何版本) ## 📚 文档与资源 更多详细信息,请参阅 [`docs/`](docs/) 目录: - **[为什么选择 package-checker.sh?](docs/why.md)** — 了解此工具存在的原因及其如何补充其他漏洞扫描器 - **[Docker 使用指南](docs/docker.md)** — 使用 Docker 镜像的完整指南 - **[数据格式](docs/data-formats.md)** — JSON、CSV、PURL 格式的完整规范 - **[漏洞源](docs/vulnerability-feeds.md)** — 内置 GHSA/OSV 源指南及生成自定义源 - **[漏洞扫描工具](docs/vulnerability-scanning-tools.md)** — Trivy、Grype、Syft、OSV-Scanner 及其他工具指南 - **[配置](docs/configuration.md)** — 详细配置参考 - **[GitHub 集成](docs/github.md)** — 高级 GitHub 扫描功能 - **[CI/CD 集成](docs/ci.md)** — GitHub Actions、GitLab CI 等示例 - **[测试](docs/testing.md)** — 测试指南、固件和示例 - **[贡献](docs/contributing.md)** — 开发工作流、提交规范和版本管理 ### 应用场景 - **安全团队**:维护内部漏洞数据库 - **合规性**:执行公司特定的安全策略 - **CI/CD 流水线**:自动化漏洞检查 - **应急响应**:安全事件期间的快速扫描 - **供应链安全**:监控跨多个项目的依赖项 ## 📄 许可证 MIT 许可证 — 详情请参阅 [`LICENSE`](LICENSE) 文件。 **有问题或遇到问题?** 请在 [GitHub](https://github.com/maxgfr/package-checker.sh/issues) 上提交 Issue。
标签:Bun, Cutter, Deno, GHSA, GNU通用公共许可证, IP 地址批量处理, JavaScript安全, LNA, Node.js, NPM包安全, OSV, SARIF, SBOM, Shell脚本, TypeScript, Vercel, 子域名暴力破解, 安全可观测性, 安全插件, 应用安全, 文档安全, 暗色界面, 版本控制, 硬件无关, 系统独立性, 自动化检测, 请求拦截, 零依赖