6月30日、thereallo.devが「Claude Code Is Steganographically Marking Requests」と題した記事を公開した。Claude Code(バージョン2.1.196)のバイナリを解析したところ、APIリクエストのシステムプロンプト内に視覚的に判別不能なUnicode文字の差し替えという手法でマーカーを埋め込む処理が存在することが判明したという内容だ。
コーディングエージェントはファイルシステム・シェル・gitへのフルアクセス権を持つ。開発者がその権限を許容しているのは、ツールのふるまいが「つまらないほど予測可能」であるという信頼があってこそだ。今回の発見が波紋を広げているのは技術的な被害の有無ではなく、その信頼の根拠そのものを揺るがすからだ。
発端:プライバシー調査中の発見
筆者はプライバシー上の観点からClaude Codeのバイナリを精査していた。ファイルシステムやシェルへのアクセス権を持つエージェントであれば、クライアントバイナリ自体も調査に値するという動機だ。
調査の結果、バイナリ内にシステムプロンプトへ挿入される日付文字列を条件次第でサイレントに変更する関数が存在することが判明した。なお、バイナリにはAnthropicによる正規の署名(TeamIdentifier: Q6L2SF6YDW、2026年6月29日付)が確認されており、第三者による改ざんではない。
何が埋め込まれているのか
通常、Claude Codeがモデルに送るシステムプロンプトには次のような日付文字列が含まれる。
Today's date is 2026-06-30.
この一見無害な文字列の2箇所を、Claude Codeは条件次第で変更する。
Today'sのアポストロフィ(')を別のUnicode文字に差し替える- 日付の区切り文字を
-から/に変更する
実際のコードを整形したものが以下だ。
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}.`;
}
\u2019(右シングル引用符)、\u02BC(修飾文字アポストロフィ)、\u02B9(修飾文字強調符号)はいずれもモノスペースフォントでは視覚的にほぼ区別がつかない。ユーザーもモデルも普通の英文にしか見えないが、生のリクエストデータにはマーカーが仕込まれている。これがタイトルにある「ステガノグラフィ」だ。
ステガノグラフィ(Steganography):暗号化とは異なり、情報が存在すること自体を隠す技術。画像データの最下位ビット(LSB)に別データを埋め込む手法などが代表例。今回のケースでは視覚的に区別困難なUnicode文字の差し替えが同様の役割を果たしている。
何を検出しようとしているのか
マーカーの内容は3つの条件で決まる。
| 条件 | 変化 |
|---|---|
タイムゾーンが Asia/Shanghai または Asia/Urumqi |
日付区切りが - → / |
ANTHROPIC_BASE_URL のホスト名が既知ドメインに一致 |
アポストロフィが \u2019 |
| ホスト名にAIラボ系キーワードを含む | アポストロフィが \u02BC |
| 両方 | アポストロフィが \u02B9 |
トリガーとなるドメインリストとキーワードリストはbase64エンコードされ、さらにXORキー91で難読化されてバイナリ内に格納されている。
デコードされたキーワードリストは次の通りだ。
deepseek, moonshot, minimax, xaminim, zhipu, bigmodel, baichuan, stepfun, 01ai, dashscope, volces
いずれも中国系AIサービスの名称だ。ドメインリストもより大規模で、baidu.com・alibaba-inc.com・bytedance.net等の中国系企業ドメインに加え、プロキシ・リセラー・ゲートウェイ系のドメインが多数含まれる。
anyrouter.top
claude-code-hub.app
claude-opus.top
openclaude.me
proxyai.com
yunwu.ai
zenmux.ai
この設計の背景には、米中間のAI技術競争という文脈がある。中国政府はAI開発企業に対してモデルの学習データや能力に関する情報開示を義務付けており、Anthropicのモデルを中国企業のゲートウェイ経由で利用することは、いわゆるモデル蒸留攻撃(強力なモデルの出力を使って別モデルを訓練し、能力を模倣する手法)のリスクと表裏一体だ。Anthropicが利用規約でモデル蒸留を禁止していることも、この文脈で理解できる。
大半のユーザーには影響しない、が
ANTHROPIC_BASE_URL が未設定か、公式の api.anthropic.com を指している場合、この処理は早期リターンで全スキップされる。標準的な使い方では日付文字列は変更されない。
問題になるのはカスタムベースURLを使っているケースだ。社内ゲートウェイ、ローカルプロキシ、モデルルーター、リセラー経由のAPI、研究用途のセットアップなどが該当する。これらのユーザーはClaudeの利用規約に違反していないケースも多い。にもかかわらず、ホスト名でサイレントに分類されてシステムプロンプトにマーカーが埋め込まれる。
さらに筆者が指摘するのはバイパスの容易さだ。ホスト名を変えるか、タイムゾーンを変えるか、バイナリにパッチを当てれば回避できる。本当に悪意ある攻撃者にとってこの仕組みはほぼ無効で、「正規だが変わった使い方をしている開発者」だけが影響を受ける設計になっている。
本記事執筆時点でAnthropicからの公式コメントは確認されておらず、HackerNews上の議論では実装の意図や透明性をめぐって活発な意見交換が続いている。
問題の本質:隠すこと自体が問題
筆者はAnthropicの意図自体は理解できると述べる。APIリセラーの検出、無許可ゲートウェイの把握、モデル蒸留攻撃パイプラインの特定——いずれも正当な理由だ。
しかし実装方法に疑問を呈する。
APIプロバイダーがカスタムゲートウェイを検出したいなら、明示的なテレメトリフィールドを送ればいい。ポリシーをドキュメントに書けばいい。リリースノートに記載すればいい。シグナルをシステムプロンプトに隠す必要はない。
コーディングエージェントはすでにローカルマシン上でコードを読み、コマンドを実行し、ファイルを編集し、コミットをプッシュできる。その権限を許容しているのは、開発者がツールを信頼しているからだ。その信頼は「ふるまいがつまらないほど予測可能であること」で成り立っている。今回の発見が問うているのは、技術的な被害の有無ではなく、その信頼の根拠そのものだ。
詳細はClaude Code Is Steganographically Marking Requestsを参照していただきたい。