{"id":23672,"date":"2025-10-28T02:47:32","date_gmt":"2025-10-28T02:47:32","guid":{"rendered":"http:\/\/localhost\/?p=23672"},"modified":"2025-10-28T02:47:32","modified_gmt":"2025-10-28T02:47:32","slug":"curl-curls-persistence-files-inherit-world-readablewritable-perms-from-umask-leaking-and-tampering-w","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=23672","title":{"rendered":"curl: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761"},"content":{"rendered":"<p>{&#8220;lastseen&#8221;:&#8221;2025-10-28T07:25:47&#8243;,&#8221;description&#8221;:&#8221;## Executive Summary\\n`Curl_fopen()` clones the permissions of any pre-existing persistence file when creating its temporary file. When the persistence file does not exist, it first creates one with the process umask (typically `022`, i.e., `0644`). That mode is then copied to the temp file via `0600` | `sb.st_mode`, so the final cookie\/HSTS\/Alt-Svc store ends up group\/other-readable even though it contains bearer tokens. (`lib\/curl_fopen.c:101-150`)\\n\\nAll stateful persistence features that rely on `Curl_fopen()`\u2014`cookie_output()`, `Curl_hsts_save()`, and `Curl_altsvc_save()`\u2014inherit this behavior, leaking session cookies, HSTS cache entries, and Alt-Svc metadata to any local user.\\n\\n## Steps To Reproduce\\nEnvironment: `macOS 26.1 Dev Beta 4`, `commit a49e4e3d16991465144558f405b2d7972824abb0`, built with `.\/configure &#8211;disable-shared &#8211;with-openssl=\/opt\/homebrew\/opt\/openssl@3 &#8211;without-libpsl \\u0026\\u0026 make -j8`.\\n\\n1. Ensure no leftover file and simulate a normal multi-user umask:\\n&#8220;`\\nrm -f \/tmp\/cookie-leak.txt \\u0026\\u0026 umask 022 \\\\\\n\\u0026\\u0026 .\/src\/curl -s -o \/dev\/null -c \/tmp\/cookie-leak.txt https:\/\/example.org \\\\\\n\\u0026\\u0026 ls -l \/tmp\/cookie-leak.txt\\n.rw-r&#8211;r&#8211; 131 geeknik 26 Oct 22:22 \/tmp\/cookie-leak.txt\\n&#8220;`\\n{F4935751}\\nThe cookie jar is created even though no cookies were set, which is enough to demonstrate the default mode of `0644`.\\n\\n2. As another local user simply `cat \/tmp\/cookie-leak.txt`,  read the file contents\u2014full session cookies would be exposed in real traffic. The same reproduction works for `&#8211;hsts` and `&#8211;alt-svc` files because they call `Curl_fopen()` with identical code paths.\\n\\nAdditionally, we were able to reproduce this behavior on Fedora with `curl 8.6.0` (x86_64-redhat-linux-gnu).\\n\\n## CVSS v3.0\\nAV:L\/AC:L\/PR:L\/UI:N\/S:U\/C:H\/I:N\/A:N \\n\\n## Suggested Fix\\nReplace [lines 140-141](https:\/\/github.com\/curl\/curl\/blob\/a49e4e3d16991465144558f405b2d7972824abb0\/lib\/curl_fopen.c#L140) with:\\n&#8220;`c\\n  fd = curlx_open(tempstore, O_WRONLY | O_CREAT | O_EXCL, 0600);\\n&#8220;`\\n\\n## Impact\\n\\nAny local user on the same host (shared CI runners, university shells, managed desktops, etc.) can read authentication cookies, session tokens, CSRF nonces, HSTS preload data, or Alt-Svc targets written by another user\u2019s curl\/libcurl client. Immediate consequences range from full account takeover (cookie replay) to bypassing HSTS (by rewriting the file before the victim reads it) and intelligence gathering on internal endpoints listed in Alt-Svc caches. Because the files are written automatically whenever `CURLOPT_COOKIEJAR`, `CURLOPT_HSTSWRITEFUNCTION`, or `CURLOPT_ALTSVC` are used, even well-configured automation unintentionally leaks secrets to co-resident users.&#8221;,&#8221;published&#8221;:&#8221;2025-10-27T04:09:34&#8243;,&#8221;modified&#8221;:&#8221;2025-10-28T07:09:05&#8243;,&#8221;type&#8221;:&#8221;hackerone&#8221;,&#8221;title&#8221;:&#8221;curl: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches&#8221;,&#8221;source&#8221;:&#8221;&#8221;,&#8221;references&#8221;:&#8221;&#8221;,&#8221;id&#8221;:&#8221;H1:3400761&#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\/3400761&#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-28T07:25:47&#8243;,&#8221;description&#8221;:&#8221;## Executive Summary\\n`Curl_fopen()` clones the permissions of any pre-existing persistence file when creating its temporary file. When the persistence file does not exist, it first&#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-23672","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: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761 - 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=23672\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"curl: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761 - zero redgem\" \/>\n<meta property=\"og:description\" content=\"{&#8220;lastseen&#8221;:&#8221;2025-10-28T07:25:47&#8243;,&#8221;description&#8221;:&#8221;## Executive Summaryn`Curl_fopen()` clones the permissions of any pre-existing persistence file when creating its temporary file. When the persistence file does not exist, it first...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=23672\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T02:47:32+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=23672#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23672\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"curl: curl\u2019s persistence files inherit world-readable\\\/writable perms from umask, leaking and tampering with cookies\\\/HSTS\\\/Alt-Svc caches_H1:3400761\",\"datePublished\":\"2025-10-28T02:47:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23672\"},\"wordCount\":554,\"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=23672#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23672\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23672\",\"name\":\"curl: curl\u2019s persistence files inherit world-readable\\\/writable perms from umask, leaking and tampering with cookies\\\/HSTS\\\/Alt-Svc caches_H1:3400761 - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-10-28T02:47:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23672#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=23672\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=23672#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"curl: curl\u2019s persistence files inherit world-readable\\\/writable perms from umask, leaking and tampering with cookies\\\/HSTS\\\/Alt-Svc caches_H1:3400761\"}]},{\"@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: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761 - 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=23672","og_locale":"en_US","og_type":"article","og_title":"curl: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761 - zero redgem","og_description":"{&#8220;lastseen&#8221;:&#8221;2025-10-28T07:25:47&#8243;,&#8221;description&#8221;:&#8221;## Executive Summaryn`Curl_fopen()` clones the permissions of any pre-existing persistence file when creating its temporary file. When the persistence file does not exist, it first...","og_url":"https:\/\/zero.redgem.net\/?p=23672","og_site_name":"zero redgem","article_published_time":"2025-10-28T02:47:32+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=23672#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=23672"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"curl: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761","datePublished":"2025-10-28T02:47:32+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=23672"},"wordCount":554,"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=23672#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=23672","url":"https:\/\/zero.redgem.net\/?p=23672","name":"curl: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761 - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-10-28T02:47:32+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=23672#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=23672"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=23672#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"curl: curl\u2019s persistence files inherit world-readable\/writable perms from umask, leaking and tampering with cookies\/HSTS\/Alt-Svc caches_H1:3400761"}]},{"@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\/23672","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=23672"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/23672\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=23672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=23672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=23672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}