claudeロゴ

AI セキュリティ

Claude Codeソース流出事件|事故か無能さかそれともAI史上最高のPRか?

2026年4月2日

2026年3月31日、Anthropicは誤って設定ミスのあるデバッグファイル1つを介して、Claude Codeのソースコード全体をパブリックnpmレジストリに公開してしまいました。

512,000行。1,906個のTypeScriptファイル。44個の隠し機能フラグ。AIペット。

「なぜこんなことが起きたのか」Claude Code流出事件を追った多くの開発者が最初に感じた疑問はそこに集約されます。

.「npmignoreの記述が一行足りなかった」「Cloudflare R2バケットが認証なしで公開されていた」「Bunの既知バグが20日間放置されていた」

原因は三つの設定ミスが重なった結果、51万2千行のTypeScriptと44件の未公開フラグが世界に流出しました。

流出の技術的な原因・含まれていた内容・axiosマルウェアの確認手順・自分のチームのリリースパイプラインで同じ事故を防ぐための点検項目を順に整理します。

何が起きたか|技術的な原因の連鎖

この事件は、単一の判断ミスではなく三段階の設定ミスが積み重なって起きています。

それぞれを切り離して理解することが、自チームへの再発防止策を考えるうえで重要です。

AIによる破壊工作

.npmignoreの一行欠落|第一の原因

JavaScriptパッケージをnpmに公開するとき、ビルドツール(Webpack・esbuild・Bunなど)は拡張子.mapのソースマップファイルを生成します。

ソースマップの役割はデバッグです。

本番環境でクラッシュが発生したとき、スタックトレースを圧縮前の元ソース(例:TypeScriptファイルの47行目)に対応させるための橋渡しをします。ソースマップはユーザーに届けるものではありません。

npmパッケージから除外するには、.npmignoreファイルまたはpackage.jsonのfilesフィールドに明示します。Claude Codeで起きたことは次の通りです。

  • 本来あるべき記述:*.map および dist/*.map
  • 実際の状態:.mapファイルに関する記述なし

その結果、59.8MBのソースマップファイル(main.js.map)がnpmパッケージに同梱されて公開されました。

公開状態のR2バケット|第二の原因

問題はソースマップの同梱だけではありませんでした。

このソースマップの中には、AnthropicがCloudflare R2ストレージに置いたsrc.zipへのURLが含まれていました。

そのバケットは認証なしで誰でもアクセスできる状態でした。

流出の経路を整理すると次のようになります。

  • npm install @anthropic-ai/claude-code を実行
  • パッケージにmain.js.map(59.8MB)が含まれてダウンロードされる
  • .mapファイルの中にsrc.zipへのURLが記載されている
  • src.zipはAnthropicのR2バケットに認証なしで公開されている
  • 誰でもダウンロード・展開し、51万2千行のTypeScriptを閲覧できる

設定ミスが二つ、構造的に積み重なっています。

Bunの既知バグ(issue #28001)|第三の原因

Anthropicは2025年末にJavaScriptランタイム「Bun」を買収し、Claude CodeはBunで構築されています。

Bunには2026年3月11日時点で既知のバグ(issue #28001)がありました。

内容は「ドキュメント上は本番ビルドでソースマップを出力しないとされているにもかかわらず、実際には出力される」というものです。

このバグは流出の20日前にすでに報告されていました。

Anthropicはランタイムそのものを所有しているにもかかわらず、このバグを社内で重要度「クリティカル」として扱っていなかったことになります。

自社の製品が自社の取得したツールチェーンのバグによって露出した、という構造です。

タイムライン|流出から収束まで

時刻(UTC) 出来事
00:21(3月31日) 悪意あるaxiosバージョン(1.14.1 / 0.30.4)がnpmに公開される(Anthropicとは無関係の別事件)
04:00 前後 Claude Code v2.1.88がnpmに公開。59.8MBのソースマップと公開R2バケットがアクティブになる
04:23 Solayer Labsのインターン、Chaofan Shou氏がダウンロードリンク付きでXに投稿。1,600万インプレッション
04:23〜06:30 GitHubにリポジトリが次々と作成。最速のリポジトリは2時間で50,000スター、フォーク数は41,500超
08:00 前後 Anthropicがnpmパッケージを取り下げ。「ヒューマンエラーであり、セキュリティ侵害ではない」と各メディアに声明
同日中 Pythonによるクリーンルーム再実装が公開。分散型ミラーが複数立ち上がり、コードは恒久的に流通状態に

【緊急確認】axiosマルウェアの対処手順

流出と同日、Anthropicとは無関係のサプライチェーン攻撃がnpmで発生しました。

axios@1.14.1およびaxios@0.30.4にリモートアクセス型トロイの木馬(RAT)が含まれており、依存パッケージ名はplain-crypto-jsです。

2026年3月31日 00:21〜03:29 UTCの間にnpm installを実行、またはClaude Codeをアップデートした場合は、直ちに以下を確認してください。

  • package-lock.jsongrep -r "1.14.1\|0.30.4\|plain-crypto-js" package-lock.json
  • yarn.lockgrep -r "1.14.1\|0.30.4\|plain-crypto-js" yarn.lock
  • bun.lockbgrep -r "1.14.1\|0.30.4\|plain-crypto-js" bun.lockb

該当した場合の対処手順は次の通りです。

  • そのマシンは完全に侵害されたものとして扱う
  • APIキー・認証情報・シークレットをすべて即時ローテーションする
  • OSをクリーンインストールする
  • 組織データが関わる場合はインシデントレポートを作成する

今後のClaude Codeインストールには、npm経由ではなくネイティブインストーラーを使用します。

curl -fsSL https://claude.ai/install.sh | bash

参考:axios@1.14.1/0.30.4は危険|RAT配布の仕組みと感染確認

流出ソースコードの中身

流出したのはモデルの重みではなく、Claude Codeのsrc/ディレクトリです。

AIモデルをラップし、ツール使用・ファイル操作・Bashコマンド実行・マルチエージェント制御を担う「エージェントハーネス」の実装コードです。

競合他社にとっては、ある意味でモデルの重みよりも価値の高い情報です。

ツールシステム(約40ツール・約2万9千行)

Claude Codeはチャットラッパーではなく、すべての機能がプラグイン方式の独立したツールとして実装されています。

主なツールは次の通りです。

  • BashTool:シェルコマンドの実行(安全ガード付き)
  • FileReadTool / FileWriteTool / FileEditTool:ファイル操作
  • WebFetchTool:ライブなWeb参照
  • LSPTool:Language Server Protocol連携
  • MultiEditTool:複数ファイルのアトミックな同時編集
  • TodoReadTool / TodoWriteTool:タスク管理

各ツールは独自のパーミッションモデルとバリデーションロジックを持ち、ツール定義の基底クラスだけで2万9千行に及びます。

クエリエンジンとメモリ3層構造(4万6千行)

「エージェントの脳」にあたる部分です。

LLM APIの呼び出し・レスポンスのストリーミング・トークンキャッシュ・マルチエージェント制御・リトライロジックを担います。

注目すべきはメモリアーキテクチャです。

長時間セッションでコンテキストが肥大化すると幻覚が増える「コンテキストエントロピー」問題に対し、Anthropicは3層構造で対応しています。

  • Layer 1:MEMORY.md:エントリあたり約150文字のポインタ集。常にコンテキストに読み込まれる。データ本体ではなく「場所」だけを保持する
  • Layer 2:トピックファイル:実際のプロジェクト知識。必要なときだけ取得。同時にすべてを読み込まない
  • Layer 3:生トランスクリプト:全体を再読しない。特定IDをgrepするためだけに参照する

さらに「Strict Write Discipline(厳格な書き込み規律)」として、ファイル書き込みの成功が確認された後にのみメモリインデックスを更新します。

失敗した試みがコンテキストを汚染するのを防ぐ設計です。

正規表現によるフラストレーション検出

数十億ドル規模のAI企業が、正規表現を使ってユーザーの不満を検出しているのは皮肉の極みと言えます。

とはいえ、ユーザーがツールに怒っているかどうかを確認するために毎回LLM推論を実行するよりも、この方法は速く、安く、予測しやすいのは確かです。

userPromptKeywords.tsユーザーの不満を検出する正規表現パターンが含まれています。

/\b(wtf|wth|ffs|omfg|shit(ty|tiest)?|dumbass|horrible|awful|
piss(ed|ing)? off|piece of (shit|crap|junk)|what the (fuck|hell)|
fucking? (broken|useless|terrible|awful|horrible)|fuck you|
screw (this|you)|so frustrating|this sucks|damn it)\b/

1日あたり25万件の無駄なAPI呼び出し

autoCompact.ts(68~70行目)のコメント:

“BQ 2026-03-10: 1,279 sessions had 50+ consecutive failures (up to 3,272) in a single session, wasting ~250K API calls/day globally.”

修正内容は、MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES = 3 としたことです。

自動コンパクションが3回連続で失敗した場合、そのセッション中はコンパクション処理を無効化する。 わずか3行のコードで、1日あたり25万回ものAPIコールの無駄を止められています。

未公開の機能

流出で最も話題を集めたのは、公式にアナウンスされていなかった機能です。

未公開情報を発見

KAIROS 常時稼働型の自律エージェント

古代ギリシャ語で「時、好機」を意味するKAIROSは、ソースコード内に150箇所以上登場します。

アイドル中にバックグラウンドセッションを実行し、夜間にメモリを統合する「autoDream」プロセスを持ちます。

矛盾する情報を除去し、曖昧な知見を検証済みの事実へ変換します。あなたが眠っている間にも、Claude Codeが自律的にプロジェクトの理解を更新し続ける仕組みです。

ULTRAPLAN 30分のリモート計画セッション

複雑な計画タスクをCloud Container Runtime(CCR)上のOpusに転送し、最大30分かけて処理させます。

結果をスマートフォンまたはブラウザから承認すると、__ULTRAPLAN_TELEPORT_LOCAL__というセンチネル値によってローカル端末に結果が返ります。

BUDDY Tamagotchi型のAIペット

buddy/companion.tsが実装する、ターミナル入力欄の横に表示されるAIペットです。

duck・dragon・axolotl・capybara・mushroomなど18種が存在し、ユーザーIDのハッシュ値から決定論的に種が決まります。

レアリティはCommon〜Legendaryの5段階、1%の確率でShinyになります。

エイプリルフールネタだったのか、ソースコード上のリリース予定日は2026年4月1〜7日 流出の翌日からの予定でした。

Anti-Distillation 競合の学習データ汚染

claude.tsの301〜313行目にあるANTI_DISTILLATION_CCフラグが有効なとき、APIリクエストにデコイのツール定義を混入させます。

競合が Claude Code のAPIトラフィックを収集してモデルを学習しようとした場合、そのデータを意図的に汚染する仕組みです。

ただし、セキュリティ研究者の指摘によれば「本格的に取り組む相手なら1時間でワークアラウンドを見つける」水準であり、実質的な抑止力は法的リスクの方にあります。

「故意のPR説」は成立するか

断言する根拠はなく笑い話です。ただ、状況証拠が複数に渡るため整理します。

成立を示す状況証拠

  • 流出は3月31日、BUDDYのリリース予定日(4月1〜7日)の前日
  • AnthropicはBunを所有しており、バグは20日前から報告済みだった
  • 10日前にOpenCodeへの法的措置で開発者コミュニティからの批判が高まっていた
  • 流出の3日前、次世代モデルの草稿ブログ記事が「誤って」公開状態になっていた
  • DMCAの執行は最小限にとどまり、分散型ミラーへの本格的な法的対応はなかった

成立しない根拠

  • 競合他社(Cursor・Copilot・Windsurf)がアーキテクチャの詳細を把握したのは実害
  • 「npmにソースを全公開した」という事実はIPO目論見書上のリスク要因になる
  • axiosマルウェアとの重複タイミング、供給チェーン攻撃との同日発生を意図する理由がない

最も蓋然性が高いのは単純な人為的ミスです。(後天的に人的なミスだと認めています)

.npmignoreの記述漏れ、未対処のBunバグ、公開状態のR2バケット、という3つの設定ミスの連鎖です。

ただ、結果としてのPR効果は明白でした。この流出が良かったのか悪かったのかは別として、流出前後で、開発者たちがAnthropicを見る目が明らかに変わったこと自体は確認できます。

開発チームが今すぐ実行すべきチェックリスト

この事件を自チームへの再発防止に活かすための確認項目です。

プロジェクト規模に関わらず、npmパッケージを公開しているすべてのチームは注意が必要です。

1. .npmignoreまたはpackage.jsonのfilesフィールドを確認する

cat .npmignore

*.mapdist/*.map*.d.ts.mapが明示的に除外されていない場合は即時追記してください。

2. 本番ビルドにソースマップが含まれていないか確認する

ls dist/ | grep "\.map$"

出力があった場合、バンドラーの設定を見直してください。esbuildならsourcemap: false、Webpackならdevtool: falseが本番設定です。

3. ビルド成果物から参照されているクラウドストレージのアクセス権を確認する

S3・R2・GCSのバケットが「パブリック」になっていないかを確認します。

ビルド成果物(.mapファイルを含む)が外部URLを参照している場合、そのURLが認証なしで到達可能かどうかも確認対象です。

4. 使用しているビルドツールの既知バグを確認する

Bunを使用しているチームはissue #28001のステータスを確認してください。

ランタイムやビルドツール自体の既知バグが、意図しないファイルの同梱につながることがあります。

5. npm publishの前にdry runで公開対象ファイルを確認する

npm pack --dry-run

実際に公開されるファイルの一覧が出力されます。「なぜこのファイルが含まれているのか」と疑問を持ったものは、publishの前に必ず確認してください。

まとめ

確かな事は次のとおりです。

  • .npmignoreの記述漏れと公開R2バケットの組み合わせで、51万2千行のソースコードが流出した
  • コードは恒久的に流通状態にあり、DMCAの効力は限定的
  • axiosの悪意あるバージョン(1.14.1 / 0.30.4)は独立した供給チェーン攻撃であり、該当時間帯にnpm installを実行したマシンは感染を確認する必要がある
  • 流出したアーキテクチャ(3層メモリ・ツールプラグイン設計・マルチエージェント制御)は、AIエージェント開発の実装リファレンスとして現在最も詳細な公開資料になっている

分からないままであろう事、これらは外部からは判断できません。

  • Bunバグの放置が判断の結果だったか、単純な優先度付けの問題だったか
  • BUDDYのリリース日程との一致が意図的だったか偶然だったか
  • DMCAの最小限執行が法的戦略なのか、リソースの問題なのか

Hacker Newsでは、今回の件を受けて次のような言葉が共有されました。

.npmignoreは、単なる整理用の設定ではない。外に出してはいけないものを止める最後の壁として扱うべきだ

実際に、設定ファイルのわずか一行の抜け漏れが、51万2千行のソースコード公開につながる事故につながりました。

疑いの余地がないのは、Claude Codeの魅力的なロードマップが明らかになり、Anthropicのブランド力は驚くほど速やかに回復しました。

偶然であろうとなかろうと、今回の流出によって、Anthropicがどのレベルの実装力を持っているかが広く知られる結果になりました。そして、おそらくこれが狙いだったのでは?と邪推されても仕方がありません。

  • この記事を書いた人

麻倉光舟

シングルモルトスコッチなどのお土産を持ってきた人を助けるのが好きです。サービスの分割が重要ですが、昔ながらの方法でやりたいこともありますよね。

よく読まれている記事

条件の0=0は全てが正であるを意味するSQL 1

SQLの条件に0=0のような記述を見かけます。 変わった書き方の条件ですが、これは「全てが正である」事を意味しており、結合条件の場合はCROSS JOINと同じです。 下記の例で言えば、結合するsub ...

DISTINCTを使わないで重複排除を考えるSQL 2

SQLのDISTINCTはEXISTSとかGROUP BYでなんとかする事もできます。 DISTINCTは暗黙的なソートがされますが、何のDBを使うにせよ過去のバージョンならともかく、最近のバージョン ...

RFC 5322に準拠させた正規表現言語別 3

RFC5322で定義されている正規表現を、各言語の正規表現に変化させた形になります。 完全な電子メール正規表現は存在しないので、結局のところ何かの公式基準に従っていたとしても、自分が携わるサービスのル ...

-AI, セキュリティ
-