RubyのRegex脆弱性、GitLabの深刻なRCEを招く

‘プログラミング言語Rubyのコアメンテナンスチームが、バージョン4.0.9、3.4.12、3.3.13をリリースしました。今回の重要なアップデートでは、組み込みの正規表現解析エンジン「Onigmo」に存在した深刻な脆弱性が修正されています。これらのメモリエラーにより、GitLabのインスタンスはリモートコード実行攻撃にさらされていました。GitLabのセキュリティリリース文書で研究者は、信頼できないパターンを悪用すれば、攻撃者がホストサーバーを完全に制御できたと明らかにしています。

パターンのコンパイル中に発生するメモリ破壊

GitLabでは、継続的インテグレーション(CI)パイプライン内で、ユーザーが独自の正規表現を定義できます。たとえば、自動化されたCI/CDジョブは、ユーザー定義のパターンに照らして受信テキストを評価します。しかし、細工された入力文字列は、パターンマッチングが始まる前にプロセスのメモリを破壊していました。Onigmoの正規表現修正に関するRuby公式のセキュリティアドバイザリによると、この欠陥はバイトコードのコンパイル時に発生します。その結果、認証不要の攻撃者が、単純な解析上の不具合を完全なコマンド実行へと発展させることができました。

Onigmoの中核的な欠陥を分析

根本的には、Onigmoに存在する3つの異なる設計上の欠陥から、4件の重大な脆弱性識別子が生まれました。1つ目のCVE-2026-89078は、エンジンが複雑な部分式の解析に失敗した際に、危険なダブルフリー状態を引き起こすものです。2つ目のCVE-2026-93577とCVE-2026-97229は、式のサイズ計算時に発生する整数オーバーフローが原因です。特に、この2件の外部向け脆弱性レコードは、Ruby内の同一の欠陥に起因しています。

最高深刻度のスコアと影響が及ぶ過去のバージョン

さらに、CVE-2026-110264はOnigmoエンジン内部の識別子管理を狂わせます。攻撃者が部分パターンを過剰に繰り返し送り込むと、内部のカウンター変数がたちまちオーバーフローします。この境界の崩壊がヒープ割り当てを乱し、CVSSで最高値の10.0と評価されました。加えて、この欠陥はアカウント認証を必要とせず、バージョン7.0にまでさかのぼるGitLabの環境に影響します。

先に見つかったCVE-2026-89078とCVE-2026-93577は、有効な認証情報が必要で、深刻度は9.9でした。その後、開発者は認証不要の攻撃経路であるCVE-2026-97229を、内部ビルドで無効化しています。GitLabは独自の修正を迅速に提供しましたが、上流の言語メンテナーも今回、公式のRubyディストリビューション全体で保護を統一しました。

影響を受けるアプリケーションと推奨される対策

重要なのは、これらの脆弱性がRubyアプリケーション全般を脅かすわけではない点です。攻撃経路が成立するのは、信頼できないユーザー入力をコンパイル用メソッドに直接渡すソフトウェアに限られます。Regexp.new、Regexp.compile、Regexp.unionなどの関数は、攻撃を受けるおそれがあります。一方、開発者だけが定義する静的な正規表現は、メモリ破壊に対して完全に安全です。

また、標準のRegexp.timeoutを設定しても、メモリ破壊は防げません。タイムアウトの監視機能が制御するのは検索の実行時間であり、今回の脆弱性は構文のコンパイル時に発動するためです。同様に、任意の文字列長制限を設けても、悪意あるペイロードを無効化することはできません。したがって、開発チームは攻撃リスクを完全に排除するため、Ruby 4.0.9、3.4.12、3.3.13のいずれかへ直ちにアップグレードする必要があります。

翻訳元: https://meterpreter.org/ruby-regex-vulnerabilities-gitlab-rce/

本記事は meterpreter.org の記事を翻訳・要約したものです。