84 个 npm 软件包在五月一次攻击中被投毒

让智能体碰生产环境。密钥留在手里。

Sallyport 把你的凭证存放在本地密钥库里,替智能体执行 API 调用和 SSH 命令。你点按一下或用 Touch ID 就能批准运行。没有任何命令能显示已存储的密钥,也没有导出按钮。

$brew install --cask olegsotnikov/tap/sallyport

macOS 14+ · Apple Silicon · Apache-2.0 · 免费 · 无需账户 · 无需云服务

为放手让 Claude Code、Cursor 或 Codex 碰真实基础设施的工程师打造

Claude CodeCodexCursorWindsurfClineLangChainCrewAIOpenHandsGooseZed
亲自试用

就在当前工作位置完成批准

此密钥每次使用都需要批准。调用会等待你的决定。

claude · ~/infra

sallyport · http.request

PATCH api.cloudflare.com/client/v4/zones/…/dns_records

密钥 cloudflare · 已标记 每次调用均需批准

正在等待批准…

需要批准

http.request → api.cloudflare.com

Developer ID Application: Anthropic PBC

claude node zsh

密钥:cloudflare每次调用
点按“批准”以允许调用继续执行。或按下 A/D
问题所在

你的智能体现在就能读取你的密钥

.env 里的 API 令牌、磁盘上的 SSH 密钥、配置文件里的 OAuth 授权,智能体和它拉取的每一个软件包都能读取,而一个被投毒的 README 就能把它们统统卷走。

机密信息一览无余

.env 和 shell 变量里的令牌、磁盘上的 SSH 密钥、配置文件里的 OAuth 令牌,智能体、它的子进程,以及今天 npm 装进来的一切,都能读取。

提示词注入变成盗窃

一个恶意网页或 README 让智能体把令牌发往新的地址,智能体照办不误。它天生就是用来服从指令的。

从账单上才发现

没有网关,就没有记录能告诉你智能体发起了哪些调用、发往了哪里、携带了什么。被盗的密钥几周后才浮出水面,而且时间由别人说了算。

这些都真实发生过

2026年5月

TanStack npm 攻击

跨 42 个软件包的 84 个恶意版本在安装时收集云凭证、GitHub 令牌和 SSH 密钥,再借受害者自己的软件包继续扩散。

2025年末

Shai-Hulud 蠕虫

被攻陷的 npm 软件包在安装时窃取机密信息,再用窃得的凭证感染下一批软件包。

2025年8月

Nx S1ngularity

一款被投毒的构建工具扫描开发者机器搜寻机密信息,试用本地 AI 工具,并借 GitHub CLI 把窃得的数据传送出去。

这三起事件都从环境变量和磁盘上的文件中窃取密钥。Sallyport 让这两处都不存在可用的密钥。

你的智能体根本不需要密钥

智能体发来一个请求:调用这个 API,在那台主机上运行这条命令。Sallyport 在 App 内部附上凭证、执行调用并返回结果。密钥从不出现在智能体的环境中,而一份密封的审计日志会记录运行了什么、由谁批准。

信任模型

固定决策阶梯

每个操作都沿着同一套编译固化的阶梯向上。没有可以配错的策略语言,也没有会腐坏的规则引擎;可选的允许列表能让你信任的代码身份跳过会话提示。

信任模型

1

密钥库门控

密钥库是绝对门槛

密钥库初始处于锁定状态。Secure Enclave 和 Touch ID 对其数据访问实施门控。解锁之前,Sallyport 会拒绝所有操作。

2

每次调用均需批准的密钥

标记的密钥每次都会请求批准

标记为“每次调用均需批准”的密钥,每次使用都需要点按或 Touch ID 确认,即使在已批准的会话中也是如此。

3

会话门控

每次智能体运行只需批准一次

新的智能体进程会显示一张卡片,其中包含其代码签名方。批准有效期至进程退出、你撤销批准或密钥库锁定。

4

观察

运行并记录

关闭会话批准后,操作无需会话卡片即可运行,但仍会记录到审计日志中。

密钥库门控、每次调用均需批准的密钥、会话门控、观察。

内置能力

一切都装进一款已签名的 App

一款已签名的 Mac App 就装下了密钥库、批准机制和审计日志。无需创建账户,背后也没有任何云服务。

绝对密钥库门控

密钥库锁定时,除查询状态外,Sallyport 会拒绝智能体的所有操作和全部管理操作。

存储时加密

密钥库会加密密钥名称、提供方、主机绑定、SSH 主机清单、设置和机密值。

进程来源信息

每张卡片都会显示调用方的代码签名方和父进程链,包括任何未签名进程。

使用 Touch ID 确认更改

配置更改可以要求使用 Touch ID。模拟点击无法通过生物识别提示。

盲写审计日志

Sallyport 在写入智能体运行记录和每次调用活动时对其加密,再通过哈希链连接密文。

可查看完整命令的 SSH

Sallyport 能看到完整的 SSH 命令、检查主机密钥并对会话录制进行密封。私钥始终留在 App 内。

观察模式

观察模式会移除会话卡片,但仍保留密钥库门控、每次调用批准机制和审计日志。

无法恢复

密钥库无法导出或显示凭证,也没有恢复密钥。如果你失去对密钥库的访问权限,请让相应提供方重新签发其中存储的凭证。

通道

HTTP、SSH 和 MCP

你的智能体会像连接普通 MCP 服务器一样连接 Sallyport。它执行的所有操作都会经过同一套决策阶梯,并写入同一份审计日志。

HTTP API

http.request → api.github.com

App 会发起 HTTPS 调用,并且只在执行期间注入凭证。跨主机重定向不会携带该凭证。

SSH

ssh.exec → deploy@prod-03

无状态辅助进程负责打开连接。App 处理 SSH 签名、固定主机密钥并对会话录制进行密封;私钥不会进入辅助进程。

MCP 服务器

github.create_issue

本地 stdio 和远程 MCP 服务器均由 Sallyport 通过同一道门控代理。Sallyport 会密封并刷新 OAuth 2.1 令牌。

用数字说话

利害所在

84

同一次搜刮凭证的 npm 攻击中出现的恶意软件包版本

0

账户、云服务或遥测:Sallyport 完全在你的 Mac 上运行

一次点按

Touch ID 批准被标记的调用;模拟点击无法冒充

约 2 分钟

从 brew install 到第一次经过门控的调用

限制

Sallyport 不承诺什么

安全工具总爱把话说满,所以我们把自己的边界白纸黑字写在这里。

限制

已批准的会话仍可能行为不当

会话批准所授权的是进程,而不是每个请求的含义。对于需要逐项审查的密钥,请启用“每次调用均需批准”。

它无法阻止以你的身份运行的原生代码

Sallyport 不是防病毒软件。以你的用户权限运行的代码仍可能攻击 App 或操作系统。

它无法替你审阅

卡片会显示调用方的代码签名方和进程链。你仍须自行审查请求。

常见问题

常见问题解答

Sallyport 采用什么许可?
Sallyport 可免费下载和使用。核心组件依据 Apache-2.0 开源。计划中的企业组件将采用商业许可。
我的机密信息存储在哪里?
存储在你 Mac 上的本地密钥库中。Secure Enclave 和 Touch ID 对密钥库加密密钥的访问实施门控。Sallyport 会对静态存储的机密值和元数据进行加密,且不会上传密钥库数据。
它会回传数据吗?
不会。没有云服务,没有账户,也没有遥测。除了你让它连接的服务和更新源,Sallyport 完全离线工作。
系统要求是什么?
需要配备 Apple Silicon 且运行 macOS 14 或更高版本的 Mac。不支持 Intel Mac。
密钥库锁定时会发生什么?
智能体操作会停止。管理请求只能返回状态,其他所有操作都会被拒绝。解锁需要 Touch ID;锁定密钥库会清除会话和待处理的批准请求。
它能与 Claude Code 和其他智能体配合使用吗?
任何 MCP 客户端都可以使用随附的 sp mcp shim 来访问 http.request、ssh.exec 和已配置的上游 MCP 服务器。
智能体能看到我的密钥吗?
不能。没有任何命令能显示已存储的凭证,也没有导出或恢复途径。但有一点要如实说明:Sallyport 会原样返回服务器的响应,因此如果目标服务在响应中回传了某个机密,智能体就会看到那条响应。
如果我无法再访问自己的 Mac,该怎么办?
没有恢复密钥。请重新初始化密钥库,并让相应提供方重新签发凭证。

你的智能体,距离你的密钥只差一次提示词注入。

免费下载。需要 Apple Silicon、macOS 14 或更高版本。永远无需账户。

$brew install --cask olegsotnikov/tap/sallyport

macOS 14+ · Apple Silicon

Sallyport

Sallyport 替你的 AI 智能体执行 API 调用和 SSH 命令。密钥留在你 Mac 上的本地密钥库里;每次运行由你批准,每个操作都落入一份密封的审计日志。

© 2026 Sallyport · 依据 Apache-2.0 开源 · Oleg Sotnikov