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にはこの挙動を無効化する手段がなく、現時点でプレリリース版でしか対処できない。
【ポイント】
extconf.rb / mkrf_conf.rb など)はgemインストール時にビルドスクリプトとして実行される。②lib/rubygems_plugin.rb というファイルを含むgemはインストール後もすべての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 を設定する。【まとめ】 Rubyを使用する開発者・チームは今すぐ、ロックファイルおよびインストール済みgemに上記4件の悪意あるgemが含まれていないか確認し、含まれている場合はアンインストールと被害範囲の調査を行うべきである。恒久対策としては、RubyGems/Bundlerを4.1.0.beta3に更新してオプトアウト設定を有効化すること、およびAikido Device Protectionによるインストール時のブロックを検討すること。
原文を読む
Aikido Security Blog
英語で詳細な技術情報を確認