Piが「砂蟲」に飲み込まれなかった話 ── mistralai乗っ取り事件とMario Zechnerの神対応
Piが「砂蟲」に飲み込まれなかった話 ── mistralai乗っ取り事件とMario Zechnerの神対応
出典: note.com / 2026-05-21
プロローグ:砂の惑星で起きた事件
「シャイ・フルード」——知ってる?『デューン/砂の惑星』っていうSF作品に出てくる、砂漠の下に潜む巨大な砂蟲(すなむし)だ。
砂漠の上を歩いていると、突然地面が割れて、歯の代わりに何千本もの触手が並んだ巨大な口が現れる。飲み込まれたら終わり。どんなに強い者でも、シャイ・フルードの前ではひとたまりもない。
2026年5月、インターネットの世界で、まさにこれと同じことが起きた。
あるnpmパッケージが「シャイ・フルードされた」——つまり、飲み込まれて乗っ取られたんだ。

そして、そのニュースを伝えたのが、君たちが今使っている「Pi(パイ)」というコーディングエージェントの開発者、Mario Zechner(マリオ・ツェヒナー)だった。
今回はこの事件と、Piの開発者が取った「神対応」について、中学生でもわかるように解説する。
第1章:事件の概要——mistralaiパッケージ、食われる
**日にち:**2026年5月11日
**場所:**npm(なんぴーえむ)——JavaScriptの世界で最も大きな「部品置き場」
被害者:@mistralai/mistralai というパッケージ(AIの会社Mistralが公開していた便利な部品)
ある日、誰かがMistral社のnpmアカウントを乗っ取った。そして、悪意のあるプログラムを仕込んだバージョン2.2.4を公開した。
このバージョンをインストールしたコンピュータは、**完全に乗っ取られる。**パスワードも、暗号資産の鍵も、仕事のファイルも、全部盗まれる。
GitHubのセキュリティチームはこう警告した:
「このパッケージをインストールしたコンピュータは、完全に侵害されたものとみなせ。すべての秘密情報と鍵を、別のコンピュータから直ちに交換しろ。」
これがいわゆる**「サプライチェーン攻撃」**だ。便利な部品に偽装して、裏口から悪いコードを忍び込ませる。まるで、レゴブロックに爆弾を仕込んでおいて、何も知らない子どもが組み立てると爆発する——そんな恐ろしい攻撃だ。
第2章:なぜ「シャイ・フルード」なのか

Marioはこのツイートでこう言った:
“Last week the mistralai package got shai huluded”
「shai huluded(シャイ・フルーデッド)」——これは彼が作った造語だ。
さっき話したデューンの砂蟲、シャイ・フルードは、砂漠の上を通るものを何でも飲み込む。キャラバンも、軍隊も、戦車も——全部、砂の下に消える。
同じように、mistralaiのパッケージは「飲み込まれた」のだ。作者の知らない間に、誰かに中身をすり替えられて、悪意あるコードという「砂蟲の胃液」で満たされた。
「シャイ・フルードされた」——この言葉には、**「完全に飲み込まれて、元の姿をとどめていない」**というニュアンスが込められている。
IT業界の人間なら思わずニヤリとする、この遊び心。こんなところにもMarioの人柄が現れている。
第3章:なぜPiは無傷だったのか
Piはこの攻撃の被害を受けなかった。
なぜか?
Marioは事件直後、こうツイートしている:
“we were not affected, due to pinning”
「ピンニング(固定)」のおかげで影響を受けなかった、と。
Piが使っているmistralaiのバージョンは2.2.1。攻撃されたのは2.2.4だった。つまり、使う部品のバージョンをしっかり固定していたから、自動的に悪いバージョンを掴まされなかったのだ。
これは一見「普通のこと」に思える。だが、ここでMarioは立ち止まった。
あるコミュニティメンバーがこう指摘した:
「ロックファイルは君たち開発者を守るだけだよ。ユーザーが新しくnpm installしたら、まだ危険なんじゃない?」
核心を突いた指摘だった。Piの開発チームは安全だったかもしれない。しかし、Piをインストールするすべてのユーザーを守れているか?——答えはNOだった。
第4章:Marioの「神対応」——v0.75.4の衝撃

事件からわずか9日後。2026年5月20日。
MarioはPiのバージョン0.75.4をリリースした。内容を見て驚いてほしい:
① npm-shrinkwrap.json の導入
普通のロックファイルは「開発者だけ」を守る。でも、shrinkwrap(シュリンクラップ)はパッケージそのものにバンドルされる。つまり、ユーザーがPiをインストールした瞬間から、すべての依存関係のバージョンが固定される。悪いバージョンを引っ張ってくる可能性がゼロになる。
② ロックファイルの変更を自動検知してブロック
うっかり誰かがロックファイルを書き換えても、CI(自動テスト)が「おい、変だぞ」と止めてくれる。
③ ライフサイクルスクリプトの許可リスト化
npmのパッケージはインストール時に「postinstall」というスクリプトを実行できる。これは便利な反面、乗っ取られたパッケージがここから悪意あるコードを実行するのに悪用される。Piは「このスクリプトは安全」というリストだけを実行する。リストにないスクリプトは黙って無視する。
④ セルフアップデート時のライフサイクルスクリプト無効化
pi updateで自分自身を更新するときも、余計なスクリプトは絶対に実行しない。
⑤ リリース前の隔離スモークテスト
新しいバージョンを公開する前に、隔離された環境でnpmとBunの両方で実際にインストールしてみて、問題がないことを確認する。
たった9日で、これだけの対策を実装したのだ。一人の開発者が。
第5章:なぜこれが「誠実」なのか
大事なのは、Piはもともと被害を受けていなかった、という点だ。
「ウチは大丈夫でした。終わり。」——そう言って何もしないこともできた。
あるいは「次のアップデートで直します」と言って、3ヶ月後にようやく対応することもできた。
でもMarioは違った。
「今回はたまたま無害だった。でも次はわからない。だから、システム全体をガチガチに固める。」
これが、彼の取った選択だ。
自分たちが安全だから終わり、ではなく、これからインストールするすべてのユーザーを守るために、たった9日でリリースパイプラインを根本から見直した。
趣味のプロジェクトでこれができるのは、相当な職人気質と誠実さがないと無理だ。
しかも彼は、この一連の対応をすべてGitHubのissue上でオープンに議論している。「誰が悪い」ではなく「どうやって守るか」だけを淡々と進めている。
第6章:僕たちが学べること
この事件から、3つの教訓をもらった。
教訓1:依存関係は必ず固定しろ
「便利そうだから」と最新版を無造作にインストールするな。package-lock.jsonやrequirements.txtで、使うバージョンを必ず固定する。これだけで、今回のような事故の99%は防げる。
教訓2:「大丈夫」で終わるな
自分たちが無害だったからといって、それで終わりにしてはいけない。システム全体を俯瞰して「次に同じことが起きたらどうするか」を考える。Marioがやったのはそれだ。
教訓3:遊び心を忘れるな
「シャイ・フルードされた」——セキュリティの報告にSFネタを仕込める余裕。技術者として誠実でありながら、人間味を失わないこと。これが多くの人に愛されるオープンソースプロジェクトの共通点だ。
エピローグ:Piのこれから
Piバージョン0.75.4は、もう誰でもインストールできる。
npm install -g @earendil-works/pi-coding-agent
これだけで、シャイ・フルードに耐えうる、サプライチェーン攻撃に強いPiが手に入る。
今回の一件で、Piは単なる「便利なツール」ではなくなった。一人の誠実な開発者が、ユーザーを守るために本気で作った——信頼に値するプラットフォームになったんだ。
君がもしPiを使っているなら、今日からちょっとだけ誇りに思っていい。
そしてもしこれから使おうと思っているなら——安心して使ってほしい。砂蟲に飲み込まれる心配は、もうないから。
元ツイート:https://x.com/badlogicgames/status/2057108413113340039
Piの公式サイト:https://pi.dev
GitHub Advisory GHSA-3q49-cfcf-g5fm:https://github.com/advisories/GHSA-3q49-cfcf-g5fm
この記事は note.com から KTBLOG に移行されました。元記事: https://note.com/famous_prawn2009/n/nb85adcfb2eae