Ruby、GitLabの重大なリモートコード実行脆弱性の原因となる正規表現エンジンのバグを修正
Rubyは、Onigmoエンジンの3つのバグを修正するアップデートをリリースしました。これらのバグは、信頼できない正規表現パターンをコンパイルするあらゆるアプリに影響を与える、GitLabにおける4件の重大なリモートコード実行脆弱性を可能にしていました。
英語の原文から自動翻訳されました。
Rubyは、組み込みの正規表現エンジンであるOnigmo内の3つのバグに対処するため、バージョン4.0.9、3.4.12、および3.3.13をリリースしました。これらの根本的な欠陥は、最近GitLabで修正された4件の重大なリモートコード実行(RCE)脆弱性の原因となっていました。ユーザーから提供されたパターン文字列を処理するRubyアプリケーションを維持しているすべての開発者にとって、この修正は緊急の課題です。
何が起きたか
セキュリティ問題は、攻撃者が制御できるテキストからRubyが正規表現をコンパイルする方法に起因していました。プログラムがRegexp.new、Regexp.union、またはRegexp.compileなどのメソッドにそのような文字列を渡す場合や、/#{input}/のようなパターンで補間を使用する場合、コンパイル中にメモリ破損が発生する可能性があります。このメモリ破損により、サーバー上で任意のコードを実行するための経路が生じます。公開された主な被害者はGitLabでしたが、Ruby側はこの操作を行うすべてのアプリケーションが脆弱であると明確に述べています。
GitLabはバグバウンティプログラムを通じてこれらの欠陥を発見し、研究者joaxcar氏が4件すべてを報告しました。同社は9月23日から10月21日の間に4件の共通脆弱性識別子(CVE)を発行しました。9月下旬に開示された最初の2つの脆弱性は、ログイン済みアカウントが必要であり、深刻度評価は10段階中9.9でした。続く2つ、CVE-2026-97229とCVE-2026-110264は認証を必要とせず、最大深刻度スコアである10.0を受けました。注目すべき点として、CVE-2026-110264は7.0以降のすべてのGitLabバージョンに影響します。
Rubyはまだこれらの修正に対して独自のCVE識別子を割り当てておらず、ユーザーには代わりにGitLabの記録を通じて問題を追跡することを推奨しています。この決定は、特定のライブラリバージョンとCVEを照合することに依存するセキュリティスキャナーにとって可視性のギャップを生み出します。なぜなら、GitLabの記録では影響を受ける製品としてGitLabのみがリストされているためです。Rubyは2022年と2024年の同様のバグに対してCVEを割り当てたことを明記していますが、現在ドキュメントでは信頼できないパターンを主にサービス拒否(DoS)リスクとして説明しており、コード実行の脅威としては扱っていません。
仕組み
脆弱性は、Ruby言語に組み込まれている正規表現エンジン「Onigmo」にあります。Rubyが正規表現をコンパイルする際、パターン文字列をマッチングに使用される内部構造に変換します。攻撃者が特別に細工されたパターンを提供すると、コンパイルプロセス中にメモリ破損が発生する可能性があります。これは複雑な正規表現に伴う典型的な懸念であるマッチングの遅延やリソース枯渇の問題ではありません。その代わりに、エンジンがビルドフェーズ中に特定のパターン構造を安全に処理できず、攻撃者にメモリの位置を上書きされる隙を与えます。
一般的な緩和策は、この特定のクラスのバグに対してしばしば失敗します。エラーがマッチング開始前のコンパイル中に発生するため、Regexp.timeoutの設定ではメモリ破損を防ぐことができません。同様に、入力パターンの長さを制限することも信頼性がありません。短く慎重に構築されたパターンでも、根本的なエンジン欠陥を引き起こす可能性があるからです。唯一の確実な防御策は、信頼できない入力から正規表現をコンパイルすることを完全に避けるか、Rubyランタイムのパッチ適用済みバージョンへアップグレードすることです。
主要な詳細
- Ruby バージョン4.0.9、3.4.12、および3.3.13には、3つのOnigmoエンジンバグに対する必要な修正が含まれています。
- Ruby 4.0.8は不十分です。CVE-2026-110264に対する修正が含まれていないため、ユーザーは4.0.9へアップグレードする必要があります。
- Ruby 3.2以前は修正を受け取らない予定です。Ruby 3.2は2026年4月1日にサポート終了(EOL)を迎えたためです。
- アプリケーションが危険にさらされるのは、
Regexp.new、Regexp.union、Regexp.compile、または補間を通じて、攻撃者が制御する文字列から正規表現をコンパイルする場合のみです。 - GitLabはバージョン19.5.1、19.4.3、19.3.6、19.2.9、19.1.9、19.0.10、および18.11.13でこれらの問題を修正しました。
- 10月23日時点では、関連する4件のCVEのうち、CISAの既知の悪用脆弱性カタログに記載されているものは一つもありませんでした。
なぜ重要なのか
ソフトウェアエンジニアにとって、この事件は動的パターンマッチングのためのユーザー入力の取り扱いにおける持続的な危険性を浮き彫りにします。多くの開発者は、正規表現のリスクがパフォーマンス低下やサービス拒否攻撃に限られていると仮定しています。しかし、この事象はコンパイルフェーズにおけるメモリセーフティの問題が完全なリモートコード実行につながる可能性があることを証明しています。これは、ユーザーが検索フィルター、検証ルール、または設定パターンを定義するために正規表現を使用できるようにするすべての機能の再評価を強いるものです。
専用のRuby CVEが存在しないことも、自動セキュリティ監視を複雑にします。標準的な脆弱性スキャナーに依存しているチームは、ツールがRuby言語パッケージに直接関連付けられたCVEのみを確認する場合、これらのパッチを見逃す可能性があります。GitLabは独自のコピーのRubyをバンドルしているため、セルフマネージドインスタンスは修正を取得するためにGitLabアプリケーション自体を更新する必要があります。この依存関係チェーンにより、インフラストラクチャーリーダーは、バンドルされたサービス内のアプリケーションレベルのパッチとして現れる場合であっても、上流の言語更新を追跡しなければなりません。
実施できること
- アプリケーションがユーザー入力から正規表現をコンパイルする場合は、直ちにRubyをバージョン4.0.9、3.4.12、または3.3.13へアップグレードしてください。
- Ruby 3.2以前への移行を進めてください。これらのバージョンはこれらのバグに対するセキュリティ修正を受け取らないためです。
Regexp.new、Regexp.union、Regexp.compile、または信頼できないデータを用いたパターン補間の使用について、コードベースを監査してください。- ユーザー定義の正規表現パターンを許可する機能を、事前定義されたフィルターオプションや文字列マッチングなど、より安全な代替手段を使用するようにリファクタリングしてください。
- セルフホスト型のGitLabインスタンスを管理している場合は、19.5.1や18.11.13などのパッチ適用済みリリースの一つへアップグレードしてください。
- サーバー上の悪用試みの兆候を監視するために、GitLabが提供する検出ルールを実装してください。



