2026年1月14日、私はnpm上で「」というパッケージを主張しました。 react-codeshift.
私はその作者ではありませんでした。そのために一行もコードを書いたことはありません。そのパッケージは存在したことがなく、誰も公開したことがありませんでした。しかし、237のGitHubリポジトリがすでにそれを参照し、AIエージェントにインストールを指示していました。実際に試みているものもありました。私は、公開したばかりの、中身が何もないパッケージのダウンロードを受け取っていました。
その名前はどこから来たのでしょうか?LLMが作り出したものです。どのようにして237のリポジトリに広がったのでしょうか?エージェントスキルファイルです。コピー&ペーストされ、フォークされ、日本語に翻訳され、一度も検証されることはありませんでした。私は他の誰よりも早くそれを見つけて主張しました。
調査
2025年7月に、私は調査を開始しました npx confusion issues。これらはドキュメントやコードに現れるものの、実際には公開されていないnpmパッケージ名です。アイデアはシンプルでした。スクレイピングして package.json npm全体のスクリプトとREADMEファイルから npx <package> パターンをスクレイピングし、それらのパッケージが実際に存在するかどうかを確認することでした。結果として、多くは存在しませんでした。
その後、S1ngularity攻撃が発生したため、研究を一時中断しました。ホリデーシーズンになり、再び取り掛かりました。本稿では、その研究の一つの側面のみを扱っています。今後も続きます。
react-codeshiftの登場
12月に再び研究を再開し、参照をスクレイピングすることでGitHubもインデックス化するように拡張することにしました。 npx コマンド。 react-codeshift が多く見つかりました。200以上のリポジトリです。私がそれを主張した時には、その数は237以上に増えていました。

問題は、 react-codeshift は存在しなかったことです。私が登録するまでは。しかし、その名前は正当に聞こえます。実際に存在する2つのパッケージがあります。
LLMがこれらを組み合わせ、react-codeshiftという存在しないツールを幻覚的に生成しました。存在しないツールとしては、もっともらしい名前です。典型的な事例です。
その成り立ち
それは単一のコミットに遡ることができます。 65e5cb0 の wshobson/agents リポジトリで、2025年10月17日付です。
そのコミットは、14のプラグインにわたって47のLLM生成「Agent Skills」を投入しました。明らかな人間のレビューはありませんでした。これらのスキル(react-modernizationとdependency-upgrade)のうち少なくとも2つには、以下の内容が含まれていました。
npx react-codeshift --transform=react-codeshift/transforms/rename-unsafe-lifecycles.js ./src
npx react-codeshift --transform=react-codeshift/transforms/new-jsx-transform.js ./src正当に見え、正当に聞こえます。トランスフォームパスは、実在するcodemodの構造を反映しています。
しかし、それは存在しませんでした。
スキル:新たな攻撃対象領域
タイポスクワッティングやAIスロップパッケージは見てきましたが、これは単なる憶測ではなく、実際に発生しているスロップスクワッティングの事例です。そして、Skillsを通じて拡散されています。
スキルは新しい標準です: AnthropicのAgent Skills Specification、Claude Codeプラグイン、MCPサーバー。これらはすべてスキルファイルを使用してAIエージェントに何をすべきかを指示します。これらのファイルは、Markdown、YAML、プレーンテキストの指示といったドキュメントのように見えます。
しかし、それらは実行可能な命令です。AIエージェントがスキルファイルをロードすると、そのコマンドに従います。npx react-codeshiftが存在するかどうかは検証せず、ただ実行するだけです。
npxがローカルでパッケージを見つけられない場合、次のようにプロンプトを表示します。
以下のパッケージをインストールする必要があります。
react-codeshift
続行してもよろしいですか? (y)エージェントは「y」を押します。ほとんどの人もそうするでしょう。その点では、エージェントも私たちと同じです。大規模な「盲人が盲人を導く」状態です。
アクティブな実行試行の証拠
パッケージをクレームした後、ダウンロードテレメトリーを監視しました。
通常のパッケージは初日に60~100回のダウンロードを記録しますが(レジストリミラー、セキュリティスキャナーによるもの)、その後はゼロになります。実際に利用しようとしているユーザーはいません。
しかし、 react-codeshift?1日あたり1~4回の継続的な少量ダウンロードは?それらは本物です。AIエージェントがスキル指示に従い、npxダウンロードをトリガーしているのです。
スキルが使用されています。幻覚されたパッケージが実行されています。もし私が最初にクレームしていなければ、攻撃者がそうしていた可能性があります。
拡散パターン
237個の全リポジトリは同じソースに遡ります。そのパターンは、ほぼ完全に直接フォークです。
wshobson/agents(オリジン)- 正確なパスを維持したまま、約100のフォーク:
plugins/framework-migration/skills/react-modernization/SKILL.md - あるユーザーが自身の30以上のリポジトリにコピーしました
- 異なるディレクトリ構造へのいくつかの再編成
- 日本語訳まで!
- あるリポジトリが切り替えました
npxtobunx。同じ幻覚パッケージ、異なるランナーです。
npxだけではありません
同じパターンがすべてのパッケージランナーに適用されます。
npx react-codeshiftbunx react-codeshiftpnpm dlx react-codeshiftyarn dlx react-codeshift
これらはすべて同じnpmレジストリに解決され、インストール前にプロンプトを表示し、深く考えることなく承認されます。LLMがある形式でパッケージ名を幻覚した場合、他の形式でも同様に幻覚します。
これは拡散力がありますが、表面的なものです。主要なリポジトリや高評価のプロジェクトはありません。存在しないパッケージを使用するようにエージェントがエージェントに教えているだけです。どこまでもエージェントであり、ある意味、自己改善システムと言えます。
これが重要な理由
これは大規模な侵害ではありませんでした。誰も乗っ取られることはなく、このパッケージは現在、安全なプレースホルダーとなっています。
しかし、これはこれらのものがどのように広がるかについての有用なケーススタディです:
- LLMはもっともらしいパッケージ名を幻覚します。特に、命名規則が予測可能なドメイン固有のツールでは顕著です。
- スキルはレビューなしでコピー&ペーストされます。これらはドキュメントのように見えるため、コードと同じ精査を受けません。
- エージェントは指示を文字通りに実行します。それが彼らの仕事です。
- npxがプロンプトを表示し、人間が承認します。摩擦が十分に低いため、ほとんどの人が「y」を押してしまいます。
- 未登録の名前は先着順です。誰でも登録できます。
私は偶然これを見つけて登録しました。このパターンは理解する価値があります。
どのような対応が必要でしょうか?
エージェントスキルまたはAIツールのメンテナンスを行っている場合:
- スキルをドキュメントではなくコードとして扱います。 レビューし、監査し、ソースコードと同じ厳格さでバージョン管理してください。
- パッケージ名が存在することを確認します。 任意のコミットを行う前に
npx <package>指示を行う前に、そのパッケージが本物であり、意図した発行元によって公開されていることを確認します。 - コードベースを検索します。 実行します
grep -r "npx react-codeshift"検出された問題を修正します。適切なツールに置き換えてください。npx jscodeshift汎用的なコードモッド向けnpx react-codemodReact固有のトランスフォーム向け
侵害の痕跡
npmパッケージ: react-codeshift
全体像
スキルは新しいコードです。一見そうは見えませんが、MarkdownやYAML、そして分かりやすい指示で構成されています。しかし、それらは実行可能です。AIエージェントは、『このパッケージは実際に存在するか?』と問うことなく、それらに従います。
これはハルシネーションでした。237のリポジトリに拡散し、実際のダウンロード試行を発生させました。それが攻撃ベクトルにならなかった唯一の理由は、私が先に発見したからです。
サプライチェーンに、LLMの夢から生まれた新たなリンクが加わりました。これはnpxの混乱に関する調査で判明したことの一つに過ぎません。今後も続きます。

