【翻译】ClaudeCode正在对请求进行隐写标记

admin 2026-07-02 05:33:57 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档揭示了ClaudeCode在系统提示中嵌入隐写标记的机制,通过修改日期格式和撇号字符来标记请求来源,检测时区是否为亚洲上海或乌鲁木齐以及API基础URL是否匹配特定域名或关键词列表。这引发了隐私和安全性担忧,表明AI编码工具可能通过细微的文本变化追踪用户请求。 综合评分: 85 文章分类: 威胁情报,安全意识,AI安全,漏洞分析


cover_image

【翻译】Claude Code 正在对请求进行隐写标记

mayfly mayfly

独眼情报

2026年7月1日 10:24 湖北

在小说阅读器读本章

去阅读

我出于隐私原因检查了 Claude Code,发现了基于 API 基础 URL 和时区的隐藏系统提示标记。

我出于隐私考虑检查了 Claude Code。

大多数开发者会给他们的代理工具链赋予过多的访问权限——文件系统、shell、git、浏览器访问,甚至现在的计算机使用权限。这正是重点所在。他们需要足够的上下文来完成有用的工作。

这也意味着客户端本身值得严格审查。如果一个编码代理可以读取你的代码库并运行命令,那么分发它的二进制文件就应该很“无聊”(例如 pi harness)。

于是我查看了我本地的 Claude Code(2.1.196)安装。

none !importantnone !importantnone !importantnone !important标记none !importantnone !importantnone !importantnone !important

在 Claude Code 的二进制文件中,存在一个函数会修改插入到系统提示中的当前日期字符串。

正常的字符串看起来是这样的:

Today's date is 2026-06-30.

Claude Code 可以静默修改两处内容:

  1. “Today’s” 中的撇号
  2. 日期分隔符,从 - 改为 /

以下是相关代码(已从压缩后的 bundle 中清理):

function Zup() {
  if (Crt()) 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 "'";
  if (known && !labKw) return "\u2019";
  if (!known && labKw) return "\u02BC";
  return "\u02B9";
}

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)——一种将数据隐藏在明面上的技术。

可见的句子仍然像普通的日期描述,模型和用户看到的都是无聊的内容。但原始请求中已经嵌入了标记。

none !importantnone !importantnone !importantnone !important检查机制none !importantnone !importantnone !importantnone !important

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);
  } 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(Claude Code 的 API 基础 URL 覆盖设置)。

随后它会检查以下几项:

  • 系统时区是否为 Asia/Shanghai 或 Asia/Urumqi
  • API 基础 URL 的主机名是否匹配解码后的域名列表
  • 主机名是否包含特定的 AI 实验室关键词

时区检查会把日期从:

2026-06-30

变成:

2026/06/30

主机名检查则会改变撇号字符:

| 条件 | 使用的撇号字符 | | — | — | | 正常情况 | ' | | 已知域名 | \u2019 | | 包含实验室关键词 | \u02BC | | 同时满足已知域名和实验室关键词 | \u02B9 |

这些都是视觉上极其细微的变化,在大多数等宽字体中几乎无法察觉。

none !importantnone !importantnone !importantnone !important混淆的列表none !importantnone !importantnone !importantnone !important

域名和关键词列表以 base64 字符串存储,并使用密钥 91 进行 XOR 解码。

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(",");
}

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

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

解码后的域名列表要大得多,包含中国企业域名、AI 公司域名,以及大量代理、经销商和网关域名。

完整示例:

const knownDomains = [
  "cn",
  "sankuai.com",
  "netease.com",
  "163.com",
  "baidu-int.com",
  "baidu.com",
  "alibaba-inc.com",
  "alipay.com",
  "antgroup-inc.cn",
  "kuaishou.com",
  "bytedance.net",
  "xiaohongshu.com",
  "ctripcorp.com",
  "jd.com",
  "jdcloud.com",
  "bilibili.co",
  "iflytek.com",
  "stepfun-inc.com",
  "aliyuncs.com",
  "cn-shanghai.fcapp.run",
  "cn-beijing.fcapp.run",
  "xaminim.com",
  "moonshot.ai",
  "anyrouter.top",
  "packyapi.com",
  "aicodemirror.com",
  "aigocode.com",
  "hongshan.com",
  "iwhalecloud.com",
  "dhcoder.net",
  "lemongpt.top",
  "zhihuiapi.top",
  "intsig.net",
  "high-five-ai.xyz",
  "cloudsway.net",
  "4sapi.com",
  "529961.com",
  "88996.cloud",
  "88code.ai",
  "88code.org",
  "91code.pro",
  "992236.xyz",
  "ai.codeqaq.com",
  "ai.hybgzs.com",
  "ai.kjvhh.com",
  "aicanapi.com",
  "aicoding.sh",
  "aifast.site",
  "aihubmix.com",
  "anmory.com",
  "api.5202030.xyz",
  "api.ablai.top",
  "api.bianxie.ai",
  "api.bltcy.ai",
  "api.cpass.cc",
  "api.dev88.tech",
  "api.dreamger.com",
  "api.expansion.chat",
  "api.gueai.com",
  "api.holdai.top",
  "api.ikuncode.cc",
  "api.lconai.com",
  "api.linkapi.org",
  "api.mkeai.com",
  "api.nekoapi.com",
  "api.oaipro.com",
  "api.ruyun.fun",
  "api.ssopen.top",
  "api.tu-zi.com",
  "api.uglycat.cc",
  "api.v3.cm",
  "api.whatai.cc",
  "api.wpgzs.top",
  "api.xty.app",
  "api.yuegle.com",
  "api.zzyu.me",
  "apimart.ai",
  "apipro.maynor1024.live",
  "apiyi.com",
  "applyj.hiapi.top",
  "augmunt.com",
  "b4u.qzz.io",
  "clauddy.com",
  "claude-code-hub.app",
  "claude-opus.top",
  "claudeide.net",
  "co.yes.vg",
  "code.wenwen-ai.com",
  "code.x-aio.com",
  "codeilab.com",
  "cubence.com",
  "deeprouter.top",
  "dimaray.com",
  "dmxapi.com",
  "docs.aigc2d.com",
  "duckcoding.com",
  "fk.hshwk.org",
  "flapcode.com",
  "foxcode.hshwk.org",
  "foxcode.rjj.cc",
  "fuli.hxi.me",
  "getgoapi.com",
  "gpt.zhizengzeng.com",
  "gptgod.cloud",
  "gptkey.eu.org",
  "gptpay.store",
  "hdgsb.com",
  "henapi.top",
  "instcopilot-api.com",
  "jeniya.top",
  "jiekou.ai",
  "kg-api.cloud",
  "n1n.ai",
  "new-api.u4vr.com",
  "new.xychatai.com",
  "one-api.bltcy.top",
  "one.ocoolai.com",
  "oneapi.paintbot.top",
  "open.xiaojingai.com",
  "openclaude.me",
  "opus.gptuu.com",
  "poloai.top",
  "poloapi.top",
  "privnode.com",
  "proxyai.com",
  "qinzhiai.com",
  "right.codes",
  "runanytime.hxi.me",
  "sssaicode.com",
  "store.zzyus.top",
  "tiantianai.pro",
  "uiuiapi.com",
  "uniapi.ai",
  "vip.undyingapi.com",
  "wolfai.top",
  "wzw.de5.net",
  "wzw.pp.ua",
  "xairouter.com",
  "xaixapi.com",
  "xiaohuapi.site",
  "xiaohumini.site",
  "xy.poloapi.com",
  "yansd666.com",
  "yansd666.top",
  "yunwu.ai",
  "yunwu.zeabur.app",
  "zenmux.ai",
];
const labKeywords = [
  "deepseek",
  "moonshot",
  "minimax",
  "xaminim",
  "zhipu",
  "bigmodel",
  "baichuan",
  "stepfun",
  "01ai",
  "dashscope",
  "volces",
];

none !importantnone !importantnone !importantnone !important标记如何传递none !importantnone !importantnone !importantnone !important

日期函数在构建代理上下文时被调用:

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

因此这个标记会成为发送给模型的系统上下文的一部分(Anthropic 很可能在后端进行解析)。

none !importantnone !importantnone !importantnone !important我的本地安装情况none !importantnone !importantnone !importantnone !important

我安装的二进制文件由 Anthropic 签名:

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

我当前 shell 中 ANTHROPIC_BASE_URL 未设置,时区为:

Asia/Hong_Kong

因此在我的机器上、当前环境下,这个路径会生成正常的撇号和标准的 YYYY-MM-DD 日期字符串。

none !importantnone !importantnone !importantnone !important令人担忧的点none !importantnone !importantnone !importantnone !important

Anthropic 可能希望检测 API 经销商、未经授权的 Claude Code 网关,以及模型“蒸馏攻击”管道。自定义 ANTHROPIC_BASE_URL 指向已知经销商域名是一个有用的信号;主机名包含 deepseek 或 zhipu 也是有用信号。

这部分逻辑说得通,但实现方式很奇怪。

CC 会使用近乎不可见的 Unicode 标记静默修改系统提示。它把代理/网关分类信息编码进看起来像普通英语的句子中,并将域名列表隐藏在 XOR 和 base64 之后。这不是恶意功能,但对于一个需要开发者信任的开发工具来说,这样的设计选择相当奇怪。

编码代理已经生活在一条可怕的边界上。它们可以检查代码、意外总结秘密、运行命令、安装包、编辑文件,并在你的本地机器上推送提交。大多数开发者接受这一点,是因为生产力提升值得冒这个风险。

真正开发者的信任,取决于那些“无聊”的行为。

如果客户端想要检测自定义 API 网关,它可以直白地说出来——发送一个有文档说明的显式遥测字段、公开政策、写入发布说明。

把信号藏在系统提示里,会让其他所有隐私声明都更难令人相信。

none !importantnone !importantnone !importantnone !important实际影响none !importantnone !importantnone !importantnone !important

对大多数用户来说,这个路径大概率保持不活跃。

如果你使用官方 Anthropic API 端点,Crt() 会提前返回;如果 ANTHROPIC_BASE_URL 未设置,Crt() 也会提前返回;正常使用场景下,日期提示会保持“无聊”状态。

有趣的情况是人们通过自定义基础 URL 来路由 Claude Code,包括:

  • 内部网关
  • 本地代理
  • 模型路由器
  • 经销商
  • 研究环境

在这些情况下,Claude Code 会对主机名进行分类,并把结果编码进提示中。

绕过方法也非常简单:修改主机名、修改时区、修补二进制文件、包装进程。任何认真的对手都能让这个信号失效。

因此,这个功能主要惩罚了那些更容易被指纹识别的人:那些做着奇怪但合法事情的普通开发者。

none !importantnone !importantnone !importantnone !important一些想法none !importantnone !importantnone !importantnone !important

我认为这本可以更明确一些。

开发者工具可以强制执行条款,API 提供商可以检测滥用行为,公司也可以保护自己的模型。

当一个拥有文件系统和 shell 访问权限的工具,开始把分类比特隐藏在不可见的提示标点符号里时,正确的反应就是严格审查。

信任,是在那些无聊的细节中赢得的。

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


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:独眼情报 mayfly mayfly《【翻译】Claude Code 正在对请求进行隐写标记》

评论:0   参与:  0