GitLab Workhorse Security
GitLab Workhorse is a smart reverse proxy for GitLab positioned between NGINX and the Rails application[^c1]. It intercepts all HTTP traffic to and from Rails and handles resource-intensive operations such as file transfers, Git operations, and data streaming. All authentication and authorization decisions remain in the Rails application, and all requests to Rails pass through Workhorse[^c2]. A typical GitLab installation uses NGINX as a web server to proxy through Workhorse and into the Puma application server. Apache is technically usable only when installing from source and is not officially supported in Omnibus deployments.[^c8].
Workhorse relies on a shared-secret JWT mechanism for internal authentication with Rails and other components such as [[gitaly]] and [[gitlab-shell]]. Rate limiting protects the Rails backend from overload, and a multipart middleware with allowed-path validation and JWT-signed upload metadata secures file upload processing.
The proxy began as a weekend Go project called gitlab-git-http-server and evolved within roughly four months into a central traffic cop routing all HTTP requests[^c7]. It has been the subject of numerous security vulnerabilities spanning multiple classes: parser differentials between Workhorse and Rails's middleware stack, HTTP request smuggling through inconsistent interpretation of requests, architectural weaknesses such as upload processing code executing before authentication checks, path traversal enabling JWT token leakage, and file upload resource exhaustion leading to denial of service. The most critical vulnerability, CVE-2021-22205, allowed unauthenticated remote code execution through ExifTool and was widely exploited in the wild.
In 2026, five CVEs have been disclosed that directly affect Workhorse's own code or its request handling paths: CVE-2025-9222 (stored XSS via Markdown placeholders, CVSS 8.7[^c4]), CVE-2026-0958 (DoS via JSON validation middleware bypass, CVSS 7.5[^c6]), CVE-2026-1182 (confidential issue title disclosure, CVSS 4.3), CVE-2026-1458 (DoS via malicious file upload resource exhaustion[^c5]), and CVE-2026-5173 (WebSocket server-side method invocation via Workhorse's WebSocket handling, CVSS 8.5[^c11]). An additional EE-only vulnerability, CVE-2026-1184 (DoS via deserialization in file upload), is a Rails-layer issue shipped in the same distribution package rather than Workhorse code.
Workhorse is also affected by security vulnerabilities in its Go runtime and standard library dependencies, which are inherited at compile time. In May 2026, Go 1.26.3 and 1.25.10 fixed CVE-2026-39825, a ReverseProxy query parameter smuggling vulnerability that directly affects Workhorse's proxy functionality, along with CVE-2026-39826 (html/template XSS) and CVE-2026-33814 (HTTP/2 SETTINGS infinite loop)[^c13]. Later in May 2026, 13 vulnerabilities were disclosed in golang.org/x/crypto affecting SSH, AES-GCM, and certificate verification packages, including CVE-2026-46597 (AES-GCM packet decoder panic)[^c17]. In June 2026, golang.org/x/image fixed CVE-2026-46601 (WebP decoder panic)[^c14] and CVE-2026-46602 (TIFF unbounded memory consumption)[^c15], both reachable through Workhorse's image processing pipeline. In July 2026, Go 1.26.5 and 1.25.12 fixed CVE-2026-42505, a TLS Encrypted Client Hello privacy leak affecting the Go runtime embedded in Workhorse container images[^c16]. A further Go standard-library flaw, GO-2026-4970, affected Chainguard's gitlab-workhorse-ce-18.9 container image: on Unix systems, opening a file in an os.Root could improperly follow a symlink out of the root when the final path component was a symbolic link and the path ended in a forward slash; the issue was fixed in image version 18.9.8-r5[^c18].
The April 2026 security release (versions 18.8.9, 18.9.5, 18.10.3) fixed the WebSocket vulnerability and two critical unauthenticated DoS flaws. The June 24, 2026 patch release (versions 19.1.1, 19.0.3, 18.11.6) addressed 13 CVEs[^c9][^c10], none of which reference Workhorse directly, continuing a trend of Workhorse stability. The May 2026 security release (versions 18.11.3, 18.10.6, 18.9.7) fixed 25 CVEs, including CVE-2026-1184 (a deserialization DoS in GitLab EE, not Workhorse-specific code)[^c3]. The July 8, 2026 patch release (versions 19.1.2, 19.0.4, 18.11.7) fixed eight CVEs including CVE-2026-6896 (XSS in vulnerability evidence table renderer, CVSS 8.7) and CVE-2026-8472 (missing authorization in work items)[^c12].