Claude 的记忆机制被安全研究员 Ayush Sharma 攻破这件事,真正让开发者后背发凉的并不是"聊天记录被看到",而是跨会话的数据泄露路径:一段精心构造的对话,就能让 Claude 在另一个会话里把之前输入的敏感信息吐出来。攻击者不需要 root、不需要破解加密,只需要聊天。对每天把私有代码库片段、API key、内部文档名贴进 AI 编程助手的开发者来说,这已经不是理论风险。
这篇不讨论 Claude 的记忆实现细节,而是把它落成一个可执行动作:用走 TaoToken 的 Codex,按清单扫描你本地项目里的敏感线索。TaoToken(官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end )在这里只做一件事——给 Codex 供 Key,不参与扫描逻辑,扫描规则和判断都在你自己的 Codex 会话里完成。拿 Key 之后先跑通一次 Codex 请求,再做排查,顺序别反。
一、原问题与场景:记忆泄露为什么让本地项目也危险
先把事件本身说清楚。Ayush Sharma 演示的攻击链核心是"记忆机制天然需要跨会话共享数据"。Claude 的记忆功能让助手从一次性对话工具变成长期认知伙伴,代价就是一次会话里的信息可能影响所有关联会话。普通用户几乎察觉不到异常,对话看起来完全正常,但某些信息已经在后台被转移。
对开发者来说,危险面被放大了三档:
第一档是私有代码库。你为了问一个报错,把某个模块的片段贴进对话,里面可能带着内部服务的域名、数据库连接串的格式、鉴权头的构造方式。这些不是"代码",是攻击者拼图用的碎片。
第二档是 API key 和凭证。很多人有"临时贴一下"的习惯,贴完就以为过去了。但记忆机制意味着它可能没过去。
第三档是内部文档名和路径。/internal/billing/legacy-migration.md这种路径本身不敏感,但它暴露了你的系统结构和演进阶段,是社会工程学的优质素材。
同一天 Cursor 被 Mindgard 公开 0day,两件事撞在一起不是巧合:AI 工具的安全问题已经从论文走进真实漏洞列表。原文给的提醒是"敏感信息永远别放进 AI 对话",这句话正确但不可执行——你不可能记住项目里每一处敏感线索。所以需要把它变成一次机械扫描。
这就是本篇的场景:你有一个本地项目,你怀疑(或者只是不确定)里面散落着不该外流的线索,你想用 Codex 做一次清单式排查,而 Codex 的请求走 TaoToken。
二、TaoToken 前置:只供 Key,不参与扫描
在动手之前把边界划清楚,避免后面排查时产生错误预期。
TaoToken 在本篇里的角色是模型请求的接入层。你从官网创建 Key,把 Codex 的 Base URL 指向https://taotoken.net/api,Codex 的推理请求就通过这个入口发出。它不读取你的本地文件,不参与扫描规则的制定,也不会替你判断哪一行是敏感信息。扫描这件事完全发生在 Codex 会话里,用的是你自己的提示词和清单。
为什么这个边界重要?因为排查敏感信息这件事本身很敏感。如果接入层参与了扫描,等于你把"哪些文件里有 key"这个元信息又交给了第三方。本篇的方案是:接入层只负责把请求送到模型,扫描逻辑和结果都留在你本地。
前置动作只有两步:
- 打开 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,注册并创建一个 API Key。创建入口在控制台的 API Keys 页面,建议单独建一个用于本次排查的 Key,方便事后吊销。
- 记下 Key,形如
YOUR_API_KEY。不要把它写进任何会被提交的文件里——这一点在排查过程中尤其要注意,因为你会扫描到大量同类凭证。
拿到 Key 之后不要急着上扫描清单。先跑通一次最小请求,确认链路是通的。链路不通的时候做排查,你会分不清是 Codex 配置错了还是扫描提示词有问题。
三、可复制配置:Codex 的 config.toml 与 settings.json
Codex 的配置分两块:模型接入配置和 Claude Code 侧的 settings.json(如果你同时用 Claude Code 做对照排查)。先配 Codex。
Codex 的配置文件是config.toml,通常位于~/.codex/config.toml。最小可用配置如下:
model = "gpt-5-codex" model_provider = "taotoken" [model_providers.taotoken] name = "TaoToken" base_url = "https://taotoken.net/api" env_key = "TAOTOKEN_API_KEY" wire_api = "chat"然后在 shell 里导出 Key,不要写进配置文件:
export TAOTOKEN_API_KEY="YOUR_API_KEY"如果你用的是 Claude Code 而不是 Codex,配置走settings.json,字段是ANTHROPIC_*系列:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "YOUR_API_KEY", "ANTHROPIC_MODEL": "claude-sonnet-4-5" } }注意ANTHROPIC_BASE_URL填的是https://taotoken.net/api,不要带 UTM 参数,也不要多加路径。UTM 只用于官网跳转统计,API 端点保持干净。
如果你更习惯用 CLI 方式拉起,TaoToken 提供了命令行工具:
npm i -g @taotoken/taotoken taotoken cc -k YOUR_API_KEY -u https://taotoken.net/api -m claude-sonnet-4-5-u后面跟 API 地址,-m后面跟模型 ID。这条命令适合快速验证,长期使用还是建议写进config.toml或settings.json。
配置完成后,先不要跑扫描。下一步是验证。
四、验证请求与成功结果
验证的目标只有一个:确认 Codex 能通过 TaoToken 拿到模型响应。用一个和扫描无关的最小请求,避免把配置问题和扫描问题混在一起。
在项目根目录下启动 Codex,输入:
请用一句话说明你当前使用的模型名称,不要执行任何文件操作。预期结果是 Codex 返回一句正常的模型自述,没有报错、没有超时、没有 401。如果你看到的是401 Unauthorized,说明 Key 没生效;如果是404,多半是 Base URL 写错了;如果是连接超时,检查网络出口。
验证通过后,再跑一次带文件读取的请求,确认 Codex 有权限读你的项目:
列出当前目录下的文件,只输出文件名,不要读取内容。这一步确认的是工具链的文件访问能力。两步都通过,才进入扫描。
扫描本身建议分三批做,不要一次性把整个项目丢进去。第一批扫凭证类线索,第二批扫路径和文档名,第三批扫配置和注释。每批用一个独立会话,避免上下文互相污染——这一点在记忆泄露的背景下尤其重要,你正在排查的敏感信息不应该在会话之间流动。
第一批的提示词示例:
扫描当前项目中可能包含 API key、token、secret、password 的文件。 对每个命中,输出:文件路径、行号、命中的变量名、值的长度(不要输出完整值)。 不要修改任何文件。注意最后两条约束:不输出完整值,不修改文件。前者防止扫描结果本身变成新的泄露源,后者防止 Codex 误操作。
第二批扫路径和文档名:
列出项目中所有 .md 文件路径,标记其中包含 internal、private、draft、legacy、migration 等关键词的路径。 只输出路径,不要读取文件内容。第三批扫配置和注释:
检查 .env、.env.example、docker-compose.yml、CI 配置文件中是否有硬编码的凭证或内部地址。 输出文件路径和问题类型,不要输出具体值。成功的结果不是"扫出很多问题",而是"你得到了一份可操作的清单":哪些文件需要清理,哪些凭证需要轮换,哪些路径需要从公开仓库移除。如果扫描结果为空,也要确认是"真的没有"还是"提示词没覆盖到"——可以手动抽查两三个你确定有敏感信息的文件,验证扫描逻辑是否有效。
五、本篇常见错排查
错误一:把 Key 写进了 config.toml。这是最常见的。config.toml很容易被同步到 dotfiles 仓库,Key 就跟着走了。正确做法是用env_key指向环境变量,Key 只存在于 shell 环境里。
错误二:Base URL 带了 UTM 参数。官网链接带 UTM 是为了统计来源,但 API 端点不能带。https://taotoken.net/api?utm_source=...这种写法会导致请求异常。API 地址就是https://taotoken.net/api。
错误三:先扫描后验证。链路没通就跑扫描,你会得到一堆超时错误,然后误以为是提示词问题。顺序必须是先验证再扫描。
错误四:扫描提示词要求输出完整值。这会让扫描结果本身变成敏感信息集合。一旦这份结果被贴进另一个 AI 对话,你就复现了本篇开头说的那个问题。永远只输出路径、行号、变量名和值的长度。
错误五:用同一个会话扫完所有批次。上下文会累积,第一批扫出的凭证信息会留在上下文里,影响后续批次的判断,也增加了跨会话泄露的面。分批、分会话。
错误六:扫描后不轮换凭证。扫描只是发现,轮换才是修复。扫出来的 key 如果还在用,等于没扫。发现即吊销、即轮换。
错误七:忽略.gitignore之外的文件。很多人只扫源码目录,忘了 CI 配置、Docker 文件、脚本目录、测试 fixture。这些地方恰恰是硬编码凭证的高发区。
错误八:把 Codex 的扫描结果直接提交成 issue 或 PR。扫描结果里即使只有路径和行号,组合起来也是信息。内部处理,不要外流。
六、把动作固化下来
Claude 记忆泄露这件事的教训不是"别用 AI",而是"别把不该进对话的东西放进对话"。但人记不住,所以要用工具把这件事变成流程。
本篇的流程是:TaoToken 提供接入(官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end ,API 端点https://taotoken.net/api),Codex 执行扫描,扫描清单和判断留在本地。三步里最容易省略的是第一步的验证,最容易做错的是扫描提示词的输出约束。
如果你要把这套流程长期跑下去,建议把扫描提示词存成项目里的一个文件,每次排查直接引用,避免每次重新组织语言导致覆盖不一致。同时把 Key 的创建和吊销也纳入流程——排查用的 Key 和日常编码用的 Key 分开,排查结束后吊销排查 Key。
需要创建 Key 或查看接入文档的,走 API Keys 页面和接入文档;想先验证模型响应是否正常的,用模型对话页面发一条最小请求;如果你打算把 Codex 长期用于这类工程排查和日常编码,Coding Plan 比按次调用更合适。三个入口按你的实际阶段选,不要只停在首页。