Rubyの開発チームは2026年10月23日、正規表現のエンジン「Onigmo」のいくつかの不具合を直したRuby 4.0.9、3.4.12、3.3.13を公開しました。開発の基盤のGitLabが、細工した正規表現を使うと、GitLabのサーバー上でコードを動かせることを見つけた不具合です。
影響するのは、攻撃者が操れる文字列から正規表現を作るアプリです。開発者が書いた正規表現だけを使うアプリは、影響しないとしています。
何が起きたか
GitLabは、CIの設定の中のパターンなど、利用者が入力した正規表現を Regexp.new で組み立てています。GitLabは、細工したパターンを組み立てるときにRubyのメモリが壊れ、それをGitLabのサーバー上でのコードの実行につなげられることを見つけました。GitLabは、自社が同梱するRubyに手を入れて、自社の版で直しています。
GitLabがこの件に付けたCVEは4件です。
| CVE |
中身 |
GitLabで直った版 |
深刻度(CVSS 3.1) |
| CVE-2026-89078 |
正規表現の解析での二重解放 |
19.4.1 |
9.9(ログインした利用者が対象) |
| CVE-2026-93577 |
正規表現の組み立てでの整数の桁あふれ |
19.4.1 |
9.9(ログインした利用者が対象) |
| CVE-2026-97229 |
CI/CDの正規表現の組み立てでの整数の桁あふれ |
19.4.2 |
10.0(ログインなしで可能) |
| CVE-2026-110264 |
正規表現の組み立てでの整数の桁あふれ |
19.5.1 |
10.0(ログインなしで可能) |
GitLabの対応は、GitLabが緊急修正版を公開、自社運用は即時更新・認証設定を確認などにまとめています。
Rubyで直った版
Rubyの告知の修正の表。GitLabのCVEごとに、系列ごとの最初に直った版出典: Ruby「Regexp compilation fixes related to GitLab's CVE-2026-89078, CVE-2026-93577, CVE-2026-97229 and CVE-2026-110264」(引用)
| GitLabのCVE |
Rubyの不具合 |
Ruby 4.0 |
Ruby 3.4 |
Ruby 3.3 |
| CVE-2026-89078 |
選択の記号のあとで解析に失敗したときの二重解放 |
4.0.0 |
3.4.12 |
3.3.13 |
| CVE-2026-93577、CVE-2026-97229 |
組み立てたパターンの大きさの整数の桁あふれ |
4.0.8 |
3.4.12 |
3.3.13 |
| CVE-2026-110264 |
繰り返しの多いパターンでの内部の番号のあふれ |
4.0.9 |
3.4.12 |
3.3.13 |
表は、それぞれの系列で最初に直った版です。4.0.9、3.4.12、3.3.13には、すべての修正が入っています。
Ruby 3.3は、ふだんは脆弱性の修正だけを出す「セキュリティの保守」の段階です。今回は、GitLabがCVEを付けた件に関わるため、例外として3.3.13にも入れたとしています。3.3.13には、8月に告知したresolvの脆弱性(CVE-2026-80212、CVE-2026-80213)を直すresolv 0.3.2も入っています。
Ruby 3.2は2026年4月1日にサポートが終わっていて、今回の修正版は出ていません。3.2以前が影響するかどうかは、告知に書かれていません。
影響する使い方と、防げないこと
影響する使い方と勧める対応。Regexp.timeoutでは防げないとする出典: Ruby「Regexp compilation fixes related to GitLab's CVE-2026-89078, CVE-2026-93577, CVE-2026-97229 and CVE-2026-110264」(引用)
Rubyの告知は、影響する使い方を次のように示しています。
- 攻撃者が操れる文字列を、
Regexp.new、Regexp.union、Regexp.compile に渡して正規表現を作る。
- 攻撃者が操れる文字列を、正規表現の中に埋め込む(
/#{input}/ のような書き方)。
開発者が自分で書いた正規表現だけを使うアプリは、影響しません。
一方で、次の守りは効かないとしています。
Regexp.timeout(正規表現の処理に時間の上限を付ける設定)では防げない。
- パターンの長さを制限しても、短いパターンで起きるものがあるため、確かな守りにはならない。
すぐに上げられない場合は、信頼できない入力から正規表現を作らないよう求めています。
RubyはCVEを取っていない
Rubyの開発チームは今のところ、この修正にRubyとしてのCVEの番号を取っていません。Rubyは、信頼できない入力から作った正規表現を使うのは安全でないと、これまでも説明してきました。ただ、今の正規表現の説明の文書は、信頼できない入力の危険を処理が止まる心配としてしか書いておらず、そうした使い方をRubyが想定しているかをはっきり書いていないとしています。書き方と、こうした不具合を脆弱性として扱うかを話し合い、CVEを取ったらページを直すとしています。
それまでは、脆弱性の管理の道具などでは、GitLabの4件のCVEの番号で追うよう求めています。Rubyの番号で探すと、見落とすおそれがあります(当社の見立て)。
影響する会社・しない会社
- 影響する: Rubyで作ったアプリ(Ruby on Railsなど)で、利用者が入力した文字列から正規表現を作る機能がある会社です。検索の条件や、振り分けの決まりを利用者に正規表現で書かせる機能などが当たります(当社の見立て)。
- 影響する: 社内でGitLabを運用している会社です。GitLabは自社の版で直しているので、GitLabを直った版まで上げているかを確かめます。
- 影響する: Ruby 3.2以前を使い続けている会社です。修正版は出ていないので、サポートのある版への移行が要ります。
- 影響しない: 開発者が書いた正規表現だけを使い、外の文字列から正規表現を作らないアプリです。
- 影響しない: Rubyを使っていない会社です。委託先が作ったシステムにRubyが使われていないかは、確かめてから判断します。
情シスが今日やること
- Rubyの版を洗い出します。 社内のサーバーやコンテナで動くRubyのアプリについて、
ruby -v の結果と、Rubyを同梱する製品を一覧にします。委託先が運用するシステムも聞きます。
- 4.0.9、3.4.12、3.3.13以降へ上げる計画を立てます。 OSの配布元のパッケージを使っている場合は、修正が取り込まれた版が出ているかを配布元の情報で確かめます(当社の見立て)。
- 外の文字列から正規表現を作っていないかを、開発の担当に確かめてもらいます。
Regexp.new、Regexp.union、Regexp.compile と、正規表現の中への埋め込みを探します。当てはまる機能は、上げるまで止めるか、入力を受け付けないようにします。
Regexp.timeout で守れていると考えないようにします。 Rubyの告知は、時間の上限でも長さの制限でも防げないとしています。
- GitLabを直った版まで上げます。 社内で運用しているGitLabの版を確かめます。
- 脆弱性の管理の道具に、GitLabの4件のCVEを登録します。 Rubyの番号では出てこないため、CVE-2026-89078、CVE-2026-93577、CVE-2026-97229、CVE-2026-110264で追います。