
CVE-2026-85706 — GitLab Path Traversal IOC Scanner & Detection Toolkit. Detect and hunt for exploitation of the critical unauthenticated GitLab CE/EE path traversal vulnerability with IOC scanning, Sigma, Suricata/Snort, and SIEM detection rules.
GitLab CE/EE Repository Commits API Unauthenticated Path Traversal (CVSS 3.1: 10.0, Critical) Status: Actively exploited in the wild · Listed in CISA KEV (2026-09-11, due 2026-09-14) · Patched by GitLab 2026-09-10
A free, open-source incident response and threat hunting toolkit for — a critical, unauthenticated path traversal vulnerability in GitLab Community Edition (CE) and Enterprise Edition (EE) affecting the . This repository gives security teams, SOC analysts, detection engineers, and GitLab administrators a ready-to-run , , , and a — everything you need to detect exploitation attempts, confirm patch status, and respond to this GitLab zero-day / n-day vulnerability quickly.
🔎 Looking for the fastest path to "am I affected?" Jump to Quick Start.
🚨 Looking for what to patch to? Jump to Fixed Versions & Patch.
| CVE ID | CVE-2026-85706 |
| Vendor / Product | GitLab Community Edition (CE) & Enterprise Edition (EE), self-managed |
| Vulnerability class | Path Traversal (CWE-35), part of the broader Improper Limitation of a Pathname family (CWE-22) |
| Affected component | Repository Commits API (/api/v4/projects/:id/repository/commits...) |
| Root cause | Improper path confinement combined with missing authentication enforcement in the affected API endpoint |
| Affected versions | GitLab CE/EE 18.7 up to (not including) 19.1.8, 19.2 up to (not including) 19.2.6, 19.3 up to (not including) 19.3.2 |
| Authentication required | None — unauthenticated, pre-auth exploitation |
| Attack vector | Network, single HTTP request |
| CVSS 3.1 score | 10.0 (Critical) |
| Impact | Arbitrary file read on the GitLab server — configuration files, secrets, tokens, source code, potentially SSH keys and database credentials |
| Reported by | External security researcher (HackerOne handle "s3ntago"), via GitLab's HackerOne bug bounty program |
| Disclosed / Patched | September 10, 2026 — part of a critical GitLab security release fixing 17 vulnerabilities in total (see Related Vulnerabilities) |
| CISA KEV | Added September 11, 2026; federal civilian remediation due September 14, 2026; CISA has flagged this CVE as subject to forensic triage under Binding Operational Directive (BOD) 26-04, reflecting the possibility that vulnerable systems may already have been accessed before patching |
| Exploitation status | Confirmed active scanning / probing observed in the wild — watchTowr reported the first in-the-wild exploitation attempts roughly 24 hours after public disclosure, with mass exploitation assessed as likely to follow |
An unauthenticated attacker can send a single crafted HTTP request to
GitLab's repository commits API, supplying a file.path (or
file_path) parameter containing directory-traversal sequences
(../, URL-encoded variants, etc.), and have the server return the
contents of arbitrary files outside the intended repository directory —
including GitLab's own secrets file, database configuration, SSH private
keys, and other sensitive server-side data. Because no credentials are
required and the request is trivial to construct, GitLab and third-party
researchers rate this as maximum severity (CVSS 10.0) and CISA has
confirmed active exploitation in the wild.
gitlab-secrets.json, database.yml, or CI/CD runner tokens can pivot
into far deeper access than the initial file-read alone suggests.GitLab fixed CVE-2026-85706 in the following releases on 2026-09-10:
Any self-managed GitLab CE/EE instance on an earlier patch level within
these branches — or on an older major/minor branch entirely — should be
considered vulnerable and upgraded immediately. GitLab.com's SaaS
offering is patched by GitLab directly and does not require customer
action. See docs/remediation.md for a full
step-by-step upgrade and incident-response guide.
Upgrade note: on single-node GitLab instances, upgrading to these versions involves downtime while database migrations complete before GitLab restarts. Multi-node instances can apply the patch without downtime by following GitLab's documented zero-downtime upgrade procedure. Version 19.3.2 also ships post-deploy migrations that run after the upgrade completes — factor this into your maintenance window.
CVE-2026-85706 was the headline issue in a critical GitLab security release covering 17 vulnerabilities in total. Two other issues in the same release are worth tracking alongside it, since they affect similar attack surface and credential/secret exposure risk:
| Vulnerability | Severity | Notes |
|---|---|---|
| CVE-2026-85706 — Path Traversal in repository commits API | Critical (CVSS 10.0) | Unauthenticated arbitrary file read — the focus of this repository |
| Insecure Deserialization in GraphQL subscription serializer (GitLab EE) | Critical | Affects GitLab EE only; deserialization flaws of this type can potentially lead to remote code execution depending on exploitability |
| Buffer Overflow in Unicode conversion wrapper (GitLab EE) | High | |
| Scheduled Pipeline Execution Policy test allows Developers to access protected CI/CD variables | High | Credential/secret exposure risk relevant to the same "protect your CI/CD secrets" response actions in this repo's remediation guide |
| Cross-Site Scripting in Markdown JSON table renderer (CE/EE) | High | |
| Incorrect Authorization in CI/CD environment variable scope matcher (CE/EE) | High | |
| Denial of Service in GraphQL complexity limiter (CE/EE) | High | |
| Improper Authentication in SAML SSO sign-in restriction enforcement (CE/EE) | Medium | |
| Insufficiently Protected Credentials in Workhorse senddata emitters (CE/EE) | Medium | |
| Several additional authorization-bypass and access-control issues in protected environment approval rules and compliance frameworks (EE) | Medium |
Practical takeaway: if you are patching for CVE-2026-85706, you are already pulling in fixes for all of the above in the same 19.3.2 / 19.2.6 / 19.1.8 release — there is no reason to patch for CVE-2026-85706 alone and defer the rest. Treat this as one release to apply in full, not a menu of independently-schedulable fixes.
gitlab-cve-2026-85706-ioc/
├── README.md ← you are here
├── LICENSE ← MIT
├── CHANGELOG.md
├── CONTRIBUTING.md
├── SECURITY.md
├── scanner/
│ ├── gitlab_cve_2026_85706_ioc_scanner.py ← main IOC scanner (stdlib-only Python 3)
│ └── requirements.txt ← documents "no dependencies needed"
├── detection/
│ ├── sigma_rule_gitlab_cve_2026_85706.yml ← Sigma rule (SIEM-agnostic)
│ ├── network_ids_cve_2026_85706.rules ← Suricata/Snort signatures
│ └── siem_hunting_queries.md ← Splunk / Elastic / OpenSearch / grep queries
├── docs/
│ ├── ioc_list.md ← full IOC reference (network, host, post-exploitation)
│ ├── remediation.md ← patch & incident-response playbook
│ └── timeline.md ← public disclosure & exploitation timeline
├── tests/
│ ├── test_scanner.py ← unit tests (stdlib unittest)
│ └── fixtures/sample_production_json.log ← sanitized sample log for testing
└── .github/workflows/ci.yml ← GitHub Actions: lint, test, smoke-test on every push
The scanner is pure Python 3 standard library — no pip install
required, so you can copy just the one file onto a locked-down GitLab host
and run it immediately.
git clone https://github.com/jithinkrishnanrs/gitlab-cve-2026-85706-ioc.git
cd gitlab-cve-2026-85706-ioc
python3 scanner/gitlab_cve_2026_85706_ioc_scanner.py \
--production-log /var/log/gitlab/gitlab-rails/production_json.log \
--api-log /var/log/gitlab/gitlab-rails/api_json.log \
--nginx-log /var/log/gitlab/nginx/gitlab_access.log \
--format json --out report.json
Exit code 1 means at least one potential IOC was found — review
report.json immediately. Exit code 0 means no matches were found in
the logs you provided (see Limitations — this
is not a compromise guarantee).
You can also point it at any arbitrary/rotated log with --generic-log
(repeatable flag), and choose --format text|json|csv for the report.
python3 scanner/gitlab_cve_2026_85706_ioc_scanner.py --check-version 19.2.3
# → GitLab 19.2.3 is VULNERABLE to CVE-2026-85706. Upgrade to 19.2.6 or later immediately...
python3 scanner/gitlab_cve_2026_85706_ioc_scanner.py --check-version 19.2.6
# → GitLab 19.2.6 is PATCHED for CVE-2026-85706 (fixed in 19.2.6).
detection/sigma_rule_gitlab_cve_2026_85706.yml
into your Sigma-compatible pipeline (Splunk via sigma-cli, Elastic
Detection Rules, Microsoft Sentinel, Chronicle, etc.).detection/network_ids_cve_2026_85706.rules
to Suricata or Snort — start in alert-only mode and tune SIDs/thresholds
to your environment before enabling blocking.detection/siem_hunting_queries.md
for Splunk (SPL), Elastic/Kibana (KQL + DSL), OpenSearch (PPL), and plain
ripgrep/grep triage.gitlab_cve_2026_85706_ioc_scanner.py parses GitLab's structured JSON logs
(production_json.log, api_json.log) as well as generic combined-format
reverse-proxy access logs, and flags requests that match the publicly
documented exploitation pattern for CVE-2026-85706:
/api/v4/projects/:id/repository/commits and sub-resources.file.path / file_path / path style
parameter is present in the query string, form body, or JSON body.../, URL-encoded, double-encoded, overlong-UTF-8, and
semicolon path-segment variants) or references a known sensitive
target file (/etc/passwd, gitlab-secrets.json, secrets.yml,
database.yml, SSH private keys, etc.).PRIVATE-TOKEN,
Authorization, or a non-null user_id field to determine whether the
request was authenticated, matching the unauthenticated / pre-auth
exploitation condition central to this CVE.Findings are scored CRITICAL / HIGH / MEDIUM and exported as structured JSON, CSV, or human-readable text for triage.
CVE-2026-85706 IOC Scan Report — 2 finding(s)
============================================================
[CRITICAL] 2026-09-11T02:14:33.120Z src=203.0.113.9 method=POST auth=False
path: /api/v4/projects/42/repository/commits/HEAD
matched: ../../../../etc/passwd
reason: path-traversal sequence in file path parameter; known sensitive/system file referenced; unauthenticated request (matches pre-auth exploitation condition)
log: production_json.log
[CRITICAL] 2026-09-11T02:16:45.501Z src=203.0.113.9 method=POST auth=False
path: /api/v4/projects/17/repository/commits/abc123
matched: ..%2f..%2f..%2fopt%2fgitlab%2fembedded%2fservice%2fgitlab-rails%2fconfig%2fsecrets.yml
reason: path-traversal sequence in file path parameter; unauthenticated request (matches pre-auth exploitation condition)
log: production_json.log
(Generated from the sanitized sample fixture in tests/fixtures/.)
Full detail, including host-based and post-exploitation indicators, is in
docs/ioc_list.md. Headline network indicators:
/api/v4/projects/<id>/repository/commits*file.path / file_path parameter containing ../, %2e%2e%2f,
..%2f, %252e%252e%252f, or similar traversal sequences/etc/passwd, /etc/shadow, gitlab-secrets.json,
secrets.yml, database.yml, id_rsa, .env, or
/opt/gitlab/embedded/service/gitlab-rails/config/secrets.ymlPRIVATE-TOKEN / Authorization header
or authenticated session| File | Platform | Purpose |
|---|---|---|
detection/sigma_rule_gitlab_cve_2026_85706.yml | Sigma (SIEM-agnostic) | Log-based detection rule convertible to Splunk, Elastic, Sentinel, Chronicle, QRadar, etc. |
detection/network_ids_cve_2026_85706.rules | Suricata / Snort | Network-layer signatures for inline IDS/IPS sensors |
detection/siem_hunting_queries.md | Splunk, Elastic/Kibana, OpenSearch, grep/ripgrep | Copy-paste hunting queries for manual/ad-hoc investigation |
See the full playbook in docs/remediation.md.
Summary:
Is GitLab.com (SaaS) affected? No customer action is required for GitLab.com — GitLab patches its SaaS platform directly. This tooling is for self-managed GitLab CE/EE instances.
Do I need authentication to be exploited? No — that's what makes this CVE CVSS 10.0. It's an unauthenticated path traversal against a single API endpoint.
Is there a public exploit / PoC available?
As of this writing, no confirmed public proof-of-concept has been
identified, though active scanning/probing has been observed. This
repository does not contain or link to exploit code — see
CONTRIBUTING.md for why, and always check the
official GitLab CVE-2026-85706 advisory
for the latest vendor guidance.
Will the scanner tell me for certain whether I was compromised? No tool can guarantee that. It performs best-effort detection based on the logs you provide. See Limitations & Disclaimer.
What log retention do I need?
GitLab's default log rotation may not retain logs back to the disclosure
date (2026-09-10). Pull from your centralized SIEM/log archive if your
on-host logs have already rotated — see the note in
detection/siem_hunting_queries.md.
Does this repository work for GitLab Helm/Kubernetes or Docker deployments?
Yes, as long as you can export production_json.log / api_json.log (or
your ingress/reverse-proxy access logs) to a file the scanner can read;
use --generic-log for anything outside the three named log types.
Exactly which versions are affected? GitLab CE/EE 18.7 up to (not including) 19.1.8, 19.2 up to (not including) 19.2.6, and 19.3 up to (not including) 19.3.2. Anything older than the 18.7 branch is also unsupported/end-of-life and should be treated as vulnerable and upgraded regardless.
Was this actually exploited, or just "at risk"? Confirmed exploited. watchTowr Labs observed the first in-the-wild exploitation attempts about 24 hours after GitLab's public disclosure, and CISA subsequently added CVE-2026-85706 to its KEV catalog specifically because it confirmed real-world exploitation — this is not a theoretical or "responsible disclosure only" finding.
What does the CISA BOD 26-04 "forensic triage" designation mean for me?
CISA flagged this CVE as requiring forensic triage under Binding
Operational Directive 26-04, meaning the assumption for federal systems is
that a vulnerable, internet-facing instance may already have been
accessed before it was patched — not just theoretically exposed. The
same assumption is a reasonable default for any organization: treat
patching as step one of an incident response process, not the end of one.
See docs/remediation.md for the full assume-breach
checklist (secret rotation, credential review, CI/CD audit).
Was anything else fixed in the same GitLab release? Yes — the September 10, 2026 release fixed 17 security issues in total, including a second Critical-severity issue (insecure deserialization in the GraphQL subscription serializer, GitLab EE) and a High-severity buffer overflow in a Unicode conversion wrapper. See Related Vulnerabilities Fixed in the Same Release. Since all of these ship in the same 19.3.2 / 19.2.6 / 19.1.8 versions, patching for CVE-2026-85706 already remediates them too.
docs/ioc_list.md.CONTRIBUTING.md for the project's scope policy.Contributions of new IOCs, detection-rule ports, false-positive reports,
and scanner improvements are welcome — see
CONTRIBUTING.md for guidelines (including the
no-exploit-code policy and data-sanitization requirements).
Full citation details and additional context are in
docs/timeline.md.
Released under the MIT License. Detection content (Sigma, Suricata/Snort rules, SIEM queries) is provided as-is for defensive use; tune thresholds and false-positive handling to your own environment before relying on it operationally.
CVE-2026-85706 GitLab CVE-2026-85706 GitLab path traversal GitLab vulnerability GitLab IOC GitLab indicators of compromise GitLab security advisory GitLab exploit detection GitLab CVSS 10.0 GitLab CISA KEV GitLab repository commits API vulnerability GitLab unauthenticated file read GitLab arbitrary file read path traversal CVE 2026 GitLab patch 19.3.2 GitLab patch 19.2.6 GitLab patch 19.1.8
GitLab secrets exposure GitLab CI/CD credential theft Sigma rule GitLab Suricata rule GitLab Snort rule GitLab Splunk GitLab hunting
GitLab incident response GitLab threat hunting self-managed GitLab security
| Public PoC |
| Not confirmed publicly available at time of writing |
| GitLab.com / Dedicated | GitLab.com (SaaS) was already patched at disclosure; GitLab Dedicated customers did not need to take action. Only self-managed CE/EE instances require action |