CVE-2020-8169: Partial password leak over DNS on HTTP redirect
What the report claims
Partial password leak over DNS on HTTP redirect
Compare with curl's recorded outcome
Known vulnerability
A real vulnerability: CVE-2020-8169 Partial password leak over DNS on HTTP redirect
Shown for comparison after analysis. The pipeline did not see this label.
ProveIt's finding
The available evidence does not settle the report. A maintainer should investigate.
Why this finding?
- The provided curl source code snippet (include/curl/curl.h:695-715) does not contain the HTTP redirect handling logic, credential management, or DNS resolution code that would confirm or contradict the claims.
- The deterministic checks report 'grounded' but the deciding code is not included in the provided source excerpt.
- The report describes a plausible and well-documented issue (CVE-2020-8169) with concrete reproduction steps, but verification requires examining the redirect handling code (likely in lib/http.c or similar) which is not provided.
What still needs checking
- Source code for HTTP redirect handling (301/302 processing with relative Location headers)
- Code that constructs the new URL for redirected requests including credential embedding
- DNS resolution code path that sends the hostname to the resolver
How this analysis ran 5 claims · 0 citations verified
Checked against curl master on 2020-05-15 (8df455479f88). Dev evaluation split. Citation verification checks that a referenced line was in the evidence; it does not prove the model interpreted it correctly.
Review a draft reply to the reporter
Edit and verify before sending.
Thank you for the detailed report with reproduction steps. The provided code excerpt does not include the HTTP redirect handling logic needed to verify the claims. Could you point to the specific source files/functions (e.g., in lib/http.c) where relative redirects are processed and the new URL with credentials is constructed? This will allow us to confirm the fix.
Inspect all claims and source code 5 claims · 1 code excerpts
Report claims
curl leaks part of user credentials in the plain text DNS request when a server redirects with a relative path (e.g., Location: /login)
Read the reasoning
The provided source code (include/curl/curl.h lines 695-715) only shows proxy type enums and does not contain the HTTP redirect handling logic (CURLX301/CURLX302) or credential structures. The code that constructs the redirected URL and triggers DNS resolution is not in the provided excerpt.
Location header with relative path triggers the leak
Read the reasoning
The redirect processing code that parses the Location header and handles relative vs absolute paths is not present in the provided source snippet.
Server sends a 301 or 302 response with a relative URL in the Location header
Read the reasoning
The server response handling for 301/302 status codes with relative Location headers is not shown in the provided code.
User credentials (including password) are sent in plain text to the DNS server, allowing remote capture
Read the reasoning
The DNS resolution code path that would send the constructed hostname (including embedded credentials) to the DNS server is not in the provided source.
Run curl with -u username:password against a URL that returns a relative redirect, then observe DNS query containing the password
Read the reasoning
The reproduction steps reference curl versions 7.62-7.70 but the provided source code excerpt does not include the relevant redirect/credential handling functions to verify the code path.
What the report says about other projects
not addressed The DNS request includes the full user:password string as part of the hostname query
Read the original report (excerpt)
Source code
| 695 | typedef CURLcode (*curl_ssl_ctx_callback)(CURL *curl, /* easy handle */ |
| 696 | void *ssl_ctx, /* actually an OpenSSL |
| 697 | or WolfSSL SSL_CTX, |
| 698 | or an mbedTLS |
| 699 | mbedtls_ssl_config */ |
| 700 | void *userptr); |
| 701 | |
| 702 | typedef enum { |
| 703 | CURLPROXY_HTTP = 0, /* added in 7.10, new in 7.19.4 default is to use |
| 704 | CONNECT HTTP/1.1 */ |
| 705 | CURLPROXY_HTTP_1_0 = 1, /* added in 7.19.4, force to use CONNECT |
| 706 | HTTP/1.0 */ |
| 707 | CURLPROXY_HTTPS = 2, /* added in 7.52.0 */ |
| 708 | CURLPROXY_SOCKS4 = 4, /* support added in 7.15.2, enum existed already |
| 709 | in 7.10 */ |
| 710 | CURLPROXY_SOCKS5 = 5, /* added in 7.10 */ |
| 711 | CURLPROXY_SOCKS4A = 6, /* added in 7.18.0 */ |
| 712 | CURLPROXY_SOCKS5_HOSTNAME = 7 /* Use the SOCKS5 protocol but pass along the |
| 713 | host name rather than the IP address. added |
| 714 | in 7.18.0 */ |
| 715 | } curl_proxytype; /* this enum was added in 7.10 */ |