
safe-chain v1.5.15
使用 Aikido Safe Chain 防范通过 npm、yarn、pnpm、npx、pnpx、pip、uv 和 poetry 安装的恶意代码。免费使用,无需令牌。
Aikido Safe Chain
- ✅ 在开发者笔记本电脑和 CI/CD 上阻止恶意软件
- ✅ 支持 npm 和 PyPI,更多包管理器即将支持
- ✅ 阻止发布时间少于 48 小时的软件包,且不会破坏你的构建
- ✅ 无需令牌、免费、不共享构建数据
需要超越 npm 和 PyPI 的保护?
Aikido Device Protection 基于 Safe Chain 构建,将软件包和扩展安全性扩展到更多生态系统:npm、PyPI、VS Code、Open VSX -(Cursor、Windsurf、Kiro、Vs Codium 等)、Maven、NuGet、Chrome 扩展、Go、Skills.sh AI 技能、Ruby、Rust 等。
获取集中式策略管理、请求与审批工作流,以及对你组织中每台开发者工作站的可见性。由相同的 Aikido Intel 数据源提供支持。可手动部署,或通过你的 MDM 工具(Jamf、Fleet 或 Iru)进行管理。
Aikido Safe Chain 支持以下包管理器:
- 📦 npm
- 📦 npx
- 📦 yarn
- 📦 pnpm
- 📦 pnpx
- 📦 rush
- 📦 rushx
- 📦 bun
- 📦 bunx
- 📦 pip
- 📦 pip3
- 📦 uv
- 📦 poetry
- 📦 uvx
- 📦 pipx
- 📦 pdm
使用方法

安装
使用安装脚本可以轻松安装 Aikido Safe Chain。
Unix/Linux/macOS```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.20/install-safe-chain.sh -o /tmp/install-safe-chain.sh
&& echo "0ad25efe15d1fa56105157a454d647223e78eb0c53d1f85e3d10afcd722e7bfd /tmp/install-safe-chain.sh" | sha256sum -c -
&& sh /tmp/install-safe-chain.sh
&& rm /tmp/install-safe-chain.sh
### Windows (PowerShell)```powershell
$installer = Join-Path $env:TEMP "install-safe-chain.ps1"
Invoke-WebRequest "https://github.com/AikidoSec/safe-chain/releases/download/1.5.20/install-safe-chain.ps1" -OutFile $installer -UseBasicParsing
$expectedHash = "468C342C5AABB71200B0BD19950984EDD5C4B39811B653B13A5AD15E0FBA4DFA"
if ((Get-FileHash $installer -Algorithm SHA256).Hash -ne $expectedHash) {
Remove-Item $installer -ErrorAction SilentlyContinue
throw "Checksum verification failed for install-safe-chain.ps1"
}
& $installer
Remove-Item $installer
上述安装命令始终引用特定版本。要安装其他版本,请将版本号替换为您所需的版本号。所有可用版本均在 releases page 上。
下载完整性
安装脚本从带版本号的发布 URL(releases/download/1.5.20/...)提供。GitHub 发布是不可变的——一旦某个构件在带版本号的 URL 上发布,就无法修改或替换,因此您下载的文件保证与发布时完全一致。
验证安装
-
❗重启您的终端以开始使用 Aikido Safe Chain。
- 此步骤至关重要,因为它确保 npm、npx、yarn、pnpm、pnpx、rush、rushx、bun、bunx、pip、pip3、poetry、uv、uvx、pipx 和 pdm 的 shell 别名被正确加载。如果您不重启终端,这些别名将不可用。
-
验证安装,通过运行验证命令: ```shell npm safe-chain-verify pnpm safe-chain-verify pip safe-chain-verify uv safe-chain-verify
Any other supported package manager: {packagemanager} safe-chain-verify
- 输出应显示 "OK: Safe-chain works!",确认 Aikido Safe Chain 已正确安装并运行。
-
(可选)测试恶意软件拦截,尝试安装一个测试包:
对于 JavaScript/Node.js: ```shell npm install safe-chain-test
对于 Python: ```shell pip3 install safe-chain-pi-test
- 输出应显示 Aikido Safe Chain 阻止了这些测试包的安装,因为它们被标记为恶意软件。
在运行 `npm`、`npx`、`yarn`、`pnpm`、`pnpx`、`rush`、`rushx`、`bun`、`bunx`、`pip`、`pip3`、`uv`、`uvx`、`poetry`、`pipx` 和 `pdm` 命令时,Aikido Safe Chain 会自动检查你尝试安装的包中是否存在恶意软件。它还会在可用时拦截 Python 模块对 pip 的调用(例如 `python -m pip install ...`、`python3 -m pip download ...`)。如果检测到任何恶意软件,它会提示你退出该命令。
你可以通过运行以下命令来检查已安装的版本:```shell
safe-chain --version
工作原理
恶意软件拦截
Aikido Safe Chain 通过运行一个轻量级代理服务器来拦截来自 npm registry 和 PyPI 的软件包下载。当你运行 npm、npx、yarn、pnpm、pnpx、rush、rushx、bun、bunx、pip、pip3、uv、uvx、poetry、pipx 或 pdm 命令时,所有软件包下载都会通过这个本地代理进行路由,该代理会实时对照 Aikido Intel - Open Sources Threat Intelligence 验证软件包。如果在任何软件包(包括深层依赖)中检测到恶意软件,代理会在恶意代码到达你的机器之前阻止下载。
最小软件包年龄
Safe Chain 对支持的生态系统应用最小软件包年龄检查。
当前的执行方式因生态系统而异:
- 基于 npm 的包管理器:
- 在正常的软件包解析过程中,Safe Chain 会从 registry 返回的软件包元数据中抑制比配置的最小年龄更新的版本
- 对于绕过该元数据流程的直接软件包下载请求,Safe Chain 可以使用新发布软件包的缓存列表来阻止该请求
- Python 包管理器:
- 在软件包解析过程中,Safe Chain 会从 PyPI 元数据响应中抑制过新的文件和发布版本
- 对于绕过该元数据流程的直接软件包下载请求,Safe Chain 可以使用新发布软件包的缓存列表来阻止该请求
默认情况下,最小软件包年龄为 48 小时。这在新发布的软件包最有可能包含未检测到的威胁的关键时期提供了额外的安全层。你可以配置此阈值或完全绕过此保护——请参阅下方的最小软件包年龄配置部分。
Shell 集成
Aikido Safe Chain 与你的 shell 集成,在使用 npm、npx、yarn、pnpm、pnpx、rush、rushx、bun、bunx 以及 Python 包管理器(pip、uv、uvx、poetry、pipx、pdm)时提供无缝体验。它为这些命令设置别名,使它们被 Aikido Safe Chain 命令包装,这些命令会在执行原始命令之前管理代理服务器。我们目前支持:
- ✅ Bash
- ✅ Zsh
- ✅ Fish
- ✅ PowerShell
- ✅ PowerShell Core
有关 shell 集成的更多信息,请参阅 shell 集成文档。
卸载
要卸载 Aikido Safe Chain,请使用我们的一行卸载程序:
Unix/Linux/macOS```shell
curl -fsSL https://github.com/AikidoSec/safe-chain/releases/download/1.5.20/uninstall-safe-chain.sh | sh
### Windows (PowerShell)```powershell
iex (iwr "https://github.com/AikidoSec/safe-chain/releases/download/1.5.20/uninstall-safe-chain.ps1" -UseBasicParsing)
❗卸载后请重启终端,以确保所有别名都被移除。
配置
日志记录
你可以使用 --safe-chain-logging 标志或 SAFE_CHAIN_LOGGING 环境变量来控制 Aikido Safe Chain 的输出。
配置选项
你可以通过多种来源设置日志级别(按优先级顺序):
-
CLI 参数(最高优先级):
-
--safe-chain-logging=silent- 抑制 Aikido Safe Chain 的所有输出,除非恶意软件被拦截。包管理器的输出会照常写入 stdout,而 Safe Chain 仅在拦截到恶意软件并导致进程退出时写入一条简短消息。npm install express --safe-chain-logging=silent -
--safe-chain-logging=verbose- 启用 Aikido Safe Chain 的详细诊断输出。适用于排查问题或了解 Safe Chain 在后台执行的操作。npm install express --safe-chain-logging=verbose
-
-
环境变量: ```shell export SAFE_CHAIN_LOGGING=verbose npm install express
有效值:silent、normal、verbose
这对于为终端会话或 CI/CD 环境中的所有包管理器命令设置默认日志级别非常有用。
文件日志记录
你可以使用 --safe-chain-log-file 标志或 SAFE_CHAIN_LOG_FILE 环境变量将 Aikido Safe Chain 的输出镜像到日志文件。文件日志记录默认禁用,设置路径后启用。文件格式(--safe-chain-log-file-format)和详细程度(--safe-chain-log-file-verbosity)独立于终端输出进行控制。
配置选项
通过以下任一方式设置(按优先级顺序):
- CLI 参数(最高优先级): ```shell
npm install express
--safe-chain-log-file=~/safe-chain.log
--safe-chain-log-file-format=plain
--safe-chain-log-file-verbosity=normal - 环境变量: ```shell
export SAFE_CHAIN_LOG_FILE=~/safe-chain.log
export SAFE_CHAIN_LOG_FILE_FORMAT=plain
export SAFE_CHAIN_LOG_FILE_VERBOSITY=normal
- 配置文件(
~/.safe-chain/config.json): ```json { "logFile": "~/safe-chain.log", "logFileFormat": "plain", "logFileVerbosity": "normal" }
logFileFormat — json(默认)或 plain。
logFileVerbosity — silent、normal 或 verbose(默认)。独立于 --safe-chain-logging。
最小包年龄
你可以配置包必须存在多长时间后,Safe Chain 才允许其安装。默认情况下,包必须至少存在 48 小时才能被安装。
对于基于 npm 的包管理器,此检查目前有两种执行模式:
- Safe Chain 在正常依赖解析期间从包元数据中抑制过于年轻的版本。
- 当直接包下载请求与缓存的新发布包列表匹配时,Safe Chain 会阻止这些请求。
对于 Python 包管理器,此检查目前有两种执行模式:
- Safe Chain 在依赖解析期间从 PyPI 元数据中抑制过于年轻的文件和发布版本。
- 当直接包下载请求与缓存的新发布包列表匹配时,Safe Chain 会阻止这些请求。
配置选项
你可以通过多种来源设置最小包年龄(按优先级顺序):
- CLI 参数(最高优先级): ```shell
npm install express --safe-chain-minimum-package-age-hours=48
- 环境变量: ```shell
export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_HOURS=48
npm install express
- 配置文件(
~/.safe-chain/config.json): ```json { "minimumPackageAgeHours": 48 }
排除软件包
通过环境变量或配置文件(两者会合并)将受信任的软件包排除在最小年龄过滤之外。使用 @scope/* 信任某个组织下的所有软件包:```shell
export SAFE_CHAIN_MINIMUM_PACKAGE_AGE_EXCLUSIONS="@aikidosec/*"
## 使用示例
### 基本用法
```bash
# 扫描单个目标
python3 cve_2025_55182.py -u https://target.example.com
# 扫描多个目标
python3 cve_2025_55182.py -f targets.txt
# 使用代理
python3 cve_2025_55182.py -u https://target.example.com -p http://127.0.0.1:8080
# 详细输出
python3 cve_2025_55182.py -u https://target.example.com -v