{"id":32396,"date":"2025-12-21T16:43:24","date_gmt":"2025-12-21T16:43:24","guid":{"rendered":"http:\/\/localhost\/?p=32396"},"modified":"2025-12-21T16:43:24","modified_gmt":"2025-12-21T16:43:24","slug":"curl-functional-regression-in-digest-authentication-failure-to-handle-optional-spaces-and-escaped-qu","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=32396","title":{"rendered":"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-21T22:25:47&#8243;,&#8221;description&#8221;:&#8221;Summary\\nA recent migration of the Digest authentication parsing logic to the curlx_str (strparse) API introduced two functional parsing regressions in lib\/vauth\/digest.c.\\n1. Optional Whitespace (OWS) Handling\\nThe current implementation fails to skip optional whitespace after comma delimiters in WWW-Authenticate headers.\\nFor example, in a challenge such as:\\nWWW-Authenticate: Digest realm=\\&#8221;test\\&#8221;, nonce=\\&#8221;abc\\&#8221;\\nthe parser incorrectly includes the leading space in the subsequent attribute name (e.g., \\&#8221; nonce\\&#8221;), causing key lookups to fail.\\n\\n2. Escaped Quote Handling\\nThe curlx_str_quotedword() helper used to parse quoted attribute values does not correctly handle escaped characters (e.g., \\\\\\&#8221;).\\nAs a result, attribute values such as realm=\\&#8221;My \\\\\\&#8221;Cool\\\\\\&#8221; Realm\\&#8221; are truncated or fail to parse entirely. This behavior differs from the previous manual parsing implementation, which handled escaped quotes correctly.\\n\\nAn AI assistant was used only for code navigation and understanding control flow. The issue was identified and verified manually.\\n\\nAffected Version\\n\u2022\\tcurl: 8.18.0-DEV (latest master branch)\\n\u2022\\tPlatform: All (platform independent)\\n\\nSteps To Reproduce\\n1.\\tSet up a server or local listener that returns the following Digest challenge (note the space after the comma):\\nWWW-Authenticate: Digest realm=\\&#8221;test\\&#8221;, nonce=\\&#8221;xyz\\&#8221;\\n2.\\tRun : curl &#8211;digest -u user:pass http:\/\/localhost:8080\/\\n3.\\tObserve that curl fails to correctly parse the nonce and other parameters, resulting in an authentication failure (401 loop or error).\\n4.\\tRepeat with an escaped quote inside an attribute value:\\nWWW-Authenticate: Digest realm=\\&#8221;My \\\\\\&#8221;Cool\\\\\\&#8221; Realm\\&#8221;, nonce=\\&#8221;xyz\\&#8221;\\n5.\\tObserve that curl truncates the realm value or fails to parse the challenge entirely.\\n6.\\tSupporting Material \/ References\\nPoC Output (Python implementation):\\n-   Testing challenge 1: nonce=\\&#8221;abc\\&#8221;,realm=\\&#8221;def\\&#8221;\\nFound realm: def\\n-\\tTesting challenge 2 (with space after comma): nonce=\\&#8221;abc\\&#8221;, realm=\\&#8221;def\\&#8221;\\nFAILED to find realm (BUG CONFIRMED: whitespace issue)\\n-\\tTesting challenge 3 (with escaped quote): nonce=\\&#8221;foo\\\\\\&#8221;bar\\&#8221;,realm=\\&#8221;def\\&#8221;\\nFAILED to find realm (BUG CONFIRMED: escape issue)\\n\\nRelevant Code (lib\/vauth\/digest.c)\\nstatic bool auth_digest_get_key_value(const char *chlg, const char *key,\\n                                      char *buf, size_t buflen)\\n{\\n    do {\\n        struct Curl_str data;\\n        struct Curl_str name;\\n\\n        if(!curlx_str_until(\\u0026chlg, \\u0026name, 64, &#8216;=&#8217;) \\u0026\\u0026\\n           !curlx_str_single(\\u0026chlg, &#8216;=&#8217;)) {\\n\\n            int rc = curlx_str_quotedword(\\u0026chlg, \\u0026data, 256);\\n            \/* &#8230; *\/\\n\\n            if(curlx_str_cmp(\\u0026name, key)) {\\n                \/* Fails when name contains leading whitespace *\/\\n                \/* &#8230; *\/\\n            }\\n\\n            if(curlx_str_single(\\u0026chlg, &#8216;,&#8217;)) {\\n                return false; \/* OWS after comma is not skipped *\/\\n            }\\n        }\\n        else\\n            break;\\n    } while(1);\\n\\n    return false;\\n}\\n\\n## Impact\\n\\nSecurity Impact\\nThis parsing regression allows a malicious or compromised server to deliberately craft RFC-compliant WWW-Authenticate headers that cause curl clients to silently fail Digest authentication.\\nIn security-sensitive environments (API clients, automation, CI\/CD, package managers), this can be abused to:\\n- Trigger repeated authentication failures (DoS-style degradation)\\n- Force fallback to weaker authentication mechanisms (e.g., Basic auth, or unauthenticated requests depending on configuration)\\n- Break integrity assumptions in automated systems that rely on Digest authentication for request validation\\n\\nBecause the headers are RFC-compliant, clients cannot distinguish between legitimate and malicious challenges, making this a protocol-level attack surface rather than simple server misconfiguration.&#8221;,&#8221;published&#8221;:&#8221;2025-12-20T11:55:02&#8243;,&#8221;modified&#8221;:&#8221;2025-12-21T21:44:32&#8243;,&#8221;type&#8221;:&#8221;hackerone&#8221;,&#8221;title&#8221;:&#8221;curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;H1:3473384&#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\/3473384&#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;2025-12-21T22:25:47&#8243;,&#8221;description&#8221;:&#8221;Summary\\nA recent migration of the Digest authentication parsing logic to the curlx_str (strparse) API introduced two functional parsing regressions in lib\/vauth\/digest.c.\\n1. Optional Whitespace (OWS) Handling\\nThe&#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-32396","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: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384 - 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=32396\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-21T22:25:47&#8243;,&#8221;description&#8221;:&#8221;SummarynA recent migration of the Digest authentication parsing logic to the curlx_str (strparse) API introduced two functional parsing regressions in lib\/vauth\/digest.c.n1. Optional Whitespace (OWS) HandlingnThe...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=32396\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-21T16:43:24+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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32396#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32396\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384\",\"datePublished\":\"2025-12-21T16:43:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32396\"},\"wordCount\":660,\"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=32396#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32396\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32396\",\"name\":\"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-21T16:43:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32396#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=32396\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=32396#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384\"}]},{\"@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: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384 - 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=32396","og_locale":"en_US","og_type":"article","og_title":"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-21T22:25:47&#8243;,&#8221;description&#8221;:&#8221;SummarynA recent migration of the Digest authentication parsing logic to the curlx_str (strparse) API introduced two functional parsing regressions in lib\/vauth\/digest.c.n1. Optional Whitespace (OWS) HandlingnThe...","og_url":"https:\/\/zero.redgem.net\/?p=32396","og_site_name":"zero redgem","article_published_time":"2025-12-21T16:43:24+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=32396#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=32396"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384","datePublished":"2025-12-21T16:43:24+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=32396"},"wordCount":660,"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=32396#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=32396","url":"https:\/\/zero.redgem.net\/?p=32396","name":"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-21T16:43:24+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=32396#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=32396"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=32396#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"curl: Functional Regression in Digest Authentication: Failure to handle optional spaces and escaped quotes_H1:3473384"}]},{"@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\/32396","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=32396"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/32396\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=32396"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=32396"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=32396"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}