Check a site
Check a website Service status Outages Blog
All tools
Check a websiteBrowse all tools
A CI configuration file with a highlighted regular expression rule, next to a GitLab version badge reading 19.5.4

WarningAlerts

GitLab’s CI/CD regex flaw is being exploited: upgrade GitLab and Ruby

Posted Jimel S.5 min read

Attackers are exploiting CVE-2026-97229, a CVSS 10.0 bug that lets a crafted regular expression run code on self-managed GitLab servers. The root cause sits in Ruby’s regex engine. Upgrade GitLab to 19.5.4, 19.4.6 or 19.3.8, and Ruby to 4.0.9, 3.4.12 or 3.3.13.

Illustration: UtiBox

Warning

Ongoing

GitLab CVE-2026-97229 is being exploited. Upgrade self-managed GitLab to 19.5.4, 19.4.6 or 19.3.8.

Started
Ends
Not known yet

What happened

On 12 October 2026 GitLab released 19.4.2, 19.3.5 and 19.2.8 for its self-managed Community and Enterprise Editions. The most serious fix, CVE-2026-97229, scored the maximum CVSS 10.0. GitLab’s advisory says that, under certain conditions, it “could have allowed an unauthenticated user to execute arbitrary code on the GitLab server via a specially crafted regular expression in a CI/CD configuration”.

On 29 October 2026 CISA added the bug to its Known Exploited Vulnerabilities (KEV) catalog, which means it has evidence of real attacks, and gave US federal agencies until 1 November to patch.

Affected versions are 19.2 before 19.2.8, 19.3 before 19.3.5 and 19.4 before 19.4.2. GitLab’s own detection notes add an important detail: 19.4.1 contained an incomplete fix for an earlier, related bug (CVE-2026-93577), and CVE-2026-97229 bypasses it. If you installed the September security release (19.4.1, 19.3.3 or 19.2.7) and stopped there, you’re still exposed.

The root cause is Ruby’s regex engine

GitLab is a Ruby on Rails application, and the underlying bugs are in Onigmo, the regular expression engine built into Ruby. On 23 October 2026 the Ruby project released Ruby 4.0.9, 3.4.12 and 3.3.13 with fixes linked to four GitLab CVEs: CVE-2026-89078, CVE-2026-93577, CVE-2026-97229 and CVE-2026-110264.

According to Ruby’s announcement:

  • The bugs are only reached when an application compiles a regular expression from a string an attacker controls, for example with Regexp.new, Regexp.union, Regexp.compile or by interpolating input into a regex literal. Apps that only use patterns written by their developers aren’t affected.
  • Regexp.timeout doesn’t protect against these bugs, and limiting pattern length doesn’t reliably help, because some can be triggered by short patterns.
  • Ruby 3.3 is in its security maintenance phase, but 3.3.13 includes these fixes as an exception “because GitLab assigned CVEs to issues that rely on them”.

CISA’s catalog entry makes the same point: “Other products can potentially be affected by the same underlying Ruby/Onigmo Integer Overflow issue.” If you run Rails or other Ruby apps that let users type their own patterns (search filters, routing rules, validation rules), upgrade Ruby too.

Three more GitLab security releases since

Patching for CVE-2026-97229 alone isn’t enough any more. GitLab has shipped three further security releases:

DateVersionsMain fix
21 October19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10, 18.11.13CVE-2026-110264 (CVSS 10.0): another regex integer overflow allowing unauthenticated code execution, affecting every version from 7.0
29 October19.5.3, 19.4.5, 19.3.7, 19.2.10, 19.1.10, 19.0.11, 18.11.14Removes trust for eight eMudhra intermediate CA certificates whose private keys were compromised; GitLab Runner must also be updated to 19.5.1
10 November19.5.4, 19.4.6, 19.3.8CVE-2026-105437 (Critical): a heap buffer overflow in the bundled git that “could be used to execute arbitrary commands within GitLab’s Gitaly environment”

Two points from the release notes are easy to miss:

  • Bring-your-own Ruby or Git. GitLab’s official Linux packages and container images include the fixed Ruby and Git. If you compiled GitLab yourself or use your own Ruby runtime, GitLab says you “must also upgrade Ruby to 3.3.13, 3.4.12, 4.0.9 or later”. For Git, it says to rebuild Gitaly’s embedded Git and, if Git comes from your distribution, upgrade it to 2.56.1 or later (or a distribution-patched version).
  • Old branches. The git bug affects every version from 16.2, but the 10 November fix was only released for 19.3, 19.4 and 19.5. Anything older needs to move to a current release.

How to check and upgrade

On a Linux package (Omnibus) installation, check your version with:

sudo gitlab-rake gitlab:env:info

Take a full backup first, as GitLab’s upgrade documentation advises, then install a specific version (Enterprise Edition shown; swap ee for ce on Community Edition):

# Debian / Ubuntu
sudo apt update && sudo apt install gitlab-ee=19.5.4-ee.0

# RHEL / AlmaLinux / Oracle Linux 9
sudo dnf install gitlab-ee-19.5.4-ee.0.el9

Expect downtime on a single-node instance if the jump includes database migrations (the 10 November release adds none). If you’re several versions behind, check GitLab’s upgrade path for any required stops before you jump.

For Ruby apps outside GitLab, ruby -v shows the version. Update Ruby through your version manager, base image or distribution, then redeploy and restart the app.

Look for signs of exploitation

GitLab published six detections for self-managed instances. They point to two request paths, the CI lint API (/api/v4/projects/:id/ci/lint) and the ciLint GraphQL mutation (/api/graphql), and to three places to look:

  • Workhorse access log: a 502 with badgateway: failed to receive response: EOF on a POST to either path, often with a request body of roughly 2 MB. GitLab calls this the “authoritative crash-side detection”.
  • GraphQL log (graphql_json.log): ciLint requests whose variables contain constructs such as {96000,}, \g<...> or \K.
  • Puma error log: Ruby [BUG] crash reports with Onigmo frames such as onig_compile or compile_tree.

A quick first look on a Linux package install:

sudo grep 'ci/lint' /var/log/gitlab/gitlab-workhorse/current | grep '"status":502'
sudo grep -c '\[BUG\]' /var/log/gitlab/puma/puma_stderr.log

The full rules are linked from GitLab’s 19.4.2 release notes. If anything matches from before you patched, treat the server as compromised. A GitLab server holds CI/CD variables, deploy keys, runner tokens and access tokens, and all of them need rotating. Our guide to rotating leaked secrets walks through it.

Sources

Related

More from Alerts

Most read

Latest

Most read

  1. 01November Patch Tuesday lands on the 10th: what October’s record release tells us19
  2. 02Introducing UtiBox: the Web’s Utility Box2
  3. 03Ivanti Connect Secure zero-days gave attackers root on VPN gateways1
  4. 04“Black October”: attackers raid secrets at cloud and AI developer platforms1

Embed this post

Paste this code into your page. It shows the post as a card that links back here. In WordPress you can also paste the post’s address on a line of its own.

Cookies on UtiBox

UtiBox is free because of ads. Google and its partners use cookies to show, limit and measure ads, Google Analytics, Ahrefs Web Analytics and Microsoft Clarity show us how the site is used, and we use a few essential cookies to run the site.