AI-noleak – AI命令行工具的本地秘密代理
AI-noleak 是一个本地反向代理,可拦截AI编码代理无意中泄露的本地秘密(如API密钥、令牌),并用确定性占位符替换它们,防止秘密通过提示泄露给上游AI模型。它通过三层保护(PTY包装器、HTTP代理、文件监视器)实现零配置、无需安装CA证书的本地安全隔离。
AI-noleak 是由开发者 ahmedxuhri 创建的一个开源项目,旨在解决AI编码代理在执行任务时意外泄露敏感本地信息的问题。该工具作为一个本地反向代理运行在用户终端和AI API之间,通过三层独立的保护机制拦截、替换并恢复秘密,确保只有授权的API密钥能够通过,而其他本地秘密在离开主机前被替换为确定性占位符。
第一层是 PTY 包装器,它在shell执行前从括号粘贴中剥离秘密;第二层是 HTTP 代理,它扫描并编辑出站请求和AI响应中的秘密;第三层是文件监视器,使用 inotify(Linux)或 kqueue(macOS)监控日志和历史文件中的秘密并立即清理。所有三层共享一个本地保险库守护进程(noleakd),该守护进程存储占位符与秘密之间的映射,既可以使用内存模式(无持久化),也可以使用 AES-256-GCM 加密的磁盘持久化(启动时需提供主密码)。
安全模型方面,AI-noleak 采用100%本地隔离,不发送任何遥测数据。它不需要安装自定义根CA证书,因为明文流量仅通过本地回环接口(127.0.0.1)传输。保险库守护进程通过Unix域套接字通信,并使用内核级对等凭据检查(Linux上的SO_PEERCRED,macOS上的LOCAL_PEERCRED)严格验证UID,确保只有启动守护进程的同一用户ID的进程才能查询保险库。HTTP代理对保险库仅具有只读权限,无法修改秘密。持久化模式下,保险库文件使用 Argon2id 密钥派生函数和 AES-256-GCM 加密。
为什么这很重要?Agentic AI CLI 工具会写入和执行命令、grep 文件、读取日志。如果环境中存在活跃的环境变量、.env 文件、.git/config 凭据或命令历史中的原始令牌,Agent 很容易意外读取它们,将其注入提示上下文并发送到上游AI API。AI-noleak 确保粘贴的秘密在shell执行前被清除(第一层),出站 HTTP 请求中的原始秘密在离开机器前被替换为占位符(第二层),写入磁盘的临时快照、日志或历史文件被立即清理(第三层)。上游AI模型只看到类似 @TOKEN_a9553f@ 的占位符,如果模型输出占位符,AI-noleak 在返回CLI之前将其本地翻译回真实秘密。
安装支持 Linux 和 macOS,提供一行命令快速安装或校验安装(推荐)。也可以从源码编译,要求 Go 1.22+。快速启动需要编辑 ~/.noleak/config.yaml 设置代理上游地址,然后运行 noleak start(或 noleak start --ephemeral 使用内存模式),最后将AI CLI的基础URL配置为 http://127.0.0.1:9999/v1。项目提供健康检查命令 noleak doctor 以及管理占位符的命令如 list、review、rotate、delete。
交互式演示显示,当Agent尝试发送包含AWS密钥的提示时,AI-noleak 立即拦截并在控制台输出红色替换信息,将密钥替换为 @TOKEN_xxxxxx@,上游模型只看到占位符。用户还可以手动测试各层保护:测试第二层用 curl 发送包含密钥的请求;测试第三层通过向监视目录写入包含GitHub PAT的文件;测试第一层通过 printf 模拟括号粘贴。
需要注意的是,在 macOS 上,文件监视器可能因 FSEvents 的延迟和合并而无法足够快地反应,在高磁盘 I/O 下,如果 Agent 在几毫秒内写入并读取秘密,第三层可能无法及时拦截。此外,如果 CLI 工具将快照写入未监视的目录,第三层保护也会失效。用户应根据自己的工作流调整监视路径。