Kerberos/SPNEGO Connection Reuse Vulnerability

Disclosed: 2026-05-14 09:32:23 By rootofpi_ramesh To curl
Unknown
Vulnerability Details
# Kerberos/SPNEGO Connection Reuse Vulnerability in curl ## Summary curl reuses HTTP connections across different users without checking Kerberos state. User B's request can inherit User A's GSS security context, allowing authentication bypass. ## Affected Versions All curl versions with Kerberos support (tested and confirmed on curl 8.5.0) ## Root Cause `ConnectionExists()` in `lib/url.c` checks NTLM state (lines 1214-1273) but has no equivalent check for `http_negotiate_state` or `proxy_negotiate_state`. When Kerberos auth completes, `conn->http_negotiate_state` advances to `GSS_AUTHSUCC` and the GSS security context remains valid. Since `hashkey()` (`lib/conncache.c:126-150`) only uses `port+hostname` (no credentials) and HTTP sets `PROTOPT_CREDSPERREQUEST` which skips credential checks, any request to the same `host:port` reuses the connection with the previous user's GSS context. ## Partial Mitigation curl has `noauthpersist` (`lib/http_negotiate.c:140-152`) that cleans up GSS context for single-roundtrip Negotiate (MIT Kerberos). However: - When `havemultiplerequests` is TRUE (multi-roundtrip auth, common with Windows AD/IIS), `noauthpersist` is FALSE and no cleanup occurs - This cleanup happens AFTER `ConnectionExists()` already matched the connection - wrong defensive layer - NTLM has protection in both layers; Negotiate has neither ## Suggested Fix Add `#if defined(USE_SPNEGO)` block to `ConnectionExists()` mirroring the NTLM pattern: - Compare credentials when Negotiate is wanted - Reject connections with active Negotiate state if new request doesn't want it - Add per-transfer Negotiate state reset (like NTLM at `url.c:3776-3792`) **Note:** For SSO (`--negotiate -u :`), usernames are empty so credential comparison won't work - might need to clear GSS context unconditionally or force separate connections. Apply to both `http_negotiate_state` and `proxy_negotiate_state`. ## Proof of Concept I've developed a complete reproduction package with real Kerberos authentication: ### Files Included: 1. **source-analysis.md** - Detailed code analysis with line numbers and exploitation flow 2. **run-exploit.sh** - Automated PoC demonstrating the vulnerability 3. **test-server.py** - GSSAPI test server that tracks GSS context per TCP connection ### Reproduction Steps: 1. Setup Kerberos KDC with test users (alice, bob) 2. Run `./run-exploit.sh` 3. Observe connection reuse and GSS context inheritance The PoC demonstrates: - Alice authenticates with `--negotiate` - Bob makes a request to the same server - Connection is reused (same TCP socket) - Server logs show: `"CONNECTION REUSED - GSS context persists for [email protected]"` ## Technical Details See attached `source-analysis.md` for: - Complete code analysis - Comparison with NTLM protection mechanism - Exploitation flow for different scenarios (single-roundtrip vs multi-roundtrip) - Root cause explanation with exact file/line references ## Attachments - `source-analysis.md` - Technical deep dive - `run-exploit.sh` - Working proof-of-concept - `test-server.py` - Test server for reproduction --- **Reported by:** Ramesh Adhikari ([email protected]) ## Impact ## Impact Corporate environments using Kerberos authentication are at high risk. Attack scenarios include: - **CI/CD pipelines** with multiple service accounts accessing the same API - **Shared web servers** where User B's request executes with User A's privileges - **Multi-tenant applications** where connection pools are shared across users
Actions
View on HackerOne
Report Stats
  • Report ID: 3725659
  • State: Closed
  • Substate: duplicate
  • Upvotes: 1
Share this report