GitLab CI Lint API SSRF — CVE-2021-39935 Patch Bypass, CISA KEV Feb 2026, Cloud Metadata Theft, Internal Service Enumeration, 4-Year Exploitation Gap on Self-Managed Instances

GitLab CI Lint API SSRF (TL-2026-0089) is a high-severity software vulnerability scored CVSS 7.5, first published 2026-02-03. It has no confirmed attribution, references 1 CVE (CVE-2021-39935), maps to 24 MITRE ATT&CK techniques (T1016, T1018, T1046), and is covered by 9 detection rules and 25 indicators of compromise.

Key facts for TL-2026-0089

Threat ID
TL-2026-0089
Severity
HIGH
CVSS
7.5
Status
MONITORING
Category
VULNERABILITY
First published
2026-02-03
Last reviewed
2026-02-03
Attribution confidence
NONE
Motivation
ESPIONAGE
Target sectors
Technology, Government, Financial Services, Healthcare, Education, Critical Infrastructure, Defense
Target regions
Global
Detection rules
9
Indicators of compromise
25

GitLab CE/EE CI Lint API Server-Side Request Forgery (SSRF) vulnerability (CVE-2021-39935) allows unauthenticated external users to perform server-side requests, enabling access to internal services, cloud metadata endpoints, and credential harvesting. Added to CISA KEV on 2026-02-03 due to confirmed exploitation in the wild.

How GitLab CI Lint API SSRF works

CVE-2021-39935 is a Server-Side Request Forgery (SSRF) vulnerability in GitLab Community Edition (CE) and Enterprise Edition (EE) affecting all versions from 10.5 through 14.5.1. The vulnerability exists in the CI Lint API endpoint, which validates CI/CD pipeline configuration (`.gitlab-ci.yml` files). Unauthorized external users can craft malicious CI configuration payloads that cause the GitLab server to make arbitrary HTTP requests to internal services, cloud provider metadata endpoints (169.254.169.254), and other restricted network resources.

The vulnerability is a patch bypass — an earlier SSRF in the CI Lint API was reported via HackerOne (report #1110131) and patched, but the fix was incomplete. Security researcher @minhli discovered that the access control enforcement could be circumvented in specific configurations. When GitLab instances have sign-ups enabled with the 'New users set to external' option, newly registered external users — who should have no project access and cannot trigger CI pipelines — can still abuse the CI Lint API to perform SSRF attacks without any project membership.

The CI Lint API (`/api/v4/ci/lint`) is designed to validate CI/CD YAML configuration before pipeline execution. The SSRF occurs because the validation process follows `include:` directives that reference remote URLs, allowing an attacker to specify arbitrary internal URLs. This enables:

1. **Cloud metadata theft**: Accessing AWS IMDSv1 (http://169.254.169.254/latest/meta-data/), GCP metadata, and Azure IMDS endpoints to steal IAM credentials, service account tokens, and instance identity documents 2. **Internal service enumeration**: Probing internal network services (Redis, PostgreSQL, Elasticsearch, Consul, Vault) for service discovery and data exfiltration 3. **Credential harvesting**: Accessing internal GitLab services (Gitaly, Workhorse, Rails console) that may expose tokens, API keys, or database credentials 4. **Network reconnaissance**: Mapping internal network topology by observing response timing and error messages from internal hosts

GitLab serves over 30 million registered users and is widely deployed as self-managed instances in enterprise environments, government agencies, and critical infrastructure organizations. Self-managed GitLab instances are particularly vulnerable because they often run within corporate networks with access to sensitive internal services. CISA added this CVE to the Known Exploited Vulnerabilities catalog on 2026-02-03, indicating confirmed exploitation in the wild more than 4 years after the original patch was released — suggesting that many self-managed instances remain unpatched.

The vulnerability was patched in GitLab versions 14.5.2, 14.4.4, and 14.3.6, released on 2021-12-06. GitLab.com (the SaaS offering) was patched immediately. However, self-managed instances require manual upgrades, and the long tail of unpatched GitLab deployments represents significant ongoing risk. The current stable GitLab version is 18.8.4 (released 2026-02-10), meaning vulnerable instances are more than 3 years behind on patches.

The CISA KEV addition 4+ years post-patch highlights a critical pattern: legacy vulnerabilities in widely-deployed DevOps infrastructure continue to be actively exploited by threat actors who scan for unpatched self-managed instances. This mirrors the exploitation lifecycle of CVE-2021-22205 (GitLab Workhorse RCE, KEV since 2021-11-03) and CVE-2023-7028 (GitLab password reset takeover, KEV since 2024-05-01), confirming GitLab as a high-value target for persistent exploitation campaigns.

MITRE ATT&CK techniques used in TL-2026-0089

discovery

T1016 System Network Configuration Discovery; T1018 Remote System Discovery; T1046 Network Service Discovery; T1082 System Information Discovery; T1526 Cloud Service Discovery; T1580 Cloud Infrastructure Discovery

defense-evasion

T1078 Valid Accounts; T1078.004 Cloud Accounts; T1211 Exploitation for Stealth

initial-access

T1190 Exploit Public-Facing Application; T1199 Trusted Relationship

lateral-movement

T1210 Exploitation of Remote Services

collection

T1213 Data from Information Repositories; T1213.003 Code Repositories; T1530 Data from Cloud Storage

credential-access

T1528 Steal Application Access Token; T1552 Unsecured Credentials; T1552.001 Credentials In Files; T1552.005 Cloud Instance Metadata API; T1606 Forge Web Credentials

privilege-escalation

T1548 Abuse Elevation Control Mechanism

exfiltration

T1567 Exfiltration Over Web Service

resource-development

T1588 Obtain Capabilities

reconnaissance

T1595 Active Scanning

Remediation for GitLab CI Lint API SSRF

Patches

  • GitLab 14.5.2 (2021-12-06)
  • GitLab 14.4.4 (2021-12-06)
  • GitLab 14.3.6 (2021-12-06)
  • Current stable: GitLab 18.8.4 (2026-02-10)

Immediate actions

  • Upgrade GitLab CE/EE to version 14.5.2, 14.4.4, or 14.3.6 or later immediately
  • If upgrade is not immediately possible, restrict access to the CI Lint API endpoint (/api/v4/ci/lint) via reverse proxy or WAF rules
  • Disable public sign-ups if not required for business operations
  • Implement network segmentation to prevent GitLab servers from accessing cloud metadata endpoints and sensitive internal services
  • Review GitLab access logs for anomalous CI Lint API usage patterns from external or unauthenticated users

Workarounds

  • Block CI Lint API access for unauthenticated users via reverse proxy configuration
  • Disable user registration or set restrictive sign-up restrictions
  • Configure GitLab's outbound request allowlist to prevent access to internal networks
  • Deploy egress filtering on GitLab servers to block connections to 169.254.169.254 and internal RFC1918 ranges

Longer-term hardening

  • Establish a policy to apply GitLab security patches within 72 hours of release
  • Deploy Web Application Firewall (WAF) rules to detect and block SSRF payloads targeting internal IP ranges and cloud metadata endpoints
  • Implement IMDSv2 (token-required) on AWS instances running GitLab to mitigate metadata theft via SSRF
  • Configure GitLab Outbound Request Settings to restrict allowed external connections
  • Deploy network monitoring to detect outbound connections from GitLab to internal services or metadata endpoints
  • Audit all self-managed GitLab instances for version compliance and patch status
  • Consider migrating to GitLab.com SaaS to eliminate self-managed patching burden

CVEs associated with GitLab CI Lint API SSRF

CVE-2021-39935

Weaknesses (CWE) in GitLab CI Lint API SSRF

CWE-918

Timeline of GitLab CI Lint API SSRF

  • Security researcher @minhli submits HackerOne report #1236965 identifying CI Lint API SSRF bypass in GitLab CE/EE. Source: https://hackerone.com/reports/1236965
  • GitLab creates internal issue #346187 — 'SSRF patch for CI Lint API is incomplete' — confirming the bypass of prior SSRF fix from HackerOne #1110131. Source: https://gitlab.com/gitlab-org/gitlab/-/issues/346187
  • GitLab releases security versions 14.5.2, 14.4.4, and 14.3.6 patching CVE-2021-39935 along with 18 other vulnerabilities. GitLab.com already running patched version. Source: https://about.gitlab.com/releases/2021/12/06/security-release-gitlab-14-5-2-released/
  • CVE-2021-39935 published in NVD. CVSS 3.1 scored 7.5 High (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N). GitLab original scoring: 6.8 Medium. Source: https://nvd.nist.gov/vuln/detail/CVE-2021-39935
  • CISA adds CVE-2023-7028 (GitLab password reset account takeover) to KEV, signaling continued exploitation of GitLab vulnerabilities in the wild. Source: https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  • CISA adds CVE-2021-39935 to Known Exploited Vulnerabilities catalog with remediation deadline 2026-02-24. Exploitation confirmed more than 4 years after patch release — indicating widespread unpatched self-managed instances. Source: https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  • GitLab releases version 18.8.4 with 15 security fixes including 2 additional SSRF vulnerabilities (CVE-2025-12575 in Virtual Registry, CVE-2025-12073 in Git repository import), demonstrating ongoing SSRF attack surface in GitLab. Source: https://about.gitlab.com/releases/2026/02/10/patch-release-gitlab-18-8-4-released/
  • As of 2026-05-29, CVE-2021-39935 (GitLab CI Lint API SSRF, CWE-918, CVSS 7.5) remains actively exploited in the wild per its CISA KEV listing (added 2026-02-03, BOD 22-01 deadline 2026-02-24), confirmed by BleepingComputer, CISA, and multiple vendors. A 2021 patch (14.5.2/14.4.4/14.3.6) exists but ~49K-71K exposed self-managed instances stay vulnerable; no actor attribution, takedown, or successor CVE.

Sources cited for GitLab CI Lint API SSRF

Threats related to GitLab CI Lint API SSRF

Detection coverage for TL-2026-0089

As of 2026-02-03, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-0089 across Splunk SPL, Microsoft KQL and Sigma, covering 25 indicator(s) of compromise. The whole corpus is readable without an account; a free account unlocks full detection query text in Splunk SPL, Microsoft KQL and Sigma; paid tiers add raw indicator values, correlation and the MCP server. Threadlinqs MCP server · View plans.

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Latest Threats