2026年3月31日(日本時間)、Claude Codeのnpmパッケージ @anthropic-ai/claude-code の2.1.88に、デバッグ用のソースマップ cli.js.map が入ったまま公開されました。ソースマップには元のTypeScriptが埋め込まれており、報道によれば約1,900ファイルのソースを復元できる状態でした(規模は報道値で、流出物をこの記事で集計したものではありません)。
この記事では、npmレジストリに残る公開と取り下げの記録、GitHubのDMCA通知の原文、流出に便乗した攻撃を一次情報で確かめたうえで、「claude npm」で調べる人が知りたい今のnpm版の入れ方(npm 12で起動しない問題を含む)と、自社のnpm公開で同じ事故を防ぐ設定をまとめます。レジストリの値は2026年10月31日に取り直しました。Claude Codeを使って自分のプロジェクトのソースコードを解析する方法を探している場合は、Claude Codeでソースコード解析する方法|既存コードの読解・バグ調査と静的解析との使い分け【2026年10月】を参照してください。
まとめ:Claude Code流出(npm 2.1.88)の要点と今やること
- 何が起きたか:2.1.88(2026-03-30 22:36 UTC=日本時間3月31日7:36公開)に約60MBのソースマップが同梱され、元のTypeScriptが復元可能になった。2.1.88は取り下げられ、レジストリには公開時刻だけが残っている。
- Anthropicの説明:顧客データや認証情報の露出は無く、リリース時の梱包の人為的ミスでセキュリティ侵害ではない。漏れたのはCLIのクライアント側のコードで、モデルの重みやサーバー側のコードではない。
- DMCA:3月31日の通知でGitHubはフォーク網8.1K件をまとめて停止し、翌日の一部撤回で対象は97件に縮小した。2025年2月の初回公開直後にも、Claude Codeのコードを複製したリポジトリに3件の通知が出ている。
- 便乗攻撃:「流出したClaude Code」を名乗る偽リポジトリからVidarなどのマルウェアが配られた。流出コードは取得もビルドもしない。
- 今のnpm版:2.1.113以降はネイティブバイナリを取ってくる薄いラッパーで、流出時の
cli.jsは入っていない。npm 12では既定でpostinstallが止まりclaudeが起動しないので、allow-scriptsで許可するかネイティブインストーラーへ切り替える。 - 自社で防ぐなら:package.jsonの
filesで公開物を許可リストにし、CIでnpm pack --dry-run --jsonの中身を検査する。.npmignoreの除外指定だけに頼らない。
npm 2.1.88に何が入っていたか:レジストリの記録と流出の規模
npmレジストリのパッケージ情報には、取り下げた版も含めて各版の公開時刻を記録する time 欄があります。2026年10月31日に取得した内容でも、2.1.88は time に公開時刻が残る一方、ダウンロードできる版の一覧(versions)からは消えています。
2.1.87・2.1.88・2.1.89の公開時刻と取得可否
| 版 | 公開(UTC) | 公開(日本時間) | 10月31日の状態 |
|---|---|---|---|
| 2.1.87 | 03-29 01:40 | 03-29 10:40 | 取得可(19ファイル) |
| 2.1.88 | 03-30 22:36 | 03-31 07:36 | 取り下げ済み |
| 2.1.89 | 03-31 23:32 | 04-01 08:32 | 取得可(19ファイル) |
前後の2.1.87と2.1.89のtarballは、cli.js(約13MB)、ripgrepのバイナリ、音声取得用のネイティブモジュールなど19ファイルで、.map ファイルはどちらにもありません。公式のCHANGELOGも2.1.87の次が2.1.89で、2.1.88の項目はありません。
報じられた流出の規模:59.8MB・1,906ファイル・約51万行
規模の数字は報道ごとに少しずつ違います。2.1.88そのものはnpmから取得できないため、主な報道の値を並べます。
| 出典 | ソースマップ | ファイル数 | 行数 |
|---|---|---|---|
| Zscaler(4月1日) | 59.8MB | 1,906 | 約513,000 |
| Ars Technica(3月31日) | 記載なし | 約2,000 | 512,000超 |
| Help Net Security(4月3日) | 記載なし | 1,906 | 約513,000 |
国内の解説記事には「約2,300ファイル」「57MB」とするものもありますが、Zscalerの分析とHelp Net Securityはともに1,906ファイル・約513,000行で一致しています。この記事では「約1,900ファイル・約51万行」と書きます。
ソースマップから元のTypeScriptが復元できる仕組み
ソースマップは、圧縮・結合したJavaScriptの位置を元のソースの位置へ対応付けるファイルです。仕様上、元ソースの本文を sourcesContent に丸ごと埋め込めます。これが入っていれば、.map ファイル1つから元のファイル群をそのまま書き出せます。
esbuild 0.25.12で3行のTypeScriptを --sourcemap 付きでバンドルすると、dist/cli.js.map の sourcesContent にコメントまで含めた元のソースが入り、cli.js の末尾には //# sourceMappingURL=cli.js.map が付きました。同じ条件で --sources-content=false を付けると、sourcesContent 自体が出力されません。ソースマップを配布物に残す必要がある場合でも、元ソースまでは配らない設定があります。
原因の説明:「セキュリティ侵害ではない」の範囲とBun原因説
Anthropicの広報は報道機関へのメールで次のように回答しています(Ars Technicaが全文を掲載)。
No sensitive customer data or credentials were involved or exposed. This was a release packaging issue caused by human error, not a security breach.
漏れたのはClaude Code(CLI)のクライアント側のソースです。モデルの重みや、APIの背後にあるサーバー側のコードはnpmパッケージに含まれていないため、この経路では出ていません。利用者がAPIキーを作り直す必要が生じる種類の事故でもありません。
原因を「Bunのバンドラーの不具合」や「Bunは既定でソースマップを出す」とする解説も出回りましたが、Bunの公式ドキュメントでは Bun.build の sourcemap の既定値は none です。よく引かれるBunのIssue #28001(2026年3月11日起票)は、フロントエンド開発サーバー Bun.serve が本番設定でもソースマップを配信してしまう問題で、npmパッケージのビルドとは別の話です。Anthropic自身も梱包時の人為的ミスと説明しています。自社の対策としては、ツールの不具合を探すより、公開物の中身を公開前に機械で検査する工程を入れるほうが確実です。
なお、同じ週の3月26日には、公開前の新モデル情報(Claude Mythos)が外部から見える状態になっていたと報じられています。モデルの現状はClaude Mythosとは?最新版Mythos 5.1とFable 5.1の違い・使える条件・料金【2026年10月】で扱っています。
GitHubのDMCA削除:2025年の3件と2026年の8.1K件から97件への縮小
AnthropicがClaude Codeのソースについて出したDMCA通知は、GitHubが公開している github/dmca リポジトリで原文を読めます。2025年分と2026年分を並べると次のとおりです。
| 通知日 | 対象 | GitHubの処理範囲 |
|---|---|---|
| 2025-03-10 | dnakov/claude-code | ネットワーク438件 |
| 2025-03-10 | 別ユーザーのリポジトリ | ネットワーク15件 |
| 2025-04-28 | 削除済みリポジトリの派生 | ネットワーク495件 |
| 2026-03-31 | nirholas/claude-code ほか | ネットワーク8.1K件 |
| 2026-04-01 | 上記の一部撤回 | 親+96フォークの97件に縮小 |
2025年2月の初回公開直後の取り下げと3件の通知
npmレジストリの time 欄を見ると、Claude Code公開初日の2025年2月24日に出た0.2.6・0.2.7・0.2.8の3版も取り下げ済みで、次の0.2.9が同日20:50(UTC)に出ています。2025-04-28付の通知は、公開時に利用できた初期のコードをあるユーザーが「source mapped」して公開し、3月10日の通知で削除させたと経緯を説明しています。そのうえで、同じユーザーの新しいリポジトリを派生物として申し立て、GitHubはネットワーク495件に処理を適用しました。ただし、0.2.6〜0.2.8は取り下げられていて中身を確かめられず、通知の原文だけでは、当時もnpm配布物にソースマップが混入していたとまでは断定できません。
2026年3月31日の通知と4月1日の一部撤回
2026-03-31付の通知は、親リポジトリ nirholas/claude-code の全体が侵害物だとし、フォーク96件を個別に挙げています。GitHubの注記によれば、侵害物を含むネットワークが100リポジトリを超え、申立人が「フォークの全部またはほとんどが親と同程度に侵害している」と主張したため、GitHubは8.1K件のネットワーク全体に削除を適用しました。
翌日の2026-04-01付の撤回文は、親リポジトリと個別に挙げた96フォークを除く全リポジトリについて通知を撤回し、ネットワーク単位で止めたリポジトリの復旧を求めています。最終的な対象は97件です。各リポジトリが実際に停止・復旧した時刻は撤回文からは分かりません。2026年5月から10月までの github/dmca には、Anthropic名義の通知はありません。
claw-codeなど再実装リポジトリの現状
流出直後には、流出コードを置くのではなく構造を参考に別の言語で書き直したと主張するリポジトリも現れました。代表例の claw-code は現在 ultraworkers/claw-code にあります。コミット履歴では、3月31日12:38(UTC)に「ソースツリーをPythonにする」コミット、同日17:43に「Rust port」のコミットがあり、Pythonへの移植から始まって同じ日のうちにRustへ移っています。
GitHub APIで10月31日に確認した値は、言語がRust、MITライセンス、スター約19.5万・フォーク約10.8万、最終push 10月28日です。リポジトリの説明文は自らを「museum exhibit(展示物)」と呼び、人の手を介さずエージェントが保守していると書いています。作者自身が本番用ではないと位置付けている以上、業務で依存するのは避けるべきです。MITライセンスの表示があっても、実装の独立性や第三者の権利まで確かめられるわけではありません。
流出コードで話題になった未公開機能と、その後の正式リリース状況
流出したソースからは、フィーチャーフラグで隠された開発中の機能名が多数報じられました。報道の段階では「コードに名前がある」以上のことは分かりません。公式CHANGELOGで同名の機能が出たかを突き合わせると次のとおりです。
| 報じられた機能名 | CHANGELOGでの扱い |
|---|---|
| BUDDY(ペット) | 2.1.89:4月1日用に /buddy 追加 |
| ULTRAPLAN | 2.1.101で記載、2.1.222で削除 |
| KAIROS(常駐型) | 同名の記載なし |
| Undercover Mode | 同名の記載なし |
/buddy は、流出を修正した2.1.89のCHANGELOGに「is here for April 1st」として載っています。エイプリルフール向けの仕込みが流出で先に知られた、と言われるのはこのためです。一方、ULTRAPLANは正式機能になった後に「Removed ultraplan feature」として削除されました。流出時のフラグ一覧がそのまま製品計画になるわけではないので、流出コードをロードマップとして読むのは避けてください。
流出に便乗した攻撃:偽リポジトリ・内部パッケージ名・同日のaxios侵害
「流出したClaude Code」を名乗る偽リポジトリの配布物
Zscalerは2026年4月1日、「Claude Code – Leaked Source Code」という名前の.7zアーカイブをリリース欄で配るGitHubリポジトリを報告しました。中の ClaudeCode_x64.exe はRust製のドロッパーで、情報窃取型マルウェアのVidar v18.7とプロキシ型のGhostSocksを入れます。流出を名乗るリポジトリのコードは、取得もフォークもビルドも実行もしないのが原則です。
流出ソースから分かった内部パッケージ名と自社での対策
流出コードは、npmに公開されていない内部パッケージの名前も明らかにしました。audio-capture-napi、color-diff-napi、image-processor-napi、modifiers-napi、url-handler-napi の5つは、レジストリの記録では3月31日15:04〜15:09(UTC)に作成され、報道では攻撃者による先取り登録と伝えられました。10月31日時点のレジストリでは、5つとも版は0.0.1、保守者は anthropic.com のメールアドレスを持つアカウントで、説明文は「This package name has been reserved.」です。Anthropic側が名前を押さえた状態が続いています。
自社のソースを公開する予定がなくても、内部パッケージ名をpublicレジストリで押さえていなければ、漏えい時に同名の悪性パッケージを置かれる余地が残ります。社内パッケージはスコープ(@社名/)付きにして、スコープごと確保しておくのが確実です。依存関係に紛れ込んだ不審なパッケージをインストール前に見つける仕組みはsocket.devとは?npm/PyPIのサプライチェーン攻撃を防ぐ仕組みと料金で解説しています。
日本時間3月31日午前のaxios悪性版と依存関係の確認
同じ3月31日には、HTTPクライアントのaxiosで別の事件が起きています。axiosの事後報告(GitHub Issue #10636)によると、メンテナのアカウントが乗っ取られ、[email protected] と [email protected] に遠隔操作型のトロイの木馬を入れる依存 [email protected] が仕込まれました。悪性版1.14.1の公開は00:21(UTC)、0.30.4の公開は01:00頃(UTC)で、両版の削除は03:15(UTC)です。
「この時間帯にnpmでClaude Codeを入れた人は影響を受けた可能性がある」と伝えた報道もありましたが、2.1.87と2.1.89のpackage.jsonは dependencies が空で、任意依存も画像処理のsharpだけです。Claude Codeを入れただけでaxiosが入る作りではなく、Zscalerも両者を「separate」な攻撃と書いています。確認すべきなのは、同じ時間帯に自分のプロジェクトで npm install を実行したかどうかです。ロックファイルの文字列検索では、package-lock.jsonでパッケージ名と版番号が別の項目に入るため見落とします。解決済みの版は npm ls で表示します。
# 今インストールされている依存関係(該当が無ければ (empty))
npm ls axios plain-crypto-js --all
# ロックファイルに記録された版(node_modulesを入れ直した後でも当時の解決結果を見られる)
npm ls axios plain-crypto-js --all --package-lock-only
1つ目が (empty) でも、その後に依存を更新・削除していれば過去の感染は否定できません。当時のロックファイルとCI・インストールログを突き合わせてください。
該当があった場合の対処はaxiosにマルウェア混入(1.14.1・0.30.4)|感染確認・対処と再発防止の設定にまとめています。
今のnpm版Claude Codeの中身とインストール手順
「claude npm」で調べて、今npmでClaude Codeを入れてよいかを知りたい人向けの章です。npm版は流出後に作りが大きく変わっています。
2.1.113でJavaScript本体からネイティブバイナリへ
2.1.113(2026-04-17公開)のCHANGELOGには「Changed the CLI to spawn a native Claude Code binary (via a per-platform optional dependency) instead of bundled JavaScript」とあります。tarballを比べると違いは明らかです。
| 版 | ファイル数 | 展開後サイズ | 実行ファイル |
|---|---|---|---|
| 2.1.87 | 19 | 約46.6MB | cli.js |
| 2.1.316 | 7 | 約190KB | bin/claude.exe(置き換え用) |
10月31日に2.1.316のtarballを展開すると、入っていたのは cli-wrapper.cjs、install.cjs、500バイトの bin/claude.exe、package.json、LICENSE.md、README.md、型定義の sdk-tools.d.ts の7ファイルでした。.map ファイルも cli.js もありません。公式のセットアップ手順は、npm版も「スタンドアロンのインストーラーと同じネイティブバイナリを入れる」と説明しています。@anthropic-ai/claude-code-darwin-arm64 などOSとCPUごとの任意依存(8種類)からバイナリを取り、postinstallの install.cjs が所定の位置に置く仕組みです。
公式の推奨はネイティブインストーラーで、npmは代替手段の扱いです。npmで入れるときの条件は次のとおりです。
- Node.js 22以上が必要(2.1.198から
enginesが>=22.0.0)。古いNode.jsではEBADENGINEの警告が出るが、実行するのはネイティブバイナリなので動く。 - 任意依存を無効にしている環境(
--omit=optional、.npmrcのoptional=falseなど)ではバイナリが入らない。社内のnpmミラーには本体と8種類のプラットフォーム別パッケージをすべて置く必要がある。 sudo npm install -gは使わない。公式は権限の問題とセキュリティ上のリスクを理由に明確に禁じており、sudoが要る入れ方では自動更新も失敗する。- 更新は
npm install -g @anthropic-ai/claude-code@latest。npm update -gは最初に入れたときのsemver範囲に縛られ、最新へ上がらないことがある。
npm 12で「claude native binary not installed」になる原因と直し方
npm 12は、許可していないパッケージのinstall scriptsを既定で実行しません。npm install -g のグローバルインストールでは、ユーザー設定の allow-scripts に載せたパッケージだけが対象で、Claude Codeのpostinstallもこれに当たります。10月31日にmacOS(darwin-x64)でnpm 12.2.1を使い、一時ディレクトリへ2.1.316を入れて確かめた結果は次のとおりです。
- オプション無しの
npm install -gは終了コード0で完了するが、「install scripts blocked」の警告が出て、bin/claude.exeは500バイトの置き換え用のまま残った。claude --versionは「Error: claude native binary not installed.」を出して終了コード1になった。 --allow-scripts=@anthropic-ai/claude-codeを付けて入れ直すと、bin/claude.exeが約324MBの実体に置き換わり、claude --versionは「2.1.316 (Claude Code)」を返した。npm config set "allow-scripts=…" --location=userは既存の値を足すのではなく丸ごと置き換えた。先に別のパッケージを許可していた場合、その許可は消える。
公式のトラブルシュートも、npm 12ではネイティブインストーラーへ切り替えるか、ユーザー設定の allow-scripts にClaude Codeを足すかの2択を示しています。後者の手順は、今の値を確かめてから既存の許可と一緒に書き直す形です。ただし、pnpm 9・10やYarn 1などで実行するpackage.jsonのスクリプトが内部で npm install を呼ぶ環境では、npm 12.1以降でも設定の引き継ぎにより EALLOWSCRIPTS で失敗する場合があり、公式はこのときもネイティブインストーラーを案内しています。
# 1. 今の許可リストを確認する(次のコマンドは値を丸ごと置き換えるため)
npm config get allow-scripts
# 2. 既存の許可があればカンマ区切りで並べて保存する
npm config set "allow-scripts=@anthropic-ai/claude-code" --location=user
# 3. 入れ直して起動を確認する
npm install -g @anthropic-ai/claude-code
claude --version
npm 12.0.x の場合は先に12.1以降へ上げるよう公式は案内しています(12.0.x では保存後に npx や npm run から起動したプロジェクトのインストールが EALLOWSCRIPTS で失敗することがあるため)。sudo が必要になる環境なら、npmで粘らずネイティブインストーラーへ移るほうが早く済みます。
latest・stableの確認と社内で版を固定する方法
npmは latest や stable といった名前(dist-tag)を特定の版に結び付けて配っており、版を指定しなければ latest が入ります。10月31日にレジストリで確認したdist-tagsは次のとおりです。
| dist-tag | 版 | 公開(UTC) |
|---|---|---|
| latest | 2.1.316 | 10-31 00:42 |
| next | 2.1.316 | 10-31 00:42 |
| stable | 2.1.309 | 10-22 20:34 |
レジストリの time 欄で数えると、9月に公開された版は27、10月も31日朝までに27あります。ほぼ毎日版が上がるため、記事や社内手順に書いた版番号はすぐ古くなります。導入前には次のコマンドで取り直してください。
# dist-tags(latest・stable・next)が今どの版を指しているか
npm view @anthropic-ai/claude-code dist-tags
# 各版の公開時刻(取り下げた2.1.88の時刻も残る)
npm view @anthropic-ai/claude-code time --json
npm install -g @anthropic-ai/claude-code@stable で入る stable は、公式によればおおむね1週間前の版で、大きな不具合が出た版を飛ばすチャネルです。ただし参照先は更新されるので、版の固定にはなりません。全端末で版をそろえるなら検証済みの版番号を指定して入れ、Claude Code自身の更新も環境変数 DISABLE_UPDATES=1 で止めて、管理者が新しい版を配ります。版の確認方法と更新チャネルの違いはClaude Codeの最新バージョンは2.1系|確認方法・アップデート手順とstable版の違い、導入後の初期設定はClaude Codeの使い方|インストールから権限・CLAUDE.md設定、初日の進め方まで、権限ルールやサンドボックスでの守り方はClaude Codeのセキュリティ設定|権限ルール・サンドボックス・管理設定で守る実装手順【2026年10月】を参照してください。
自社のnpm公開でソースマップ混入事故を防ぐ設定とCIでの検査
ソースマップの混入は、ビルドツールがソースマップを出力し、公開物の選別を除外指定に頼っていると起きます。npm 11.17.0とNode.js v26.5.0で小さなパッケージを作って確かめた結果をもとに、止め方を2段で示します。
package.jsonのfilesによる公開対象の許可リスト化
files も .npmignore も無いパッケージで npm pack --dry-run を実行すると、公開対象は dist/cli.js・dist/cli.js.map・package.json・src/cli.ts の4ファイルでした。ソースマップだけでなく元のTypeScriptまで入ります。package.jsonに次の1行を足すと、dist/cli.js と package.json の2ファイルに減りました。
"files": ["dist/*.js"]
.npmignore は「出さないもの」を列挙する方式なので、ビルドツールが新しい種類のファイルを出し始めると漏れます。files は公開対象を絞る許可リストです。ただし package.json、README、LICENSE、main で指定したファイルなど、設定にかかわらず含まれる例外があるため、許可リストを設定した後も実際の公開対象を検査します。
npm pack –dry-run –jsonによるCIの公開対象検査
次のスクリプトは npm pack --dry-run --json の結果から、.map ファイル、型定義以外の .ts・.tsx、.env を見つけたら終了コード1で止めます。上の検証用パッケージでは、files 有りで「OK: 2 files」、外すと dist/cli.js.map と src/cli.ts を挙げて終了コード1になりました。execSync でシェル経由に実行しているのは、Windowsでは npm の実体が npm.cmd で、シェルを通さない起動では見つからないためです。
// check-pack.mjs
import { execSync } from "node:child_process";
const out = execSync("npm pack --dry-run --json", { encoding: "utf8" });
const files = JSON.parse(out)[0].files.map((f) => f.path);
const bad = files.filter((p) => /\.map$|\.tsx?$|(^|\/)\.env/.test(p) && !p.endsWith(".d.ts"));
if (bad.length) { console.error("公開対象に含めてはいけないファイル:", bad); process.exit(1); }
console.log(`OK: ${files.length} files`);
リリース用のワークフローで npm publish の前に node check-pack.mjs を実行し、検査が失敗したら公開しないようにします。検査後の再ビルドや公開時のライフサイクルスクリプトで配布物が変わる構成では、この検査だけでは防げません。npm pack で作ったtarball自体を検査し、同じtarballを公開してください。ソースマップをエラー監視に使う場合は、公開パッケージには入れず監視サービスへ別途アップロードします。
公開物の検査を依存関係の検証や署名と並ぶ防御の1つとして位置付ける考え方はソフトウェアサプライチェーンセキュリティとは?開発工程に組み込む防御と2026年規制対応の実装判断、ソースマップの形式と生成設定はソースマップ(.mapファイル)とは?mappingsの読み方・生成設定・404警告の対処で解説しています。リリース工程に公開前の検査を組み込む設計から見直す場合は、DevOps・CI/CD導入支援で検査とワークフローの分け方を相談できます。
Claude Codeのソースコード流出に関するよくある質問
Claude Codeのソースコード流出はいつ、どのバージョンで起きましたか?
npmパッケージ @anthropic-ai/claude-code の2.1.88で、公開は2026年3月30日22:36(UTC)、日本時間では3月31日7:36です。2.1.88は取り下げ済みで、2026年10月31日時点でも取得できません。修正版の2.1.89は日本時間4月1日8:32に公開されました。
流出したのはモデルや顧客データですか?
いいえ。流出したのはClaude Code(CLI)のクライアント側のソースです。Anthropicは顧客データや認証情報の露出は無いと説明しています。モデルの重みやサーバー側のコードはnpmパッケージに含まれていません。
今npmでClaude Codeを入れても大丈夫ですか?
2.1.113以降のnpm版は公式のネイティブバイナリを取ってくるラッパーで、流出した頃の cli.js とは作りが違います。10月31日時点の latest は2.1.316、stable は2.1.309です。npmで入れるならNode.js 22以上で、sudo を付けずに入れます。npm 12では allow-scripts の許可が無いと起動しないため、公式の推奨どおりネイティブインストーラーを使うほうが手間は少なくなります。
流出をきっかけにClaude Codeはオープンソースになりましたか?
なっていません。GitHubの anthropics/claude-code は公開リポジトリですが、置かれているのはCHANGELOG・プラグイン・サンプルなどで、LICENSE.mdは「All rights reserved」とし、利用はAnthropicの商用利用規約に従うと定めています。流出したソースを使ってよいという許諾ではありません。
GitHubにある流出コードを見たりダウンロードしたりしてもよいですか?
勧めません。AnthropicはDMCA通知で著作権侵害として削除を求めており、「流出したClaude Code」を名乗るリポジトリからはVidarなどのマルウェアが配られました。ビルドや実行は特に危険です。