XHack Logo
XHack
Products
Services
Compliance
Pricing
Resources
Company
Sign upLogin
XHack Logo
XHackOffensive Security

Certified offensive security team delivering penetration testing evidence written for your auditor.

OSCP+OSCPC-AI/MLPenCASA
support@xhack.io

24/7 SOC Operations

XHack Status
Under attack? Get help now
Services
  • VAPT Services
  • Red Teaming
  • SOC Services
  • Threat Intelligence
  • Incident Response
  • Managed Testing
Pricing
  • Platform Plans
  • Services Pricing
Compliance
  • SOC 2
  • PCI DSS
  • ISO 27001
  • GDPR
  • HIPAA
  • ISO 42001
  • AI Maturity Assessment
  • TX-RAMP
  • NBFC / SECP
  • All Frameworks
Products
  • Vulnerability Assessment
  • GitGuard
  • AI Probe
  • SOC Dashboard
  • AI Agent
  • Cloud Investigation
Comparison
  • XBOW vs XHack
  • Horizon3 vs XHack
  • Strix vs XHack
  • Pentera vs XHack
Resources
  • Platform Tour
  • All Features
  • Install the Agent
  • XHack AI
  • Documentation
  • Blog
  • Case Studies
  • Documents
  • FAQ
Company
  • About Us
  • Our Team
  • Certifications
  • Security and Trust
  • VAPT Explained
  • Contact

© 2026 XHACK (SMC-PRIVATE) LIMITED. All rights reserved.

Registered with the SECP, CUIN 0361945. Verify

Security & TrustVulnerability DisclosurePrivacy PolicyTerms of ServiceRefund Policy
Blog/News

CVE-2026-97229: Critical GitLab RCE Is Exploited, and Upgrading GitLab May Not Be Enough

XHack

XHack

Author

November 2, 2026

16 min read

CVE-2026-97229: Critical GitLab RCE Is Exploited, and Upgrading GitLab May Not Be Enough

Table of contents

18

Why a Regex Bug in GitLab’s CI Matters

What CVE-2026-97229 Is

How CVE-2026-97229 Works

The Four CVEs Behind One Ruby Bug

Is CVE-2026-97229 Being Exploited?

Who Is Exposed to CVE-2026-97229

Fixing CVE-2026-97229

Checking Your Own GitLab for CVE-2026-97229

What to Rotate If You Suspect a Compromise

How XHack Reads CVE-2026-97229

FAQ: CVE-2026-97229 Questions Answered

Is CVE-2026-97229 being exploited in the wild?

Which GitLab versions fix CVE-2026-97229?

Is CVE-2026-97229 really unauthenticated?

Does updating GitLab alone fix CVE-2026-97229?

Does CVE-2026-97229 affect GitLab.com?

How do I check whether CVE-2026-97229 affects my GitLab?

The Bottom Line on CVE-2026-97229

Read this in 30 seconds: CVE-2026-97229 is an integer overflow in the regular expression engine that GitLab uses to process CI/CD configuration. GitLab rates it CVSS 10.0 and says it can give an unauthenticated attacker code execution on the GitLab server. CISA added it to the Known Exploited Vulnerabilities catalog on 29 October 2026, with a federal due date of 1 November and a forensic triage flag of “Yes”.

  • The fix is in Ruby, not only in GitLab. GitLab’s 12 October releases patch the Ruby that ships in its own packages, and upstream Ruby shipped its fix on 23 October.
  • A normal upgrade can leave you exposed. Alpine Linux upgraded GitLab and stayed vulnerable, because its container image used standard Ruby.
  • Exploitation is documented. Alpine says an attacker tried it on 20 and 21 October, crashed workers eight times and got partway in, but it found no proof the code ran.
  • “Unauthenticated” has a catch. Rapid7 found the attacker still needs to plant a CI configuration in a project, which a self-registered account on many servers can do.
  • There is a newer sibling. CVE-2026-110264, also CVSS 10.0, was fixed on 21 October and reaches back to GitLab 7.0, so patch to the latest release, not just 19.4.2.

The lesson of CVE-2026-97229 is that a patched application can still run a vulnerable dependency. The fix lives where most teams do not look, in the language runtime underneath the product.

This article covers what the flaw is, how it works at the level the vendors have published, the timeline, what we know and do not know about exploitation, who is exposed, which version you actually need, and how to check your own GitLab. It does not include exploit code or payloads.

CVE-2026-97229 at a glance: GitLab CI/CD regex compiler integer overflow, CVSS 10.0, CISA KEV added 29 October 2026, fixed in GitLab 19.4.2, 19.3.5 and 19.2.8 and in Ruby 3.3.13, 3.4.12 and 4.0.9
CVE-2026-97229 at a glance: severity, KEV dates and fixed versions

Why a Regex Bug in GitLab’s CI Matters

GitLab is written in Ruby, and it takes text from its users and turns it into regular expressions. A CI/CD configuration file, .gitlab-ci.yml, can include patterns, for example to decide which branches or files a job applies to. Ruby’s Regexp.new compiles those patterns into instructions for its regular expression engine, which is called Onigmo.

Compiling a pattern is not the same as matching one. Compiling means parsing text and building an internal program, and any bug in that step touches memory. When the pattern comes from someone else, a memory bug becomes a security bug.

That is the setting for CVE-2026-97229. The code runs inside GitLab’s application workers, so a successful attack lands in the same place as GitLab itself: the server that holds source code, CI/CD variables, runner tokens and integration credentials.

What CVE-2026-97229 Is

GitLab’s critical patch release page describes CVE-2026-97229 as an issue that, under certain conditions, could have allowed an unauthenticated user to execute arbitrary code on the GitLab server through a specially crafted regular expression in a CI/CD configuration, because of insufficient regular expression validation. CISA’s KEV entry uses the same wording.

Here are the facts, and who said them.

  • Weakness: CWE-190, integer overflow or wraparound.
  • Score: CVSS 3.1 of 10.0 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H), assigned by GitLab as the CNA. The NVD entry, published 13 October 2026, carries GitLab’s score and no separate NVD score.
  • Confirmed exploited: yes. It is in CISA’s KEV catalog, added 29 October 2026, due 1 November, forensic triage “Yes”, ransomware use “Unknown”.
  • Affected versions: GitLab CE and EE from 19.2 before 19.2.8, 19.3 before 19.3.5 and 19.4 before 19.4.2.
  • Discoverer: Johan Carlsson (joaxcar), through GitLab’s HackerOne bug bounty program.
  • Not affected, per GitLab: GitLab.com, which already ran the patched version, and GitLab Dedicated, which was patched before the release.

The vendors and researchers do not agree on one word. GitLab and CISA say “unauthenticated”. Rapid7, which reproduced the bug, says an attacker must first be able to commit a CI configuration to a project, and that on servers where new users can self-register and create projects, that condition is easy to meet.

SourceWhat it says about who can attack
GitLab (CNA)Unauthenticated user, CVSS PR:N
CISA KEVUnauthenticated user
Rapid7Needs a way to plant a CI configuration, such as a public project from a self-registered account
Alpine Linux (victim)A newly registered account sent the crafted configurations

The practical reading is that a server with open registration is exposed to anyone, and a server with closed registration is exposed to anyone who can already create or write to a project. We cannot say that any further restriction fully closes the path.

How CVE-2026-97229 Works

We are describing this at the level GitLab, Ruby and Rapid7 have published. We are not reproducing an exploit.

Ruby’s advisory says the bug behind CVE-2026-97229 is an integer overflow in the size of a compiled pattern. The change that fixes it is Ruby issue 19020. In plain terms, the engine calculates how big the compiled program will be, the number overflows, and the resulting program is malformed. Ruby’s maintainers say that specially crafted patterns can corrupt memory during compilation.

Rapid7 adds that GitLab’s own validation runs first and accepts the pattern, and the overflow happens later, inside the engine. That is why a check at the application layer did not stop it, and why the fix had to go into the engine.

Two details from Ruby’s advisory change how you should think about defences.

  • Regexp.timeout does not protect against these bugs, because the problem happens while compiling, not while matching.
  • Limiting the length of patterns does not reliably protect either, because some of the triggering patterns can be short.

Why CVE-2026-97229 matters beyond GitLab: the weakness is in Ruby. Ruby’s advisory says any application that compiles a regular expression from attacker-controlled text, through Regexp.new, Regexp.union, Regexp.compile or interpolation into a regexp literal, can reach it. CISA’s KEV note makes the same point, saying other products can potentially be affected by the same underlying issue.

The Four CVEs Behind One Ruby Bug

CVE-2026-97229 is one of four GitLab CVEs that all trace to Ruby’s regular expression engine, and all four credit the same researcher. The table below combines GitLab’s and Ruby’s advisories.

CVEBugGitLab releaseWho can attack, per GitLabCVSSIn KEV?
CVE-2026-89078Double free when a pattern fails to parse19.4.1 (23 Sep)Authenticated9.9No
CVE-2026-93577Integer overflow in the compiler19.4.1 (23 Sep)Authenticated9.9No
CVE-2026-97229Integer overflow in CI/CD compiler19.4.2 (12 Oct)Unauthenticated10.0Yes, 29 Oct
CVE-2026-110264Overflow of internal IDs in a pattern with many repeats19.5.1 (21 Oct)Unauthenticated10.0No, as of 30 Oct
CVE-2026-97229 timeline: GitLab 19.4.1 on 23 September, 19.4.2 and the fix on 12 October, attack on Alpine on 20 and 21 October, Ruby fixes on 23 October, KEV on 29 October
CVE-2026-97229 timeline from first fix to CISA KEV

Ruby’s advisory says GitLab found these bugs, and that the Ruby releases contain the fixes for the underlying problems. Ruby states that it has not requested CVE identifiers of its own for them yet, so GitLab’s identifiers are the ones to track in a scanner.

Is CVE-2026-97229 Being Exploited?

Yes, and one victim has described it in detail. The evidence, in order:

  1. 12 October: GitLab releases the fix, and Rapid7 publishes an analysis on 13 October saying it reproduced code execution on an unpatched official GitLab CE image. Rapid7 also links a proof of concept.
  2. 20 to 21 October: according to Alpine Linux’s incident report, a newly registered account sent crafted CI configurations to its GitLab server, which crashed worker processes eight times. In four of those crashes the attacker got partway through the exploit and failed at the next step. The attacker also downloaded the server’s container image, which Alpine reads as a sign they were tuning the exploit to that build.
  3. 22 to 27 October: Alpine upgrades to GitLab 19.3.6, finds on 26 October that it is still vulnerable, and republishes its image with Ruby 3.3.13 on 27 October.
  4. 29 October: CISA adds CVE-2026-97229 to the KEV catalog.

What we do not know about CVE-2026-97229 matters just as much.

  • Whether it succeeded against Alpine. Alpine found no evidence that the attacker ran code, but says a successful exploit leaves no crash and no trace in web logs, some logs from the attack day are gone, and it had no outbound network logging. It treated the server as compromised and rebuilt it.
  • Who the attacker is. No source we read names one.
  • How many others were hit. CISA does not publish the evidence behind a KEV addition. Alpine’s report was public on 28 October, the day before CISA’s addition, but nothing says CISA relied on it.
  • Ransomware use. CISA lists it as unknown.

Our advice is conservative: treat any internet-facing GitLab that was unpatched after 12 October as a possible target, and keep your logs before you patch, because CISA flags this one for forensic triage.

Who Is Exposed to CVE-2026-97229

Your exposure to CVE-2026-97229 depends on how you run GitLab, and the trap is the second row.

How you run GitLabWhat you need
GitLab.com or GitLab DedicatedNothing. GitLab says both are patched.
Self-managed with GitLab’s official package or image (Omnibus package or GitLab’s official container image)Upgrade GitLab. The release carries GitLab’s patch to the bundled Ruby.
Self-managed with your own Ruby (source install, third-party or custom container image)Upgrade GitLab and upgrade Ruby to 3.3.13, 3.4.12, 4.0.9 or later.
A server below 19.2CVE-2026-97229 does not list it, but CVE-2026-110264 reaches back to 7.0, so you still need to patch.
Other Ruby applications that compile user-supplied patternsUpgrade Ruby. This is the case CISA’s note and Ruby’s advisory describe.

Alpine’s own report is the clearest example of the second and third rows. Its fix was an upgrade to 19.3.6, which did not help because “the fix isn’t in GitLab’s own code but in a patch to Ruby, which GitLab applies only in its official packages.” Alpine also notes that it had upgraded to 19.3.4 on 13 October instead of 19.3.5, which had the fix, by mistake.

One caution on reading versions. Because GitLab patches Ruby inside its own packages, the Ruby version string inside an official package may not tell you whether the fix is present. This is our reading of GitLab’s and Alpine’s statements, so for official packages go by the GitLab version, and for your own Ruby go by the Ruby version.

Fixing CVE-2026-97229

To fix CVE-2026-97229, upgrade to the newest patch release for your version, not just the minimum. The minimum fixed versions for CVE-2026-97229 are below. The 21 October releases fix the later CVE-2026-110264 as well.

Release lineMinimum for CVE-2026-97229Also fixes CVE-2026-110264
19.5Not affected19.5.1
19.419.4.219.4.3
19.319.3.519.3.6
19.219.2.819.2.9
19.1, 19.0, 18.11Not listed19.1.9, 19.0.10, 18.11.13
CVE-2026-97229 which fix do you need: official GitLab package needs the GitLab upgrade, your own Ruby also needs Ruby 3.3.13, 3.4.12 or 4.0.9, and the newest patch release also covers CVE-2026-110264
CVE-2026-97229: which fix you need depending on how you run GitLab

Work through it in this order.

  1. Preserve evidence first. CISA’s forensic triage flag means you should keep web, Rails, Sidekiq and system logs before you restart or rebuild.
  2. Upgrade GitLab to the latest patch release for your line, from the table above.
  3. Check your Ruby, if you do not use GitLab’s official packages, and move to 3.3.13, 3.4.12, 4.0.9 or later. Ruby 3.3 is in its security maintenance phase, and Ruby says it shipped 3.3.13 as an exception for these fixes.
  4. Rebuild containers from a patched image. A patched base image does not help a container built last week, and Alpine’s own advice is to pull the image again.
  5. Tighten sign-up while you patch. In the admin area, restrict new sign-ups or require admin approval. Rapid7 says restricting anonymous access to public projects and preventing untrusted users from creating or writing to public projects can reduce exposure to the path it demonstrated, but that this does not fix the engine. Alpine now requires admin approval for new accounts.
  6. Verify the running version, not just the package manifest.
  7. If you suspect exploitation, treat the server as compromised, as Alpine did. Rebuild, then rotate secrets, which we list below.

Do not rely on the stopgap alone. It limits who can reach the bug on one path, and the vulnerable code stays in place.

Checking Your Own GitLab for CVE-2026-97229

These commands check for CVE-2026-97229 by reading versions and looking for signs of worker crashes on your own server. Paths assume a Linux Omnibus install, so adjust them for containers or source installs.

# GitLab and Ruby version information
sudo gitlab-rake gitlab:env:info | grep -iE 'gitlab|ruby'

# Inside a container
docker exec -it <gitlab-container> gitlab-rake gitlab:env:info | grep -iE 'gitlab|ruby'

# Worker crashes around 12 to 28 October (look for segfaults and killed workers)
sudo grep -iE 'segfault|sigsegv|worker .*(killed|terminated|exited)' /var/log/gitlab/puma/puma_stderr.log* /var/log/gitlab/puma/current 2>/dev/null | tail -50
sudo dmesg -T 2>/dev/null | grep -i segfault | tail -20

# Accounts created in the last 45 days
sudo gitlab-rails runner 'User.where("created_at > ?", 45.days.ago).order(:created_at).each { |u| puts "#{u.created_at} #{u.username} #{u.email}" }'

# Recent changes to CI configuration in public projects (adapt to your logging)
sudo grep -h "\.gitlab-ci\.yml" /var/log/gitlab/gitlab-rails/production_json.log 2>/dev/null | tail -50

Interpret the results carefully. A worker crash alone does not prove CVE-2026-97229 was exploited, because other faults also crash workers, and Alpine says a successful exploit leaves no crash at all. A brand new account that shortly afterwards creates projects and commits CI files is a stronger signal.

GitLab also released six threat detections for self-managed customers to spot attempts: Onigmo native worker crash, GraphQL CI lint hostile regexp, CI regexp oversized non-ASCII path, CI regexp guard rejection, CI lint Workhorse worker crash, and CI lint scripted client error burst. If your GitLab or security tooling supports them, turn them on and check what they flagged since 12 October. The 21 October release added detections for CVE-2026-110264, including the same worker crash signal.

What to Rotate If You Suspect a Compromise

Alpine’s report lists what a successful attacker could have reached, which makes a useful rotation checklist for any GitLab server with the same exposure.

  • User email addresses, names and IP addresses
  • Password hashes, so force a password reset
  • Two-factor authentication secrets
  • CI/CD variables and runner tokens
  • Webhook, integration and push mirror credentials
  • Personal access tokens (stored as hashes)
  • Private repositories, and confidential issues and merge requests

Alpine also replaced GitLab’s secret keys, which invalidated passwords, 2FA, tokens and some stored secrets at once. That is disruptive, and you will want a plan before you do it. Anything stored in CI/CD variables should be treated as exposed and rotated at the source system.

How XHack Reads CVE-2026-97229

Most vulnerability programmes ask “have we patched GitLab?” For CVE-2026-97229 the better questions are “what Ruby is the server actually running?” and “who can put a file into a project on it?”

In an AI-assisted VAPT engagement, that becomes an attack-surface review of your source and CI platform. We check whether registration is open, whether untrusted users can create public projects, what a new account can commit, and whether the patched version is the one actually running, including inside container images. AI vulnerability scanning can help find the GitLab, runner and Ruby instances you forgot about.

Two other things stand out. First, this is the second GitLab bug on the KEV list in seven weeks, after the GitLab path traversal CVE-2026-85706 added on 11 September. We checked CISA’s feed, which lists six GitLab entries in total. Second, another late-October runtime bug is PHP2Shell, and the lesson is the same: a fix has to reach the layer that is actually vulnerable.

A pentest report would not certify that you are safe from this CVE. It documents what was tested and found at a point in time, and you should still patch and verify on your own systems.

FAQ: CVE-2026-97229 Questions Answered

Is CVE-2026-97229 being exploited in the wild?

Yes. CISA added CVE-2026-97229 to its KEV catalog on 29 October 2026, and Alpine Linux reported that an attacker tried it against its GitLab server on 20 and 21 October. Alpine found no evidence the code ran but could not rule it out, and CISA lists ransomware use as unknown.

Which GitLab versions fix CVE-2026-97229?

GitLab 19.2.8, 19.3.5 and 19.4.2, released on 12 October 2026, fix CVE-2026-97229. Upgrade to the newest patch release for your line instead, because the 21 October releases also fix the related CVE-2026-110264, rated CVSS 10.0 and affecting versions back to 7.0.

Is CVE-2026-97229 really unauthenticated?

GitLab scores it as unauthenticated, but Rapid7 says an attacker must first plant a CI configuration in a project. On a server with open registration, a new account can do that, so treat registration-enabled instances as exposed to anyone and limit who can create or write to projects.

Does updating GitLab alone fix CVE-2026-97229?

Only if you run GitLab’s official package or image. GitLab fixed it by patching the Ruby it bundles, so a source install or a third-party container with its own Ruby also needs Ruby 3.3.13, 3.4.12, 4.0.9 or later. Alpine upgraded GitLab and stayed vulnerable for exactly this reason.

Does CVE-2026-97229 affect GitLab.com?

GitLab says GitLab.com already ran the patched version and GitLab Dedicated tenants were patched before the release, so CVE-2026-97229 requires no action from them. The risk applies to self-managed CE and EE instances.

How do I check whether CVE-2026-97229 affects my GitLab?

Check the GitLab version against the fixed list, and if you do not use GitLab’s official packages, check the Ruby version as well. Then read your logs from 12 October onward for worker crashes and unfamiliar new accounts. The NVD entry lists the affected ranges.

The Bottom Line on CVE-2026-97229

CVE-2026-97229 is a Ruby regular expression bug that GitLab exposed to anyone who could get a CI file onto its server, and a documented attack on Alpine Linux shows attackers moved within eight days of the fix. The CISA due date of 1 November has passed, so any server still unpatched is already late.

Patch to the newest GitLab release for your line, check your Ruby if you do not use GitLab’s own packages, and close open registration until you have. If you suspect an attempt, keep the logs, rebuild and rotate secrets. If your team wants someone outside to check what a new account can reach on your GitLab, our AI VAPT services cover exactly that.


Categories

News

Previous

Claude Code Bug Bounty: What It Does Well, Where It Stalls and 6 Rules to Follow

Next

Ghidra MCP: How to Connect Claude Code to Ghidra for Reverse Engineering

On this page

Why a Regex Bug in GitLab’s CI Matters

What CVE-2026-97229 Is

How CVE-2026-97229 Works

The Four CVEs Behind One Ruby Bug

Is CVE-2026-97229 Being Exploited?

Who Is Exposed to CVE-2026-97229

Fixing CVE-2026-97229

Checking Your Own GitLab for CVE-2026-97229

What to Rotate If You Suspect a Compromise

How XHack Reads CVE-2026-97229

FAQ: CVE-2026-97229 Questions Answered

Is CVE-2026-97229 being exploited in the wild?

Which GitLab versions fix CVE-2026-97229?

Is CVE-2026-97229 really unauthenticated?

Does updating GitLab alone fix CVE-2026-97229?

Does CVE-2026-97229 affect GitLab.com?

How do I check whether CVE-2026-97229 affects my GitLab?

The Bottom Line on CVE-2026-97229

Related articles

Continue reading

CVE-2026-119977: WordPress Core RCE Is Under Attack, and the Update Itself Is the Risky Moment

News

CVE-2026-119977: WordPress Core RCE Is Under Attack, and the Update Itself Is the Risky Moment

CVE-2026-119977 explained: the WordPress Core upgrade-window RCE that CISA now lists as exploited, who is affected, how ...

Read article
Binance Hack: How $6.3 Billion Was Stolen in 20 Minutes and What Happens Next

News

Binance Hack: How $6.3 Billion Was Stolen in 20 Minutes and What Happens Next

Binance hack explained: $6.3 billion stolen on 29 October 2026, how it happened, who is behind it, what is frozen and ho...

Read article
CVE-2026-46300: Urgent Linux Kernel Root Flaw Fragnesia Is Now in CISA KEV

News

CVE-2026-46300: Urgent Linux Kernel Root Flaw Fragnesia Is Now in CISA KEV

CVE-2026-46300 is an exploited Linux kernel root flaw called Fragnesia. Get fixed kernels, mitigations and what CISA say...

Read article