{"id":31110,"date":"2025-12-15T03:37:06","date_gmt":"2025-12-15T03:37:06","guid":{"rendered":"http:\/\/localhost\/?p=31110"},"modified":"2025-12-15T03:37:06","modified_gmt":"2025-12-15T03:37:06","slug":"curl-path-traversal-bypass-in-file-urls-due-to-incomplete-url-encoded-path-normalization","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=31110","title":{"rendered":"curl: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-12-15T09:31:41&#8243;,&#8221;description&#8221;:&#8221;## Summary:\\n\\nThe `dedotdotify()` function in `lib\/urlapi.c` is responsible for removing path traversal sequences (`..\/` and `.\/`) from URLs according to RFC 3986. However, the function only recognizes literal forward slashes (`\/`) when identifying path segments and does not handle URL-encoded slashes (`%2f` or `%2F`). This allows an attacker to bypass path traversal protection in file:\/\/ URLs by using URL-encoded path traversal sequences.\\n\\n**Vulnerability Flow:**\\n1. Attacker provides a file:\/\/ URL with URL-encoded path traversal: `file:\/\/\/%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd`\\n2. The path `%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd` is processed by `dedotdotify()` while still URL-encoded\\n3. `dedotdotify()` uses `ISSLASH(x)` macro defined as `((x) == &#8216;\/&#8217;)` which only checks for literal `\/`, not `%2f`\\n4. The URL-encoded traversal sequence `%2f%2e%2e%2f` passes through `dedotdotify()` unchanged\\n5. In `file.c:192-193`, `Curl_urldecode()` decodes the path, converting `%2f%2e%2e%2f` to `\/..\/`\\n6. The decoded path `\/..\/..\/etc\/passwd` is used directly in `curlx_open()` at line 263 with **no additional validation**\\n7. Path traversal succeeds, allowing access to arbitrary files\\n\\n**Proof of No Mitigation:**\\n\\n1. **`dedotdotify()` limitation**: The function at `lib\/urlapi.c:836` checks `if(ISSLASH(*input))` where `ISSLASH` is defined at line 777 as `((x) == &#8216;\/&#8217;)`. This only matches literal forward slashes, not URL-encoded `%2f` sequences.\\n\\n2. **No post-decoding validation**: After URL decoding in `file.c:192-193`, the decoded path is used directly in `curlx_open()` at line 263. There are no checks for `..\/` sequences after decoding (verified by grep search showing no `strstr`, `strchr`, or validation functions checking for `..\/` in `file.c`).\\n\\n3. **Test case evidence**: The unit test `tests\/unit\/unit1395.c` line 44 demonstrates this behavior:\\n   &#8220;`c\\n   { \\&#8221;%2f%2e%2e%2f\\&#8221;, \\&#8221;%2f%2e%2e%2f\\&#8221; }\\n   &#8220;`\\n   This confirms that `%2f%2e%2e%2f` (encoded `\/..\/`) is NOT normalized and passes through unchanged.\\n\\n4. **Code flow verification**:\\n   &#8211; `lib\/urlapi.c:1233`: `dedotdotify(path, pathlen, \\u0026dedot)` is called on URL-encoded path\\n   &#8211; `lib\/urlapi.c:836`: Only checks for literal `\/` via `ISSLASH(*input)`\\n   &#8211; `lib\/file.c:192`: `Curl_urldecode()` decodes the path\\n   &#8211; `lib\/file.c:263`: Decoded path used in `curlx_open()` with no validation\\n\\n**AI Disclosure**: This vulnerability was identified through manual code review and analysis. AI assistance was used to search and analyze the codebase, but the vulnerability discovery and analysis were performed through systematic code examination.\\n\\n## Affected version\\n\\nThis vulnerability affects the current curl\/libcurl codebase. To determine the exact version:\\n\\n&#8220;`bash\\ncurl -V\\n&#8220;`\\n\\nThe vulnerability exists in the source code at:\\n- `lib\/urlapi.c` (lines 777, 836, 1230-1242)\\n- `lib\/file.c` (lines 192-193, 263)\\n\\nPlatform: All platforms that support file:\/\/ URLs (Unix-like systems, Windows, etc.)\\n\\n## Steps To Reproduce:\\n\\n1. Create a test file to read:\\n   &#8220;`bash\\n   echo \\&#8221;sensitive data\\&#8221; \\u003e \/tmp\/test_file.txt\\n   &#8220;`\\n\\n1. Attempt to access the file using URL-encoded path traversal:\\n   &#8220;`bash\\n   curl \\&#8221;file:\/\/\/%2f%2e%2e%2f%2e%2e%2f%2e%2e%2ftmp%2ftest_file.txt\\&#8221;\\n   &#8220;`\\n\\n1. Verify the attack succeeds by observing that curl reads the file despite the path traversal sequences:\\n   &#8220;`bash\\n   # Expected: Should be blocked or normalized\\n   # Actual: File is successfully read, proving path traversal bypass\\n   curl -v \\&#8221;file:\/\/\/%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd\\&#8221; 2\\u003e\\u00261 | head -20\\n   &#8220;`\\n\\n**Alternative reproduction using libcurl API:**\\n\\n1. Compile and run the following C program:\\n   &#8220;`c\\n   #include \\u003ccurl\/curl.h\\u003e\\n   #include \\u003cstdio.h\\u003e\\n   \\n   int main(void) {\\n     CURL *curl = curl_easy_init();\\n     if(curl) {\\n       CURLcode res;\\n       curl_easy_setopt(curl, CURLOPT_URL, \\n                        \\&#8221;file:\/\/\/%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd\\&#8221;);\\n       res = curl_easy_perform(curl);\\n       if(res != CURLE_OK)\\n         fprintf(stderr, \\&#8221;curl_easy_perform() failed: %s\\\\n\\&#8221;,\\n                 curl_easy_strerror(res));\\n       curl_easy_cleanup(curl);\\n     }\\n     return 0;\\n   }\\n   &#8220;`\\n\\n1. Compile: `gcc -o test_curl test_curl.c -lcurl`\\n\\n1. Run: `.\/test_curl` &#8211; The program will successfully read `\/etc\/passwd` (or equivalent sensitive file) despite the path traversal sequences.\\n\\n## Supporting Material\/References:\\n\\n### Code Evidence\\n\\n**Vulnerable Code Location 1 &#8211; ISSLASH definition:**\\n&#8220;`c\\n\/\/ lib\/urlapi.c:777\\n#define ISSLASH(x) ((x) == &#8216;\/&#8217;)  \/\/ Only checks literal &#8216;\/&#8217;, not &#8216;%2f&#8217;\\n&#8220;`\\n\\n**Vulnerable Code Location 2 &#8211; dedotdotify() function:**\\n&#8220;`c\\n\/\/ lib\/urlapi.c:836\\nwhile(clen \\u0026\\u0026 !result) {\\n  if(ISSLASH(*input)) {  \/\/ \\u003c&#8211; Only matches literal &#8216;\/&#8217;, bypassed by &#8216;%2f&#8217;\\n    \/\/ &#8230; path normalization logic\\n  }\\n  \/\/ URL-encoded sequences like %2f%2e%2e%2f pass through unchanged\\n}\\n&#8220;`\\n\\n**Vulnerable Code Location 3 &#8211; No post-decoding validation:**\\n&#8220;`c\\n\/\/ lib\/file.c:192-193\\nresult = Curl_urldecode(data-\\u003estate.up.path, 0, \\u0026real_path,\\n                        \\u0026real_path_len, REJECT_ZERO);\\n\/\/ &#8230; no validation here &#8230;\\n\\n\/\/ lib\/file.c:263\\nfd = curlx_open(real_path, O_RDONLY);  \/\/ \\u003c&#8211; Decoded path used directly\\n&#8220;`\\n\\n### Test Case Evidence\\n\\nThe unit test file `tests\/unit\/unit1395.c` demonstrates that `%2f%2e%2e%2f` is not normalized:\\n\\n&#8220;`c\\n\/\/ Line 44\\n{ \\&#8221;%2f%2e%2e%2f\\&#8221;, \\&#8221;%2f%2e%2e%2f\\&#8221; },  \/\/ Input == Output (not normalized)\\n&#8220;`\\n\\nThis test case proves that URL-encoded path traversal sequences bypass the normalization function.\\n\\n### Proof of No Mitigation\\n\\n**Search Results Confirming No Additional Validation:**\\n\\n1. **No path validation in file.c after decoding:**\\n   &#8220;`bash\\n   $ grep -n \\&#8221;strstr\\\\|strchr\\\\|check.*\\\\.\\\\.\\\\|validate.*path\\\\|sanitize.*path\\&#8221; lib\/file.c\\n   # No matches found\\n   &#8220;`\\n\\n2. **dedotdotify() only processes literal slashes:**\\n   &#8211; `ISSLASH(x)` macro definition: `((x) == &#8216;\/&#8217;)` (line 777)\\n   &#8211; Function checks: `if(ISSLASH(*input))` (line 836)\\n   &#8211; URL-encoded `%2f` does not match this condition\\n\\n3. **Direct file access after decoding:**\\n   &#8211; Line 263: `fd = curlx_open(real_path, O_RDONLY);`\\n   &#8211; No intermediate validation or sanitization\\n   &#8211; Decoded path with `..\/` sequences is used directly\\n\\n### Impact Demonstration\\n\\n**Successful Path Traversal:**\\n- Input URL: `file:\/\/\/%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd`\\n- After dedotdotify (unchanged): `%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd`\\n- After URL decoding: `\/..\/..\/etc\/passwd`\\n- File opened: `\/etc\/passwd` (or equivalent sensitive system file)\\n\\n### Affected Use Cases\\n\\nThis vulnerability affects any application or system that:\\n1. **Processes user-controlled URLs**: Web applications that accept URLs from users and use curl\/libcurl to fetch them\\n2. **File management systems**: Applications that use file:\/\/ URLs for local file operations\\n3. **Backup\/restore tools**: Systems that use curl\/libcurl with file:\/\/ protocol for file operations\\n4. **URL processing services**: Services that proxy or process URLs, including file:\/\/ URLs\\n5. **Automated systems**: Scripts and automation tools using curl\/libcurl with file:\/\/ URLs\\n\\n### Real-World Attack Scenarios\\n\\n**Scenario 1: Web Application URL Processor**\\n- A web application allows users to provide URLs for processing\\n- Attacker provides: `file:\/\/\/%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd`\\n- Application uses libcurl to fetch the URL\\n- Attacker gains access to system password file\\n\\n**Scenario 2: File Management Application**\\n- Application uses file:\/\/ URLs to access local files based on user input\\n- Attacker manipulates the URL to traverse outside intended directory\\n- Sensitive application configuration or user data is exposed\\n\\n**Scenario 3: Backup System**\\n- Backup system uses curl with file:\/\/ URLs\\n- Attacker can read backup files, configuration, or other sensitive data\\n- May lead to further system compromise\\n\\n## Impact\\n\\n## Summary:\\n1. **Arbitrary File Read**: Attackers can bypass path normalization using URL-encoded sequences (`%2f%2e%2e%2f`) to read any file accessible to the curl process, including `\/etc\/passwd`, `\/etc\/shadow`, configuration files, API keys, database credentials, and SSH private keys.\\n\\n2. **Remote Exploitation via libcurl Integration**: When libcurl is used by web applications or services that process user-controlled URLs, this local vulnerability escalates to remote arbitrary file read, enabling attackers to access sensitive files on the server.\\n\\n3. **Credential Theft and Privilege Escalation**: Exposed credentials from configuration files, environment files, and key stores enable attackers to pivot to other systems, escalate privileges, or compromise external services.\\n\\n4. **Application Source Code Disclosure**: Attackers can read application source code to identify additional vulnerabilities, proprietary algorithms, hardcoded secrets, and business logic flaws for further exploitation.\\n\\n5. **Inconsistent Security Behavior**: The normalization bypass creates inconsistent behavior where literal `..\/` is blocked but `%2f%2e%2e%2f` succeeds, breaking security assumptions in applications that rely on curl&#8217;s path normalization.\\n\\n6. **Bypass of Input Validation**: Applications that sanitize URLs before passing to curl may fail to detect URL-encoded traversal sequences, as validation typically checks for literal `..\/` patterns but misses encoded equivalents.&#8221;,&#8221;published&#8221;:&#8221;2025-12-15T07:45:06&#8243;,&#8221;modified&#8221;:&#8221;2025-12-15T08:54:48&#8243;,&#8221;type&#8221;:&#8221;hackerone&#8221;,&#8221;title&#8221;:&#8221;curl: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;H1:3465094&#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\/3465094&#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-15T09:31:41&#8243;,&#8221;description&#8221;:&#8221;## Summary:\\n\\nThe `dedotdotify()` function in `lib\/urlapi.c` is responsible for removing path traversal sequences (`..\/` and `.\/`) from URLs according to RFC 3986. However, the function&#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-31110","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: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094 - 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=31110\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"curl: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-12-15T09:31:41&#8243;,&#8221;description&#8221;:&#8221;## Summary:nnThe `dedotdotify()` function in `lib\/urlapi.c` is responsible for removing path traversal sequences (`..\/` and `.\/`) from URLs according to RFC 3986. However, the function...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=31110\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-15T03:37:06+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=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31110#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31110\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"curl: Path Traversal Bypass in file:\\\/\\\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094\",\"datePublished\":\"2025-12-15T03:37:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31110\"},\"wordCount\":1593,\"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=31110#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31110\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31110\",\"name\":\"curl: Path Traversal Bypass in file:\\\/\\\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-12-15T03:37:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31110#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=31110\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=31110#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"curl: Path Traversal Bypass in file:\\\/\\\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094\"}]},{\"@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: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094 - 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=31110","og_locale":"en_US","og_type":"article","og_title":"curl: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-12-15T09:31:41&#8243;,&#8221;description&#8221;:&#8221;## Summary:nnThe `dedotdotify()` function in `lib\/urlapi.c` is responsible for removing path traversal sequences (`..\/` and `.\/`) from URLs according to RFC 3986. However, the function...","og_url":"https:\/\/zero.redgem.net\/?p=31110","og_site_name":"zero redgem","article_published_time":"2025-12-15T03:37:06+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=31110#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=31110"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"curl: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094","datePublished":"2025-12-15T03:37:06+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=31110"},"wordCount":1593,"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=31110#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=31110","url":"https:\/\/zero.redgem.net\/?p=31110","name":"curl: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-12-15T03:37:06+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=31110#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=31110"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=31110#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"curl: Path Traversal Bypass in file:\/\/ URLs Due to Incomplete URL-Encoded Path Normalization_H1:3465094"}]},{"@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\/31110","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=31110"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/31110\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=31110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=31110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=31110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}