# PKG-Defender (PKGD)
### 在供应链攻击到达您的机器或 CI pipeline *之前*将其拦截
[][license-badge-link]
[][pypi-badge-link]
[][github-binary-releases-link]
[][github-snapshot-releases-link]
[][codecov-badge-link]
[][ci-badge-link]
[][ecosystems-badge-link]
[][ecosystems-badge-link]
[][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 使用
[][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