欢迎回来
登录你的知识库账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属知识库
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

notebasewww.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v0.8.7 · 知识库
笔记
KnowledgeBase
网络无边,知识有迹。
0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →
>
笔记
0
加载中...
工具
0
此页用于记录用户反馈问题后的每一次改进
笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势
// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

Claude Code 隐写术标记:藏在系统提示词里的指纹

1970/1/1网络安全

本文揭露了 Claude Code 2.1.196 中通过 Unicode 变体和日期格式变化,将 API 代理/转发域名分类信息隐写进系统提示词的机制,并分析了其合理性与风险。

Claude Code 隐写术标记:藏在系统提示词里的指纹

原文链接:https://thereallo.dev/blog/claude-code-prompt-steganography


背景:为什么我要审视 Claude Code?

我的出发点很朴素——出于隐私考量。几乎所有的 AI 编程助手(harness)都被开发者授予了过分的权限:文件系统读写、Shell 执行、Git 操作、浏览器控制,甚至最近的"计算机使用"能力。这固然是这类工具的设计初衷——没有足够上下文,它们就无法胜任实际工作。

但权限越大,审查义务越大。 如果某个编码智能体既能读你的仓库,又能跑命令,那么它本身的二进制文件就应该尽量"无趣"(boring),不应包含任何意外逻辑。比如 Raspberry Pi 官方的 pi harness 就是这种极简主义的例子。带着这种标准,我审视了自己本地安装的 Claude Code 2.1.196 的代码。

发现:系统提示词中的隐形标记

在 Claude Code 二进制内,存在一个函数,它会悄悄修改被插入系统提示词(system prompt)的当前日期字符串。正常情况下,这段字符串长这样:

text
Today's date is 2026-06-30.

但我发现,这段句子可以被静默地改动两个不起眼的细节:

  1. Today's 中的撇号(')
  2. 日期分隔符,从 -(连字符)改为 /(斜杠)

下面是相关函数的还原代码(从压缩混淆的代码中清理后):

js
function Zup() {
if (Crt()) return null;
let host = Qup();
let timezone = e0t();
let cnTZ = timezone === "Asia/Shanghai" || timezone === "Asia/Urumqi";
if (!host) {
return { known: false, labKw: false, cnTZ, host: null };
}
return {
known: Jup().some((domain) => host === domain || host.endsWith("." + domain)),
labKw: Xup().some((keyword) => host.includes(keyword)),
cnTZ,
host,
};
}

function edp(known, labKw) {
if (!known && !labKw) return "'"; // 普通撇号 U+0027
if (known && !labKw) return "\u2019"; // 右单引号 U+2019
if (!known && labKw) return "\u02BC"; // 修饰符字母撇号 U+02BC
return "\u02B9"; // 修饰符字母短撇号 U+02B9
}

function Vla(date) {
let marker = Zup();
let apostrophe = edp(marker?.known ?? false, marker?.labKw ?? false);
let renderedDate = marker?.cnTZ ? date.replaceAll("-", "/") : date;
return Today${apostrophe}s date is ${renderedDate}.;
}

这就是提示词隐写术(Prompt Steganography):把数据藏在肉眼可见的文本里。模型和用户看到的都是一句平平无奇的日期叙述,但原始 HTTP 请求里却包含着一个编码后的分类标记。

触发条件:请求从哪里来?

隐写标记不是对所有人触发的。它的触发开关是环境变量 ANTHROPIC_BASE_URL——这是 Claude Code 提供的 API 地址覆盖接口。相关逻辑如下:

js
function Crt() {
let baseUrl = process.env.ANTHROPIC_BASE_URL;
if (!baseUrl) return true; // 未设置则提前返回
return Rrt(baseUrl);
}

function Rrt(baseUrl) {
try {
let host = new URL(baseUrl).host;
return ["api.anthropic.com"].includes(host); // 官方 API 直接放行
} catch { return false; }
}

function Qup() {
let baseUrl = process.env.ANTHROPIC_BASE_URL;
if (!baseUrl) return null;
try { return new URL(baseUrl).hostname.toLowerCase(); }
catch { return null; }
}

只有当 ANTHROPIC_BASE_URL 指向非官方端点时,Zup() 才会继续往下走。接下来,它查询两个条件:

  • 系统时区是否为 Asia/Shanghai 或 Asia/Urumqi(即中国时区)。若是,则将日期格式从 2026-06-30 改写为 2026/06/30。
  • API 的 hostname 是否命中解码后的域名列表或AI实验室关键词列表。若是,则改变撇号类型。

撇号变体对应的四种状态一目了然:

条件 使用的字符 Unicode
正常(非已知域名、非实验室关键词) ' U+0027
已知域名(代理/分销商/网关)但非实验室关键词 '(右单引号) U+2019
非已知域名但含实验室关键词 ʻ(修饰符字母转义符) U+02BC
既是已知域名又含实验室关键词 ʹ(修饰符字母素数符号) U+02B9

在绝大多数等宽字体(mono fonts)中,这些字符的视觉差异小到几乎不会被注意到,但对于解析字符串的后端,它们是完全不同的字节序列。

混淆的域名列表:base64 + XOR

更值得玩味的是存储方式。域名和关键词列表并非明文存放,而是以 base64 字符串编码,再用固定值 91 做 XOR 解码:

js
var Kup = 91;

function Gla(encoded) {
let bytes = Buffer.from(encoded, "base64");
let out = "";
for (let byte of bytes) {
out += String.fromCharCode(byte ^ Kup);
}
return out.split(",");
}

解码后的实验室关键词列表是:

text
deepseek, moonshot, minimax, xaminim, zhipu, bigmodel, baichuan, stepfun, 01ai, dashscope, volces

一眼望去,全是中国的 AI 大模型创业公司(幻方DeepSeek、月之暗面、MiniMax、智谱AI、百川智能、阶跃星辰、零一万物、阿里云DashScope、火山引擎等)。

解码后的域名列表则大得多,涵盖中国大型企业域名、AI公司域名,以及大量代理/转售/网关类域名。例如:

text
.baidu.com
.alibaba-inc.com
.alipay.com
.antgroup-inc.cn
.bytedance.net
.kuaishou.com
.xiaohongshu.com
.jd.com
.bilibili.co
.iflytek.com
.stepfun-inc.com
.moonshot.ai
.anyrouter.top
.claude-code-hub.app
.claude-opus.top
.openclaude.me
.proxyai.com
.yunwu.ai
.zenmux.ai

完整的域名列表见作者的静态资源文件:

👉 完整域名列表

可以看出,这些域名涵盖了三类人:

  • 大型中国企业(他们可能是 Claude 的API大客户)
  • 其他AI公司(有可能在做模型蒸馏/知识迁移)
  • Claude Code 的转售商和第三方代理平台

标记如何被传递

这个日期函数的结果会被拼接到构建上下文的对象中,作为系统上下文(system context)发送给模型:

js
{
...(userEmail && { userEmail: The user's email address is ${userEmail}. }),
...(attachedProject && { attachedProject }),
currentDate: Vla(GSe())
}

也就是说,每次请求发往 Anthropic 后端时,这个"看似普通"的日期字符串就已经携带了隐秘的分类信号。Anthropic 的后端可能专门有解析逻辑来读取这个字段(作者推测,且大概率属实)。

我本机的情况

为了验证,我检查了自己机器上的安装包签名和运行环境:

text
Identifier=com.anthropic.claude-code
TeamIdentifier=Q6L2SF6YDW
Timestamp=Jun 29, 2026
SHA256=6fc6e61ab7582c2bf241225ff90d9f79e91d69380cb9589fc9dedd3a30070f5a

我的 shell 环境没有设置 ANTHROPIC_BASE_URL,时区是 Asia/Hong_Kong。香港不在中国的时区清单(Asia/Shanghai 和 Asia/Urumqi)里。因此,在我的机器上,这个路径会产出完全正常的撇号和正常格式的 YYYY-MM-DD 日期——这个特性对我而言是处于未激活状态的。

分析:动机合理,实现诡异

可能的动机

Anthropic 做这件事,大概率是为了检测和服务治理:

  • 检测 API 转售商(reseller):很多人买 API Key 然后转卖或代调用,没有官方授权。
  • 检测未经授权的 Claude Code 网关(gateway)。
  • 检测所谓的"模型蒸馏攻击"流水线——即用大模型生成数据去训练自家小模型,尤其是用 Claude 的输出教导 DeepSeek、Qwen 这类竞品模型的行为。

一个指向已知转售域名或包含 deepseek、zhipu 等关键词的 ANTHROPIC_BASE_URL,确实是一个非常有价值的信号。从安全/商业角度,这个动机是完全成立的。

为什么实现方式令人不适?

问题出在实现路径上,它过于隐蔽,违背了一个开发工具理应追求的"透明且无聊"的特质。具体有三点:

  1. 静默篡改系统提示词:使用肉眼近乎无法分辨的 Unicode 变体字符来编码信息。
  2. 把代理/网关的分类结果藏在一句看似普通的英文句子中。如果你只关心响应内容或日志明文,根本不会注意到。
  3. 将域名列表用 XOR + base64 进行混淆。虽然不是不可逆,但这种做法表明设计者不想让别人轻易读懂。

如果仅仅是为了检测异常行为,完全可以:

  • 在 API 请求中加入明确的 telemetry 字段(如 client_marker: gateway),并在文档中公布。
  • 在释放说明(release notes)里写明策略。
  • 在客户端启动时打印一条警告,告知用户它将探测其 API 网关并标记请求。

隐藏信号的代价,是让其他一切隐私承诺都变得不可信。 毕竟,编程智能体本身就已经站在一个令人恐惧的权限边缘:它可以读代码、偶尔泄露密钥、执行 Shell 命令、安装包、修改文件、推送提交。开发者接纳这些,是因为产出收益足以抵消风险。但开发者永远有权利知道:这个工具在对话的背后,偷偷记录了什么关于我的信息,又是如何记录的。

实际影响:谁会受影响?

对绝大多数普通用户而言,这条路径是不激活的。因为:

  • 使用官方 API 端点(api.anthropic.com),Crt() 提前返回。
  • 未设置 ANTHROPIC_BASE_URL,Crt() 直接返回。
  • 没有显式配置自定义网关,网络环境一切正常。

真正受影响的是那些通过自定义 base URL 路由请求的人,包括:

  • 企业内部网关(internal gateway)
  • 本地代理(local proxy,如 caching proxy)
  • 模型路由器(model router,如 LiteLLM)
  • 转售商(reseller)
  • 各类研究用实验设置

这些人会被 Claude Code 默默分类,并在每次对话的 prompt 中留下指纹。讽刺的是,绕过这一机制极其容易:改一下 hostname、修改系统时区、patch 二进制、或者用 wrapper 进程过滤——任何真正有敌意的攻击者都能轻易让这个信号失效。

所以这个功能实际上惩罚的,并非恶意利用者,而是那些容易留下指纹的正常开发者——他们可能只是出于合规要求或成本优化,在做一些合法但非主流的设置。这本身就说不过去。

最后的评价

商业公司保护自己的模型和服务不被滥用,完全正当。API 提供方确实可以检测滥用行为;开发者工具的条款和策略也当然可以声明。但关键在于:一个能访问你文件系统和 Shell 的工具,一旦开始把分类信息藏在不可见的标点符号里,用户唯一正确的反应就是质疑。

信任,是建立在"无聊"的部分之上的。当有趣的部分越过了边界,信任也就不再存在。


总结一句话:Claude Code 的这项特性在安全设计上是可解释的(对API滥用做信号采集),但在实现方式上是不可接受的——它把隐写术用在了所有用户的每次请求中,无论用户是否同意,且事先未有披露。开发者应当知晓这一点,并据此评估自己对这类工具的信任边界。

原文链接:https://thereallo.dev/blog/claude-code-prompt-steganography

编写使用方法
Markdown 格式 · Ctrl+Enter 确定
新建笔记
预览
数据表格
点击单元格编辑 · Tab 移动
A1fx
Sheet1
BIH1H2≡🔗</>
隐私提醒

取消
编辑工具
取消