← Back to Home
note.com ·

Piが「砂蟲」に飲み込まれなかった話 ── mistralai乗っ取り事件とMario Zechnerの神対応

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