Anthropicが提供するAIコーディングツール「Claude Code」の中身が丸見えになった。
ハッキングされたわけではない。Anthropicが自分でnpm(JavaScriptのパッケージ管理システム)にコードを公開するとき、「ソースマップ」という本来含めてはいけないファイルを一緒に入れてしまった。いわば設計図を製品と一緒に箱に入れて出荷してしまったようなものだ。
発見したのはセキュリティ研究者のChaofan Shou氏。対象は @anthropic-ai/claude-code v2.1.88で、1,902個のファイル・51万行以上のソースコードが読める状態だった。
発見から数時間でGitHubにアーカイブリポジトリが複数作られ、最大のものは15,000以上のスターと22,000以上のフォークを集めた。もう回収は不可能だ。
ソースマップとは、「圧縮・変換後のコード」と「元のコード」を対応づけるファイルだ。開発中のデバッグには便利だが、本番環境に含めると元のソースコードが丸見えになる。
流出がどのように起きたかを図にすると:
npmでパッケージを公開する際は「このファイルだけ入れる」というホワイトリスト方式が推奨されている。しかしAnthropicは「このファイルは入れない」というブラックリスト方式を使っていたため、ソースマップがすり抜けてしまった。
同じ日にAxiosの供給チェーン攻撃も報告されており、npmエコシステムのセキュリティが改めて問われる1日になった。
流出したソースコードの分析から、Claude Codeの内部構造が見えてきた。全体像を図にするとこうなる:
ソフトウェア開発では「フィーチャーフラグ」という仕組みを使って、開発中の機能をコードに入れつつ無効化しておくことがある。スマホアプリで言えば「メニューには出てないけどコードの中には存在する隠し機能」のようなものだ。Claude Codeには107個ものフラグが見つかったとされている。
以下は、流出したコードの分析レポートやXのスレッドで報告された内容だ。Anthropicによる公式確認はなく、分析者の解釈が含まれている点に注意してほしい。
ただし、実際のソースコードには tengu_ プレフィックスのフラグが至るところに埋め込まれている。たとえば:
// src/commands/vim/vim.ts — エディタモード変更時のログ
logEvent('tengu_editor_mode_changed', {
mode: newMode,
source: 'command',
});
// src/utils/bash/parser.ts — Tree-sitterパーサーのロード
logEvent('tengu_tree_sitter_load', { success })
// src/hooks/useIdeLogging.ts — IDE連携イベント
logEvent(`tengu_ide_${eventName}`, eventData)
「tengu(天狗)」がアナリティクスイベントの共通プレフィックスとして使われていることが確認できる。
最も話題になったのが「KAIROS」と呼ばれるプロジェクトだ。
今のClaude Codeは「ユーザーが指示を出す → AIが答える」という対話型。KAIROSはユーザーが何も言わなくてもAIが自律的に動く常駐アシスタントに進化させる計画だとされている。
報告されたフラグ名から推測される機能:
| 機能 | 何ができるようになる? |
|---|---|
| 常駐プロセス化 | PCを立ち上げたらバックグラウンドで動き続ける |
| 自律動作 | ユーザーの入力を待たずに自分で判断して動く |
| プッシュ通知 | 「これやっておきました」とスマホに通知が来る |
| マルチチャネル | ターミナルだけでなく複数の入力経路をサポート |
| 15秒ルール | 15秒以上かかる処理は後回しにして邪魔しない |
実際のコードでは、KAIROSのフラグがUI制御にまで組み込まれている:
// src/components/Spinner.tsx — KAIROSモード時のUI切り替え
if (
(feature('KAIROS') || feature('KAIROS_BRIEF')) &&
(getKairosActive() || getUserMsgOptIn() &&
(briefEnvEnabled ||
getFeatureValue_CACHED_MAY_BE_STALE('tengu_kairos_brief', false))
) && isBriefOnly && !viewingAgentTaskId
) {
return <BriefSpinner mode={props.mode} />;
}
feature('KAIROS') でフラグの有効/無効を判定し、有効な場合は専用UIに切り替わる。GrowthBookの tengu_kairos_brief がキルスイッチ(緊急停止用)として機能している点も興味深い。
「Dream(夢見る)」と名付けられた機能の報告もある。人間が睡眠中に記憶を整理するように、AIがアイドル時に過去のセッションを振り返り、記憶を自動整理するというものだ。
ソースコードにも autoDream の実装が確認できる:
// src/utils/backgroundHousekeeping.ts — autoDreamの初期化
import { initAutoDream } from '../services/autoDream/autoDream.js'
// src/services/autoDream/consolidationLock.ts — 排他ロック
logForDebugging(
`[autoDream] lock held by live PID ${holderPid} ` +
`(mtime ${Math.round((Date.now() - mtimeMs) / 1000)}s ago)`
)
// src/services/autoDream/config.ts
// can read the auto-dream enabled state without dragging in
// the forked agent / task registry / message builder chain
// that autoDream.ts pulls in.
consolidationLock でプロセス間の排他制御を行い、複数のClaude Codeインスタンスが同時に記憶整理を始めないようにしている。Claude Codeの自動モードで既にメモリ機能は実装されており、その延長線上にある機能という解釈は自然だ。
マルチエージェント(複数のAIが協力して動く)の仕組みも報告されている。
注目されたのはVerification Agentに与えられたとされるプロンプトだ。「あなたの仕事は実装が動くことを確認することではない — 壊すことだ」「最初の80%に騙されるな」と書かれているという。AIが自分自身の「見た目は動いてるからOK」というバイアスを対策している設計思想が読み取れる。
| フラグ名 | 推測される機能 | ひとことで言うと |
|---|---|---|
VOICE_MODE |
音声入出力 | 話しかけてコーディング |
WEB_BROWSER_TOOL |
ブラウザ操作を内蔵 | AIがWebページを見る |
ULTRAPLAN |
最大30分の超詳細プランニング | クラウドで長考 |
ULTRATHINK |
深い推論モード | さらに深く考える |
BUDDY |
たまごっち風コンパニオンペット | エイプリルフール? |
MCP_SKILLS |
MCPサーバーからスキル自動発見 | プラグイン自動認識 |
TEAMMEM |
チーム共有メモリ | チーム全員の記憶を共有 |
FORK_SUBAGENT |
サブエージェントのプロセス分離 | AI分身が独立動作 |
分析レポートでは、Claude Codeを不正なリポジトリで使う場合のリスクも指摘されている。
知らないリポジトリで claude -p や claude doctor を安易に実行しないこと。 これはClaude Codeに限らず、あらゆるAIコーディングツールに共通するリスクだ。
ソースコードからは、Anthropic社員がパブリックリポジトリで作業する際に、内部情報(モデルコードネーム、未リリースバージョン等)をコミットやPRから自動除去する仕組みの存在も報告されている。
内部情報の流出防止機能を実装していたのに、ソースマップ経由でコード自体が流出した — という皮肉は多くの人が指摘した。
これは5日間で2度目の重大な情報流出だ。3月26日にはCMS設定ミスで未リリースモデル「Claude Mythos」の詳細、CEOイベント情報、3,000の未公開アセットが流出していた。
「AIセーフティ企業」を標榜する会社が自社ソフトウェアのセキュリティ管理に連続して失敗した形で、「AIの安全性を語る前に自社の安全性を」という声も上がっている。
技術的な話に戻ると、今回の事件からnpmパッケージを公開するすべての開発者が学べることがある。
# パッケージに含まれるファイルを事前確認
npm pack --dry-run
# ソースマップが含まれていないか検索
npm pack --dry-run 2>&1 | grep -i ".map"
{
"files": [
"dist/",
"README.md",
"LICENSE"
]
}
「入れないファイルを指定する」のではなく、「入れるファイルだけ指定する」。これだけで今回のような事故の大半は防げる。
# GitHub Actionsでパブリッシュ前にソースマップを検証
- name: Check for source maps
run: |
if npm pack --dry-run 2>&1 | grep -q "\.map"; then
echo "ERROR: Source maps found in package"
exit 1
fi
最後に大事な注意点。この記事で紹介した「KAIROS」「autoDream」「107個のフィーチャーフラグ」などの情報は、流出したソースコードの第三者による分析結果に基づいている。
フィーチャーフラグがコードに存在することと、その機能が実際にリリースされることは別の話だ。廃止された実験的機能やジョークコード(BUDDY のたまごっちなど)が含まれている可能性もある。
Anthropicからの公式声明は出されていない。
信じるか信じないかは、あなた次第だ。
OpenHandsのようなオープンソースAIコーディングツールでは、こうした「流出」の概念自体が存在しない。コードの透明性をどう考えるかという問いも、この事件は投げかけている。