2026年1月14日、私はnpmで「 react-codeshift.
私は作者ではなかった。そのパッケージのために一行のコードも書いたことがない。そもそもそのパッケージは存在したこともなかった。誰も公開したこともなかった。それなのに、237ものGitHubリポジトリが既にそれを参照し、AIエージェントにインストールを指示していた。実際に試みているものもあった。私は、中身が何も入っていない、自分が公開したばかりのパッケージのダウンロード数を増やしていたのだ。
その名前はどこから来たのか?あるLLMが作り出したものだ。どうして237のリポジトリに広がったのか?エージェントのスキルファイルが原因だ。コピペされ、フォークされ、日本語に翻訳され、一度も検証されなかった。誰よりも先にそれを見つけ、主張したのだ。
研究
2025年7月、私は調査を始めた npxの混乱問題これらはドキュメントやコードに記述されているものの、実際には公開されたことのないnpmパッケージ名です。その考え方は単純でした:スクレイピングして package.json npm全体にわたるスクリプトとREADMEファイル npx <package> パターンを調べ、それらのパッケージが実際に存在するかどうかを確認する。結果として、多くのパッケージは存在しないことが判明した。
その後、S1ngularity攻撃が起きたので、研究は一旦棚上げした。休暇シーズンが巡ってきたので、再び取り掛かることにした。この投稿はその研究の一分野に過ぎない。続報は後日。
react-codeshiftを入力してください
12月に研究を再開し、GitHubも対象に含めることにした。具体的には、GitHub上のリファレンスをスクレイピングしてインデックス化する。 npx コマンド react-codeshift 頻繁に話題に上った。200を超えるリポジトリ。私がそれを主張した時点では、その数は237以上に増えていた。

問題は、 react-codeshift 存在しなかった。私が主張するまでは。しかしその名前は正当に聞こえる。実在するパッケージは二つある:
あるLLMがこれらを混ぜ合わせて幻覚でreact-codeshiftを生成した。存在しないツールにふさわしい名前。古典的だ。
起源の物語
私はそれを単一のコミットまで遡って特定した: 65e5cb0 において wshobson/エージェント リポジトリ、日付:2025年10月17日。
そのコミットでは、14のプラグインにわたり47のLLM生成「エージェントスキル」が投入された。明らかな人的レビューは確認されていない。少なくとも2つのスキル(react-modernizationとdependency-upgrade)には以下が含まれていた:
npx react-codeshift --transform=react-codeshift/transforms/rename-unsafe-lifecycles.js ./src
npx react-codeshift --transform=react-codeshift/transforms/rename-unsafe-lifecycles.js ./srcnew-jsx-transform.js ./src見た目は本物っぽい。聞こえも本物っぽい。変換パスは実際のコードモッドの構造を反映している。
しかし、それは存在しなかった。
スキル:新たな攻撃対象領域
タイポスクワッティングやAIによる粗悪なパッケージは既に確認済みだ。これは単なる推測ではなく、実際に発生しているスロープスクワッティングの実例である。しかもスキルを通じて拡散されている。
スキルは新たな標準です:Anthropicのエージェントスキル仕様、Claude Codeプラグイン、MCPサーバー。これら全てはスキルファイルを用いてAIエージェントに何をすべきかを指示します。これらのファイルはドキュメントのように見えます:Markdown、YAML、プレーンテキストの指示です。
しかしそれらは実行可能な命令です。AIエージェントがスキルファイルを読み込むと、その命令に従います。npx react-codeshiftが存在するか検証しません。ただ実行するだけです。
npxがローカルでパッケージを見つけられない場合、次のようにプロンプトが表示されます:
以下のパッケージをインストールする必要があります:
react-codeshift
続行しますか? (y)エージェントはyを押す。大抵の人も同じだろう。エージェントはそういう点で私たちと変わらない。盲人が盲人を導く、しかも大規模に。
実行試行の証拠
パッケージを取得した後、ダウンロードのテレメトリを監視した:
通常のパッケージは初日に60~100回のダウンロード(レジストリミラー、セキュリティスキャナー)を記録し、その後はゼロになる。実際にそれらを使おうとしている者は誰もいない。
しかし react-codeshift1日あたり1~4件のダウンロードが絶え間なく続く現象?あれは本物だ。AIエージェントがスキルの指示に従い、npxダウンロードを起動しているのだ。
スキルが使用されている。幻覚化されたパッケージが実行されている。もし私が先に主張していなければ、攻撃者が主張できたかもしれない。
拡散パターン
全237のリポジトリは同一のソースに遡る。パターンはほぼ完全に直接的なフォークである:
wshobson/エージェント(原点)- 正確なパスを維持する約100のフォーク:
plugins/framework-migration/skills/react-modernization/SKILL.md - あるユーザーが自身のリポジトリ30個以上にこれをコピーした
- 異なるディレクトリ構造への再編成がいくつか
- 日本語訳まで!
- 1つのリポジトリが切り替えられました
npxへのブンクス同じ幻覚のパッケージ、別の配達人。
単にnpxだけではない
すべてのパッケージランナーに同じパターンが適用されます:
npx react-codeshiftbunx react-codeshiftpnpm dlx react-codeshiftyarn dlx react-codeshift
それらはすべて同じnpmレジストリに解決される。インストール前にすべてプロンプトが表示される。すべてが迷いなく承認される。LLMがパッケージ名をある形式で幻覚表示すれば、他の形式でも同様に幻覚表示する。
それは拡散しているが、浅薄だ。主要なリポジトリもない。高評価プロジェクトもない。ただエージェントがエージェントに、存在しないパッケージの使い方を教えるだけ。下までずっとエージェントばかり。ある意味、自己改善システムだ。
なぜこれが重要なのか
これは大規模な侵害ではなかった。誰もハッキングされなかった。パッケージは現在安全なプレースホルダーとなっている。
しかし、こうした事象がどのように広がるかについての有用な事例研究である:
- 大規模言語モデルは、特に命名規則が予測可能なドメイン固有のツールにおいて、説得力のあるパッケージ名を幻覚する。
- スキルは確認なしにコピペされる。ドキュメントのように見えるため、コードと同じ厳格なチェックを受けない。
- エージェントは指示を文字通り実行する。それが彼らの仕事だ。
- npxがプロンプトを表示し、人間が承認する。摩擦が十分に低いため、ほとんどの人はただyを押すだけだ。
- 未登録の名称は先着順です。誰でも登録できます。
たまたまこれを見つけて確保した。このパターンは理解する価値がある。
どうすればいいですか?
エージェントスキルやAIツールを管理している場合:
- スキルをドキュメントではなくコードとして扱う。レビューし、監査し、ソースコードと同等の厳格さでバージョン管理する。
- パッケージ名が存在することを確認する。 コミットする前に
npx <package>指示に従い、パッケージが本物であり、あなたが想定する発行元によって公開されていることを確認してください。 - コードベースを検索してください。 走る
grep -r "npx react-codeshift"ヒットを修正し、正しいツールに置き換えてください:npx jscodeshift汎用的なコード変更用npx react-codemodReact固有の変換のため
妥協の指標
npmパッケージ: react-codeshift
全体像
スキルは新たなコードだ。見た目にはそう見えない。マークダウンやYAML、親しみやすい指示文の形をしている。だが実行可能だ。AIエージェントは「このパッケージは実際に存在するのか?」と問うことなく、それらに従う。
これは幻覚だった。237のリポジトリに拡散した。実際のダウンロード試行を生成した。攻撃ベクトルにならなかった唯一の理由は、私が先に手を打ったからだ。
サプライチェーンに新たな環が加わった。LLMの夢でできた環だ。これはnpx混乱研究から得られた知見の一つに過ぎない。続報を待て。
今すぐソフトウェアを保護しましょう



.avif)
