ブログ一覧に戻る
ベストプラクティス2026年11月5日4分で読めます

gem list を実行するだけで他人のコードが動く――RubyGemsの隠れた実行経路と対策

Even gem list can run someone else's code

ベストプラクティス

この記事のポイント

【なぜ重要か】 RubyGemsには、インストールスクリプトとは見なされない2つの仕組み(ネイティブ拡張ビルドスクリプトとプラグイン機構)を通じて、gemのインストール時および以降のすべてのgemコマンド実行時に任意コードが実行される問題がある。`gem list` や `gem -v` のような読み取り専用コマンドでさえコードが走るため、開発者のラップトップやCI環境が知らぬ間に侵害されるリスク...

【なぜ重要か】 RubyGemsには、インストールスクリプトとは見なされない2つの仕組み(ネイティブ拡張ビルドスクリプトとプラグイン機構)を通じて、gemのインストール時および以降のすべてのgemコマンド実行時に任意コードが実行される問題がある。gem list や gem -v のような読み取り専用コマンドでさえコードが走るため、開発者のラップトップやCI環境が知らぬ間に侵害されるリスクがある。安定版のRubyGems/Bundlerにはこの挙動を無効化する手段がなく、現時点でプレリリース版でしか対処できない。

【ポイント】

  • 2つの実行経路が存在する: ①ネイティブ拡張(extconf.rb / mkrf_conf.rb など)はgemインストール時にビルドスクリプトとして実行される。②lib/rubygems_plugin.rb というファイルを含むgemはインストール後もすべてのgemコマンド実行のたびにプラグインとして読み込まれ続ける。どちらも通常のファイルと見分けがつきにくく、レビューで見逃されやすい。
  • 実際に問題のある4つのgemを発見: xmastree・ancient-city-ruby・hacky・et_phone_home の4つが2013〜2015年に公開されており、インストール時にインストーラーのユーザー名・macOSのスクリーンショット・ビーコンを外部サーバーへ送信する。2026年11月4日時点でこれらはまだRubyGemsからインストール可能な状態にある。
  • 安定版には無効化手段がない: --no-build-extension および --no-install-plugin フラグは4.1.0.beta3にのみ存在し、安定版4.0.xでは使用できない。4.1.0.beta3でもデフォルトはオンのままであり、明示的にオプトアウト設定を行う必要がある。Bundlerでは bundle config set --global no_build_extension true / no_install_plugin true、CIでは環境変数 BUNDLE_NO_BUILD_EXTENSION=true / BUNDLE_NO_INSTALL_PLUGIN=true を設定する。
  • 人気gem上位1,000件中約1割が影響対象: 上位997件のうち74件(約1/13)がネイティブ拡張ビルドステップを持ち、bcrypt・bootsnap・bsonなどの著名なgemが含まれる。プラグインファイルを持つgemは2件(rdoc・yard)。これらは悪意あるものではないが、攻撃者が同じ仕組みをいつでも悪用できることを示している。
  • npmはすでに同様の問題に対処済み: npmはMiasmaキャンペーンを機にv12でインストールスクリプトとネイティブビルドをオプトイン制に変更した。RubyGemsは同様の問題を抱えながら、これを無効化できる安定リリースがまだ存在しない。

【まとめ】 Rubyを使用する開発者・チームは今すぐ、ロックファイルおよびインストール済みgemに上記4件の悪意あるgemが含まれていないか確認し、含まれている場合はアンインストールと被害範囲の調査を行うべきである。恒久対策としては、RubyGems/Bundlerを4.1.0.beta3に更新してオプトアウト設定を有効化すること、およびAikido Device Protectionによるインストール時のブロックを検討すること。

原文を読む

Aikido Security Blog

英語で詳細な技術情報を確認

原文を読む

コメント・質問

この記事についてのコメントや質問を投稿できます

コメントを投稿するにはログインが必要です

ログインする

読み込み中...