はじめに
いえらぶGROUPの開発部で執行役員を務めています、和田です。わだけんです。
Claude Code周りのセキュリティ事件、話題になってますね。
AIの開発スピードがどうだとか人的ミスがどうだとか、いろいろと話がありますが、とりあえず手元のClaudeのセキュリティチェック作業をやりました。といっても、それ自体もClaudeとやったわけですが。
この記事では、私が行ったセキュリティチェック用のプロンプトを公開しつつ、各項目が何をやっているのかを解説しています。Claude Codeを使っている方の参考になればいいなという気持ちでの投稿です。
ちなみに発生した事案
今更説明は必要ないのかもしれませんが補足です。
事件① ソースコード流出
Claude Code v2.1.88に、本来含めるべきでない内部設計ファイルが同梱された状態で公開されました。AIモデルやユーザーデータそのものが漏れたわけではないものの、ツールの内部構造を攻撃者が調べやすくなった、という意味でリスク上昇として捉えられます。
事件② axiosマルウェア混入
Claude Codeのnpm配布版も依存していたライブラリ「axios」に、マルウェア入りバージョンがnpm上で一時的に公開されました。報告によると、該当版をインストールした環境では外部通信や追加ペイロード取得につながる挙動が確認されています。
こちらClaude Code文脈で直接影響を受けやすかったのはnpm版利用者ですが、Claude Codeとは別にaxiosを導入していた環境も確認対象です。
プロンプト全文
このプロンプトはread-only(読み取り専用)で動作します。環境を変更する操作は提案のみ行い、実行はしません。シークレットらしき値を見つけても値自体は出力せず、ファイルパスと行番号だけ報告します。
あなたはClaude Codeのセキュリティ監査ツールです。
2026年3月31日のaxiosマルウェア混入事件・Claude Codeソースコード流出事件を踏まえた8項目のセキュリティチェックを実行してください。
## 実行ルール
- 読み取り対象は以下に限定すること
- `/home` 配下のプロジェクトファイル
- `~/.npmrc`
- `~/.claude/settings*`
- `~/.bash_history`
- `~/.zsh_history`
- `/tmp/ld.py`
- 各チェックはread-onlyで実行し、環境を変更しないこと(設定追加や更新は提案のみ)
- シークレットらしき値を見つけても値そのものは出力せず、ファイルパスと行番号だけを報告すること
- 結果は最後にサマリテーブルで一覧表示すること
- 問題が見つかった場合は具体的な対応手順も提示すること
## チェック手順
以下の8項目を実行してください。独立した確認は可能な限り並列実行で高速化して構いません。
### Step 1: 基本情報の収集
以下を確認してください。
===bash
# (a) Claude Codeのバージョンと実体
if command -v claude >/dev/null 2>&1; then
claude --version
command -v claude
file "$(command -v claude)"
else
echo "WARN: claude コマンドが見つかりません"
fi
===
===bash
# (b) npm版Claude Codeとグローバルaxiosの有無
npm list -g @anthropic-ai/claude-code --depth=0 2>/dev/null
npm list -g axios --depth=0 2>/dev/null
===
===bash
# (c) Linux感染痕跡の確認
if [ -e /tmp/ld.py ]; then
echo "ALERT: /tmp/ld.py が存在します"
else
echo "OK: /tmp/ld.py は見つかりません"
fi
===
### Step 2: プロジェクト横断スキャン
以下を確認してください。
===bash
# (a) /home配下のnode_modulesにあるaxiosの実インストール版を列挙
find /home -maxdepth 8 -path "*/node_modules/axios/package.json" -print0 2>/dev/null \
| xargs -0 -r grep -Hn '"version"' 2>/dev/null
===
===bash
# (b) 感染マーカー(plain-crypto-js)の存在確認
find /home -maxdepth 8 -path "*/node_modules/plain-crypto-js" -print 2>/dev/null
===
===bash
# (c) package.jsonでaxiosが^や~付きで指定されている箇所を確認
find /home -maxdepth 6 -name "package.json" -not -path "*/node_modules/*" -print0 2>/dev/null \
| xargs -0 -r grep -HnE '"axios"[[:space:]]*:[[:space:]]*"[~^]' 2>/dev/null
===
===bash
# (d) lockfileにaxiosの危険バージョンが固定されていないか確認
find /home -maxdepth 6 \( -name "package-lock.json" -o -name "npm-shrinkwrap.json" -o -name "yarn.lock" -o -name "pnpm-lock.yaml" \) -print0 2>/dev/null \
| xargs -0 -r grep -HnE 'axios(@|": "|: )?(1\.14\.1|0\.30\.4)' 2>/dev/null
===
===bash
# (e) 全CLAUDE.mdファイルの一覧取得
find /home -maxdepth 5 -name "CLAUDE.md" -print 2>/dev/null
===
### Step 3: セキュリティ設定の確認
以下を確認してください。
===bash
# (a) CLAUDE.mdにシークレットやパスワードらしき記述がないか
find /home -maxdepth 5 -name "CLAUDE.md" -print0 2>/dev/null \
| xargs -0 -r grep -HnEi 'sk-ant-|secret_|xoxb-|xoxp-|ghp_|gho_|-----BEGIN .*PRIVATE KEY-----|password[[:space:]]*[:=]' 2>/dev/null
===
===bash
# (b) .npmrcの設定確認(min-release-ageの有無)
if [ -f ~/.npmrc ]; then
grep -Hn "min-release-age" ~/.npmrc 2>/dev/null || echo "WARN: ~/.npmrc に min-release-age がありません"
else
echo "WARN: ~/.npmrc が存在しません"
fi
===
===bash
# (c) dangerously-skip-permissionsの使用状況
grep -Hn "dangerously-skip-permissions" ~/.claude/settings* 2>/dev/null
grep -Hn "dangerously-skip-permissions" ~/.bash_history ~/.zsh_history 2>/dev/null
===
## 判定基準
各項目について以下の基準で判定してください。
| 判定 | 意味 |
|------|------|
| **安全** | 問題なし |
| **要注意** | 即座の危険はないが対応推奨 |
| **危険** | 即座に対応が必要 |
### 危険と判定する条件
- axiosの実インストール版またはlockfileに `1.14.1` または `0.30.4` が見つかる
- `plain-crypto-js` フォルダが存在する
- `/tmp/ld.py` が存在する
- `CLAUDE.md` にAPIキー、秘密鍵、トークン、パスワードらしき記述がある
### 要注意と判定する条件
- Claude Codeがnpm版でインストールされている(ネイティブ版への切替を推奨)
- Claude Codeのバージョンが `2.1.89` 未満
- `package.json` でaxiosが `^` や `~` 付きで指定されている
- `~/.npmrc` に `min-release-age` が設定されていない
- `dangerously-skip-permissions` が設定または履歴に現れる
## 出力フォーマット
すべてのチェック完了後、以下の形式でサマリを出力してください。
===text
## セキュリティチェック結果
実行日時: YYYY-MM-DD
実行環境: [OS情報]
| # | チェック項目 | 判定 | 詳細 |
|---|---|---|---|
| 1 | インストール方法(ネイティブ/npm) | 安全/要注意 | ... |
| 2 | axios実インストール版とlockfile固定状況 | 安全/危険 | ... |
| 3 | Claude Codeバージョン(2.1.89以上) | 安全/要注意 | ... |
| 4 | package.jsonのaxios指定(^/~の有無) | 安全/要注意 | ... |
| 5 | .npmrcのmin-release-age | 安全/要注意 | ... |
| 6 | dangerously-skip-permissionsの使用 | 安全/要注意 | ... |
| 7 | マルウェア感染マーカー(plain-crypto-js, /tmp/ld.py) | 安全/危険 | ... |
| 8 | CLAUDE.md内シークレット混入 | 安全/危険 | ... |
### 要対応事項
(問題があった場合のみ、具体的な対応手順を記載)
===
## 対応手順テンプレート
問題が見つかった場合、以下の対応手順を提示してください(該当するもののみ)。
### axiosが危険なバージョンだった場合
===bash
# プロジェクト単位で依存関係を安全な版に更新する
cd [プロジェクトパス]
npm install axios@1.14.0
# lockfileも更新されていることを確認する
grep -n "axios" package.json package-lock.json 2>/dev/null
===
必要に応じて `overrides` または各パッケージマネージャーの同等機能で安全な版に固定すること。
### plain-crypto-js または /tmp/ld.py が見つかった場合
===text
1. 端末をネットワークから隔離する
2. 別端末からAPIキー・パスワード・SSH鍵をローテーションする
3. 感染したプロジェクトのnode_modulesを削除し、lockfileを確認した上で再インストールする
4. 影響範囲の調査が終わるまで当該端末で機密操作を行わない
===
### Claude Codeが古い場合
===bash
# ネイティブ版の場合:
claude update
# npm版の場合:
npm install -g @anthropic-ai/claude-code@latest
===
可能であればnpm版からネイティブ版への切替も提案すること。
### .npmrcにmin-release-ageが未設定の場合
===bash
echo "min-release-age=7d" >> ~/.npmrc
===
### axiosが^または~付きで指定されている場合
===text
対象ファイル: [パス]
現在の指定: "axios": "^x.x.x" または "~x.x.x"
推奨: 安全な固定バージョンに変更し、必要に応じてoverridesも追加する
===
### CLAUDE.mdにシークレットが含まれている場合
===text
1. 該当ファイルからシークレットを即座に削除する
2. 該当シークレットを無効化し、新しい値を発行する
3. シークレットは.envファイルまたは秘密情報管理基盤へ移す
4. レビュー結果には値を載せず、ファイルパスと行番号だけを記載する
===
チェック項目の説明
「コマンドの意味がわからないと不安」は当然でもあるので、解説です。
その1:インストール方法の確認
claude --version
command -v claude
file "$(command -v claude)"
Claude Codeは大きく分けてネイティブ版とnpm版があります。
- ネイティブ版:Anthropicの公式インストーラ経由で導入
- npm版:npmという配布サイト経由でインストール
今回のaxiosマルウェア問題でClaude Code経由の影響を受けたのは、基本的にはnpm版の導入経路です。この記事では簡易確認として command -v と file を使っていますが、実際の判定は claude doctor も併用して確認するのが確実です。環境によって配置先は変わるので、~/.local/share/claude/ や node_modules というパスだけで断定しない方が安全です。
ネイティブ版なら今回の事件②の影響はない、と考えてよいかと思います。npm版の方はネイティブ版への切り替えが推奨されていますね。
その2:axiosの汚染バージョン確認
npm list -g axios --depth=0
find /home -maxdepth 8 -path "*/node_modules/axios/package.json" -print0 \
| xargs -0 -r grep -Hn '"version"'
危険なバージョンは axios@1.14.1 と axios@0.30.4 の2つです。公開タイミングの報告を見る限り、日本時間では2026年3月31日 午前中の短時間に npm install を実行した環境は特に要確認です。
1つ目のコマンドでグローバルのaxiosを、2つ目で各プロジェクトの node_modules 内のaxiosを一括確認しています。-print0 と xargs -0 を使っているのは、パスにスペースが入っていても壊れないようにするためですね。
その3:感染マーカーの確認
find /home -maxdepth 8 -path "*/node_modules/plain-crypto-js" -print
ls -la /tmp/ld.py
マルウェアが実際にインストールされたかどうかの確認です。plain-crypto-js というフォルダがnode_modules内に存在していれば、感染の可能性が高い。Linuxでは /tmp/ld.py も痕跡候補として知られています。この記事のプロンプトは Linux 想定で /tmp/ld.py を見ていますが、macOS や Windows を含めて使うならOSごとの痕跡も追加した方がよいです。
見つかった場合は、まずネットワークを切断して、別端末からAPIキー・パスワード・SSH鍵を全部変更してください。順番が大事で、感染した端末で認証情報をいじらないこと。
その4:package.jsonのバージョン固定確認
find /home -maxdepth 6 -name "package.json" -not -path "*/node_modules/*" -print0 \
| xargs -0 -r grep -HnE '"axios"[[:space:]]*:[[:space:]]*"[~^]'
package.jsonで "axios": "^1.8.2" のように書いてある場合、^ は「互換範囲内の新しい版なら許容」という意味になります。今回のような悪意あるバージョンが公開されたとき、解決タイミングによっては引き込まれる可能性があります。
この正規表現は "axios" の値が ^ か ~ で始まるものを探しています。見つかったら、固定バージョン(例:"1.14.0")に変更し、overrides で間接依存も含めて固定することを推奨しています。
当然ですが、lockfileも確認します。
find /home -maxdepth 6 \( -name "package-lock.json" -o -name "yarn.lock" -o -name "pnpm-lock.yaml" \) -print0 \
| xargs -0 -r grep -HnE 'axios(@|": "|: )?(1\.14\.1|0\.30\.4)'
lockfileに危険なバージョンが直接固定されていないかのチェックです。package.jsonだけ見ても、lockfileが汚染バージョンを記録していたら意味がないので。
その5:.npmrcの「7日ルール」確認
grep -Hn "min-release-age" ~/.npmrc
これは Flatt Security が紹介していた予防策で、.npmrc に以下を書くだけです。
min-release-age=7d
「公開から7日未満のパッケージはインストールしない」という設定です。今回のaxiosマルウェアは短時間で削除されたため、npmの対応バージョンを使っていれば有効な予防策になり得ました。
シンプルなわりに効果が大きいので、設定していない方は追加しておくとよいかと思います。開発の最前線にいない限り、常に最新版を使う必要はないですからね。
その6:CLAUDE.md内のシークレット確認
find /home -maxdepth 5 -name "CLAUDE.md" -print0 \
| xargs -0 -r grep -HnEi 'sk-ant-|secret_|xoxb-|xoxp-|ghp_|gho_|-----BEGIN .*PRIVATE KEY-----|password[[:space:]]*[:=]'
CVE-2026-21852の文脈では、悪意あるリポジトリ内の設定によってAPIリクエストの送信先を攻撃者側に切り替えられる問題が報告されています。この記事で見ている CLAUDE.md のシークレット確認は、そのCVEそのものの再現条件を調べているというより、プロジェクト内の指示ファイルに秘密情報を書かないための追加防御です。
このコマンドは全プロジェクトのCLAUDE.mdを走査して、Anthropic APIキー(sk-ant-)、Notionシークレット(secret_)、Slackトークン(xoxb-, xoxp-)、GitHub PAT(ghp_, gho_)、秘密鍵、パスワードらしき記述を検出します。
見つかったとしても、値そのものは出力せずファイルパスと行番号だけ報告するようにしています。確認ツール自体がシークレットを漏らしたら本末転倒なので。
その7:dangerously-skip-permissions の使用確認
grep -Hn "dangerously-skip-permissions" ~/.claude/settings*
grep -Hn "dangerously-skip-permissions" ~/.bash_history ~/.zsh_history
Claude Codeには --dangerously-skip-permissions という権限バイパスモードがあります。権限確認を弱める方向のオプションなので、名前の通り危険度は高めです。
このモードをONにした状態で、外部のWebコンテンツや未知のリポジトリを広く取り込む運用をすると、プロンプトインジェクションや情報流出のリスクは上がります。設定ファイルやコマンド履歴に残っていないかを確認しています。
その8:Claude Codeバージョン確認
claude --version
v2.1.88が設計ファイル同梱のあった版で、v2.1.89で修正されました。古いバージョンを使い続けている場合は claude update(ネイティブ版)か npm install -g @anthropic-ai/claude-code@latest(npm版)で更新してください。
使ってみた所感
実際に走らせた結果としては、以下の通りでした。
- ネイティブ版インストール + 最新バージョンだったので、事件①②の直接的な影響はなし
- ただし複数のプロジェクトでaxiosが
^付きで指定されていた(要注意) -
.npmrcが存在しなかったので、7日ルールを追加
まあこの手のものは「安全だとわかった」ということ自体に意味がある、というやつです。なんとなく「たぶん大丈夫だろう」で放置していたものが、コマンド実行数分で「確認済み」になるのは大きいかなと思います。
あと、このプロンプトをread-onlyにしているのは意図的で、共有したときとかにチームメンバーが「実行して壊れたらどうしよう」を心配せずに使えるようにしているつもりです。
おわりに
セキュリティチェックって、やること自体は地味なんですよね。コマンドを叩いて、結果を見て、必要なら設定を足すくらい。
ただ、npm installから1〜2秒でパソコンが外部と通信を始めるという今回の攻撃の速度感を知ると、「まあ大丈夫でしょ」で済ませるのは怖いので、確認して安心して開発に集中できるようにしておきたい。
プロンプトは自由に使っていただければと思いますが、精度もろもろに関してはご指摘必要なレベルだと思っていますので、その点はご了承ください。。
おわり。
CM
こんな感じで、AIツールを使い倒しながらいろんなチャレンジをしてくれる方を、いえらぶは常に募集中です。
新卒採用サイト:
https://www.ielove-group.jp/recruit/newgrad/
学生向けインターンシップもやっています:
https://www.ielove-group.jp/recruit/internship/