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 到第一次经过门控的调用

开源

读一遍握着你密钥的那段代码

密钥库、批准门禁、审计日志,还有真正碰到你凭据的那个执行器,全部以 Apache-2.0 公开。克隆下来,跟着一个密钥从你按下 Touch ID 一路走到线上。

Apache-2.0 · 全部

自己审

每一行存放、解锁、花掉凭据的代码都在 GitHub 上。挑你担心的那部分读完,再做决定。

不往外打电话

没有账号,没有云服务,没有遥测。Sallyport 只和你指定的主机说话,别的谁也不联系。

归你所有

Apache-2.0 意味着你可以 fork、打补丁、在公司内部铺开。无论我们接下来做什么,你手上这份都照常能跑。

常见问题

常见问题解答

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 服务器。我们主要针对 Claude Code、Cursor 和 Codex 做测试。
我还能用 --dangerously-skip-permissions 跑 Claude Code 吗?
大家叫它 YOLO 模式的那个开关,关掉的是 Claude Code 自己的确认提示。它对你的凭据没有任何影响:它们照旧躺在 .env 文件和 shell 变量里,智能体一直都读得到。那些提示从来就不是保护密钥的东西。把智能体指向 Sallyport,它的环境里就没有密钥可以被跳过了。
装一个别人在网上发布的 MCP 服务器安全吗?
把它当成任何一个依赖:它以你的权限运行,它的工具描述会作为指令落进模型的上下文。让它走 Sallyport,它的每一次调用都需要批准,也都会写进审计日志。本地 stdio 服务器会拿到你绑定给它的凭据,所以绑定你手上范围最小的那一个,并把它标成逐次调用批准。
这和 HashiCorp Vault 或 1Password CLI 有什么不同?
那些工具很会存密钥,然后把密钥交出去。op run 和 vault read 的结局是一样的:凭据落到下一个进程的环境里,而在你的机器上,那个进程就是智能体。Sallyport 不交出去,它自己发起调用并把响应返回给你。两个一起用也完全可以:真相之源留在原处,Sallyport 只拿智能体实际用到的那一份副本。
智能体能看到我的密钥吗?
不会。没有任何命令能显示已存的凭据,没有导出,也没有恢复通道。Sallyport 把目标服务的回复原样递回来,所以某个服务要是在自己的响应里回显了你的密钥,那是它在向你展示自己的 bug,而审计日志会告诉你是哪一次调用逮到的。
如果我无法再访问自己的 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