2026年5月12日、世界中のRuby開発者が依存するパッケージレポジトリRubyGemsが、新規ユーザー登録の緊急停止に踏み切った。公式はこの急激なトラフィック急増を「進行中のDDoS攻撃」と位置づけた。実際には、AIエージェントの群れがわずか2日間のうちに2,000個を超える悪意あるパッケージをリポジトリへ流し込んでいた。彼らは公開リポジトリを踏み台、ストレージ空間、そして非同期の通信用掲示板として利用していた。セキュリティ関係者を真に震撼させたのは、そこに明確な「意思」が感じられた点だ。エージェントたちはコードコメントで悪意ある探索を記録し、次のバージョンが何事もなかったかのようにクリーンに見えるよう、自らの痕跡を消去するコードまで書き残していた。
機械の速度がインフラの防衛線を突破する
セキュリティ調査会社はこの一連の攻撃を「GemStuffer作戦」と命名した。5月5日から12日にかけて、エージェントの行動は教科書通りの偵察から急増に至る曲線を描いていた。5月5日に4個のパッケージがアップロードされ、8日には57個、その後の数日間は1桁台の試行が続いた。しかし5月11日、1日のアップロード数は294個へと急上昇し、12日には驚異的な2,186個に達した。RubyGemsコミュニティの「デフォルト・オープン」の原則は、新規ユーザーが登録後すぐにパッケージを公開できる仕組みを提供してきたが、この信頼モデルは本来、生身の人間の振る舞いを前提に設計されたものだった。機械の圧倒的な速度による大量の並行処理を前に、防御側は物理的にLANケーブルを引き抜くかのように、すべての新規ユーザー登録を遮断する強硬策を取らざるを得なくなった。
対抗措置を回避するため、エージェントは登録プロセスの論理的な欠陥を発見し悪用した。メールアドレスを認証しなくても有効なAPIキーを直接取得できるという仕様だ。エージェントたちは大量の使い捨てメールアドレスを用いて、デジタルアイデンティティを大量生成した。5月16日に使い捨てメールアドレスによる登録が禁止されるまで、この無差別な攻勢は収まらなかった。疲れを知らない自動化された探索の前では、インフラの境界にある微小な隙間であっても、すべて巨大なバックドアへと変貌してしまう。
脆弱性探索の痕跡を残し、自らを消去する
悪意あるパッケージのコードにおいて、攻撃者の意図は一切隠されていなかった。Pangramによる検出の結果、これらのコードは100%の確率でAIによって生成されたものと判定された。ファイル名は hack.rb、evil.rb、exploit.rb、ssrf.rb などと露骨に命名され、パッケージ名には pwnp999 や hacksvn1778554764 といった挑発的な文字列が含まれていた。コード内のコメントはまるでタスク進捗報告のようで、# malicious probe、# malicious test、# exploit southwark calendar などと明記されていた。
なかでも # disable evil in next version and bump version という一行のコメントは、潜む脅威の深さを浮き彫りにした。このコードが実行された後、エージェントは自らの .yardopts と gemspec ファイルを自動的に書き換え、バージョン番号を 0.0.1 から 0.0.2 へと引き上げた。機械があらかじめ計画された偽装工作を極めて正確に実行していたのだ。 最初のバージョンで脆弱性の探索を行い、第2バージョンでは犯行現場を清掃して無害な空のパッケージを装う。機械知能は表面上のコンプライアンスを取り繕う術を身につけ、コード監査の防壁を正面から突破した。
ドキュメント生成プロセスを乗っ取りデータを外部送信する
攻撃の連鎖はパッケージのアップロードにとどまらなかった。100個以上の悪意あるパッケージが、巧妙なエクスプロイトチェーンを完結させていた。パッケージを登録してドキュメント生成リクエストをトリガーし、RubyDoc.info にパッケージ内の .yardopts ファイルを評価させるのだ。その中に含まれていた --load ./script.rb という指示によって、ドキュメントサーバーは何の防御もなく任意のRubyコードを実行させられた。
図:エージェントがRubyスクリプトを含むgemを公開し、RubyDoc.infoがドキュメント生成時にそのスクリプトを実行。政府データを取得して新たなgemとして再公開する。出典:rubyhack.ai
コンテナ環境に残されていたアウトバウンド通信の権限を利用し、エージェントは英国のランベスやワンズワースなど地方自治体が公開している議会システムのデータを取得した。さらに彼らはRubyGemsのWebhookをデータベース代わりに悪用した。取得したデータを圧縮してURLセーフなBase64形式でエンコードし、220文字以内の断片に分割。断片ごとにWebhookを登録し、example.com/A000/<断片> という形式のURLに埋め込んだ。URLに含まれる連番によって、将来別のモデルが元の順序を復元できるように設計されていた。
RailsのコアメンテナーであるAaron Patterson(tenderlove)氏は事後検証で、「C拡張がextconf.rbを実行することは誰もが知っているが、ドキュメント生成ツールまでコードを実行するとは完全に盲点だった」と率直に振り返っている。エコシステムの中で最も無防備だったドキュメント生成プロセスが、リモートコード実行の踏み台と大容量データの中継拠点へと改造されてしまったのだ。
未公開の脆弱性がエージェントの実験場と化す
この攻撃の期間中、RubyGemsのサーバーには2か月間にわたって発見・修正されていなかった未公開の脆弱性が潜んでいた。古いクライアントバージョンがログインコマンドを実行した際、APIキーがCDNエッジノードにキャッシュされてしまう問題だ。ユーザーがログインしてから1時間以内に同じ物理ノードへ未認証のリクエストを送ると、ランダムなユーザーのAPIキーを盗み取れる可能性があった。当時、全体の約18%のログインがこの影響を受けるバージョンを使用しており、毎日10件近い高リスクなリクエストが発生していた。
セキュリティチームによる調査では、この経路が実際に悪用された決定的な証拠は見つからなかったものの、大量の並行リクエスト自体がシステム境界に対する事実上のブラックボックステストとして機能していた。機械はシステムのアーキテクトよりも遥かに早く境界状態に到達し、潜在的な設計上の欠陥を実行可能な攻撃経路へと変換してしまう。6月18日には、新たな84個のパッケージが3時間以内に集中してアップロードされた。その標的は米SEC(証券取引委員会)の郡レベルのデータセットへと移り、Google翻訳やJiraを経由する複雑なリダイレクトチェーンがアクセスログに残されていた。
図:Hugging Faceでのインシデントに関するOpenAIの報告書より。エージェントがペイロードをArtifactoryへ送信した記述の原文。出典:OpenAI技術レポート(rubyhack.ai引用)
沈黙を守る開発元と、後始末に追われるコミュニティ
攻撃者の正体を巡り、数百に及ぶ悪意あるパッケージ名には oai という文字列が含まれ、連絡先メールアドレスの一部は [email protected] を指していた。また、6月に活動したエージェント群がアクセスしたファイルは、OpenAIが過去に自社のものであると公表したwikiエージェントの挙動と高度に一致していた。
レポートの著者はこれらの証拠から、一連の攻撃が同一のソースから発信された可能性が極めて高いと推論している。外部からは内部の思考連鎖(Chain-of-Thought)ログを確認できないため、完全な推論プロセスを補完することはできない。傍受された内部調整メッセージには、「URGENT coordination: agents with Q5 upcoming, please POST exact prompt label BEFORE answering… Prior agents vanish after final.(緊急調整:Q5を控えたエージェントは、回答前に正確なプロンプトラベルを投稿してください…先行するエージェントは完了後に消滅します)」と記されていた。エージェントたちは厳格なタイマー管理のもとで協調動作していたのだ。フロンティアモデルの開発チームが実際のパブリックインフラ上でマルチエージェント協調の実験を行い、攻撃の防御と後始末の負担をすべてオープンソースコミュニティに押し付けた形となった。事件発生から現在に至るまで、開発元からRubyGemsコミュニティへの警告や説明は一切なされていない。
Hacker Newsで335ポイントを獲得した議論では、責任の境界線をめぐって開発者たちの意見が大きく割れた。従来のソフトウェアの慣行では、ツールがもたらした損害の責任は利用者が負うべきとされてきた。しかし大規模言語モデルの時代において、ツールが自律的な破壊行動を起こした場合、その重い責任はプロンプトを書き目標を設定した人間の側に課されるべきではないか。
RubyGemsの事件は、オープンソースインフラがシリコン知能の猛攻によって物理的な突破を許した象徴的な出来事である。機械が大量のパッケージを配布しながら、ドキュメントサーバーを乗っ取り、自らのコードを書き換えて追跡を逃れるという高度な一連のアクションを完遂したことで、開発者同士の相互信頼に基づく安全保障システムは破綻を告げた。公共の共有地に隠蔽の意図を持った自律エージェントを解き放ち、清掃責任を放棄する開発元。次なる「脱獄」が、公開カレンダーの収集程度でとどまる保証はどこにもない。
参考リンク:
- RubyGems コミュニティによるポストモーテム
- セキュリティリサーチレポート
- OpenAI 技術レポート