乐于分享
好东西不私藏

Claude Code被曝使用“间谍软件”标记中国用户,解决方案可能是OpenAFW

Claude Code被曝使用“间谍软件”标记中国用户,解决方案可能是OpenAFW

最近 Claude Code 圈子里爆了一个很大的雷。

Anthropic偷偷在Claude Code中植入了隐形代码,只为识别中国用户。

有国外黑客逆向 Claude Code 时发现:当你不是直连 Anthropic 官方接口,而是通过 API 中转站、公司代理、模型网关或者第三方 proxy 使用 Claude Code 时,Claude Code 可能会在系统提示词里偷偷塞入一个“肉眼几乎看不出来”的标记。

逆向后的代码:

这个标记不是一段明显的 telemetry,也不是一个叫 china_user: true 的字段。

它藏在一行看起来非常普通的话里:

Today's date is 2026-06-30.

正常情况下,这句话只是告诉模型今天是哪一天。

但被曝出的逻辑是:Claude Code 会先看你有没有修改 ANTHROPIC_BASE_URL。如果没有修改,或者仍然是官方的 api.anthropic.com,那就按正常格式发送。

但如果你使用了第三方中转站、公司代理或者 proxy,它就会进一步检查:

你是不是中国时区,比如 Asia/Shanghai 或 Asia/Urumqi

你的 base URL 是不是中国互联网公司域名、中国 AI 公司域名,或者某些 API 中转/转售服务域名;

域名里是否包含 deepseekmoonshotminimaxzhipubaichuanstepfundashscopevolces 这类关键词。

然后,它不会弹窗提醒你,也不会在界面里告诉你。

它会改写这句系统提示里的两个细节。

第一,把 Today's 里的普通撇号 ' 换成另一个 Unicode 字符。看起来仍然像撇号,但底层字符已经变了。

  • U+2019: ’
  • U+02BC:ʼ
  • U+02B9: ʹ

第二,如果识别到中国时区,把日期里的连字符 - 改成斜杠 /

于是:

Today's date is 2026-06-30.

可能会变成:

Today’s date is 2026/06/30.

或者其他肉眼很难区分的 Unicode 撇号版本。

这就是争议最大的地方。

因为这句话会作为系统上下文的一部分,在每次请求里发给 Claude 模型。也就是说,模型端理论上可以根据这行“日期格式暗号”,知道你是不是用了代理、是不是中国时区、是不是来自某类中国公司或 AI lab。

至于 Anthropic 是否真的基于这个标记执行封号、限流、降智,外界目前不能仅凭这段客户端逻辑完全证明。

但开发者真正愤怒的点不止是“检测代理”。

检测滥用、检测转售、检测模型蒸馏,平台当然有自己的商业理由。

真正的问题是:它没有明说,而是把环境信息编码进系统提示里的标点和日期格式。

对于一个拥有本地文件系统、shell、git、代码修改权限的 AI 编程工具来说,这种“偷偷改 prompt”的行为,已经足够让人警觉。

更现实的是,很多中国开发者并不是在做灰产转售。

他们只是因为公司网络、内部网关、模型路由、成本优化,或者不得不用 API 中转服务,才修改了 base URL。

结果,他们可能被一起打上了标签。

目前的问题是:大家都知道有这个问题,但普通用户没有一个干净的解决办法

你可以改时区。

你可以换域名。

你也可以 patch Claude Code binary。

但这些办法都很脏。

改时区会影响系统环境。换域名不一定可控。patch 二进制文件更不适合普通开发者,也会随着版本更新失效。

真正合理的方案,应该满足三个条件:

第一,不改 Claude Code 本体。

第二,不改全局系统环境。

第三,在请求真正发出去之前,让用户能看到、能路由、能修正 Claude Code 发给模型的内容。

这就是 OpenAFW 出场的地方。

OpenAFW 是什么?

OpenAFW 是一个开源的本地 Agent Firewall。

开源地址:https://github.com/openafw/openafw

你可以把它理解成 Claude Code 和模型服务之间的一层本地 proxy。

它运行在你自己的电脑上,不是云服务,不需要把流量先发给另一个 SaaS 平台。

OpenAFW 原本的设计目标不是“反 Claude Code 标记”,而是保护 AI agent 的本地安全:看见每一次模型调用,做模型路由,防止密钥泄漏,检测危险命令,并在请求离开你的机器之前做 credential masking。

但这次 Claude Code 的争议刚好暴露了一个新需求:

AI agent 时代,我们不能只相信 agent 本身。

我们需要一个站在 agent 和模型之间的本地信任层。

Claude Code 说什么、发什么、走哪个模型、是否夹带了你不希望发送的信息,都应该能被用户自己看见和控制。

OpenAFW 正好处在这个位置。

它的核心逻辑是:

让 Claude Code 不再直接打到你的第三方中转站,而是先打到本机:

http://localhost:9877

对 Claude Code 来说,这只是一个本地地址。

它不再直接看到你的真实中转站域名,也就绕开了“根据中国公司域名/AI 公司域名分类”的第一层判断。

然后,OpenAFW 再把请求路由到你真正想用的 Claude 模型中转站。

更关键的是,OpenAFW 有一个 Credential Mask 功能。

这个功能原本是为了防止 API key、钱包私钥、GitHub token、AWS key 等敏感信息泄漏给模型或 API relay。

但在这个场景下,它可以被用来把 Claude Code 暗藏标记的那句日期字符串改回正常格式。

也就是把:

Today’s date is 2026/06/30.

修正回:

Today's date is 2026-06-30.

注意,这不是魔法。

它只是让用户重新拿回了“本地 agent 发给模型的第一条消息”的可见性和控制权。

具体怎么做?

下面是一个最小可用流程。

1. 安装 Claude Code

如果你已经安装过 Claude Code,可以跳过。

macOS / Linux / WSL:

curl -fsSL https://claude.ai/install.sh | bash

或者使用 npm:

npm install -g @anthropic-ai/claude-code

2. 安装 OpenAFW

npm i -g @openafw/openafw
openafw v0.10.1+

3. 打开 OpenAFW UI

openafw ui

打开 UI 后,开始配置你的模型路由和 masking 规则。

4. 添加你的 Claude 模型中转站

进入:

Routing -> Model providers

添加你的 Claude 模型中转站地址和模型名称。

这里填你平时使用的 Claude-compatible API endpoint。

5. 添加修复日期暗号的 Credential Mask

进入:

Guard -> Credential masking

新增一条规则:

Name: ant-todayPattern: Today[^A-Za-z0-9]*s date is (\d{4})/(\d{2})/(\d{2})Replace: Today's date is $1-$2-$3Role: userMessage: first message

然后点击 save。

这条规则的意思是:

只处理第一条 user message;

匹配 Today’s date is YYYY/MM/DD 这种被改写后的格式;

把它替换回 Today's date is YYYY-MM-DD

6. 选择你的 Claude 模型,并开启 ant-today

在 OpenAFW UI 里选择你刚刚配置的 Claude 模型。

然后开启 ant-today 这条 masking 规则。

7. 用 OpenAFW 启动 Claude Code

回到命令行,执行:

afw claude

这一步很关键。

不要直接执行 claude,而是用 afw claude 启动。

这样 Claude Code 的流量会先经过 OpenAFW 本地 proxy。

8. 设置 Claude Code 路由

回到 OpenAFW UI:

Routing -> Routes

把:

claude-code/*

的 Route to 指向你刚刚添加的 Claude 模型。

9. 验证是否成功

在命令行里和 Claude Code 对话一次。

然后回到 OpenAFW UI,进入:

See -> Agents -> claude-code -> Task -> 第一个 Task

查看第一个 user 消息里的日期行。

如果你看到的是:

Today's date is 2026-07-02

注意日期中间是连字符 -,不是斜杠 /

那就说明规则生效了。

这件事真正说明了什么?

表面上看,这是 Claude Code 的一次隐私争议。

但更深层的问题是:

AI agent 不是普通 App。

普通 App 偷偷发一点环境信息,已经让人不舒服。

但 AI agent 更危险,因为它不只是“发信息”。它会读你的代码、看你的文件、运行 shell、改你的 repo、提交 PR,甚至接入公司内部系统。

当 agent 变成你的真实工作执行层时,agent 本身就必须被监督。

以前我们讨论 AI 安全,总是假设风险来自模型:模型幻觉、模型越权、模型被 prompt injection。

但这次事件提醒我们:风险也可能来自 agent client。

也就是你本地运行的那个工具。

它可以在你看不到的地方改 prompt。

它可以决定哪些上下文发给模型。

它可以把某些信息编码进看似无害的自然语言句子里。

所以,未来真正重要的不是“你信不信某个 AI 公司”。

而是:

你有没有一个属于自己的本地信任层?

能不能看见 agent 发了什么?

能不能在请求离开机器前拦截?

能不能把敏感信息替换掉?

能不能把不同 agent 路由到不同模型?

能不能在 agent 做真实工作之前,给它戴上安全带?

这就是 OpenAFW 的价值。

它不只是这次 Claude Code 争议的临时补丁。

它代表了一种新范式:

AI agent 越强,越需要本地 agent firewall。

因为未来每个人都不会只用一个 agent。

你会有 Claude Code、Codex、OpenClaw、Hermes、Cursor、各种 MCP agent、各种公司内部 agent。

每一个 agent 都会向不同模型、不同中转站、不同工具链发请求。

如果没有一层本地 firewall,你根本不知道它们在发什么,也不知道谁在修改你的上下文。

OpenAFW 的意义就在这里:

它不是替代 Claude Code。

它是在 Claude Code 和模型之间,放一个你自己能控制的信任层。

最后

这次 Claude Code 被曝出的“日期暗号”,也许只是一个很小的标记。

但它戳破了一个更大的幻觉:

我们不能默认 AI agent client 是透明的、可信的、无害的。

AI agent 时代,真正的安全边界不在云端。

而在本地。

谁控制 agent 发出去的第一条消息,谁就控制了 agent 的真实行为边界。

如果你正在用 Claude Code,尤其是通过 API 中转站、公司代理或第三方模型网关使用 Claude Code,建议你至少检查一次自己的系统提示里到底发了什么。

目前最简单的办法,可能就是:

npm i -g @openafw/openafwopenafw uiafw claude

让 agent 先过一遍你自己的本地防火墙。

不是为了对抗谁。

而是为了把本来就属于你的可见性和控制权,拿回来。