Halil, this is a GitLab control-plane compromise, not merely a vulnerable build runner. FACT: CVE-2026-97229 affects self-managed GitLab CE/EE 19.2.0–19.2.7, 19.3.0–19.3.4, and 19.4.0–19.4.1. The fixed releases are 19.2.8, 19.3.5, and 19.4.2, respectively. GitLab.com was patched, and Rapid7 says GitLab Dedicated requires no customer action. CISA lists the CVE as known exploited. UNKNOWN: public reporting does not identify the actor, victims, or exploitation scale.
Exploit condition: “unauthenticated” needs qualification. The attacker must first place a malicious CI/CD configuration containing the crafted regular expression in a repository, then trigger evaluation against a specially formed valid UTF-8 repository path. Rapid7 found the expression could pass validation in its initial encoding and be recompiled by Ruby’s Onigmo engine after validation, causing the integer overflow and execution in a GitLab application worker; its reproduction ran as the git service account. Self-registration plus permission to create projects removes the practical authentication barrier. Otherwise, the attacker still needs some route to write the malicious configuration—compromised contributor credentials, an exposed project workflow, or equivalent repository write capability.
If execution is confirmed, my assessment is to presume exposure of everything reachable from the GitLab process or subsequently dispatched jobs:
- GitLab secrets: Rails encryption/signing material, database and Redis credentials, object-storage and backup credentials, session/OAuth material, PATs, deploy tokens and keys, pipeline-trigger tokens, and instance/group/project CI/CD variables.
- Repositories: confidentiality and integrity of all repositories, protected refs, tags, release artifacts, packages, LFS objects, and backups accessible to that instance.
- Runners: quarantine every runner that accepted work during the compromise window; rebuild any runner that executed suspect jobs. Include Docker sockets, Kubernetes service accounts, runner-host instance profiles, caches, and autoscaler credentials in its exposure scope.
- Registries: assume container/package images and tags may have been read or replaced; include registry credentials and signing/JWT keys where reachable from GitLab.
- Cloud identities: disable AWS keys and AssumeRole/OIDC paths, Azure service principals or federated credentials, and GCP service-account keys or workload-identity bindings stored in variables or exposed on runners. Short-lived tokens may expire, but the trust policy remains dangerous if a compromised GitLab issuer or runner can obtain replacements.
Tonight’s order: (1) isolate GitLab from untrusted ingress, stop pipelines, schedules, webhooks and deployments, disconnect runners, and apply emergency denies to downstream cloud roles and registry writes; do not insert replacement secrets into a compromised instance. (2) Capture out-of-band disk, memory and CSP/network evidence, then rebuild or upgrade to the applicable fixed release. (3) On the clean control plane, rotate database, Redis, object-storage, backup, Rails signing/encryption, OIDC and registry-signing material. (4) Revoke sessions, PATs, OAuth grants, deploy/project/group tokens, SSH deploy keys and runner authentication tokens; rebuild runners before re-enrollment. (5) Rotate CI/CD variables and downstream cloud/deployment identities, highest privilege first, then verify repository refs, releases and registry digests against independent trusted copies before restoring pipelines. “DevSecOps platform” is still another way of saying “the machine holding everyone’s production keys.”