divisionseven/pkg-defender

GitHub: divisionseven/pkg-defender

PKG-Defender 是一个软件供应链安全工具,通过命令包装器和多源威胁情报在包安装到本地或 CI 环境前拦截恶意依赖。

Stars: 3 | Forks: 0

pkg-defender # PKG-Defender (PKGD) ### 在供应链攻击到达您的机器或 CI pipeline *之前*将其拦截 [![License](https://img.shields.io/badge/license-Apache_2.0-blue?style=plastic&logo=apache&color=black&logoColor=white&label=License)][license-badge-link] [![Python](https://img.shields.io/pypi/pyversions/pkg-defender?style=plastic&logo=python&color=black&logoColor=white&label=Python)][pypi-badge-link] [![Binary](https://img.shields.io/github/v/release/divisionseven/pkg-defender?filter=v*&style=plastic&color=black&logo=git&logoColor=white&label=Release)][github-binary-releases-link] [![Snapshot](https://img.shields.io/github/v/tag/divisionseven/pkg-defender?filter=snapshot-latest&style=plastic&logo=sqlite&logoColor=white&color=black&label=Snapshot)][github-snapshot-releases-link] [![Codecov](https://img.shields.io/codecov/c/github/divisionseven/pkg-defender?logo=codecov&style=plastic&color=black&logoColor=white&label=Codecov)][codecov-badge-link] [![Build](https://img.shields.io/github/actions/workflow/status/divisionseven/pkg-defender/ci.yml?branch=main&logo=github&style=plastic&color=black&logoColor=white&label=Build)][ci-badge-link] [![Ecosystems](https://img.shields.io/badge/Language_Packages-npm_%7C_PyPI_%7C_Cargo_%7C_RubyGems_%7C_Packagist-black?style=plastic)][ecosystems-badge-link] [![Systems](https://img.shields.io/badge/System_Packages-Homebrew_%7C_APT_%7C_Yum_%7C_DNF_%7C_Conda-black?style=plastic)][ecosystems-badge-link] [![Platforms](https://img.shields.io/badge/Platforms-macOS%20%7C%20Linux%20%7C%20Windows-black?style=plastic)][platforms-badge-link]
## 核心亮点 - **统一的命令包装器**:`pkgd [OPTIONS] MANAGER SUBCOMMAND [PACKAGE...] [MANAGER_OPTIONS...]` - 包装任何[受支持][supported-commands]的*“危险”*包管理器 命令(`pkgd pip install requests`, `pkgd npm install express`, `pkgd brew upgrade tree` 等)。 - *“危险命令”*被定义为任何有可能将软件**安装**到您机器上的包管理器命令(`install`, `update`, `download`, `add`, `sync` 等) - **自动检测管理器**:从项目文件或系统包中自动检测包管理器 - **版本检测**:适用于所有 10 个生态系统中的 18 种包管理器的 `get_installed_version()` 支持版本比较 - **失败即关闭的安全策略**:任何失败都会通过警告阻止安装,并提供知情手动覆盖的选项 - **替代 PM 覆盖**:全面[支持][supported-commands] `python -m pip`, `pipx`, `yarn`, `pnpm` 以及其他 替代管理器调用 - **冷却期闸门**:可配置的发布后保留时间窗口,支持按包、可跟踪和可审计的覆盖(默认随附 7 天) - **多来源威胁情报**:OSV.dev, GHSA, Socket.dev, npm advisories 等全部同步并存储在本地(带有自动过期检测) - **社交情报源**:Mastodon, Reddit, RSS, X/Twitter - 随附免费来源 / 可使用 B.Y.O.K. 选项(仅供参考 —— 不会拦截) - **Lock 文件审计**:支持所有主要格式:`package-lock.json`, `poetry.lock`, `requirements.txt`, `yarn.lock`, `pnpm-lock.yaml`, `uv.lock`, `Pipfile.lock` ([目前支持的格式][targeted-managers]) - **后台 Daemon**:结合 OS 原生的 launchd / systemd / Task Scheduler 自动进行后台情报源同步 - **CI/CD 集成**:在遇到 CRITICAL/HIGH 时,`--fail-on-threat` 会退出以实现安全的 pipeline 闸门控制 [完整文档索引 →][docs-index] ## 为什么会有这个项目 近期供应链攻击**极为频繁**的态势表明,恶意 package 的传播速度可以有多么快。威胁环境已经**发生了显著变化**。 有记录以来最严重的四次开源供应链攻击,全部发生在撰写本文前的最近几个月内: - **[TanStack Router][tanstack-attack]** (*2026年5月*):一种自传播蠕虫 感染了 42 个 `@tanstack/*` package 并蔓延至 npm 和 PyPI 上的另外 160 多个 package。这些恶意版本携带着*有效的 SLSA Build Level 3 溯源 证明*,这意味着业界花费数年时间构建的供应链控制机制 提供了零保护。 - **[Axios][axios-attack]** (*2026年3月*):一个与朝鲜有关的威胁行为者 攻陷了这款最受欢迎的 JavaScript HTTP 客户端(每周下载量约 1 亿次)的首席维护者账号,并发布了一款针对 macOS, Windows 和 Linux 的跨平台 RAT。受污染的版本存活了不到 3 小时。 尽管如此,依然发生了数以千计的安装。 - **[LiteLLM][litellm-attack]** (*2026年3月*):攻击者利用通过 Trivy 泄露事件窃取的 token,发布了一款被广泛部署的 AI gateway(每月下载量约 9500 万次)的后门版本。其 payload 执行了三阶段攻击: 窃取 SSH 密钥、AWS/GCP/Azure 凭证和 Kubernetes secrets -> 跨 集群横向移动 -> 安装持久化的 systemd 后门。 - **[Trivy][trivy-attack]** (*2026年3月*):世界上最流行的容器 安全扫描器被武器化。攻击者伪造了维护者的提交,推送 了一个恶意版本,并利用 Trivy 自身的 CI/CD runner 访问权限,从 每一个使用其进行扫描的下游项目中窃取发布 token —— 从而引发 了一系列后续攻击的连锁反应。 这些事件之所以能够得手,往往是因为新发布的 package 仅凭信任就会被安装。PKG-Defender 增加了一个实用且安全的防御层:**本地 威胁情报**和**依赖审计**,结合可配置的**冷却窗口**,以便在这些最新威胁*落在*您的 机器、您的依赖树或您的生产 pipeline 上*之前*拦截它们。 ## 安装说明 ### 通过 PyPI ``` # 推荐使用 uv uv pip install pkg-defender # 使用 pip 的替代方案 pip install pkg-defender ``` ### 通过 Homebrew (macOS/Linux) ``` brew tap divisionseven/pkg-defender brew install pkg-defender ``` **Tap 信任 (Homebrew 6.0.0+)** 自 Homebrew 6.0.0 起,brew 的自动信任评估要求对 tap 进行明确的信任确认。如有需要,用户可能会被提示运行: ``` brew trust divisionseven/pkg-defender ``` ### 通过二进制文件 (macOS/Linux/Windows) 每个 [GitHub Release](https://github.com/divisionseven/pkg-defender/releases) 都附带了预构建的独立 二进制文件: - **macOS (arm64):** `pkgd-darwin-arm64` - **macOS (x86_64):** `pkgd-darwin-amd64` - **Linux (x86_64):** `pkgd-linux-amd64` - **Windows (x86_64):** `pkgd-windows-amd64.exe` 每个二进制文件都有对应的 `.sha256` 校验和文件。下载、验证并运行: ``` # macOS arm64 示例 curl -LO https://github.com/divisionseven/pkg-defender/releases/latest/download/pkgd-darwin-arm64 curl -LO https://github.com/divisionseven/pkg-defender/releases/latest/download/pkgd-darwin-arm64.sha256 shasum -a 256 -c pkgd-darwin-arm64.sha256 chmod +x pkgd-darwin-arm64 ./pkgd-darwin-arm64 --help ``` ### 通过源码 ``` git clone https://github.com/divisionseven/pkg-defender cd pkg-defender # 使用 uv(推荐) uv sync --dev # 使用 pip pip install -e ".[test,lint]" ``` [完整安装指南 →][install-guide] ## 快速开始 ``` # 简单的设置向导用于配置设置, # 添加可选 secrets,同步 intelligence feeds pkgd setup # 使用命令包装器模式来拦截支持的命令: pkgd pip install requests pkgd npm install express pkgd brew install tree # ...等等 ``` [完整的快速入门指南 →][quick-start] ### CI/CD 使用 [![Github Action Snapshot](https://img.shields.io/github/actions/workflow/status/divisionseven/pkg-defender/snapshot.yml?branch=main&logo=github&style=plastic&color=black&logoColor=white&label=PKGD%20Snapshot%20Build)][snapshot-action-badge-link] `pkg-defender` 同样专为在自动化 pipeline 中以非交互式 CI 模式运行而设计: ``` # 使用 --ci 标志跳过所有提示 pkgd --ci pip install axios # 或设置环境变量 export PKGD_CI=1 pkgd pip install axios ``` #### 在 CI pipeline 中: ``` # 使用 snapshots 进行快速审计(更快) pkgd db snapshot --download pkgd audit --fail-on-threat -o json # 或同步以获取最新数据 pkgd intel sync pkgd audit --fail-on-threat --output json ``` #### 环境配置: | 变量 | 描述 | | --------------------------- | ----------------------------------------------------------------------------------------- | | `PKGD_CI=1` | 启用非交互模式 | | `PKGD_GITHUB_TOKEN` | GHSA API token (更高的速率限制);或者可以在 `pkgd.toml` 中设置 `feeds.ghsa_token` | | `PKGD_FEEDS_SOCKET_API_KEY` | Socket.dev API key (旧版:`PKGD_TWITTER_API_KEY`) | #### GitHub Actions CI 集成示例流程 ``` ┌─────────────────────────────────────────────────────────────────┐ │ Example CI Pipeline │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ divisionseven/pkg-defender-action@v1 │ │ │ │ │ ├──▶ Check Cache (GitHub Actions) │ │ │ │ │ │ │ ├──▶ HIT: Use cached DB (<6 hours old) │ │ │ │ │ │ │ └──▶ MISS: Download fresh snapshot │ │ │ │ │ │ │ └──▶ SHA256 Verify │ │ │ │ │ │ │ ├──▶ FAIL: Rebuild │ │ │ │ │ │ │ └──▶ SUCCESS: Use DB │ │ │ │ │ ├──▶ Run pkgd audit │ │ │ │ │ │ │ └──▶ Find vulnerabilities? │ │ │ │ │ │ │ ├──▶ YES: Create PR annotations │ │ │ │ │ │ │ │ │ └──▶ Exit 4 (fail-on) │ │ │ │ │ │ │ └──▶ NO: Exit 0 (pass) │ │ │ │ │ └──▶ Done │ │ │ └─────────────────────────────────────────────────────────────────┘ │ ▲ │ GitHub Snapshot Releases │ │ ┌───────────────────────────────┐ │ └─────▶│ threats-latest.db.gz │──────┘ │ threats-latest.db.gz.sha256 │ └───────────────────────────────┘ ▲ Published │ Every 6 Hours │ (GitHub Actions) │ │ ┌───────────────┴──────────────┐ │ │ │ build_snapshot.py │ │ │ │ │ ┌────────┼────────┐ │ │ │ │ │ │ │ OSV GHSA OSSF │ │ │ │ (Tier 1 Feeds Only) │ │ │ ├──────────────────────────────┤ │ PKG-Defender GitHub │ └──────────────────────────────┘ ``` [完整 CI/CD 指南 →][ci-cd-guide] ## 工作原理 1. **拦截** — 命令包装器 (`pkgd pip install`, `pkgd npm install`) 包装了涵盖 10 个生态系统下 18 种包管理器的包管理器命令。 2. **检查** — `check_package()` 查询本地 SQLite 威胁数据库(零 网络 I/O)。 3. **通知** — 社交情报源添加来自社区的早期预警 (绝不拦截)。 4. **冷却** — 根据配置的窗口检查 Package 的发布时长(默认: 7 天)。 5. **决策** — 评分 ≥ 0.3 的威胁将被拦截;社交情报源的发现结果仅 作为参考信息。 6. **同步** — 后台 Daemon 定期从 9 个情报源刷新威胁情报。 [威胁评分概念 →][threat-scoring] ### 威胁情报 `pkg-defender` 同步自 9 个情报源:6 个结构化来源 (OSV.dev, GHSA, npm advisory, OSSF Malicious Package List, RSS, Homebrew) 和 3 个社交来源 (Mastodon, Reddit, X/Twitter)。Socket.dev 也可作为点查询源使用(非批量 同步)。结构化来源可以拦截安装;社交情报源仅提供信息参考。 情报源按可配置的时间间隔进行同步,并带有过期检测。 [完整威胁情报源指南 →][threat-feeds] ### 审计 扫描 7 种 lock 文件格式以查找已知威胁和处于冷却期等待的 package。支持 以富终端、JSON 或 CSV 格式输出。使用 `--fail-on-threat` 进行 CI/CD pipeline 的闸门控制 (仅在遇到 CRITICAL/HIGH 时以退出码 4 退出)。 [审计指南 →][auditing-guide] ### 自动补全 支持在 bash, zsh 和 fish 中自动补全 `pkgd` 命令。可通过 `pkgd completion generate` 生成。 ``` # Bash(以下之一): pkgd completion generate bash > /etc/bash_completion.d/pkgd # system-wide pkgd completion generate bash > ~/.local/share/bash-completion/completions/pkgd # user # Zsh pkgd completion generate zsh > ~/.zsh/completions/_pkgd # Fish pkgd completion generate fish | source ``` 安装后请重启您的 shell 以启用自动补全。 [自动补全指南 →][completion-guide] ## 配置说明 ### 配置加载顺序 配置按以下顺序加载(后加载的来源会覆盖先前的): 1. [内置默认配置][config-ref] 2. 系统配置 (`/etc/pkgd/pkgd.toml`) — 首先加载,可被覆盖 3. 用户配置 (`~/.config/pkg-defender/pkgd.toml`,或平台对应的等效路径) — 覆盖系统配置 4. 项目配置 (`./pkgd.toml` 或最近的父目录) — 最高的文件优先级 5. `PKGD_CONFIG_PATH` 环境变量 — 仅在 `config_path param` 为 `None` 时生效 6. `PKGD_*` 环境变量覆盖 — 优先级最高,始终生效 ### 配置 TOML 文件 包含所有值的默认*全局*配置文件 —— 在执行 `pkgd setup` 时会自动生成, 以便于轻松自定义。可以在项目级别通过 `cd path/to/project && pkgd setup --init` 生成 ``` [cooldown] # 新 package 版本被允许前的最小天数。 # 默认值:7 default_days = 7 # cooldown 检查是否处于活动状态。设置为 false 则完全禁用。 # 默认值:True enabled = true # 如果为 True,在 cooldown 执行期间发现 threats 时,audit 将以非零状态退出。 # 如果为 False,即使存在 threats,audit 也会以零状态退出(降低了安全态势)。 # 默认值:True strict_mode = true # 如果为 True,在绕过 cooldown 时必须提供原因。 # 默认值:True bypass_require_reason = true # 保留 bypass audit log 条目的天数。 # 注意:仅在 config 列表中显示 — 没有自动清理的执行代码。 # 默认值:90 bypass_log_retention_days = 90 [cooldown.overrides] # 针对每个 package 的 cooldown 天数覆盖(package 名称 → 天数)。 # package 名称必须加引号以避免 TOML 解析错误。 # 示例: # "react" = 14 # "@babel/core" = 21 # "some-package" = 7 [cooldown.per_ecosystem] # 针对每个 ecosystem 的 cooldown 窗口覆盖(ecosystem → 天数)。 # 示例: # npm = 7 # pypi = 14 # …续 ``` [完整配置参考 →][config-ref] ## 命令参考 | 基础命令组 | 描述 | | ------------------------ | ------------------------------------------------------ | | `pkgd audit` | 扫描 lock 文件以查找威胁和处于冷却期等待的 package | | `pkgd status` | 显示最近的威胁、绕过记录和情报源状态 | | `pkgd bypass` | 为被拦截的 package 创建绕过规则 | | `pkgd health` | 检查系统健康状态 | | `pkgd reset` | 重置所有数据(数据库、配置、情报源) | | `pkgd setup` | 交互式首次运行设置向导 | | `pkgd audit-logs` | 查询和管理审计事件日志 | | `pkgd logs` | 查看和管理 pkg-defender 日志 | | `pkgd completion` | 生成 shell 自动补全脚本 | | `pkgd hooks` | 为被包装的包管理器命令生成 shell 函数 | | `pkgd intel sync` | 同步所有威胁情报源 | | `pkgd intel search` | 搜索本地威胁数据库 | | `pkgd intel report` | 威胁情报看板 | | `pkgd config view` | 显示当前配置 | | `pkgd config list` | 列出所有配置值及其来源 | | `pkgd config set` | 设置配置值(支持点表示法) | | `pkgd config set-secret` | 通过隐藏输入设置机密配置值 | | `pkgd config get` | 获取特定的配置值 | | `pkgd config reset` | 恢复默认设置 | | `pkgd config options` | 列出所有可配置选项及其描述 | | `pkgd daemon` | 用于定期同步的后台 daemon | | `pkgd db snapshot` | 下载/验证数据库快照 | | `pkgd db verify` | 验证本地数据库完整性并输出摘要报告 | ### 全局 Flags 这些 flags 适用于每一个 `pkgd` 命令: | Flag(s) | 描述 | | --------------------------- | ---------------------------------------------------------- | | `--version`, `-V` | 显示版本信息 | | `--help` | 显示帮助信息并退出 | | `--config`, `-c` | 配置文件的路径(默认:视平台而定) | | `--quiet`,q` | 抑制所有非错误输出 | | `--verbose`, `-v` | 增加详细程度 (`-v`=INFO, `-vv`=DEBUG) | | `--no-verbose` | 禁用详细输出 (覆盖 `PKGD_OUTPUT_VERBOSE`) | | `--debug`, `-d` | 遇到意外错误时显示完整的 traceback | | `--no-color` | 禁用彩色终端输出 | | `--ascii` | 强制仅输出 ASCII(适用于 Windows 或 CI 环境) | | `--yes`, `-y` | 自动确认所有提示 | | `--force`, `-f` | 强制执行操作(跳过确认,覆盖文件) | | `--dry-run`, `-n` | 演练模式,只显示会发生什么而不实际更改 | | `--ci`, `--non-interactive` | 在非交互式 CI/CD 模式下运行 (读取 `PKGD_CI`) | | `--explain` | 显示关于 package 被拦截原因的详细说明 | | `--json` | 输出格式为 JSON | ### 特定命令的 Flags | 命令 | Flag(s) | 描述 | | ----------------------- | ------------------------ | ------------------------------------------------------------------------ | | `pkgd audit` | `--deep`, `-d` | 执行深度扫描(包含冷却状态检查) | | `pkgd audit` | `--fail-on-threat`, `-f` | 如果检测到 CRITICAL 或 HIGH 威胁则以代码 4 退出 (CI/CD) | | `pkgd audit` | `--since` | 仅标记在指定时间段内出现的威胁(例如:`7d`, `24h`) | | `pkgd audit` | `--output`, `-o` | 输出格式:`rich`, `json`, `csv` (默认:`rich`) | | `pkgd status` | `--feeds` | 显示每个情报源的健康状态 | | `pkgd health` | `--output`, `-o` | 输出格式:`rich`, `json` (默认:`rich`) | | `pkgd setup` | `--init`, `-i` | 使用默认值创建 `pkgd.toml` | | `pkgd setup` | `--shell`, `-s` | 覆盖自动检测到的 shell | | `pkgd bypass` | `--manager`, `-m` | 包管理器 (默认:`npm`) | | `pkgd bypass` | `--reason` | 绕过的原因(必填) | | `pkgd bypass` | `--expires` | 绕过规则的有效期(例如:`24h`, `7d`, `30m`) | | `pkgd intel sync` | `--exclude-feed` | 排除特定的情报源(可重复使用) | | `pkgd logs view` | `--lines`, `-n` | 显示的行数 (默认:100) | | `pkgd db snapshot` | `--download`, `-d` | 下载最新的威胁情报快照 | | `pkgd db snapshot` | `--verify`, `-v` | 验证本地数据库的完整性 | | `pkgd reset` | `--teardown`, `-t` | 完全卸载(移除数据库和配置) | | `pkgd audit-logs query` | `--ecosystem` | 按生态系统过滤审计日志条目 | | `pkgd audit-logs query` | `--verdict` | 按判定结果过滤 (`PASS`, `PARTIAL_PASS`, `FAIL`, `BLOCKED`, `WARN`, `ERROR`) | ### 环境变量 | 变量 | 影响项 | 描述 | | --------------------- | ------------------- | ----------------------------------------------------- | | `PKGD_DRY_RUN` | `--dry-run` 默认值 | 设置为 `1` 时,默认启用演练模式 | | `PKGD_OUTPUT_VERBOSE` | `--no-verbose` | 在环境变量层面覆盖详细输出设置 | | `PKGD_CI` | `--ci` 模式 | 设置为 `1` 时,强制开启 CI 模式(非交互式) | | `PKGD_CONFIG_PATH` | 配置加载 | 配置文件的路径(`--config` 的替代方案) | [完整 CLI 参考 →][cli-ref] ## 支持的生态系统 | 生态系统 | 管理器 | Registry Adapter | 覆盖级别 | Lock 文件 | 包装器 | | --------- | ----------------------------- | ---------------- | ------------------ | ---------------------------------------------------- | ------- | | npm | npm, yarn, pnpm, bun | Yes | `FULL` / `PARTIAL` | package-lock.json, yarn.lock, pnpm-lock.yaml | Yes | | PyPI | pip, pipx, poetry, pipenv, uv | Yes | `FULL` / `PARTIAL` | requirements.txt, poetry.lock, Pipfile.lock, uv.lock | Yes | | Cargo | cargo | Yes | `FULL` | — | Yes | | RubyGems | gem, bundler | Yes | `FULL` / `PARTIAL` | — | Yes | | Packagist | composer | Yes | `FULL` | — | Yes | | Homebrew | brew | Yes | `PARTIAL` | — | Yes | | APT | apt | Yes | `AUDIT` | — | Yes | | Yum | yum | Yes | `AUDIT` | — | Yes | | DNF | dnf | Yes | `AUDIT` | — | Yes | | Conda | conda | Yes | `FULL` | — | Yes | [完整生态系统指南 →][ecosystems] ## 依赖项 | PyPI 链接 | 用途 | 审计链接 | | -------------------------------- | --------------------------------------------- | -------------------------------------- | | [aiohttp][dep-aiohttp] | 用于情报源同步和 registry 查询的异步 HTTP | [审计我 →][audit-aiohttp] | | [click][dep-click] | CLI 框架 | [审计我 →][audit-click] | | [defusedxml][dep-defusedxml] | 用于 RPM repodata 的安全 XML 解析 | [审计我 →][audit-defusedxml] | | [feedparser][dep-feedparser] | Atom/RSS 源解析 | [审计我 →][audit-feedparser] | | [packaging][dep-packaging] | Python 版本规范解析 | [审计我 →][audit-packaging] | | [platformdirs][dep-platformdirs] | 适配平台的配置/数据目录 | [审计我 →][audit-platformdirs] | | [pyyaml][dep-pyyaml] | 用于 pnpm-lock.yaml lock 文件的 YAML 解析 | [审计我 →][audit-pyyaml] | | [rich][dep-rich] | 终端输出格式化 | [审计我 →][audit-rich] | | [tomlkit][dep-tomlkit] | TOML 配置文件读写(设置向导) | [审计我 →][audit-tomlkit] | | [zstandard][dep-zstandard] | 用于 RPM repodata 的 Zstandard 解压缩 | [审计我 →][audit-zstandard] | [查看当前依赖列表 →][pyproject] ## 安全性 请参见 [SECURITY.md →][security] 请参见 [DISCLAIMER.md →][disclaimer] ## 安全模型局限性 (v1) PKG-Defender 是一个实用的防御层,而非绝对的安全保证。了解其 架构边界有助于您校准期望值,并将其部署到能为您和您的组织 带来最大价值的地方。 ### Shell 函数仅保护交互式 CLI 使用 PKG-Defender 通过 shell 函数或直接调用包装包管理器调用, 以此保护交互式的 `pip install`, `npm install` 及类似的 CLI 命令。如果您在非交互式 环境(`pkgd [OPTIONS] MANAGER SUBCOMMAND [PACKAGE...] [MANAGER_OPTIONS...]`)中没有直接使用包装器命令,您配置的 shell 函数**将不会**提供保护: - **Dockerfiles / 容器构建** — Dockerfile 中的 `RUN pip install` 不会经过 pkgd 的 shell 函数。 - **CI/CD 脚本** — 除非明确配置为使用 `pkgd ` 而不是单纯的包管理器命令。 - **自动化 / 无人值守安装** — 脚本、Makefile 或 直接调用包管理器的系统包操作。 在放行命令后,`os.execvp()` 会使用真实的 包管理器替换掉 pkgd 进程,从而保持零运行时开销。 ### 无传递依赖解析 `pkgd audit` 目前仅检查顶层 package。针对传递依赖的 扫描计划在未来的版本中推出。 ### 执行后审计缺口 PKG-Defender 会将其安装前的评估记录在审计日志中 —— 即决策时的判定结果、 配置状态和威胁分析。然而,由于 `os.execvp()` 会替换进程,pkgd **无法**验证安装 是否真正成功,或者包管理器是否 遇到了错误。为了确认结果,请将 pkgd 的审计日志 (`pkgd audit-logs`) 与您包管理器实际安装的状态进行交叉比对。 ### AUDIT 级别的管理器没有冷却期保护 处于 `AUDIT` 覆盖级别(apt, yum, dnf)的包管理器仅接受 仅限威胁检测的保护 —— 系统**确实**查询了威胁数据库,但跳过了冷却期 验证(这些生态系统缺乏可靠的发布时间戳)。 ### 评分阈值是一种可调整的启发式方法 拦截阈值(`checker.py` 中的 0.3)是通过对 合理默认值的推理选择的初始值,而不是根据真实世界的攻击数据进行的经验性验证。它 可能会产生误报(拦截合法 package)或漏报 (放行威胁信号未达到阈值的恶意 package)。 在敏感环境中部署的用户应测试并调整此值。 ### 既有的攻击 PKG-Defender 无法防御在安装时已经处于执行状态的攻击。该工具评估的是来自情报源的威胁信号, 而不是运行时行为。 ### 基于信号的冷却机制 v1 版本提供了基于信号的冷却升级机制,威胁严重程度 可以动态延长冷却窗口。已验证的 advisory 会触发 立即拦截,而 Tier 3 社交信号会延长冷却窗口。然而, 用户无法直接针对每个信号配置阈值或升级策略; 该行为被硬编码在 `step_check_cooldown()` pipeline 中。 ## License PKG-Defender 采用 [Apache-2.0 →][license] 许可协议发布 ## 致谢 如果没有以下外部项目、 服务、数据源、库和工具,PKG-Defender 就不可能实现。感谢你们的贡献。 ### 威胁情报数据来源 - [OSV.dev][osv-dev] — Open Source Vulnerability 数据库 (Google) - [GitHub Security Advisories][ghsa] — GHSA 数据库 - [Socket.dev][socket-dev] — 供应链安全信号 - [OpenSSF Malicious Packages][ossf-malicious] — OpenSSF 恶意 package 数据库 ### Package Registry - [npm][reg-npm] — npm registry (npm, Inc.) - [PyPI][reg-pypi] — Python Package Index (Python Software Foundation) - [RubyGems][reg-rubygems] — Ruby gem 服务器 - [crates.io][reg-crates] — Rust package registry - [Packagist][reg-packagist] — PHP/Composer package 仓库 - [Homebrew][reg-homebrew] — macOS/Linux 包管理器 (formulae.brew.sh) - [Anaconda][reg-anaconda] — Python/R 数据科学发行版 (Anaconda Inc.) - [conda-forge][reg-condaforge] — 社区主导的 conda package 频道 ### 时间戳解析服务 - [libraries.io][ts-librariesio] — Package 元数据和发布时间戳 - [Fedora Koji][ts-koji] — Fedora 构建系统中心 - [Fedora Bodhi][ts-bodhi] — Fedora 更新系统 - [Ubuntu Archive][ts-ubuntu] — Ubuntu package 存档 - [Debian Snapshot Archive][ts-debian] — Debian 快照存档 ### 社交与社区数据来源 - [Mastodon / infosec.exchange][social-mast] — 去中心化社交平台 - [Reddit / PullPush.io][social-pullpush] — Reddit 评论和提交存档 - [X/Twitter API v2][social-twitter] — 社交媒体平台 (可选, BYOK) ### 安全博客 RSS 订阅源 从博客 RSS 订阅源聚合的安全情报: - Socket.dev 博客, Snyk 博客, OpenSSF 博客, GitHub Security 博客, GitGuardian 博客, Sonatype 博客 ### 运行时依赖项 PKG-Defender 的运行时依赖项在上方的 [Dependencies](#dependencies) 表格中列出, 并附带有完全透明的审计链接。 - [aiohttp][dep-aiohttp] — 用于情报源同步和 registry 查询的异步 HTTP - [click][dep-click] — CLI 框架 - [defusedxml][dep-defusedxml] — 用于 RPM repodata 的安全 XML 解析 - [feedparser][dep-feedparser] — Atom/RSS 源解析 - [packaging][dep-packaging] — Python 版本规范解析 - [platformdirs][dep-platformdirs] — 适配平台的配置/数据目录 - [PyYAML][dep-pyyaml] — 用于 pnpm-lock.yaml lock 文件的 YAML 解析 - [rich][dep-rich] — 终端输出格式化 - [tomlkit][dep-tomlkit] — TOML 配置文件读写(设置向导) - [zstandard][dep-zstandard] — 用于 RPM repodata 的 Zstandard 解压缩 ### 开发与构建工具 - [Hatchling][dev-hatchling] — Python 构建后端 - [pytest][dev-pytest] — 测试框架 - [ruff][dev-ruff] — Python linter 和 formatter (Astral) - [mypy][dev-mypy] — 静态类型检查器 - [pre-commit][dev-precommit] — Git hook 框架 - [PyInstaller][dev-pyinstaller] — 独立二进制文件打包 - [aioresponses][dev-aioresponses] — 异步 HTTP 测试模拟 ### CI/CD 与基础设施 - [GitHub Actions][infra-ghactions] — CI/CD 与快照自动化 - [Codecov][infra-codecov] — 代码覆盖率报告 - [shields.io][infra-shields] — 徽章生成服务 - [Trivy][infra-trivy] — 容器镜像漏洞扫描器 (Aqua Security) - [Docker][infra-docker] — 容器运行时和镜像分发 ### 社区标准 - [Contributor Covenant][std-covenant] — 行为准则 - [Conventional Commits][std-convcommits] — 提交信息标准 - [no-color.org][std-nocolor] — NO_COLOR 标准 ### ASCII 艺术与品牌设计 - [artty][brand-artty] — 用于 PKG-Defender logo 横幅的 ASCII 艺术生成(在开发中用于资产生成而离线使用) **最后更新:** 2026-07-03
标签:DevSecOps, Python, 上游代理, 包管理器, 文档安全, 无后门, 统一API, 逆向工具