CVSS 10.0
Maximum possible severity score for CVE-2026-85706 -- the GitLab repository commits API path traversal requires no authentication, no privileges, no user interaction, and produces full confidentiality and integrity impact across network-accessible self-managed instances
24 hours
Time between GitLab releasing patches on September 10, 2026, and watchTowr confirming in-the-wild exploitation probes starting at 06:00 UTC on September 11 -- attackers reverse-engineered the fix and weaponized CVE-2026-85706 within one day of patch publication
1 HTTP POST
A single unauthenticated HTTP POST to /api/v4/projects/{id}/repository/commits/ with a crafted file.path parameter is sufficient to read any file on the server readable by the gitlab user, including .gitlab_shell_secret, SSH host keys, deploy tokens, and database credentials
Sept 14
CISA's mandatory remediation deadline for federal civilian executive branch agencies under the Known Exploited Vulnerabilities directive -- organizations running unpatched self-managed GitLab instances are in active exploitation scope as of today

SponsoredHorizon3.ai

Proactive Security for the AI Era

NodeZero continuously and autonomously pentests infrastructure, identity, cloud, and now web applications, chaining weaknesses across every domain the way real attackers do. Every finding ships with replayable proof showing exploitable business impact, not theoretical risk.

See NodeZero WebApp in action

CVE-2026-85706 is a CVSS 10.0 path traversal in GitLab's repository commits API that lets an unauthenticated attacker read any file on the server with a single HTTP POST request -- including .gitlab_shell_secret, SSH host private keys, CI/CD pipeline variables, deploy tokens, and database passwords. GitLab released patches on September 10, 2026. Exploitation probes began within 24 hours. CISA added the flaw to the Known Exploited Vulnerabilities catalog on September 11, and the federal remediation deadline for civilian agencies is today, September 14, 2026.

The flaw exists in all self-managed GitLab Community Edition and Enterprise Edition instances running versions 18.7 through 19.3.1. The commits API endpoint accepts a file.path parameter in the POST body to specify where content should be written inside a repository. GitLab's handler fails to confine this path to the repository working directory and fails to require any authentication for this specific code path. An attacker who sends a crafted POST request with a file.path value containing ../ sequences traverses outside the repository root and retrieves the target file's content in the API response. No credentials, no session token, no social engineering, and no prior foothold are required.

GitLab.com and GitLab Dedicated hosted instances are not affected. The exposure is confined entirely to self-managed deployments. The stakes are high: any self-managed GitLab server stores the credentials that control every repository it hosts -- SSH host keys that authenticate the server identity, deploy tokens that authorize automated pipeline access to external systems, and .gitlab_shell_secret, the shared credential that GitLab uses to trust its own shell component for SSH-based git operations. An attacker who reads these files can forge repository operations, intercept SSH sessions, and pivot from the GitLab server into every system that trusts its CI/CD pipeline.

Upgrade immediately to 19.3.2, 19.2.6, or 19.1.8 using the GitLab Critical Patch Release. While upgrading, restrict API access at the reverse proxy to authenticated sessions only.

How Does GitLab CVE-2026-85706 Path Traversal Work?

The GitLab repository commits API at /api/v4/projects/{id}/repository/commits/ accepts batch file operation requests in POST body JSON. The standard use case lets authorized users create a commit that adds or modifies files by specifying the file path and content in the request body.

CVE-2026-85706 exploits two simultaneous failures in this endpoint. First, the endpoint fails to enforce authentication for the API call. A request without an Authorization header or PRIVATE-TOKEN header proceeds past the authentication check rather than returning a 401 Unauthorized response. Second, the file.path parameter value is not normalized before the server uses it to locate the file. When an attacker supplies a value like ../../../../etc/passwd or ../../../../home/git/.gitlab_shell_secret, the server traverses outside the repository working directory and reads the file at the resolved absolute path.

The server then includes the retrieved file content in the API response body, returning it to the attacker over a normal HTTP 200 response. No error is thrown. The response looks structurally similar to a successful commit creation, with the file content embedded in the diff output fields.

The attack requires three things: a reachable GitLab API endpoint over TCP/443 or TCP/80, a valid project ID (which can be any numeric ID, including ID 1 for the first project -- publicly visible on any self-managed instance with public visibility enabled), and knowledge of the target file path relative to the traversal depth.

watchTowr's analysis confirmed the technique works against all affected versions and documented the first in-the-wild probing at 06:00 UTC on September 11, 2026, less than 24 hours after patches shipped. Attacks were observed against internet-exposed GitLab instances with both the commits API accessible from public addresses.

What Credentials and Data Are Exposed on a Compromised GitLab Server?

GitLab stores multiple high-value secrets on disk in predictable locations. CVE-2026-85706 gives unauthenticated attackers access to all of them.

.gitlab_shell_secret is the shared secret that GitLab uses to authenticate its own shell component for SSH-based git operations. An attacker who retrieves this value can forge SSH-authenticated requests to GitLab's internal APIs, effectively impersonating the GitLab server itself. This breaks the trust relationship that protects every repository hosted on the instance.

SSH host private keys at /etc/ssh/ssh_host_rsa_key, ssh_host_ecdsa_key, and ssh_host_ed25519_key are typically readable by the gitlab user depending on system configuration. An attacker who retrieves the SSH host private key can impersonate the GitLab server during SSH connections, enabling man-in-the-middle attacks against developers cloning repositories over SSH.

gitlab.rb and secrets.yml contain the database connection string including password, SMTP server credentials, S3 bucket credentials for artifact storage, Kubernetes integration tokens, and the db_key_base value used to encrypt stored secrets. Decrypting stored secrets with db_key_base gives attackers access to every personal access token, deploy token, and integration credential stored in the database.

CI/CD pipeline variables stored in configuration files or referenced in the GitLab runner configuration are accessible if file paths are known. Exposed CI/CD credentials can trigger supply chain insertions into any pipeline that trusts the compromised GitLab instance -- the same attack vector that produced the LiteLLM supply chain breach and 434,000 CI/CD credential exposures.

Organizations that stored AWS IAM keys, Vault tokens, Kubernetes service account credentials, or container registry tokens in GitLab CI/CD variables should treat those credentials as compromised and rotate them immediately.

Free daily briefing

Briefings like this, every morning before 9am.

Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.

Who Is Targeting Unpatched GitLab Instances and What Are They After?

Security researchers at watchTowr and Horizon3.ai began tracking active exploitation probes against internet-exposed GitLab instances at 06:00 UTC on September 11, 2026 -- within 24 hours of the patch release. CISA formally added CVE-2026-85706 to the Known Exploited Vulnerabilities catalog the same day, citing evidence of active exploitation in the wild.

The exploitation pattern follows a reconnaissance-first methodology consistent with organized initial access broker activity. Attackers probe for .gitlab_shell_secret and SSH host keys in a first wave, then return to instances that responded with expected file sizes for deeper credential extraction targeting gitlab.rb and secrets.yml. This staged approach suggests attackers are automating the initial probe against wide target lists and manually prioritizing the most valuable instances for follow-up.

GitLab servers in defense-industrial-base, financial services, and technology sector organizations represent the highest-value targets given that these instances are most likely to host CI/CD pipelines with production cloud credentials attached. GitLab instances used for internal tool development at enterprises often have direct connections to production Kubernetes clusters, AWS accounts, and artifact repositories -- making the CI/CD credential exposure vector more damaging than the SSH key theft in many environments.

The 24-hour exploitation window from patch release to active attacks mirrors the pattern observed when GitLab released patches for prior critical vulnerabilities. Attackers routinely analyze patch diffs to reverse-engineer the underlying flaw and build exploit code faster than most organizations cycle through patch approval and deployment. Organizations with self-managed GitLab instances that do not patch within 24 to 48 hours of a critical security release consistently enter the active exploitation window.

Review log files for HTTP POST requests to /api/v4/projects/[id]/repository/commits/ URIs that contain file.path parameters. Any occurrence warrants immediate investigation.

watchTowr Rapid Reaction, CVE-2026-85706 (September 11, 2026)

Sigma Detection Rules for GitLab CVE-2026-85706

The following Sigma rules detect exploitation attempts against CVE-2026-85706 using web server access logs. Rule 1 catches the initial path traversal probe in real time; Rule 2 identifies successful file reads by correlating response status and body characteristics with the vulnerable endpoint.

Deploy via your SIEM's log ingestion for nginx, Apache, or GitLab's own Unicorn/Puma logs. Both rules target access logs with the cs-method, cs-uri-stem, and sc-status fields standard in W3C Extended Log Format. If your log format differs, adapt the field names to match your log schema before deploying.

Rule 1: GitLab Commits API Path Traversal Probe -- Targets the initial exploitation attempt at the network level, requiring only access logs with HTTP method and URI fields. Rule 2: GitLab Sensitive File Read via Commits API -- Targets successful exploitation by correlating a POST to the commits API with an HTTP 200 response, indicating the server returned file content instead of rejecting the request.

Subscribe to unlock Sigma Detection Rules

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

Subscribe to unlock Sigma Hunt Queries

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

Subscribe to unlock WAF Detection Rules

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

IOCs and Log-Based Detection Patterns for GitLab Path Traversal

No specific threat actor infrastructure (C2 domains, attacker IPs) has been publicly attributed to the CVE-2026-85706 exploitation campaign as of September 14, 2026. Exploitation is currently opportunistic, with automated scanners probing internet-exposed GitLab instances. The following behavioral and structural indicators are derived from confirmed exploitation technique and watchTowr's log analysis guidance.

The primary detection artifact is the POST request to the commits API endpoint with file.path values outside the repository root. Successful exploitation is distinguished from failed attempts by the HTTP 200 response code combined with a response body size larger than expected for a commit rejection error (which returns a compact JSON error object typically under 200 bytes).

GitLab application logs (at /var/log/gitlab/gitlab-rails/production.log) record API requests with fuller body details than nginx access logs and are a higher-fidelity source for detecting this exploit. Review both log sources.

For organizations that have already patched: search logs from September 10 through today for the URI pattern and response characteristics described below. Any successful 200-response POST to the commits API that was made without a valid Authorization header warrants credential rotation for all secrets stored on that server.

Subscribe to unlock Indicators of Compromise

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

How to Patch and Remediate GitLab CVE-2026-85706

Remediation requires upgrading your self-managed GitLab instance and rotating all credentials accessible from the server filesystem. Address the patch first, then credential rotation even if you have no evidence of exploitation -- attackers may have read credentials without triggering obvious log entries if your logging verbosity was set below the default.

Apply official patch →docs.gitlab.com/releases/patches/patch-release-gitlab-19-3-2-released/

Subscribe to unlock Remediation & Mitigation steps

Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.

Why This Flaw Matters for Your Organization

GitLab is not just a code repository -- it is the trust anchor for your entire software supply chain. Every CI/CD pipeline that builds, tests, and deploys your software runs under credentials stored in or managed through GitLab. When those credentials are exposed, attackers gain the ability to insert malicious code into your build pipeline, push to protected branches with stolen deploy tokens, access production cloud environments with CI/CD-attached IAM roles, and pivot into every external system that your automation accounts can reach.

The path traversal vulnerability in CVE-2026-85706 is particularly dangerous because it does not require the attacker to have any prior access to the GitLab environment. Unlike post-authentication vulnerabilities that require a compromised account as a starting point, this flaw gives any internet-visible self-managed GitLab instance zero protection against an attacker who sends a single HTTP POST request.

Organizations running self-managed GitLab in on-premises data centers, private cloud VPCs, or containerized environments face the highest risk. Public-facing GitLab instances that do not require VPN access are directly exploitable from any IP address. But even internal GitLab instances accessible only from within the corporate network represent a risk if the network contains any compromised endpoint with API access -- which is a realistic assumption after any phishing or initial access event.

See also the MLflow SSRF credential theft pattern for a parallel developer-infrastructure vulnerability that similarly exposed cloud credentials through a single unauthenticated request.

The CISA federal remediation deadline of September 14 reflects the agency's assessment that active exploitation is ongoing and escalating. Organizations that treat this as a routine patch cycle rather than an emergency response are accepting material risk of a supply chain compromise that may take weeks to detect.

The bottom line

CVE-2026-85706 is a CVSS 10.0 unauthenticated path traversal that gives attackers every credential stored on a self-managed GitLab server from a single HTTP request. Exploitation started within 24 hours of the September 10 patch, and the CISA federal deadline is today. Upgrade self-managed GitLab to 19.3.2, 19.2.6, or 19.1.8 now. While upgrading, block unauthenticated POST access to the commits API at your reverse proxy. After upgrading, rotate .gitlab_shell_secret, SSH host keys, all deploy tokens, and any CI/CD secrets stored on the server. Search access logs for POST requests to /api/v4/projects/*/repository/commits/ that returned HTTP 200 with unexpected body sizes to identify past exploitation.

This analysis is generic. create a free account to score threats like this against your own stack.

Frequently asked questions

What is CVE-2026-85706 in GitLab?

CVE-2026-85706 is a CVSS 10.0 path traversal vulnerability in the GitLab repository commits API. The flaw exists in all GitLab Community Edition and Enterprise Edition self-managed installations between version 18.7 and 19.3.1. An unauthenticated attacker sends a single HTTP POST request to the commits API endpoint with a file.path parameter containing path traversal sequences. GitLab fails to confine the file path to the repository directory, allowing the attacker to read any file on the server that the gitlab user can access. Exploitable files include .gitlab_shell_secret, SSH host keys, deploy tokens stored on disk, CI/CD environment variable files, and database configuration with credentials. GitLab released fixed versions 19.3.2, 19.2.6, and 19.1.8 on September 10, 2026.

Which versions of GitLab are affected by CVE-2026-85706?

All self-managed GitLab CE and EE instances running versions from 18.7.0 through 19.3.1 are vulnerable. Specifically, instances running any version before 19.1.8 on the 18.x/19.1 track, any version before 19.2.6 on the 19.2 track, or any version before 19.3.2 on the 19.3 track must upgrade immediately. Fixed versions are 19.1.8, 19.2.6, and 19.3.2, all released September 10, 2026. To check your version, navigate to Admin Area then Dashboard or run gitlab-rake gitlab:env:info from the command line. Instances that have not applied an update since mid-2025 are almost certainly vulnerable.

Is GitLab.com affected by CVE-2026-85706?

No. GitLab.com, GitLab Dedicated, and other GitLab-managed cloud instances are not affected by CVE-2026-85706. GitLab applied patches to its hosted infrastructure before public disclosure. Only self-managed installations are vulnerable. Organizations using GitLab.com or GitLab Dedicated do not need to take action for this specific vulnerability. However, organizations hosting their own GitLab instances on-premises, in private cloud environments, or via containerized deployments must upgrade immediately.

How do I detect if my GitLab instance has been exploited by CVE-2026-85706?

Review your GitLab access logs or nginx reverse proxy logs for HTTP POST requests to URIs matching /api/v4/projects/ followed by /repository/commits/ where the request body or URI contains file.path parameters with path traversal sequences (../, ..%2F, %2e%2e). A successful exploit attempt returns HTTP 200 with file content rather than a commit creation response. Check for requests that returned 200 with content longer than expected for a normal commit response. Review your .gitlab_shell_secret file's modification timestamp. Rotate all credentials stored on the GitLab server regardless of whether you detect active exploitation, as attackers may have extracted credentials without leaving obvious log evidence depending on your log verbosity level.

What files can attackers read using CVE-2026-85706?

Attackers can read any file on the GitLab server that the gitlab OS user has read access to. High-value targets include .gitlab_shell_secret (the shared secret used to authenticate GitLab Shell, allowing SSH-based repository operations to be forged), SSH host private keys in /etc/ssh/ (enabling server impersonation for man-in-the-middle attacks), gitlab.rb and secrets.yml (containing database passwords, SMTP credentials, and internal API tokens), deploy tokens and personal access tokens stored in database configuration, CI/CD pipeline variable files, and /etc/passwd for user enumeration. In practice, an attacker who retrieves .gitlab_shell_secret and SSH host keys can forge authenticated repository operations and intercept encrypted SSH sessions without any further access to the server.

How does the GitLab CVE-2026-85706 path traversal work technically?

The GitLab repository commits API at /api/v4/projects/{id}/repository/commits/ accepts a POST body describing a batch of file operations to commit. One of the accepted parameters, file.path, specifies the path within the repository where content should be written. GitLab's API handler fails to normalize the provided path before performing the file operation and does not enforce that the path stays within the repository working directory. An attacker who submits a file.path value containing ../ sequences or URL-encoded equivalents can traverse outside the repository root. Because the API does not require authentication for this specific code path due to a separate missing-auth enforcement bug, the traversal is reachable without any credentials. The server reads the file at the traversed path and includes its content in the API response.

What should I do if I cannot immediately patch GitLab to 19.3.2?

If an immediate upgrade is not possible, implement network-layer controls to block unauthenticated access to the commits API endpoint. Configure your reverse proxy or WAF to block HTTP POST requests to URIs matching /api/v4/projects/.*/repository/commits/ where the request does not include a valid Authorization or PRIVATE-TOKEN header. Restricting API access to authenticated sessions only at the network layer prevents exploitation of the missing-auth component of the flaw. Additionally, move your GitLab API endpoints behind a VPN or IP allowlist to limit exposure to trusted network ranges. These controls reduce risk but do not fully remediate the underlying vulnerability. Patch as soon as a maintenance window is available.

How do I upgrade GitLab to fix CVE-2026-85706?

Navigate to the GitLab Critical Patch Release announcement at docs.gitlab.com/releases/patches/patch-release-gitlab-19-3-2-released/ and follow the upgrade guide for your deployment type. For Linux package installations, run sudo apt-get update followed by sudo apt-get install gitlab-ee or gitlab-ce to the target version. For Docker deployments, update the image tag to 19.3.2-ee.0 or 19.3.2-ce.0 and recreate containers. For Helm chart deployments, update the appVersion in your values file and run helm upgrade. The patch includes database migrations, so single-node installations will experience brief downtime. Multi-node deployments can follow the zero-downtime upgrade procedure in the GitLab documentation. After upgrading, verify the running version at Admin Area then General and confirm it shows 19.3.2, 19.2.6, or 19.1.8.

Sources & references

  1. GitLab Critical Patch Release: 19.3.2, 19.2.6, 19.1.8
  2. CISA Adds One Known Exploited Vulnerability to Catalog (CVE-2026-85706)
  3. BleepingComputer: CISA hackers now exploit max severity GitLab flaw in attacks
  4. watchTowr Rapid Reaction: GitLab Path Traversal Vulnerability CVE-2026-85706
  5. The Hacker News: GitLab CVSS 10 File-Read Flaw Draws In-the-Wild Probes After Disclosure

Free resources

25
Free download

Critical CVE Reference Card 2025–2026

25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.

No spam. Unsubscribe anytime.

Free download

Ransomware Incident Response Playbook

Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.

No spam. Unsubscribe anytime.

Free newsletter

Get threat intel before your inbox does.

50,000+ security professionals read Decryption Digest for early warnings on zero-days, ransomware, and nation-state campaigns. Free, daily, no spam.

Unsubscribe anytime. We never sell your data.

Eric Bang
Author

Founder & Cybersecurity Evangelist, Decryption Digest

Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.

Giveaway: InfoSec World 2026 All Access Pass ($3,895 value)

Details →
Daily Briefing

Subscribe to enter the giveaway

Every subscriber is automatically entered. You also get daily threat intel every morning: zero-days, ransomware, and nation-state campaigns. Free. No spam.

Already subscribed? You're already entered.

Giveaway

Win a $3,895 InfoSec World 2026 pass.