CVECVE-2026-85706
Max severity
TypePath traversal
Unauthenticated
Arbitrary file read
Exploited1 day after
Sept 12 disclosure
Mass exploitImminent
per WatchTowr
Hunt indicatorHTTP POST to
/api/v4/projects/
{id}/repository/
commits/ URIs
with file.path
parameter
What happened
GitLab disclosed CVE-2026-85706 on September 12, a maximum-severity path traversal vulnerability in its repository commits API that allows unauthenticated attackers to read arbitrary files from the GitLab server by crafting POST requests to the /api/v4/projects/{id}/repository/commits/ endpoint containing manipulated file.path parameters. Exploitation in the wild was confirmed September 13, one day after disclosure. WatchTowr head of threat intelligence Jake Knott stated that mass exploitation is likely to follow shortly, citing the severity, the unauthenticated attack vector, and the scale of internet-exposed self-managed GitLab instances. Security firm CyCognito estimates more than 20,000 self-managed GitLab instances are reachable on standard web ports, with a meaningful share still unpatched days after critical advisories ship. This is the second simultaneous critical GitLab CVE under active attack: CVE-2026-19478, the GraphQL code injection tracked since Issue 114, remains under active exploitation in parallel. GitLab also patched CVE-2026-87719 in the same release, a CVSS 9.9 Duo Chat GraphQL serialization bypass that allows an authenticated user to obtain sensitive credentials and Advanced Search instance configurations.
Why it matters
GitLab is the repository and CI/CD system of record for an organization's code, pipelines, secrets, and deployment configurations. Unauthenticated arbitrary file read on a GitLab server is access to anything the server can read: source code, .env files, SSH keys, CI/CD variable files, tokens embedded in repository configuration, and GitLab's own configuration files containing database credentials and secret keys. Two critical CVEs simultaneously under active attack on the same platform doubles the attack surface and means organizations patching one but not the other remain exposed.
Don't miss
WatchTowr's specific hunting query is the most operationally useful indicator available before patches are confirmed applied across all instances. Hunt HTTP POST requests to /api/v4/projects/{id}/repository/commits/ URIs containing file.path parameters in GitLab web server logs. For CVE-2026-19478, the companion indicator remains requests containing @gl_introduced in the GraphQL endpoint logs. Run both queries against logs from September 12 forward given the confirmed exploitation timeline.
Potential actions
- Apply the GitLab patch for CVE-2026-85706 immediately to all self-managed instances. Patch is available in the versions GitLab released September 12. For instances that cannot patch immediately, restrict public access to the repository commits API endpoint as an interim control and run the WatchTowr hunting query against existing logs.
- Run both GitLab hunting queries now: POST requests to the commits API containing file.path parameters (CVE-2026-85706) and requests containing @gl_introduced in GraphQL endpoint logs (CVE-2026-19478). Both CVEs are under active exploitation simultaneously. Confirm patch status for both CVEs independently.
The Sip
Disclosed Friday. Exploited Saturday. Mass exploitation imminent Monday. Unauthenticated file read on your code repository means source code, secrets, and CI/CD tokens. Two critical GitLab CVEs active at once. Patch both, hunt both, treat them as separate items.