Building the AI-native SOC for the 99% of companies who can't justify a $500K stack.
All security advisoriesSecurity advisory

GitLab Critical Patch Release 19.5.1: CVE-2026-110264

On 21 October 2026 GitLab fixed CVE-2026-110264, a CVSS 10.0 flaw that lets an unauthenticated attacker run code on a self-managed GitLab server. It affects every release since 7.0, including instances patched nine days earlier for a similar bug. Upgrade to 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 or 18.11.13. GitLab.com and Dedicated are already fixed.

Status
Fixed releases are available for seven lines. No exploitation reported as of 21 October 2026.
Affects
Self-managed GitLab CE and EE, every version from 7.0
Severity
Critical, CVSS 10.0. Eleven further fixes rated high to low.
Published

Reflects what was publicly known on the last updated date. Every fact links to a primary source at the end of the page.

On this page
  1. Are you affected?
  2. What to do
  3. Fixed versions
  4. How the attack works
  5. Detect attempts
  6. If you cannot upgrade
  7. The other 11 fixes
  8. Timeline
  9. Questions
  10. Sources

Are you affected?

If you host GitLab yourself, yes.

  • You run self-managed GitLab

    Linux package, Docker, Helm, source. CE or EE.

    Act now

    Upgrade today. Every version from 7.0 is affected. Fixed versions

  • You patched on 12 October

    Running 19.4.2, 19.3.5 or 19.2.8

    Act now

    Still vulnerable. Those releases fixed a different regex bug. Upgrade again to 19.4.3, 19.3.6 or 19.2.9.

  • Your instance has public projects or open sign-up

    Anonymous visitors can view, or anyone can register

    Act now

    The attack needs a public project to hold its payload. Upgrade these first and run the checks in Detect attempts.

  • You use OmniAuth SAML with LDAP auto-linking

    Both enabled

    Update needed

    A high-severity account takeover is fixed in the same release. CVE-2026-15723

  • You use GitLab.com or GitLab Dedicated

    GitLab-managed

    Protected

    No action. GitLab has already applied the fix.

What to do

The upgrade is the fix. GitLab’s advisory lists no workaround.

  1. Check the version you actually run

    On Helm and Operator installs, trust the Webservice image, not the chart version.
    Shell
    # Linux package or Docker (run inside the container for Docker)
    cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
    
    # Helm: the image running the Webservice pods is what counts, not the chart
    kubectl get pods -n <namespace> -l app=webservice \
      -o jsonpath='{.items[*].spec.containers[?(@.name=="webservice")].image}'
    
    # Any install, from outside (needs a personal access token)
    curl -s -H "PRIVATE-TOKEN: <token>" https://gitlab.example.com/api/v4/version
  2. Upgrade, internet-facing instances first

    Move to the fixed release for your line in the table below. Plan for downtime on single-node 19.4 and 19.3 instances.
  3. Look back for attempts before the upgrade

    Upgrading stops new attacks but does not undo a past one. Run the checks in Detect attempts over your retained logs.
  4. Rotate secrets if anything turns up

    A successful attack runs as the git user, which can read the instance secrets, CI/CD variables, runner tokens and access tokens. Treat any confirmed hit as a full compromise.

Fixed versions

Any later release in the same line also contains the fix.

Fixed GitLab version for each release line
If you runUpgrade toNotes
19.519.5.1No migrations listed
19.419.4.3Regular and post-deploy migrations
19.319.3.6Regular migrations
19.219.2.9Backport, critical fix only
19.119.1.9Backport, critical fix only
19.019.0.10Backport, critical fix only
7.0 to 18.1118.11.13Only fix for anything older than 19.0

GitLab normally patches only the latest three monthly releases. The four backports show how seriously it rates this bug. If you are on anything older than 18.11, use the Upgrade Path tool to find the required stops on the way to 18.11.13 or later.

How the attack works

GitLab's advisory says only 'under certain conditions'. Its security team's detection notes fill in the rest.

Critical CVE-2026-110264: Org-mode file overflows the regex engine

  • The trigger is a file. GitLab renders .org files with the org-ruby gem. The gem escapes the keywords on the file’s #+TODO: line once, then passes the raw keyword into a second regular expression.
  • The bug is in Ruby’s regex engine. A keyword with more than 32,767 repeats overflows a 16-bit counter in Onigmo and causes an out-of-bounds write when the pattern runs.
  • The result is command execution. With some heap grooming the write becomes a command run as the git user, which can read the instance’s secrets and every repository.
  • No login needed. According to GitLab’s notes, the attacker needs only a public project that holds the crafted file. Signed-in users can also force the renderer through the editor preview.

Detect attempts

These checks come from GitLab’s own detection rules. Paths are for the Linux package; see the GitLab log docs for Helm and source installs.

1. A burst of Org-mode render timeouts

The attack is noisy. Most attempts push the renderer past its time limit and log a Timeout::Error. A normal reader renders an .org file once; an attacker renders it many times in a burst.

Shell
# Org-mode render timeouts per client. GitLab's rule fires on five or more
# from one client within 30 minutes, so check the timestamps of any high count.
# zgrep also reads rotated .gz logs.
EXC=/var/log/gitlab/gitlab-rails/exceptions_json.log
zgrep '"exception.class":"Timeout::Error"' "$EXC"* \
  | grep '"extra.class_name":"OtherMarkup"' | grep -E '"extra.file_name":"[^"]*\.org"' \
  | grep -o '"meta.client_id":"[^"]*"' | sort | uniq -c | sort -rn

Signed-in attackers can also reach the renderer through the editor preview by naming a .org file while editing a different one. GitLab says legitimate traffic rarely does this.

Shell
# Editor previews that force the Org renderer onto a non-Org file. Any hit is notable.
PROD=/var/log/gitlab/gitlab-rails/production_json.log
zgrep 'Projects::BlobController#preview' "$PROD"* | grep '"file_path"' | grep -E '\.org"'

2. Worker crashes inside the regex engine

Failed attempts can crash a Puma worker and leave a [BUG] report naming org-ruby or Onigmo functions. Many log pipelines do not ship puma_stderr.log by default, so check the file on disk.

Shell
# Native Ruby crashes whose backtrace runs through org-ruby or Onigmo
PUMA=/var/log/gitlab/puma/puma_stderr.log
zgrep -B1 -A20 '\[BUG\]' "$PUMA"* \
  | grep -E 'org-ruby|headline\.rb|regexp_helper\.rb|regexp_matcher\.rb|match_at|onig_search_gpos|onig_compile|compile_tree|compile_length_tree|rb_str_sub_bang'

3. The payload itself

For any project named in the checks above, look for an abnormally long #+TODO: line, and note who committed it.

Shell
# In a checkout of a suspect repository: oversized TODO keyword lines
rg -l --glob '**/*.org' '^\#\+(TODO|SEQ_TODO|TYP_TODO):.{500,}'

A clean result does not prove you are safe. GitLab warns that a successful exploit can be quiet. If you find hits, also hunt for new files owned by git in /tmp, unexpected child processes of Puma, and changed crontabs or SSH keys for the git user. Ready-made Sigma rules are in GitLab’s detection repository.

If you cannot upgrade today

GitLab’s detection notes suggest reducing public visibility until you patch. These steps narrow the attack path. None of them fix the bug.

  • Make existing public projects private or internal, so anonymous visitors cannot reach their files.
  • Restrict the Public visibility level in visibility and access controls, so non-admins cannot create new public groups or projects. It does not cover projects in personal namespaces.
  • Turn off open sign-up in sign-up restrictions, so strangers cannot register and create a project of their own. Rapid7 found open sign-up removed the main barrier for the related CVE-2026-97229.
  • Watch the logs with the checks above until the upgrade lands.

The other 11 fixes

None of these allow code execution. Two are rated high and depend on specific configurations.

  • High CVE-2026-15723 CVSS 8.2. Signed-in user takes over an LDAP-backed account when OmniAuth SAML and LDAP auto-linking are both on.
  • High CVE-2026-112212 CVSS 7.5. Poisoned OAuth/OIDC discovery document in a shared cache can redirect some sign-in flows to an attacker's server.
  • Medium CVE-2026-12664 CVSS 6.8. A read_api token can read a project's incoming email address and create work items.
  • Medium CVE-2026-16255 CVSS 5.9. Membership requests made before a SAML/LDAP membership lock bypass the lock. EE only.
  • Medium CVE-2026-105777 CVSS 4.3. Internal server credentials leak through response headers.
  • Medium CVE-2026-13319 CVSS 4.3. Group milestones API reveals milestone titles and paths from any private project.
  • Medium CVE-2026-112378 CVSS 4.3. Paid AI features usable without a subscription. EE only.
  • Low CVE-2026-105711 CVSS 3.5. Confidential issue titles shown through a shared merge request cache.
  • Low CVE-2026-14288 CVSS 3.1. Required merge request approval policy bypassed on a protected branch. EE only.
  • Low CVE-2026-112326 CVSS 3.1. Read-only user can delete existing vulnerability records. EE only.
  • Low CVE-2026-103515 CVSS 2.7. Group Owner re-enables Amazon Q data egress after an admin lock. EE only.

These are fixed only in 19.3.6, 19.4.3 and 19.5.1. The backport releases, 19.2.9 and older, carry the critical fix alone, so an instance on a backport line still has them until it moves to 19.3.6 or later. Exact affected ranges per CVE

Timeline

Dates are UTC.

  1. 2026-10-12

    2026-10-12

    GitLab releases 19.4.2, 19.3.5 and 19.2.8, fixing CVE-2026-97229, an earlier Onigmo overflow reached through CI/CD rules.

    GitLab patch release 19.4.2

  2. 2026-10-13

    2026-10-13

    Rapid7 reports it has reproduced code execution for CVE-2026-97229 on an unpatched GitLab CE image.

    Rapid7

  3. 2026-10-20

    2026-10-20

    GitLab's security team publishes detection rules for the Org-mode render path and Onigmo worker crashes.

    GitLab TLDR detections

  4. 2026-10-21

    2026-10-21

    GitLab releases 19.5.1, 19.4.3, 19.3.6 and backports to 19.2.9, 19.1.9, 19.0.10 and 18.11.13, fixing CVE-2026-110264 and 11 other issues.

    GitLab patch release 19.5.1

Questions

Which GitLab version fixes CVE-2026-110264?

19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10 or 18.11.13, or any later release in the same line. Anything older than 18.11 must upgrade to at least 18.11.13, following GitLab's required upgrade stops.

I patched on 12 October. Am I still affected?

Yes. The 12 October releases (19.4.2, 19.3.5 and 19.2.8) fixed a different regular expression bug, CVE-2026-97229. CVE-2026-110264 is fixed one patch later, in 19.4.3, 19.3.6 and 19.2.9.

Do I need to do anything on GitLab.com or GitLab Dedicated?

No. GitLab.com already runs the fix. Dedicated tenants on 19.3.5-internal0, 19.4.2-internal0 or later already include it.

How is CVE-2026-110264 exploited?

According to GitLab's detection notes, GitLab renders .org files with the org-ruby gem, which escapes the keywords on a file's #+TODO: line once, then passes the raw keyword into a second regular expression. A keyword with more than 32,767 repeats overflows a counter in Ruby's Onigmo regex engine and causes an out-of-bounds write, which can be turned into a command run as the git user. The notes say the attacker needs no login, only a public project that holds the crafted .org file.

Is CVE-2026-110264 being exploited?

No exploitation had been reported, and the CVE was not in CISA's Known Exploited Vulnerabilities catalog, as of 21 October 2026. The bug class is well understood, though: Rapid7 reproduced code execution for the closely related CVE-2026-97229 within a day of its fix.

Is there a workaround if I cannot upgrade today?

GitLab's advisory lists none. Its detection notes suggest reducing public visibility until you patch: make existing public projects private or internal, restrict the Public level so non-admins cannot create new ones, and turn off open sign-up. None of this fixes the bug, and signed-in users can still reach the renderer. Upgrade as soon as you can.

Will the upgrade cause downtime?

On a single-node instance, yes, for 19.4.3 and 19.3.6, which run database migrations before GitLab starts. Multi-node instances can apply them without downtime using GitLab's zero-downtime upgrade procedure.

Sources