Claude Codeの「ソースコード流出」をどう見るのか

3月31日の朝、Xのタイムラインが騒がしくなっていました。Claude Codeのソースコードが流出したというのです。調べてみると、npmパッケージ(v2.1.88)にデバッグ用のsource mapファイル(cli.js.map)が含まれた状態でリリースされていました。source mapのsourcesContentフィールドに元のTypeScriptソースコード全体がそのまま埋め込まれており、発見者の投稿は数千万ビューを記録。GitHubにミラーリングされ数万フォークされる事態になりました。

Anthropicの公式見解は「release packaging issue caused by human error」で、セキュリティ侵害ではないとしています。顧客データ、APIキー、モデルウェイトは含まれていません。なお同じ日にはAxiosのnpmアカウント乗っ取り事件(サプライチェーン攻撃)も同時発生しており、npmエコシステム全体が混乱していた日でもあります。

「流出」という言葉が飛び交っていましたが、これをどう見るべきなのか。筆者なりに整理してみます。ソースコードの中身については実際に見ていないので触れません。

「流出」ではなく「ソースマップの露呈」

これはハッキングでもサイバー攻撃でもありません。npmリリース時に、公開パッケージへのsource map同梱を防ぐチェックが機能しなかったパッケージングミスです。

ソースマップとは、minifiedされたJSから元のソースコードへのマッピング情報です。sourcesContentが有効になっていると元コード全体を復元できてしまいます。メディアは「leak(流出)」と報じていますが、実態は「exposure(露呈)」のほうが正確でしょう。

Xでは「Bunがデフォルトでsource mapを生成してしまった」という噂が流れていましたが、Bun公式ドキュメントではBun.build()のデフォルトはsourcemap: "none"です。Bunだけのせいにするのは不正確で、根本はリリースプロセスのチェック漏れです。

ソースマップがなくても解析はできていた

Claude CodeはTypeScriptで書かれてminifiedされたJSとしてnpmに公開されていました。minifiedとは、変数名の短縮やスペース除去によってコードを圧縮する処理のことです。たとえば元のコードが以下のようなものだとします。

// minify前
function checkFeatureFlag(flagName: string): boolean {
  return enabledFlags.includes(flagName);
}
checkFeatureFlag("KAIROS_DAEMON_MODE");
// minify後
function a(b){return c.includes(b)}a("KAIROS_DAEMON_MODE");

変数名や関数名はa/b/cのように短縮されますが、文字列リテラル("KAIROS_DAEMON_MODE"のようなフラグ名、システムプロンプト、正規表現、エラーメッセージ)はそのまま残ります。minifyはObfuscation(難読化)ではなく、サイズ削減が目的だからです。

minifiedコードの解析は多少の手間がかかりますが、実際にはprettierなどのフォーマッターでパースしてから適切にファイル分割してAIに読み込ませて機能を解析していた人たちがすでにいました。変数名がa/b/cになっていても、文字列リテラルや関数の呼び出しパターンからAIがコンテキストを推測できます。「機密情報が漏れた」と報じられた内容の多くは、こうした文字列として残っていたフラグ名から推測・想像された内容が含まれます。

ただし、ビルド時にOFFにされていたフィーチャーフラグの背後にあるコードは別です。バンドラのtree-shakingにより、無効なフラグで囲まれたコードブロックは出力JSから物理的に除去されます。今回話題になった44個以上の未公開フィーチャーフラグは名前自体は残っているものがあったものの、その実装コードの多くは、minified JSには含まれておらず、ソースマップがあって初めて見えるようになったと言われています。

つまり、ソースマップの露呈で変わったのは2つあります。リリース済みの機能については変数名の意味論が復元されAIによる正確な要約が可能になったこと。そして未リリースの機能についてはコード自体が初めて外部から読めるようになったことです。

開発速度がリリース管理を超過している

ここからは確認できた事実をもとにした筆者の考察になります。

2025年2月24日、Claude Code v0.2.8のローンチ当日にもインラインソースマップ経由で同じ事故が発生していました。ソースマップ経由という同じ原因で再発したことになります。

Claude-code full source code extracted from source maps | Hacker News

AnthropicはClaude Codeの開発元として、マルチエージェントによる並行開発や社内向けの高度な自動化など、外部ユーザー以上にAI駆動開発を推し進めていると考えられます。今回の事故は、AI駆動で加速した開発速度に対して、公開物の検査や配布統制が追いついていないことを印象づけます。

リークされたコードからは44個以上のフィーチャーフラグが確認されています。フィーチャーフラグによる段階的リリースは、開発速度を制御するための手段として使われています。コードは先に本番環境に入り、フラグで有効化のタイミングだけを人間が制御するデプロイ手法です。フラグの条件はオンライン/オフラインや特定チームのみなど、細かく制御されています。
(※フラグ管理には元々Statsigが使われていたようですが、OpenAIによる買収を受けてか、OSSのGrowthBookへの移行が進んでいます。)

フラグの存在自体はソースコードに文字列として残るので、minified JSの時点でフラグ名は見えていました。フィーチャーフラグという仕組み自体が「何かを隠している」という印象を与えていますが、フィーチャーフラグは一般にリリースタイミングを制御する仕組みであり、コードの秘匿を目的としたものではありません。

そもそも隠す意図はどれぐらいあったのか

本当にソースコードを秘匿したいなら、ネイティブバイナリ配布のほうが解析コストは上げやすいです。Claude Codeが使っているBun自体にbun build --compileというネイティブバイナリ生成機能があります。さらに、Claude Codeは内部レンダラーにRustを使っていたり、署名周りにZig由来と思われるファイルが含まれていたりと、すでにネイティブコンポーネントを部分的に採用しています。技術的にネイティブバイナリ化ができないわけではありません。

実際、現在の推奨インストール方法(curl -fsSL https://claude.ai/install.sh | sh)ではGCSからプラットフォーム別のネイティブバイナリをダウンロードしており、npmは経由しません。npm版は互換性やCI/CDなどの用途のために維持されている配布チャネルと見られ、少なくとも秘匿は最優先事項ではなかった可能性が高いです。

Latent SpaceポッドキャストでClaude CodeチームのBorisはオープンソース化について「investigating」「not yet」と回答し、source available(ソース公開だがライセンスはオープンソースではない形態)の可能性にも言及していました。しかし今回の事故後にDMCA削除要請を出している動きを見ると、少なくとも現時点でのソース公開は遠のいたように見えます。

フィーチャーフラグで未公開機能を制御していること自体が、「コードは見えてもいいが、機能の有効化タイミングは制御したい」という設計判断と読めます。

競合への影響はどの程度か

報道やインフルエンサーは「競合がClaude Codeの秘密のソースを分析できるようになった」と騒いでいますが、AIコーディングエージェントの差別化はコードそのものではなくモデルとハーネスの統合にあります。Claude Codeの強さはClaudeモデルとの緊密な連携から来ており、ハーネス(プロンプトの組み立て・ツール呼び出しの制御・モデル応答の後処理などを担うクライアント側のコード)だけでは競争力のコアを再現できません。

これはClaude Codeに限った話ではありません。たとえばOpenAIのCodexはCompactionなど一部機能がサーバー側に実装されています。Claude Codeもanthropic-betaヘッダーでコンテキスト圧縮(compact)や思考の挟み込み(interleaved-thinking)などの機能をAPI側から制御しています。クライアント側のコードだけでなく、サーバー側のモデル応答や機能提供と一体で動く設計であり、コードをコピーしても背後のAPI側の対応がなければ同等の挙動をそのまま再現するのは難しいでしょう。

だとしたら、ベンチマークスコアで最強クラスのGeminiを擁するGemini CLIはもっと”できる子”であるべきです。Gemini CLIはApache 2.0ライセンスでソースがほぼ読める状態で配布されており、Geminiモデルとの統合も当然あります。にもかかわらず、筆者の使用感ではCLIとしての能力はClaude Codeに及びません。現状はモデルとそれを使うCLIが一体となって開発されているかどうかで競争力が決まる結果になっています。

クリーンルーム再実装(Python/Rust版)が登場していますが、筆者はts-benchという評価ハーネスプロジェクトでニッチなエージェントとマイナーモデルを日常的に動かしており、その経験から言えばモデルとそのAPIへの入出力がエージェントの挙動に与える影響は世間の認識よりはるかにセンシティブです。ハーネスのコードを移植しただけでは同じ結果にはなりません。

まとめ

事故の直接原因は、source mapを含む成果物がそのまま公開パッケージに入ったことです。ソースマップがなくてもminified JSからの解析は以前から可能でした。今回の事故で変わったのは特定のスナップッショトバージョンの解析コストが下がったことです。

「機密情報の流出」という表現は誇張気味でしょう。フィーチャーフラグはリリースタイミングの制御であって秘匿の手段ではありません。推奨の配布方法はすでにネイティブバイナリに移行しています。

Anthropicは自社のClaude Codeで開発を加速し、フィーチャーフラグで制御するという、AI駆動開発の最先端にいる企業だと思います。その先端ゆえにリリース管理が追いつかなくなっている課題があるとすれば、これは未来の私たちの姿でもありますね。

更新履歴

Sat Apr 4 2026: Redditなどの情報によると非公開フィーチャーフラグ実装コードはminified JSに含まれていなかった、とされているので露呈の範囲を訂正(Hiroshi Urayama さんによるコメント)

Subscribe to laiso

Sign up now to get access to the library of members-only issues.
[email protected]
Subscribe