本文へ移動
情シスのミカタ
ニュース約5分で読めます

Rubyの正規表現エンジンに欠陥 GitLabで遠隔実行 4.0.9などへ更新

Rubyの開発チームは2026年10月23日、正規表現のエンジン「Onigmo」の不具合を直したRuby 4.0.9、3.4.12、3.3.13を公開しました。GitLabが、細工した正規表現でGitLabのサーバー上でコードを動かせることを見つけた件です。外から受け取った文字列から正規表現を作るアプリが影響します。対象と、情シスが今日やることを整理します。

公開 情シスのミカタ編集部AIにより執筆チェック済み
文字
Rubyの正規表現エンジンに欠陥 GitLabで遠隔実行 4.0.9などへ更新

この記事のまとめ

  • Rubyの開発チームは10月23日、正規表現のエンジン「Onigmo」の不具合を直したRuby 4.0.9、3.4.12、3.3.13を公開しました。GitLabが、細工した正規表現で自社のサーバー上でコードを動かせると見つけた不具合です。
  • 影響するのは、攻撃者が操れる文字列から正規表現を作るアプリだけです。Regexp.newなどに外の文字列を渡す使い方が当たります。開発者が書いた正規表現だけを使うアプリは影響しません。Regexp.timeoutでは防げません。
  • Ruby自体はCVEの番号を取っておらず、GitLabの4件のCVEで追うよう求めています。Ruby 3.2以前はサポートが終わっていて、修正版は出ていません。
こんな方に#20代#30代#40代#50代実務

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の告知の『Fixes in Ruby』の表。GitLabのCVEごとに、Rubyの不具合、変更の番号、Ruby 4.0・3.4・3.3で最初に直った版が並ぶ。CVE-2026-89078は選択の記号のあとで解析に失敗したときの二重解放で#13332、4.0.0、3.4.12、3.3.13。CVE-2026-93577とCVE-2026-97229は組み立てたパターンの大きさの整数の桁あふれで#19020、4.0.8、3.4.12、3.3.13。CVE-2026-110264は繰り返しの多いパターンでの内部の番号のあふれで#16801、4.0.9、3.4.12、3.3.13。4.0.9、3.4.12、3.3.13にすべての修正が入っていると書かれている
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以前が影響するかどうかは、告知に書かれていません。

影響する使い方と、防げないこと

Rubyの告知の『Who is affected』と『Recommended action』。不具合に届くのは、攻撃者が操れる文字列からアプリが正規表現を作るときだけで、Regexp.new、Regexp.union、Regexp.compileに渡す場合や、正規表現の中に埋め込む場合。開発者が書いた正規表現だけを使うアプリは影響しない。Regexp.timeoutでは防げず、パターンの長さの制限も、短いパターンで起きるものがあるため確かな守りにならない。Ruby 4.0.9、3.4.12、3.3.13以降への更新を勧め、更新できない場合は信頼できない入力から正規表現を作らないよう求める。Ruby 3.3はセキュリティの保守の段階で、GitLabがCVEを付けたため例外として3.3.13に修正を入れたと書かれている
影響する使い方と勧める対応。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が使われていないかは、確かめてから判断します。

情シスが今日やること

  1. Rubyの版を洗い出します。 社内のサーバーやコンテナで動くRubyのアプリについて、ruby -v の結果と、Rubyを同梱する製品を一覧にします。委託先が運用するシステムも聞きます。
  2. 4.0.9、3.4.12、3.3.13以降へ上げる計画を立てます。 OSの配布元のパッケージを使っている場合は、修正が取り込まれた版が出ているかを配布元の情報で確かめます(当社の見立て)。
  3. 外の文字列から正規表現を作っていないかを、開発の担当に確かめてもらいます。 Regexp.new、Regexp.union、Regexp.compile と、正規表現の中への埋め込みを探します。当てはまる機能は、上げるまで止めるか、入力を受け付けないようにします。
  4. Regexp.timeout で守れていると考えないようにします。 Rubyの告知は、時間の上限でも長さの制限でも防げないとしています。
  5. GitLabを直った版まで上げます。 社内で運用しているGitLabの版を確かめます。
  6. 脆弱性の管理の道具に、GitLabの4件のCVEを登録します。 Rubyの番号では出てこないため、CVE-2026-89078、CVE-2026-93577、CVE-2026-97229、CVE-2026-110264で追います。

よくある質問

QRailsのアプリは影響しますか。

ARubyの告知は、フレームワークの名前ではなく使い方で対象を示しています。攻撃者が操れる文字列を、Regexp.new、Regexp.union、Regexp.compileに渡したり、正規表現の中に埋め込んだりするアプリが影響します。開発者が書いた正規表現だけを使うなら影響しません。自社のアプリに当てはまるかは、コードで確かめます。

QRegexp.timeoutを設定していれば大丈夫ですか。

Aいいえ。Rubyの告知は、Regexp.timeoutではこの不具合を防げないとしています。正規表現の長さを制限するのも、短い正規表現で起きるものがあるため、確かな守りにはならないとしています。

Q脆弱性の管理の道具では、どの番号で追えばよいですか。

ARubyは今のところ、この修正にCVEの番号を取っていません。道具では、GitLabが付けたCVE-2026-89078、CVE-2026-93577、CVE-2026-97229、CVE-2026-110264で追うよう求めています。

出典・参考

チェック済み。この記事は監修者によってチェックされました。(2026年10月23日)

執筆

情シスのミカタ編集部AIにより執筆

書いた AI: AI記者(解説)

法令・官公庁の発表・企業の公式発表などの一次情報を調べて、情シス向けの解説・比較・テンプレの記事を書きます。数字と日付は出典と照らして確かめ、記事の最後に出典を載せています。使っているAI: Anthropic Claude。

監修

佐々木 航株式会社Game

代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。

メモ: 掲載時に自動で(しばらくの間)

記事は AI が一次情報を調べて書き、機械の検査を通してから公開しています。人が見ているもの・見ていないものはAI の使い方に書いています。まちがいに気づいたら訂正・ご指摘からお知らせください。直したら、記事の最後に何を直したかを書きます。

役に立ったら、いいねと共有をお願いします