GitLabのCI/CD正規表現コンパイラの脆弱性CVE-2026-97229

カテゴリ
脆弱性の悪用
タグ
国外
目次
  1. 脆弱性の内容
    1. 検知ルールが示す仕組み
    2. Rapid7の再現と認証の前提
    3. Rubyの正規表現エンジンの不具合
  2. 時系列
  3. 対象の製品と版
  4. 悪用の状況
    1. Alpine Linuxでの悪用の試み
  5. 修正と回避策
  6. 未公表の事項
  7. 注
  8. 出典
  9. 更新記録
  10. 関連記事

GitLabの2026年10月12日の告知〔注1〕によると、GitLab CE/EEには、正規表現の検証が不十分なため、特定の条件下で未認証の利用者がCI/CD設定内の細工した正規表現を通じてGitLabサーバー上で任意のコードを実行しうる脆弱性があった⁠[1]。米CISAは10月29日、この脆弱性CVE-2026-97229を既知の悪用された脆弱性(KEV)のカタログに加えた⁠[5、6]。

脆弱性の内容

表1:CVE-2026-97229の概要
項目値資料
題Integer Overflow issue in CI/CD Regular Expression Compiler impacts GitLab CE/EE⁠[1]
重大度とCVSS(GitLab)Critical、10.0(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)⁠[1]
CWECWE-190(Integer Overflow or Wraparound)⁠[5]
報告の経路HackerOneのバグ報奨金プログラム⁠[1]
CVE記録が参照する報告HackerOneの報告#4055749と#4058589⁠[5]

GitLabの告知によると、同じリリースには、XSSの脆弱性CVE-2026-92883(CVSS 8.7)を含めて24件のセキュリティの修正がある⁠[1]。GitLabは検知ルールのCVE-2026-93577の注記で、19.4.1にはCVE-2026-97229で回避される不完全な修正が含まれると書いた⁠[2、3]。

検知ルールが示す仕組み

GitLabは検知ルールgraphql_cilint_hostile_regexpの説明で、CI設定のrulesのexistsとchangesに書くregexpのパターンをRubyの正規表現エンジンOnigmoで評価するとした⁠[3]。GitLabがRE2でなくOnigmoを使うのは、先読みを許すためである⁠[3]。

同じルールの説明によると、Onigmoはコンパイル後のプログラムの大きさを制限しない⁠[3]。ciLintのGraphQLミューテーションはRunnerもコミット済みのパイプラインも要さずにCIのルールを評価し、パイプラインエディタは検証のたびにこれを呼ぶ⁠[3]。Onigmoのインラインコメントで分割した回数指定の繰り返しはGitLabの上限の検査から真の上限を隠し、GitLabはこれをCVE-2026-97229の回避の構文とした⁠[3]。

検知ルールonigmo_native_worker_crashの説明では、CIの経路でrulesに書いた細工したregexpのパターンがINT_MAX(2 GiB)を超えるプログラムにコンパイルされる⁠[2]。このとき、符号付き32ビットのジャンプのオフセットが負に回り込む⁠[2]。正規表現のVMはバッファの外で動き、用意した仕掛けによってgitユーザーとしてのsystem()の呼び出しに至る⁠[2]。

GitLabは2つのルールで、業務への影響にgitユーザーとしてのGitLabサーバー上のリモートコード実行を挙げた⁠[2、3]。ほかの影響は、gitlab-secrets.jsonのインスタンスの秘密情報・全CI/CD変数・Runnerトークン・アクセストークンの窃取と、インスタンス上の全リポジトリの読み書きである⁠[2、3]。

Rapid7の再現と認証の前提

Rapid7の10月13日の記事によると、開発元のCVSSは完全に未認証での悪用を示すが、再現では、脆弱性を起こす前に悪意あるCI/CD設定をリポジトリに置く手段が攻撃者に要った⁠[8]。新規の利用者が自ら登録してプロジェクトを作れるインスタンスでは、この制約が外れる⁠[8]。Rapid7の試験では、攻撃者はまず公開プロジェクトのブランチに、悪意ある.gitlab-ci.ymlとUTF-8の文字を含むリポジトリのパスをコミットできる必要があった⁠[8]。正規表現はUS-ASCIIの表現でコンパイルされてGitLabの検証を通り、UTF-8のパスとの照合でOnigmoが検証の後に再コンパイルし、プログラムの大きさの計算の整数オーバーフローで不正な命令が生成される⁠[8]。

Rapid7は10月16日の技術分析で、未認証なのは最後のCI lintのリクエストだけで、この前提は、GitLabがCVSSで攻撃に要する特権をなしとした評価と食い違うとした⁠[9]。元の報告は非公開で、Rapid7は報告された攻撃がこの前提をどう避けるかをまだ把握していない⁠[9]。

Rubyの正規表現エンジンの不具合

Ruby開発チームの10月23日の告知では、GitLabはCI設定のパターンなど利用者が与えた正規表現をRegexp.newでコンパイルしている⁠[4]。GitLabは、細工したパターンがコンパイル中にメモリを破壊し、リモートコード実行に転じうることを見つけた⁠[4]。同梱するRubyにパッチを当てて自社のリリースで対処し、4つのCVEを割り当てた⁠[4]。CVE-2026-93577とCVE-2026-97229の元になったRubyの不具合は、コンパイル後のパターンの大きさの整数オーバーフロー(#19020)である⁠[4]。

Ruby開発チームは、これらの不具合に達するのは攻撃者が制御する文字列から正規表現をコンパイルするアプリケーションだけで、開発者が書いた正規表現だけを使うアプリケーションは影響を受けないとした⁠[4]。Regexp.timeoutはこれらの不具合を防がず、短いパターンで起きる不具合もあるため、パターンの長さの制限も確実な防御にならない⁠[4]。

目次へ

時系列

時系列
日付主体内容資料
2026年9月23日GitLab19.4.1・19.3.3・19.2.7を公開し、正規表現コンパイラの整数オーバーフローCVE-2026-93577などを修正した⁠[11]
2026年9月24日-CVE-2026-97229が予約された⁠[5]
2026年10月12日GitLab修正版を公開した⁠[1]
2026年10月13日-CVE記録がUTCの1時5分に公開された⁠[5]
2026年10月13日Alpine Linux修正を含む版でなく、誤って19.3.4に更新した⁠[13]
2026年10月20日〜21日-新規登録のアカウントがAlpine LinuxのGitLabに細工したCI設定を送り、ワーカーが8回クラッシュした⁠[13]
2026年10月21日GitLab19.5.1などを公開し、後続の正規表現コンパイラの整数オーバーフローCVE-2026-110264を修正した⁠[12]
2026年10月21日JPCERT/CCWeekly ReportでGitLabの複数の脆弱性を紹介し、CVE-2026-97229の概念実証コードの公開を確認しているとした⁠[7]
2026年10月22日Alpine Linux19.3.6に更新した⁠[13]
2026年10月23日Ruby開発チームRuby 4.0.9・3.4.12・3.3.13を公開した⁠[4]
2026年10月23日Alpine Linux攻撃者のアカウントを遮断した⁠[13]
2026年10月25日〜26日-攻撃者が戻って再侵入を試み、失敗した⁠[13]
2026年10月27日Alpine LinuxGitLabを開発者とビルドサーバー以外に閉じ、再構築を始めた⁠[13]
2026年10月28日Alpine Linux再構築を終えて全パスワードをリセットし、GitLabの秘密鍵を交換して、悪用の試みを公表した⁠[13]
2026年10月29日Alpine Linux19.3.7でGitLabを再開した⁠[13]

目次へ

対象の製品と版

表2:影響を受ける版と修正版
製品影響を受ける版修正版資料
GitLab CE/EE 19.4系19.4以降、19.4.2より前19.4.2⁠[1]
GitLab CE/EE 19.3系19.3以降、19.3.5より前19.3.5〔注2〕⁠[1]
GitLab CE/EE 19.2系19.2以降、19.2.8より前19.2.8⁠[1]

GitLabの告知では、GitLab.comはすでに修正済みの版で稼働しており、GitLab Dedicatedの全テナントはこのパッチリリースの公開前に内部リリースで修正された⁠[1]。配備の形態の明記が無いときは、すべての形態が影響を受ける⁠[1]。

Alpine Linuxは、修正がGitLabのコードでなくRubyへのパッチにあり、GitLabはそのパッチを公式パッケージにだけ当てていると説明した⁠[13]。Alpineのイメージは標準のRubyを使っていたため、19.3.6への更新では直らず、10月26日に脆弱なままだと分かった⁠[13]。独自のRubyでGitLabを動かす場合は、Ruby 3.3.13・3.4.12・4.0.9以降も要る⁠[13]。10月27日に公開したalpinelinux/gitlabのイメージはRuby 3.3.13を含み、それより前に取得した同じ版のイメージと古いタグはすべて脆弱である⁠[13]。

目次へ

悪用の状況

Rapid7は10月13日の記事で、修正前の公式のGitLab CEイメージで任意のコード実行を独自に再現したと報告した⁠[8]。ASLRを有効にした公式のGitLab 19.4.1 CE(Linux amd64)のイメージで一連の攻撃を検証し、同じ入力は修正済みの公式イメージでは実行されなかった⁠[8]。

Help Net Securityは10月13日の追記で、Rapid7の研究者が、記事を書いた時には実環境での悪用は確認されていないと記したと報じた⁠[18]。Rapid7は10月16日の技術分析で、GitLabのリリースノートは公表の時の実環境での悪用を報告していないとした〔注3〕⁠[9]。

CISAはCVE記録に加えたSSVCの評価(10月13日付)で、Exploitation(悪用)をactive、Automatable(自動化の可否)をyes、Technical Impact(技術的な影響)をtotalとした⁠[5]。NVDの記録では、KEVでの名称は「GitLab Community Edition and Enterprise Edition Integer Overflow or Wraparound Vulnerability」である⁠[6]。対応期限は11月1日で、BOD 26-04に沿って開発元の指示どおり緩和策を適用し、緩和策が無ければ製品の使用をやめるよう求めている⁠[6]。

Rapid7は10月30日の更新で、KEVへの追加は活発な悪用の証拠に基づくと書いた⁠[8]。SecurityWeekは、CISAがBOD 26-04に基づき、連邦機関に3日以内の修正を求めたと報じた⁠[19]。

表3:悪用の試みの痕跡
種別値示した組織資料
リクエストの形数秒かかるGET /api/v4/projects/<project>/ci/lint?content_ref=<ref>とHTTP 502Rapid7⁠[9]
Workhorseのログbadgateway: failed to receive response: EOFRapid7⁠[9]
Puma/Railsワーカーのエラーログ(puma_stderr.log)Onigmoの関数を経由するRubyインタープリターのネイティブなクラッシュGitLab⁠[2]
GraphQLのログ(graphql_json.log)ciLintのGraphQLミューテーションで送られた敵対的な正規表現GitLab⁠[3]

GitLabの検知ルールの説明によると、ワーカーのクラッシュの検知は単独の判定でなく、ヒットが無くても試行や成功を否定しない裏付けの役割である⁠[2]。ワーカーをクラッシュさせたリクエストはWorkhorseの502を返し、GraphQLのログに記録を残さない⁠[3]。Rapid7は、非公開の経路は異なりうるとした⁠[9]。

Alpine Linuxでの悪用の試み

Alpine Linuxの10月28日の公表では、攻撃を受けたインスタンスは10月12日の修正を含まない19.3.4のままだった⁠[13]。クラッシュのうち4回では、攻撃者が悪用の途中まで進み、次の段階で失敗した⁠[13]。攻撃者はAlpineのGitLabのコンテナイメージも取得していた⁠[13]。

Alpine Linuxは、成功の証拠は見つかっていないが否定できないため、インスタンスを侵害されたものとして扱い、一から再構築したと説明した⁠[13]。確証を持てない理由には、成功した悪用はクラッシュもWebのログの痕跡も残さないこと、攻撃の日の一部のログが失われたこと、外向きの通信の記録が無かったことを挙げた⁠[13]。aportsリポジトリ・パッケージ・10月21日のリリースは改ざんされておらず、パッケージとリリースに署名する鍵はGitLabのサーバーに置いたことが無い⁠[13]。

表4:Alpine Linuxが挙げた、攻撃が成功していた場合に露出しえた情報
情報資料
全利用者のメールアドレス・氏名・IPアドレス⁠[13]
パスワードのハッシュ⁠[13]
2FAの秘密・CI/CD変数・Runnerトークン⁠[13]
Webhook・連携・プッシュミラーの資格情報⁠[13]
個人アクセストークン(ハッシュとして保存)⁠[13]
非公開リポジトリと非公開のissue・マージリクエスト⁠[13]

Alpine Linuxは、他のサイトから漏れたパスワードによる自動のログインの試行も同プロジェクトのGitLabで確認したとし、同じパスワードを使い回していれば変えるよう求めた⁠[13]。

Alpine Linuxの10月30日の案内によると、再開したGitLabは新しいサーバーで、19.3.7とRuby 3.3.13で動く⁠[13、14]。秘密鍵を交換したため、パスワード・2FA・トークンと一部の保存済みの秘密は使えなくなり、CI/CD変数の値は消えた⁠[13、14]。新規のアカウントには管理者の承認が要る⁠[13、14]。

目次へ

修正と回避策

GitLabは、すべてのセルフマネージドのインストールを表2の修正版のいずれかへ直ちに更新するよう強く推奨した⁠[1]。セキュリティチームは、セルフマネージドのインスタンスの顧客向けに、悪用の試みを検知する6つのルールを公開した⁠[1]。

  • Onigmo native worker crash⁠[1]
  • Graphql cilint hostile regexp⁠[1]
  • ci regexp oversized non ascii path⁠[1]
  • ci regexp guard rejection⁠[1]
  • ci lint workhorse worker crash⁠[1]
  • ci lint scripted client error burst⁠[1]

Ruby開発チームの告知によると、Rubyは10月23日に公開した版以降への更新を推奨し、更新できなければ信頼できない入力から正規表現をコンパイルしないよう求めた⁠[4]。Rubyは少なくとも当面これらの修正にCVEを求めず、追跡にはGitLabのCVEを参照するよう求めた⁠[4]。Security NEXTは、Ruby開発チームが脆弱性として扱うかを今後議論するとしたと報じた⁠[21]。

CERT-EUは10月12日の注意喚起で、インターネットに面したインスタンスから順に、セルフマネージドのGitLab CE/EEを修正版へ更新するよう強く推奨した⁠[15]。オランダのNCSCは10月13日の注意喚起で、CVE-2026-97229とCVE-2026-92883の悪用の可能性を中程度、被害の可能性を高と評価し、最新の更新をできるだけ早く入れるよう求めた⁠[16]。カナダのCyber CentreはAV26-1028を10月13日に公開し、10月29日の更新でKEVへの追加を書き加えた⁠[17]。

Rapid7の10月13日の記事では、更新までの間、公開プロジェクトへの匿名のアクセスを制限し、信頼できない利用者による公開プロジェクトの作成と書き込みを防ぐと、Rapid7が実証した経路への露出を減らせる⁠[8]。Rapid7は、この措置は実証した経路にだけ効き、脆弱な正規表現のコンパイラを直さないとした⁠[8]。10月16日の技術分析では、一時的な措置として、このlintの経路を遮断することも挙げた⁠[9]。

目次へ

未公表の事項

  • Alpine Linux以外で悪用を受けた組織とその数
  • KEVへの追加の根拠とした悪用の証拠の内容
  • Alpine LinuxのGitLabで悪用を試みた主体
  • 秘密情報やトークンが実際に盗まれた事例の有無
  • 脆弱性の詳細を記したissue(GitLabは各issueを、修正したリリースの90日後に公開するとした⁠[1])

注

  • 〔注1〕Security NEXTは、GitLabが現地時間10月8日にリリースしたと報じた⁠[20]。
  • 〔注2〕CERT-EUの注意喚起とSecurity NEXTの記事は、19.3系の修正版を19.3.4と書いた⁠[15、20]。
  • 〔注3〕The Hacker Newsは、前月にはGitLab CE/EEの別の脆弱性CVE-2026-85706(CVSS 10.0)で、公表から数時間以内に実環境での探索が見られたと報じた⁠[10]。

出典

当事者

関係組織

公的機関

調査・観測

報道機関

背景資料

更新記録

  • 2026年10月17日:公開した。
  • 2026年10月21日:JPCERT/CCのWeekly Report(出典7)とGitLabの10月21日のパッチリリースの告知(出典12)を加え、「時系列」を改めた。
  • 2026年10月23日:Ruby開発チームの告知(出典4)を加え、「脆弱性の内容」「時系列」「修正と回避策」を改めた。
  • 2026年10月28日:Alpine Linuxの公表(出典13)を加え、「時系列」「対象の製品と版」「悪用の状況」を改めた。
  • 2026年10月29日:Canadian Centre for Cyber Securityの注意喚起の10月29日の更新(出典17)を「修正と回避策」に加えた。
  • 2026年10月30日:CVE記録の10月30日の更新(出典5)、Rapid7の記事の10月30日の更新(出典8)、Alpine Linuxの公表の10月30日の追記(出典13)と案内(出典14)、SecurityWeekの記事(出典19)、Security NEXTの記事(出典21)を加え、リードと「悪用の状況」「修正と回避策」を改めた。
  • 2026年11月2日:NVDの記録の11月2日の更新(出典6)を加え、KEVの名称・対応期限・求める措置を「悪用の状況」に加えた。

目次へ