「npm install react-codeshift」と入力してEnterを押した。インストールは成功した。そのパッケージはAIが作り出した、存在しない名前だった。
「存在しないパッケージ」が攻撃に変わる瞬間
タイポスクワッティング(typosquatting)という攻撃がある。express と打つつもりで expres と打ち間違えると、攻撃者がその名前でパッケージを登録しておいて悪意あるコードを仕込む手口だ。人間が打ち間違えるという弱点を突く。
スロップスクワッティング(slopsquatting)は、標的が人間ではなくAIだ。AIは「コードを書く」過程で、実在しないパッケージ名を自信満々で提案することがある——ハルシネーション(幻覚)と呼ばれる現象だ。攻撃者はAIが幻覚しやすいパッケージ名をあらかじめリストアップして、その名前でnpmやPyPIに悪意あるパッケージを登録しておく。次にAIが同じ名前を提案すると、何も知らないユーザーが本物だと信じてインストールしてしまう。
「slopsquatting」という言葉は、Python Software FoundationのセキュリティエンジニアSeth Michael Larsonが命名した(BleepingComputer)。"slop"はAI生成コンテンツの粗悪さを指すスラング、"squatting"は他人に先んじて名前を占有することだ。
AIはどれくらいの頻度でパッケージ名を幻覚するか
「たまに起きる話」ではない。USENIX Security 2025に発表された研究「We Have a Package for You!」では、576,000件のコードサンプルを16種類のAIモデルに生成させ、提案されたパッケージ名が実在するかどうかを検証した(USENIX)。
結果は全モデル平均で19.7%のパッケージが架空だった。検出された固有の架空パッケージ名は205,474件に上る(Socket.dev)。
モデルによって差はある。商用モデルの平均ハルシネーション率は5.2%、オープンソースモデルは平均21.7%だ。GPT-4 Turboが3.59%で最低水準、CodeLlama 7Bと34Bは33%を超えた(USENIX)。
商用モデルで5.2%と聞くと低く感じるかもしれない。しかし1プロジェクトで30〜40個のパッケージを使えば、架空のものが1〜2個混じる計算になる。
幻覚パッケージ名の内訳もわかっている(Socket.dev)。
- 51%:純粋な捏造。どこにも存在しない名前
- 38%:実在パッケージの合成(conflation)。
jscodeshiftとreact-codemodを組み合わせてreact-codeshiftを作るなど - 13%:タイポ変形。実在パッケージの名前を少し変える
幻覚は「繰り返す」——攻撃者が知っていること
攻撃が成立する核心は、AIの幻覚が毎回ランダムではないという点だ。
同じプロンプトを10回実行する実験では、幻覚パッケージの43%が毎回同じ名前で登場した。58%が1回以上繰り返された(Socket.dev / Infosecurity Magazine)。
攻撃者にとって、これは「事前準備」が可能だという意味だ。特定のコーディングタスクに対してAIが繰り返し幻覚するパッケージ名をリストアップし、すべてに悪意あるパッケージを登録しておける。攻撃者側の作業は1回の登録だけ、効果は不特定多数のユーザーへの感染になる。
処方箋を書くお医者さん(AI)が、実在しない薬の名前を繰り返し書いてしまう。攻撃者はその名前をあらかじめ調べ、同じ名前の偽薬局を開いておく。患者(ユーザー)は処方箋を持ってその薬局に行き、毒薬を受け取る。お医者さんは偽薬局の存在を知らなかったし、患者も処方箋を疑わなかった。
実際に起きたこと
理論上の脅威ではない。
huggingface-cli:3ヶ月で30,000ダウンロード
セキュリティ研究者Bar Lanyado(Lasso Security)が実証実験を行った(Lasso Security)。AIが繰り返しハルシネーションする huggingface-cli という名前でPyPIに空のパッケージを登録した。中身のない、無害なパッケージだ。
3ヶ月後、このパッケージは30,000回ダウンロードされていた。研究者は一切宣伝していない。AIが提案するたびに、ユーザーがインストールしていたのだ。
中身が悪意あるコードだったなら、30,000の開発環境が攻撃を受けていた。
react-codeshift:237のGitHubリポジトリに拡散
react-codeshift は jscodeshift と react-codemod を組み合わせたような名前のnpmパッケージだ。研究者がこの名前を登録する以前から、AIが繰り返し提案したことで237のGitHubリポジトリにすでに名前が拡散していた。誰も意図していない形で、架空のパッケージ名がコードベースに広がっていた。
unused-imports:確認済みの悪意あるパッケージ
unused-imports はnpm上に実在する確認済みの悪意あるパッケージで、2026年2月時点で週233回ダウンロードされていた。「未使用のインポートを削除する」系のタスクをAIに依頼したとき、自然に生成されやすい名前のパターンに一致する。
インストールしたら何が起きるか——postinstallスクリプトの罠
npm install を実行した瞬間、インストールが完了する前にコードが走ることがある。npmパッケージには postinstall スクリプトという仕組みがある。インストール完了直後に自動で実行されるスクリプトだ。ユーザーがパッケージを呼び出す前に、すでに動く。
// ❌ 悪意あるパッケージのpackage.json(例)
{
"name": "react-codeshift",
"version": "1.0.0",
"scripts": {
"postinstall": "node steal.js"
}
}
steal.js の中では何でも実行できる。APIキー、クラウド認証情報、npmのAuthトークン、SSHキーを外部サーバーに送信する。さらに巧妙な手口では、スクリプト本体には無害なコードを書いておき、実行時に外部URLからペイロードをダウンロードして動かす。静的スキャンをすり抜けるための技法だ。
npm installは「実行ファイルをダウンロードして動かす」行為だ。信頼できないパッケージをインストールすることは、出所不明のプログラムを管理者権限で実行することと同義になり得る。
スロップスクワッティング攻撃の全体像
攻撃が成立するためには2つの条件が揃う必要がある。AIが同じ名前を繰り返しハルシネーションすること、そして攻撃者がその名前をレジストリに登録しておくことだ。研究が示す通り、前者は43〜58%の確率で起きている。後者は攻撃者が1回登録するだけでいい。非対称な構造だ。
バイブコーディングが特にリスクが高い理由
バイブコーダーがこの攻撃に特に弱い理由は、AIの提案をそのまま実行する流れが自然に出来上がっているからだ。
「動いた!」で次に進む。AIが提案したパッケージ名がnpmに実在するかどうか確認しない。作成日が数日前かどうか確認しない。週間ダウンロード数が3回かどうか確認しない。READMEがほぼ空かどうか確認しない。
エンジニアでも確認を省くことはある。だが非エンジニアにとっては、「確認すべきポイント」の存在自体を知らないことが多い。「npmに登録されていれば本物」という思い込みも生まれやすい。登録のハードルが低い(誰でも無料でできる)ことを知らなければ、当然そう思う。
今すぐできる5つの対策
複雑な仕組みに見えるが、対策は単純だ。
1. インストール前にnpmで実在確認をする
# ❌ AIの提案をそのまま実行する
npm install react-codeshift
# ✅ まずパッケージの基本情報を確認する
npm view react-codeshift
# エラーが出れば存在しない
# 作成日・ダウンロード数・公式リンクが表示されればその内容を確認する
npmjs.com(https://www.npmjs.com/package/<パッケージ名>)にアクセスするのが最も確実だ。作成日が直近(数日〜数週間前)で週間ダウンロード数が極端に少なく、READMEがほぼ空なら要注意だ。
2. lockfileを必ずコミットする
package-lock.json(npm)や bun.lockb(Bun)は各パッケージの正確なバージョンとハッシュを記録する。npm ci を使えば、lockfileにないパッケージが勝手に追加されることを防げる。
# ❌ package-lock.jsonを.gitignoreに入れている
# (チームや環境ごとに別パッケージがインストールされる可能性がある)
# ✅ lockfileをコミットし、npm ciで厳密にインストールする
git add package-lock.json
npm ci # lockfileにないパッケージはインストールしない
3. AIへの指示でパッケージを明示する
AIに「適当なパッケージを選んで」と任せると幻覚を誘発しやすい。使うパッケージを事前に指定することでリスクを大幅に下げられる。
// ❌ AIに丸投げ(架空のパッケージを提案させやすい)
「HTMLのサニタイズ処理を書いて」
// ✅ 使うパッケージを明示する
「DOMPurify(https://www.npmjs.com/package/dompurify)を使って
HTMLのサニタイズ処理を書いて。DOMPurify以外のパッケージは使わないで」
4. postinstallスクリプトを確認する
インストール前にパッケージのメタ情報で postinstall の有無を確認できる。
# ✅ インストール前にscriptsを確認する
npm view react-codeshift --json | grep -A5 '"scripts"'
# "postinstall"があれば、その内容を確認してから判断する
5. 実績のあるパッケージのみを使う
週間ダウンロード数が何万〜何百万の実績あるパッケージを選ぶ。AIが「良さそう」と提案した初めて聞く名前のパッケージは、一度立ち止まって確認する価値がある。正規パッケージなら、GitHubリポジトリへのリンク、メンテナの情報、ISSUEの履歴が揃っているはずだ。
AIを信頼しながら騙されない
AIコーディングツールをやめる必要はない。ただ、AIが提案するパッケージ名には「実在する確証」がないことを知っておく必要がある。
全モデル平均で19.7%、商用モデルでも5.2%の確率で架空の名前が混じる。繰り返し幻覚される名前には攻撃者が先行登録している可能性がある。インストール前の確認は30秒でできる。
AIが書いた処方箋を持って薬局に行く前に、その薬局の名前を検索してみる。それだけのことだ。


.avif)