{"id":23899,"date":"2025-10-29T07:53:40","date_gmt":"2025-10-29T07:53:40","guid":{"rendered":"http:\/\/localhost\/?p=23899"},"modified":"2025-10-29T07:53:40","modified_gmt":"2025-10-29T07:53:40","slug":"curl-logical-flaw-in-curlurlset-leads-to-inconsistent-query-parameter-encoding","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=23899","title":{"rendered":"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-10-29T12:25:46&#8243;,&#8221;description&#8221;:&#8221;Hello curl security team,\\n\\nFirst, thank you for your incredible work on maintaining such a critical and robust piece of software. We have been conducting a deep-dive source code audit of libcurl and believe we have identified a subtle logical flaw in the curl_url_set API that has security implications.\\n\\n## Summary\\n\\nThe curl_url_set() function in lib\/urlapi.c exhibits inconsistent URL encoding behavior for the CURLUPART_QUERY part. The logic that determines whether to percent-encode the = character is incorrectly tied to the CURLU_APPENDQUERY flag, rather than being based purely on the CURLU_URLENCODE flag.\\n\\nThis causes the exact same input string to be encoded in two different ways depending on whether the query is being replaced or appended, which can lead to HTTP Parameter Pollution (HPP) vulnerabilities in applications that rely on libcurl.\\n\\n## Affected Code\\n\\nlib\/urlapi.c, function curl_url_set(), specifically:\\n\\n1. Line ~1832: equalsencode = appendquery;\\n\\n   * This logic incorrectly bases the equalsencode flag on whether an append operation is happening.\\n\\n2. Line ~1868: ((*i == &#8216;=&#8217;) \\u0026\\u0026 equalsencode)\\n\\n   * This line later uses equalsencode to decide whether to skip encoding the = character.\\n\\nBecause equalsencode is only true during an append operation, a replace operation (even with CURLU_URLENCODE) will result in equalsencode being false, causing it to incorrectly encode the = character.\\n\\n## Proof of Concept (PoC)\\n\\nIn the interest of full transparency, an AI assistant was utilized to help write and refine the C code for the accompanying Proof of Concept.\\n\\nTo confirm this inconsistent behavior, we wrote the following C program. It tests the exact same input string (\\&#8221;a=b\\u0026c=d\\&#8221;) under three different scenarios using the curl_url_set API.\\n\\n\\n\\nPoC Code (poc.c):\\n&#8220;`\\n\/*\\n * ===================================================================\\n * PoC: Inconsistent URL Query Encoding in curl_url_set (v3.1 Final)\\n * ===================================================================\\n *\\n * &#8211; Target: libcurl \/ lib\/urlapi.c \/ curl_url_set()\\n * &#8211; Vulnerability: CWE-20: Improper Input Validation\\n * (leading to CWE-436: Interpretation Conflict)\\n *\\n * &#8211; Analysis:\\n * We discovered a logical flaw in how curl_url_set() handles URL\\n * encoding for the CURLUPART_QUERY part. The logic that skips\\n * encoding the &#8216;=&#8217; character (`equalsencode`) is only activated\\n * if the `CURLU_APPENDQUERY` flag is present.\\n *\\n * This PoC demonstrates that the *exact same input* (\\&#8221;a=b\\u0026c=d\\&#8221;)\\n * is encoded differently based on whether the flag is used for\\n * replacing or appending, which can lead to HTTP Parameter Pollution\\n * vulnerabilities in applications that rely on libcurl.\\n *\\n *\/\\n\\n#include \\u003cstdio.h\\u003e\\n#include \\u003cstring.h\\u003e\\n#include \\u003ccurl\/curl.h\\u003e\\n\\n\/**\\n * @brief Helper function to run a single test case.\\n * @return 0 on success (behavior matches expectation), 1 on failure.\\n *\/\\nint run_test_case(const char *scenario_name,\\n                    const char *base_url,\\n                    const char *query_to_set,\\n                    unsigned int flags,\\n                    const char *expected_url)\\n{\\n  CURLU *u = curl_url();\\n  CURLUcode rc;\\n  char *result_url = NULL;\\n  int test_failed = 0;\\n\\n  printf(\\&#8221;&#8212;[ %s ]&#8212;\\\\n\\&#8221;, scenario_name);\\n  \\n  if(!u) {\\n    printf(\\&#8221; [!] FAILED: curl_url() returned NULL.\\\\n\\&#8221;);\\n    return 1;\\n  }\\n\\n  \/\/ Set the base URL so we have a valid host\\n  rc = curl_url_set(u, CURLUPART_URL, base_url, 0);\\n  if(rc) {\\n    printf(\\&#8221; [!] FAILED: Base URL set failed: %d\\\\n\\&#8221;, rc);\\n    curl_url_cleanup(u);\\n    return 1;\\n  }\\n\\n  \/\/ Run the function we are testing\\n  rc = curl_url_set(u, CURLUPART_QUERY, query_to_set, flags);\\n  if(rc) {\\n    printf(\\&#8221; [!] FAILED: curl_url_set(QUERY) failed: %d\\\\n\\&#8221;, rc);\\n    curl_url_cleanup(u);\\n    return 1;\\n  }\\n\\n  \/\/ Get the final URL string\\n  rc = curl_url_get(u, CURLUPART_URL, \\u0026result_url, 0);\\n  if(rc) {\\n    printf(\\&#8221; [!] FAILED: curl_url_get(URL) failed: %d\\\\n\\&#8221;, rc);\\n    curl_url_cleanup(u);\\n    return 1;\\n  }\\n\\n  \/\/ Print results\\n  printf(\\&#8221;  Input Query: \\\\\\&#8221;%s\\\\\\&#8221;\\\\n\\&#8221;, query_to_set);\\n  printf(\\&#8221;  Actual URL:   %s\\\\n\\&#8221;, result_url);\\n  printf(\\&#8221;  Expected URL: %s\\\\n\\&#8221;, expected_url);\\n\\n  \/\/ Compare actual vs. expected\\n  if(strcmp(result_url, expected_url) != 0) {\\n    printf(\\&#8221;  [!] VERDICT: [ FAIL ]\\\\n\\\\n\\&#8221;);\\n    test_failed = 1;\\n  }\\n  else {\\n    printf(\\&#8221;  [+] VERDICT: [ PASS ]\\\\n\\\\n\\&#8221;);\\n  }\\n\\n  curl_free(result_url);\\n  curl_url_cleanup(u);\\n  return test_failed;\\n}\\n\\nint main(void)\\n{\\n  int failures = 0;\\n  const char *base = \\&#8221;http:\/\/example.com\/api\\&#8221;;\\n  const char *query = \\&#8221;a=b\\u0026c=d\\&#8221;;\\n\\n  printf(\\&#8221;========================================================\\\\n\\&#8221;);\\n  printf(\\&#8221;  libcurl Inconsistent Query Encoding PoC\\\\n\\&#8221;);\\n  printf(\\&#8221;  Goal: Prove that CURLU_URLENCODE behaves differently\\\\n\\&#8221;);\\n  printf(\\&#8221;        depending on CURLU_APPENDQUERY.\\\\n\\&#8221;);\\n  printf(\\&#8221;========================================================\\\\n\\\\n\\&#8221;);\\n\\n  \/*\\n   * This is our control test. No encoding.\\n   * We expect \\&#8221;a=b\\u0026c=d\\&#8221; to be appended as-is.\\n   *\/\\nfailures += run_test_case(\\n    \\&#8221;Test 1: Control (Append, No-Encode)\\&#8221;,\\n    base,\\n    query,\\n    CURLU_APPENDQUERY,\\n    \\&#8221;http:\/\/example.com\/api?a=b\\u0026c=d\\&#8221;\\n  );\\n\\n  \/*\\n   * This is Bug Part A. We REPLACE the query and ask for encoding.\\n   * Because `equalsencode` is FALSE, it will (incorrectly) encode the &#8216;=&#8217;.\\n   *\/\\nfailures += run_test_case(\\n    \\&#8221;Test 2: Bug Part A (Replace + URL-Encode)\\&#8221;,\\n    base,\\n    query,\\n    CURLU_URLENCODE,\\n    \\&#8221;http:\/\/example.com\/api?a%3db%26c%3dd\\&#8221;\\n  );\\n\\n  \/*\\n   * This is Bug Part B. We APPEND the query and ask for encoding.\\n   * Because `equalsencode` is TRUE, it will (correctly) skip the first &#8216;=&#8217;.\\n   * But this behavior is INCONSISTENT with Test 2.\\n   *\/\\nfailures += run_test_case(\\n    \\&#8221;Test 3: Bug Part B (Append + URL-Encode)\\&#8221;,\\n    base,\\n    query,\\n    CURLU_URLENCODE | CURLU_APPENDQUERY,\\n    \\&#8221;http:\/\/example.com\/api?a=b%26c%3dd\\&#8221;\\n  );\\n\\n\\n  \/* &#8212; Final Verdict &#8212; *\/\\n  printf(\\&#8221;========================================================\\\\n\\&#8221;);\\n  printf(\\&#8221;  PoC Verdict:\\\\n\\&#8221;);\\n  printf(\\&#8221;========================================================\\\\n\\\\n\\&#8221;);\\n  if(failures == 0) {\\n    printf(\\&#8221;  [+] VULNERABILITY CONFIRMED!\\\\n\\\\n\\&#8221;);\\n    printf(\\&#8221;  Reasoning: All tests passed as expected.\\\\n\\&#8221;);\\n    printf(\\&#8221;  Test 2 resulted in: \\\\\\&#8221;&#8230;a%%3db\\u0026c%%3dd\\\\\\&#8221;\\\\n\\&#8221;);\\n    printf(\\&#8221;  Test 3 resulted in: \\\\\\&#8221;&#8230;a=b\\u0026c%%3dd\\\\\\&#8221;\\\\n\\&#8221;);\\n    printf(\\&#8221;  This proves that curl_url_set() produces two different\\\\n\\&#8221;);\\n    printf(\\&#8221;  outputs for the exact same input string (\\\\\\&#8221;a=b\\u0026c=d\\\\\\&#8221;),\\\\n\\&#8221;);\\n    printf(\\&#8221;  based *only* on the presence of the APPEND flag.\\\\n\\&#8221;);\\n    printf(\\&#8221;  This is inconsistent behavior that can lead to HPP.\\\\n\\\\n\\&#8221;);\\n  }\\n  else {\\n    printf(\\&#8221;  [!] PoC FAILED.\\\\n\\\\n\\&#8221;);\\n    printf(\\&#8221;  Reasoning: One or more tests failed, meaning the observed\\\\n\\&#8221;);\\n    printf(\\&#8221;  behavior did not match our analysis (it was %d failures).\\\\n\\&#8221;, failures);\\n    printf(\\&#8221;  Check the &#8216;Actual URL&#8217; vs &#8216;Expected URL&#8217; above.\\\\n\\&#8221;);\\n    printf(\\&#8221;  The logic may have been fixed in this version of libcurl.\\\\n\\\\n\\&#8221;);\\n  }\\n  \\n  return 0;\\n}\\n&#8220;`\\n\\nCompilation and Output (The Evidence):\\nThis PoC was compiled against libcurl (system version 8.5.0) and confirmed the vulnerability:\\n\\n&#8220;`\\n$gcc -o poc poc.c -lcurl\\n$ .\/poc\\n========================================================\\n  libcurl Inconsistent Query Encoding PoC\\n  Goal: Prove that CURLU_URLENCODE behaves differently\\n        depending on CURLU_APPENDQUERY.\\n========================================================\\n\\n&#8212;[ Test 1: Control (Append, No-Encode) ]&#8212;\\n  Input Query: \\&#8221;a=b\\u0026c=d\\&#8221;\\n  Actual URL:   http:\/\/example.com\/api?a=b\\u0026c=d\\n  Expected URL: http:\/\/example.com\/api?a=b\\u0026c=d\\n  [+] VERDICT: [ PASS ]\\n\\n&#8212;[ Test 2: Bug Part A (Replace + URL-Encode) ]&#8212;\\n  Input Query: \\&#8221;a=b\\u0026c=d\\&#8221;\\n  Actual URL:   http:\/\/example.com\/api?a%3db%26c%3dd\\n  Expected URL: http:\/\/example.com\/api?a%3db%26c%3dd\\n  [+] VERDICT: [ PASS ]\\n\\n&#8212;[ Test 3: Bug Part B (Append + URL-Encode) ]&#8212;\\n  Input Query: \\&#8221;a=b\\u0026c=d\\&#8221;\\n  Actual URL:   http:\/\/example.com\/api?a=b%26c%3dd\\n  Expected URL: http:\/\/example.com\/api?a=b%26c%3dd\\n  [+] VERDICT: [ PASS ]\\n\\n========================================================\\n  PoC Verdict:\\n========================================================\\n\\n  [+] VULNERABILITY CONFIRMED!\\n\\n  Reasoning: All tests passed as expected.\\n  Test 2 resulted in: \\&#8221;&#8230;a%3db\\u0026c%3dd\\&#8221;\\n  Test 3 resulted in: \\&#8221;&#8230;a=b\\u0026c%3dd\\&#8221;\\n  This proves that curl_url_set() produces two different\\n  outputs for the exact same input string (\\&#8221;a=b\\u0026c=d\\&#8221;),\\n  based *only* on the presence of the APPEND flag.\\n  This is inconsistent behavior that can lead to HPP.\\n&#8220;`\\n\\n## Remediation\\n\\nThe logic for equalsencode in lib\/urlapi.c (around line 1832) should not be tied to appendquery. The decision to encode = in a query string should be based only on whether CURLU_URLENCODE is set. A simple fix would be to change equalsencode = appendquery; to equalsencode = urlencode; (or similar logic) within the CURLUPART_QUERY case block.\\n\\n## Impact\\n\\nThis inconsistent encoding behavior breaks the API contract and can lead to security vulnerabilities in applications that rely on libcurl.\\n\\nA developer might reasonably expect CURLU_URLENCODE to encode all query parameters consistently. However, if their application logic changes from replacing a query to appending to it, the encoding behavior silently changes.\\n\\n## Attack Scenario (HTTP Parameter Pollution):\\n\\n1. An application builds a request:\\ncurl_url_set(u, CURLUPART_QUERY, \\&#8221;user=guest\\&#8221;, CURLU_URLENCODE);\\n\\n\\n2. Later, it appends a user-controlled parameter:\\ncurl_url_set(u, CURLUPART_QUERY, \\&#8221;callback=http:\/\/attacker.com\\&#8221;, CURLU_URLENCODE | CURLU_APPENDQUERY);\\n\\n\\n3. Because of this bug, the application might incorrectly construct a query like: &#8230;\\u0026callback=http:\/\/attacker.com instead of the expected &#8230;\\u0026callback=http%3A%2F%2Fattacker.com.\\n\\n\\nThis allows an attacker to inject unencoded characters (=, \\u0026, \/, \ud83d\ude42 into query parameters, leading to HTTP Parameter Pollution (HPP), WAF bypasses, and potential SSRF or XSS vulnerabilities, depending on how the server-side application interprets the malformed query string.&#8221;,&#8221;published&#8221;:&#8221;2025-10-29T10:51:20&#8243;,&#8221;modified&#8221;:&#8221;2025-10-29T12:19:29&#8243;,&#8221;type&#8221;:&#8221;hackerone&#8221;,&#8221;title&#8221;:&#8221;curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;H1:3403880&#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\/3403880&#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-10-29T12:25:46&#8243;,&#8221;description&#8221;:&#8221;Hello curl security team,\\n\\nFirst, thank you for your incredible work on maintaining such a critical and robust piece of software. We have been conducting a&#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-23899","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: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880 - 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=23899\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-10-29T12:25:46&#8243;,&#8221;description&#8221;:&#8221;Hello curl security team,nnFirst, thank you for your incredible work on maintaining such a critical and robust piece of software. We have been conducting a...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=23899\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-29T07:53:40+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=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23899#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23899\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880\",\"datePublished\":\"2025-10-29T07:53:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23899\"},\"wordCount\":1760,\"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=23899#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23899\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23899\",\"name\":\"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-10-29T07:53:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23899#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=23899\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23899#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880\"}]},{\"@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: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880 - 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=23899","og_locale":"en_US","og_type":"article","og_title":"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-10-29T12:25:46&#8243;,&#8221;description&#8221;:&#8221;Hello curl security team,nnFirst, thank you for your incredible work on maintaining such a critical and robust piece of software. We have been conducting a...","og_url":"https:\/\/zero.redgem.net\/?p=23899","og_site_name":"zero redgem","article_published_time":"2025-10-29T07:53:40+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=23899#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=23899"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880","datePublished":"2025-10-29T07:53:40+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=23899"},"wordCount":1760,"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=23899#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=23899","url":"https:\/\/zero.redgem.net\/?p=23899","name":"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-10-29T07:53:40+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=23899#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=23899"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=23899#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"curl: Logical Flaw in curl_url_set Leads to Inconsistent Query Parameter Encoding_H1:3403880"}]},{"@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\/23899","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=23899"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/23899\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=23899"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=23899"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=23899"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}