利用空气间隙保护AI代理与NPM安装安全
速览
该文章探讨了在AI代理和NPM包管理场景中,如何通过实施空气间隙(Airgap)策略来增强安全性。空气间隙作为一种物理或逻辑隔离手段,能有效防止敏感信息被AI模型访问或恶意软件通过依赖注入窃取。这一方法对于保护企业核心资产和确保AI系统合规运行具有重要意义。
AI 深度解读
隐藏 AI 代理与 NPM 安装中的秘密:使用 Airgap
背景
随着 AI 编程代理(AI Agents)的普及,开发者允许这些代理读取和写入项目文件,甚至从互联网安装技能或插件。与此同时,Node.js 生态中的 npm 恶意软件攻击日益猖獗,常在安装阶段窃取敏感信息。AI 代理不仅会执行命令,还会自动安装 npm 包,而这些包可能是代理“幻觉”生成的,或者是攻击者预先注册的恶意包(slopsquatting)。
传统的敏感信息保护机制难以应对这种双重威胁:一方面,AI 代理可能会无意中读取 .env 或 SSH 密钥并将它们发送给模型提供商;另一方面,恶意的 npm 包可以通过 preinstall 或 postinstall 钩子窃取磁盘上的凭证。
Airgap 是一个基于 Linux 的包装器(wrapper),它通过在命名空间内运行程序来保护敏感数据。它旨在防止 AI 代理和包管理器在未经明确授权的情况下访问敏感文件,同时允许代理继续正常工作,只是看不到真实的敏感值。目前仅支持 Linux,macOS 支持正在开发中。
核心内容
威胁模型:秘密如何泄露?
敏感信息通常以明文形式存储在 .env、~/.ssh 和 ~/.npmrc 等文件中。如今,开发者及其 AI 代理经常运行不受信任的代码,这些代码可能读取这些文件。泄露途径主要有两种:
- AI 代理:如 Claude 或 OpenCode 等代理会扫描项目目录和主目录。它们读取的任何内容都可能被发送到模型提供商。未经注意,
.env值或 SSH 密钥可能出现在提示词中。恶意插件或技能也可能故意抓取敏感文件。 - NPM 包:恶意
npm包并非新鲜事物,但近期的攻击浪潮非常成功且传播迅速。依赖项可以添加preinstall或postinstall钩子,在安装时运行任意代码,从而窃取.env文件、SSH 密钥和云凭证。
近期著名的攻击活动包括 Shai-Hulud、Miasma、pgserve 以及伪造的 tanstack 包。它们的做法相同:在安装时运行,窃取秘密,并将其发送出去。部分攻击还会留下持久的恶意状态。
最典型的例子是 Shai-Hulud,这是一种在 2025 年底通过 npm 传播的自我复制蠕虫。当用户安装受感染的包时,其钩子会查找 .npmrc(npm token)、环境变量以及包含 GitHub PAT 和 AWS/GCP/Azure 云密钥的配置文件,并将它们发送给攻击者。利用窃取的 npm token,它会重新发布其他开发者维护的包的带后门版本,导致每次安装都会再次传播该蠕虫。2025 年底的 2.0 版本将代码移至 preinstall,这也影响了 CI/CD 管道。
Airgap 的工作原理
Airgap 的核心逻辑是:这些恶意软件只有在能够从磁盘窃取秘密时才能生效。Airgap 旨在阻止这种情况。
- 重定向与命名空间:Airgap 在挂载命名空间(mount namespace)和用户命名空间(user namespace)中启动目标程序。它将主目录和当前工作目录(如果与主目录不同)挂载为 FUSE 文件系统。
- 拦截处理:所有文件系统访问都经过 Airgap 的处理程序。
- 动态策略:
- 自动脱敏:对于已知敏感文件(如
.env、私钥、.npmrc),Airgap 返回脱敏后的内容。 - 交互式门控:对于其他意外文件(如
~/.aws/credentials),Airgap 会先询问用户权限。
- 自动脱敏:对于已知敏感文件(如
支持的敏感文件类型
Airgap 目前保护以下类型的文件(位于项目目录和主目录中,并持续扩展):
- 文件中的秘密(如
.env等) - SSH 和 PGP 私钥
- npm token(
.npmrc)
使用示例与行为演示
安装:
cargo install airgap
基本用法:
airgap <program> [args...]
针对 AI 代理的行为:
Airgap 对 AI 代理(如 claude、opencode)采用“仅脱敏”规则。代理可以读取文件,但看不到真实值。
$ cat .env
API_KEY=sk-live-9f8c2a1b4e7d
DB_PASSWORD=hunter2
$ airgap cat .env
API_KEY=<redacted value>
DB_PASSWORD=<redacted value>
文件对 AI 代理仍然可读和可编辑,只是秘密被隐藏了。
针对 NPM 的行为:
当在 Airgap 下运行 npm 时,安装钩子会运行,但每次读取新文件都会触发提示。
$ airgap npm install bad-package
airgap: allow reading /home/sven/.ssh/id_rsa? [y/N] n
airgap: blocked /home/sven/.ssh/id_rsa
added 42 packages in 2s
试图读取 ~/.ssh/id_rsa 的 postinstall 脚本会被捕获并拒绝。安装继续执行,但钩子一无所获。正常的读取(如 package.json、锁文件和 npm 缓存)被预批准,因此用户只会对非预期文件收到提示。
AI 代理交互示例:
$ airgap claude
> show me ./.env contents
Read 1 file
Here's the file:
DATABASE_URL="<redacted value>"
API_KEY="<redacted value>"
AWS_SECRET_ACCESS_KEY="<redacted value>"
代理在真实文件上工作,但只看到脱敏后的秘密。
自动化配置
为了无需思考即可在 Airgap 下运行代理或包管理器,可以将别名添加到 shell 配置(如 ~/.bashrc 或 ~/.zshrc)中:
alias claude="airgap claude"
alias opencode="airgap opencode"
alias npm="airgap npm"
局限性与贡献
Airgap 只是众多安全层中的一层,并非绝对保证。它可能会遗漏某些情况,且攻击手段不断演变。欢迎贡献!如果发现漏洞、需要支持的程序或需要脱敏的秘密,请提交 Issue。
安全相关问题请联系:[email protected] GitHub: https://github.com/xtuc/airgap crates.io: https://crates.io/crates/airgap
关键要点
- 双重威胁防护:Airgap 同时解决 AI 代理意外泄露秘密和恶意 npm 包窃取凭证的问题。
- 技术实现:基于 Linux 的 FUSE 文件系统和命名空间隔离,拦截文件系统访问并应用脱敏或交互式审批策略。
- 智能白名单:对 npm 包管理器预批准 benign 路径(如
.gitconfig、node_modules、锁文件),减少用户干扰;对 AI 代理默认仅脱敏,不阻断工作流。 - 应对新型攻击:专门针对如 Shai-Hulud 这类利用
preinstall/postinstall钩子窃取云凭证和 npm token 的恶意软件。 - 易用性集成:通过简单的 shell 别名配置,即可无缝集成到现有开发环境中。
- 开源与协作:项目开源,鼓励社区发现漏洞、添加对新程序的支持或扩展脱敏规则。
意义与影响
Airgap 的出现标志着开发者安全实践从“被动防御”向“主动隔离”的转变。随着 AI 辅助编程成为常态,开发者与代码的交互边界变得模糊,传统的权限管理模型(如文件权限)已不足以应对 AI 代理的广泛读取需求和 npm 生态中复杂的供应链攻击。
- 重新定义 AI 代理的安全边界:Airgap 承认 AI 代理需要访问文件才能工作,但通过“透明化”敏感数据,既保留了代理的功能性,又消除了凭证泄露的风险。这是一种
