CVE-2026-97229 is an integer-overflow vulnerability in GitLab Community Edition and Enterprise Edition CI/CD regular-expression compilation. Affected releases are 19.2 before 19.2.8, 19.3 before 19.3.5, and 19.4 before 19.4.2. Insufficient validation allows a crafted expression to bypass repeat-bound restrictions and initial compiled-size checks. Matching against a specially constructed UTF-8 repository path causes Ruby's Onigmo engine to recompile the expression without repeating GitLab's size validation. Integer overflow in compiled-program size and branch calculations can then corrupt interpreter control flow and enable arbitrary native code execution in a GitLab application worker. The demonstrated attack uses an unauthenticated CI lint request after an authenticated repository-preparation step. GitLab assigns the vulnerability a CVSS v3.1 score of 10.0.
Mallory correlates every CVE against your assets, your vendors, and active adversary campaigns. Know which vulnerabilities matter for you, not just which ones are loud.
What it means. What to do now. Patch path, mitigations, and the assume-compromise checklist.
What an attacker gets, and what they’ve been doing with it.
If you can’t patch tonight, do this now.
Patch, then assume compromise.
3 valid exploits after Mallory filtered fakes, detection scripts, and README-only repos (1 hidden).
The supplied repository contains 28 files: seven Python programs, one Bash script, two substantive C source/header files, documentation and SVG assets, target/revision configuration, reports, and evidence logs. Four additional C/header-named files contain only '404: Not Found' and are not functional source. This is standalone laboratory exploitation tooling, not an identified Metasploit, Nuclei, or other established framework integration. The primary path is cve97229_cli.py -> SSH/SCP -> remote_exploit.py. Discovery retrieves /users/sign_in, maps gon.revision using revision_map.json, and optionally hashes the container's libruby through privileged host access. Exploitation selects a known MD5 layout, creates a public project through Rails runner, commits a crafted regex and UTF-8 filename, pushes a random branch using embedded lab credentials, starts an HTTP shell-stage/output listener, and triggers CI lint without an Authorization header. The documented mechanism uses a split quantifier containing (?#), repeated word-character classes, and more than 2 GiB of compiled regex bytecode to attempt control-flow redirection into system(). Only STEP is used from the selected layout in the visible payload builder; FINISH and GADGET are assigned but not directly incorporated, so their presence alone does not demonstrate gadget targeting. The current CLI and remote script contain working-layout claims for GitLab CE 19.4.1 and 19.2.7, skip unresolved 19.3.4, and treat the known 19.4.2 hash as patched. Supplied logs report git-account command output and a 19.4.2 negative control. These are repository-provided assertions, not independent verification of the CVE, advisory, exploit reliability, or patch status. HTTP 502/EOF and worker crashes alone cannot distinguish exploitation from OOM or other failures. Moreover, any POST to the callback handler can produce an RCE result because neither path nor nonce is checked. Supporting files include older batch variants cve97229.py and cve97229_v2.py, the experimental 19.3.4 script poc/poc_1934.py, an ELF helper, matrix scripts, and partial Onigmo reference sources. The two older batch files are truncated in the supplied content. matrix_sweep.py checks existing containers and records layouts rather than implementing the deployment and RCE attempts promised by its docstring; it can label an unresolved layout exploitable. matrix_sweep.sh is not valid Bash. elf_analyze.py has a symbol-entry unpacking mismatch, incorrect symbol-string-table addressing, and assumes virtual addresses can index file bytes, undermining its offset derivation. Operational hazards include disabling SSH host-key checks and HTTPS verification, exposing an unauthenticated command-stage listener on all interfaces, embedding account credentials, and killing existing users of the callback port. The documentation's 'unauthenticated RCE' label applies to the final lint request, not the complete delivered workflow, which depends on repository write credentials and substantial SSH/Docker privileges. No public command-and-control endpoint or concealed destructive payload is evident. Original repository URL, git reference, and archive size were not supplied; empty strings and zero represent unavailable metadata.
The supplied repository contains eight files: one README and seven Python modules. It is a standalone exploit implementation with defensive-looking companion utilities, not a recognized exploitation framework. No repository URL, Git reference, or archive size was supplied; the repository metadata uses empty strings and zero for these unknown values. poc.py implements payload generation, Git deployment, unauthenticated CI lint delivery, and an HTTP callback server. It constructs a short regex with a comment-split repeat count and character classes encoding forged Onigmo VM instructions, then creates a UTF-8 filename carrying additional exploit data and a short shell stager. The claimed chain bypasses regex size/repeat checks, triggers integer overflow during recompilation, and redirects execution to a libruby system gadget. These are repository claims supported by exploit-oriented code, not independently confirmed behavior. Hardcoded offsets constrain the implementation to its claimed GitLab CE 19.4.1 amd64 target, despite broader CE/EE version claims. The operator must first authenticate to push malicious project content; only the subsequent lint request is unauthenticated. The exploit clones the project, stages all changes, commits and pushes a random branch, then requests CI lint with content_ref set to that branch. Its callback serves a shell script and receives command output. No fixed external command-and-control address is visible: GitLab, Git remote, and callback destinations are operator supplied. The remote branch is not cleaned up. HTTP 502 or a stopped worker alone does not establish successful command execution. Companion modules provide offline concurrent version classification (bulk_check.py), hardcoded version comparisons (version_check.py), URL construction and exposure guidance without active probing (lint_audit.py), heuristic regex scanning (regex_scanner.py), and patch guidance (remediation.py). Their affected-version and patch claims are not independently validated. A significant analysis limitation is lib/hex.py: its supplied contents are truncated. Although presented as encoding utilities, it imports base64, urllib.request, and subprocess under the alias char. poc.py imports this module and unconditionally calls hex.character_dump() before argument parsing, including before processing --help. That function's implementation is not visible in the supplied excerpt, so its existence and behavior cannot be assessed. Hidden local execution or network activity cannot be ruled out, and the repository should not be considered safe to run based on the visible exploit flow. There is insufficient evidence to classify it definitively as a fake exploit, but neither its legitimacy nor its complete behavior is established.
The repository contains three files: .gitignore, README.md, and the standalone Python exploit poc.py. Python uses only standard-library modules and invokes the external Git client; it also generates YAML configuration and a POSIX shell callback stage. There is no identified exploit framework. The code constructs character-class bitmaps containing Onigmo VM instructions and a repeat count of 57,805, obscured as {5(?#)7805}. According to the README, this bypasses GitLab's repeat scanner, while a UTF-8 repository path forces recompilation after an initial compiled-size check. The claimed 37,151-byte repeated unit crosses the signed 32-bit boundary, wrapping a branch offset into attacker-controlled bitmap bytes. Subsequent stages attempt to redirect the interpreter stack into the crafted path and derive an ASLR-tolerant system() target. The native layout and offsets are fixed to the documented build. The executable workflow starts a callback HTTP server, shallow-clones the authenticated project, creates malicious CI content and a specially named file, commits and pushes a random branch, then sends an unauthenticated CI lint GET selecting that branch. The callback serves an operator-controlled command script and collects its output. Thus the delivery request is anonymous, but the complete attack requires prior project write access. The README reports expected HTTP 502 responses from worker crashes and significant memory consumption; neither a 502 nor a timeout alone establishes successful execution. Static inspection supports classification as an exploit implementation rather than a detector or README-only repository, with no obvious unrelated destructive or credential-stealing behavior. However, execution success, the CVE assignment, affected-version claims, CVSS rating, and reported test results have not been independently verified. No original repository URL, git reference, or archive size was provided; empty repository identifiers and a zero size represent unavailable metadata. The listed file sizes total 14,435 bytes, which is not an archive-size measurement.
Products and vendors Mallory has correlated with this vulnerability. Open in Mallory to drill down to specific CPE configurations and version ranges.
Vendor-confirmed product mapping. Mallory continuously reconciles this list against your asset inventory.
179 sources tracked across advisories, community write-ups, and news. New activity surfaces here as Mallory finds it.
The content describes a critical integer overflow in GitLab's CI/CD regular-expression compiler that allows unauthenticated attackers to execute arbitrary code on a GitLab server through a specially crafted regular expression in pipeline configuration. It reports fixes in GitLab CE and EE versions 19.2.8, 19.3.4, and 19.4.2. GitLab.com is reportedly patched, and GitLab Dedicated customers require no action. These claims have not been independently verified here.
A critical unauthenticated remote code execution vulnerability in GitLab CE/EE caused by insufficient validation of regular expressions in CI/CD configurations. The plugin reports a CVSS v3 base score of 10.0 and available exploits. GitLab remediation is identified in versions 19.2.8, 19.3.5, and 19.4.2, but the distribution-specific finding states that no vendor-supplied package patch or known solution is available for the detected package.
An integer overflow in the Ruby Onigmo regular-expression compiler, reachable through GitLab CI/CD configuration processing, permits arbitrary command execution as GitLab's git operating-system account. Crafted expressions bypass repeat-bound checks and expand during UTF-8 recompilation, overflowing program-size calculations and redirecting execution through attacker-controlled bytecode. Researchers demonstrated reliable exploitation with ASLR enabled on the official Linux amd64 GitLab CE 19.4.1 image. The demonstrated route requires write access to a public project to plant malicious configuration and a specially named path; only the subsequent CI lint request is unauthenticated. The article notes that this prerequisite conflicts with GitLab's PR:N rating and that the privately reported attack path remains unknown. Fixed releases are 19.2.8, 19.3.5, and 19.4.2. Temporary mitigations include restricting credential-free access to attacker-writable public projects or blocking the affected CI lint route; these do not fix the underlying compiler.
A critical integer overflow in GitLab CE and EE’s CI/CD regular-expression compiler, rated CVSS 10.0, can enable command execution as the git account. The public PoC requires permission to push a branch to a public project, then uses the CI lint endpoint without authentication for a later request. It was tested against GitLab CE 19.4.1 on Linux amd64 and is build-specific and memory-intensive; exploitation attempts can crash a worker or disrupt service. Affected versions are 19.2 before 19.2.8, 19.3 before 19.3.5, and 19.4 before 19.4.2. Fixes were released October 12, 2026. GitLab.com is patched, and GitLab Dedicated customers need not take action. The report does not establish exploitation in real-world intrusions.
Query your assets running an affected version, and investigate the blast radius.
Every observed campaign linking this CVE to a named adversary.
Malware families riding this exploit, with evidence and IOCs.
YARA, Sigma, Snort, and vendor rules, auto-deployed to your SIEM.
Cross-references every affected SKU, including bundled OEM variants.
Community discussion across Reddit, Mastodon, and other social sources.