<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>{TRAPDOOR SECURITY} - secure by default</title>
    <subtitle>Appsec &amp; Infosec - cybersecurity advisories, CTF writeups and projects.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://trapdoorsec.com/tags/secure-by-default/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://trapdoorsec.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-08-31T00:00:00+00:00</updated>
    <id>https://trapdoorsec.com/tags/secure-by-default/atom.xml</id>
    <entry xml:lang="en">
        <title>Vulnerability Spelunking #1: SSRF with Golang&#39;s url.Parse</title>
        <published>2026-08-31T00:00:00+00:00</published>
        <updated>2026-08-31T00:00:00+00:00</updated>
        
        <author>
          <name>akses</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://trapdoorsec.com/posts/vulnerability-spelunking-ep-1/"/>
        <id>https://trapdoorsec.com/posts/vulnerability-spelunking-ep-1/</id>
        
        <content type="html" xml:base="https://trapdoorsec.com/posts/vulnerability-spelunking-ep-1/">&lt;h1 id=&quot;let-s-go-on-a-ssrfing-adventure&quot;&gt;Let’s go on a SSRFing adventure&lt;/h1&gt;
&lt;p&gt;I feel that there is a great deal of knowledge locked up in the mistakes of history. Since I am interested in application security, this means I am inherently interested in the history of application security mistakes.&lt;/p&gt;
&lt;p&gt;People like Louis Nyffenegger, (who possibly coined the term &lt;a rel=&quot;external&quot; href=&quot;https://www.amazon.com/CVE-Archeologists-Field-Guide-vulnerability-ebook/dp/B0GL97C567&quot;&gt;‘CVE archaeology’&lt;/a&gt; in the first place) and &lt;a rel=&quot;external&quot; href=&quot;https://x.com/vxunderground&quot;&gt;vx-underground&lt;/a&gt; are an inspiration for those of us who like to explore these digital oddities.&lt;/p&gt;
&lt;p&gt;My intent is to show you this exploration, or ‘spelunking’ if you will. These are not my CVEs, just an analysis of other peoples. So, grab your hard hat and let’s head into the ancient CaVEs of MITRE’s back catalog of &lt;a rel=&quot;external&quot; href=&quot;https://cve.org&quot;&gt;CVEs&lt;/a&gt; and see what treasures we can find from the mistakes of yesterday, so that we are not doomed to repeat them today.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://trapdoorsec.com/posts/vulnerability-spelunking-ep-1/adventure.png&quot; alt=&quot;obligatory lord of the rings meme picture of bilbo running away from the shire&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;cave-2026-25679&quot;&gt;CaVE-2026-25679&lt;/h1&gt;
&lt;p&gt;CVE-2026-25679 itself is a parsing issue that affects a category of golang web services that I’ll demonstrate in a little while. While it is new, it has historical pedigree on account of the fact that it was a mistake made while addressing an older &lt;a rel=&quot;external&quot; href=&quot;https://github.com/advisories/GHSA-447v-2qg4-h8hc&quot;&gt;CVE&lt;/a&gt; from last year.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CVE-2026-25679 is a high-severity input validation vulnerability in the Go programming language’s standard library net/url package.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It affects the &lt;code&gt;url.Parse&lt;/code&gt; function, which fails to correctly validate the host/authority component of URLs, specifically allowing malformed IPv6 host literals and other invalid characters that should be rejected according to RFC 3986 standards. URL parsing errors in standard libraries provide bug hunters like me a target rich environment.&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ID&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://nvd.nist.gov/vuln/detail/cve-2026-25679&quot;&gt;CVE-2026-25679&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Credit goes to&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://sg.wantedly.com/users/28514192&quot;&gt;Masaki Hari&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Report&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://sg.wantedly.com/companies/wantedly/post_articles/1041394&quot;&gt;https://sg.wantedly.com/companies/wantedly/post_articles/1041394&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Weakness(es)&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://cwe.mitre.org/data/definitions/1286.html&quot;&gt;Improper Validation&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://cwe.mitre.org/data/definitions/425.html&quot;&gt;Forced Browsing&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Severity&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;severity-pill&quot; data-sev=&quot;7.5&quot;&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CVSS Vector&lt;/td&gt;&lt;td&gt;CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Vendor&lt;/td&gt;&lt;td&gt;&lt;code&gt;golang std lib&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Affected Components &amp;amp; Versions&lt;/td&gt;&lt;td&gt;&lt;code&gt;net/url&lt;/code&gt; before go1.25.8, from go1.26.0-0 before go1.26.1&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h1 id=&quot;into-the-darkness-we-go&quot;&gt;Into the darkness we go&lt;/h1&gt;
&lt;p&gt;The flaw is simple: normally, an invalid URL would fail validation checks. But in these versions of go, an invalid URL could slip through the cracks. E.g. a non-standard URL like this should fail validation &lt;code&gt;http://trapdoorsec.com[::1]/&lt;/code&gt;, but it passes. Worse, it &lt;em&gt;accepts&lt;/em&gt; the value inside the brackets!&lt;/p&gt;
&lt;p&gt;For this to make sense you need to know that URLs are made up of many components, &lt;code&gt;host&lt;/code&gt; being one of them. Consider this code that breaks a URL apart into its constituents.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;import&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;	&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;	&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;	&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;net/url&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	raw_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;https://trapdoorsec.com/login?redir=page&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;raw_url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;                             &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; nil&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;		log&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Fatal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Scheme:  &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Scheme&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Host:    &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Host&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Hostname:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Hostname&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Port:    &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Port&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Path:    &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you were to run this with &lt;code&gt;go run main.go&lt;/code&gt; it would print out the result.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Scheme:   https&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Host:     trapdoorsec.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Hostname: trapdoorsec.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Port:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Path:     /login&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are more components than this, but this is all you need to know. From the above, I trust that you can see that &lt;code&gt;url.Parse&lt;/code&gt; has several very important jobs.&lt;/p&gt;
&lt;p&gt;One of which is to find the part of the received string that corresponds with the &lt;code&gt;host&lt;/code&gt;. The function that does this is called &lt;code&gt;parseHost&lt;/code&gt; and it happens to be where this &lt;a rel=&quot;external&quot; href=&quot;https://github.com/golang/go/blob/d90b98e65320778f3b1f99a6951ab20f04d218b3/src/net/url/url.go#L549-L552&quot;&gt;vulnerability exists&lt;/a&gt;:-&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parseHost&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;scheme&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; host&lt;/span&gt;&lt;span class=&quot;z-l-3 z-l-b z-d-6 z-d-b&quot;&gt; string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-3 z-l-b z-d-6 z-d-b&quot;&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-l-b z-d-6 z-d-b&quot;&gt; error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; openBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; strings&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;LastIndex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; openBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;1&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; &amp;lt;-- vulnerability here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;		//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; Parse an IP-Literal in RFC 3986 and RFC 6874.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;		//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; E.g., &amp;quot;[fe80::1]&amp;quot;, &amp;quot;[fe80::1%25en0]&amp;quot;, &amp;quot;[fe80::1]:80&amp;quot;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;		closeBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; strings&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;LastIndex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; closeBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 0&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; errors&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;New&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;missing &amp;#39;]&amp;#39; in host&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;		//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The job of that &lt;code&gt;if&lt;/code&gt; check on the second line, is to hunt down open brackets inside of the host string. This is because, most of the time, hosts in URLs don’t have square brackets in them. If they do, it must mean it is an IPv6 address. An example of a valid IPv6 address in a URL looks like this: &lt;code&gt;https://[::1]/login?redir=home&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The comment from the contributor stated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Now, the parsing logic should strictly enforce that only IPv6 hostnames can be resolved when in square brackets.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Except that code isn’t strict enough. Go’s &lt;code&gt;strings.LastIndex&lt;/code&gt; will return the &lt;em&gt;last&lt;/em&gt; occurrence of the &lt;code&gt;[&lt;/code&gt; character. URLs with IPv6 addresses in them should only ever have a &lt;code&gt;[&lt;/code&gt; at the &lt;em&gt;beginning&lt;/em&gt; of the string. This mistake trusts that the open bracket will &lt;em&gt;always be at the beginning of the string&lt;/em&gt; but never checks that! To bring this full circle, hopefully now you can see why this validation/parsing issue is possible.&lt;/p&gt;
&lt;p&gt;The patch is also relatively straight forward, all we have to do is fail at that point&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parseHost&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span class=&quot;z-l-3 z-l-b z-d-6 z-d-b&quot;&gt; string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-3 z-l-b z-d-6 z-d-b&quot;&gt;string&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-l-b z-d-6 z-d-b&quot;&gt; error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; openBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; strings&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;LastIndex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; openBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 0&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; errors&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;New&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;invalid IP-literal&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; &amp;lt;-- fix here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; else&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; openBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 0&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;		//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; Parse an IP-Literal in RFC 3986 and RFC 6874.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;		//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; E.g., &amp;quot;[fe80::1]&amp;quot;, &amp;quot;[fe80::1%25en0]&amp;quot;, &amp;quot;[fe80::1]:80&amp;quot;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;		closeBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; strings&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;LastIndex&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;host&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; closeBracketIdx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 0&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; errors&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;New&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;missing &amp;#39;]&amp;#39; in host&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;		//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;exploitation&quot;&gt;Exploitation&lt;/h2&gt;
&lt;p&gt;I think perhaps the reason this bug didn’t get loads of attention is that its direct impact is limited to availability, despite its low attack complexity.&lt;/p&gt;
&lt;p&gt;That doesn’t mean it isn’t useful though, because one of the issues with the CVSS (the scoring system we use to rate these bugs) is that it doesn’t really deal with ‘chainability’. Arguably, this is a highly chainable primitive by which to launch other attacks from.&lt;/p&gt;
&lt;p&gt;Let’s return to our contrived example code and see what happens:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt;	//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-3 z-d-i&quot;&gt; this time pass a &amp;#39;malicious string&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	raw_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;https://trapdoorsec.com[::1]:8080/login?redir=page&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	url&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; :=&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; url&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Parse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;raw_url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;                            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; err&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-7 z-d-7&quot;&gt; nil&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;		log&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Fatal&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;err&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Scheme:  &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Scheme&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Host:    &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Host&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Hostname:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Hostname&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Port:    &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Port&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;	fmt&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Println&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;Path:    &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; parsedURL&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;Path&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;output:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Scheme:   https&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Host:     trapdoorsec.com[::1]:8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Hostname: ::1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Port:     8080&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Path:     /login&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Crazy right? The actual URL is ignored, and the hostname is the malicious IPv6 address, and the port remains intact!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Notice that Host retains the malformed authority exactly as supplied, while Hostname() interprets the destination as ::1. The apparently legitimate trapdoorsec.com portion has disappeared from Go’s interpretation of the network destination.&lt;/p&gt;
&lt;p&gt;Now consider that there are many types of systems that rely on trustworthy URL parsing;-&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Webhook delivery systems (CI/CD, Stripe-style callbacks, monitoring pings):&lt;/strong&gt; imagine an [ab]user registers &lt;code&gt;https://ci.example.com[::1]/hook&lt;/code&gt; as their webhook target&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSO/OIDC redirect &amp;amp; issuer validation:&lt;/strong&gt; an IdP that validates &lt;code&gt;redirect_uri&lt;/code&gt; by checking the parsed host will pass the check while subsequent request flows go to an attacker-chosen internal address&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;URL fetchers in security tooling:&lt;/strong&gt; VirusTotal-style scanners, image/CVE feed fetchers, package proxy validators. A “scan this URL” feature becomes an internal network mapper with a trusted origin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxy/ACL enforcement:&lt;/strong&gt; corporate egress proxies or API gateways that parse the URL to decide allow/deny by domain category.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microservice internal routing:&lt;/strong&gt; services that accept a URL from a peer and route by parsed host&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Social media style URL ‘unfurlers’:&lt;/strong&gt; these are quite common, a user makes a post with a URL in it, the backend goes and fetches cool stuff about that URL and renders it in the post.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In all instances, the victim becomes a bit like a curl puppet to the attacker, and can be misused to retrieve internal system details to further the attackers goals (cookies, tokens, internal network info). So lets pick on an example and throw it into a lab.&lt;/p&gt;
&lt;h3 id=&quot;example-url-unfurling&quot;&gt;Example: URL unfurling&lt;/h3&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;If you are already familiar with SSRF attacks, none of the following is likely to surprise you, but I encourage you to stick around to the end of the post to go over mitigations beyond ‘patch ur sh**’&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let’s imagine if you are trusting &lt;code&gt;url.Parse&lt;/code&gt; to get you the correct host, but instead, your program is fetching against the local network on all ports &lt;em&gt;as the server&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;What could we do with that? Well for this part I need you to imagine a twitter clone or other kind of social media site. Let’s call it &lt;code&gt;tripper&lt;/code&gt; for funzies. Tripper lets you chat with friends, and when you use a URL in your posts, the backend will ‘unfurl’ it.&lt;/p&gt;
&lt;p&gt;Wait up, what is &lt;em&gt;unfurling&lt;/em&gt;? You’ve probably seen this in many social media sites, where you get a little automatic embed for every link you sprinkle into your post. For example, &lt;a rel=&quot;external&quot; href=&quot;https://docs.slack.dev/messaging/unfurling-links-in-messages/&quot;&gt;slack does this&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So it is very common, and a naive approach to doing it would look something like this:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    user &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;submits message with url inside&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;|&lt;/span&gt;&lt;span&gt; tripper&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    tripper &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;validate url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;|&lt;/span&gt;&lt;span&gt; policy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;check allow list&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    policy &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; fetcher&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;preview web fetch&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fetcher &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; internet&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;external website&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    internet &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; fetcher&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fetcher &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;renders html embed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;|&lt;/span&gt;&lt;span&gt; tripper&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;Typically, once initial url validation passes, destination validation is checked to make sure this address was allowed. &lt;strong&gt;This is precisely where this sneaky little bug has benefit.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;At its heart, it is a potential for bypassing loose validation logic, similar to the way we would dodge badchars in XSS attacks.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    attacker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    attacker &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;sends&amp;lt;br/&amp;gt;http://example.com[::1]:port&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;|&lt;/span&gt;&lt;span&gt; parser&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;vulnerable url.parse&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    parser &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;parsed host becomes&amp;lt;br/&amp;gt;::1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    result &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;fetcher bypasses block list&amp;lt;br/&amp;gt;localhost:port instead of&amp;lt;br/&amp;gt;example.com&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    expected&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;expected behaviour:&amp;lt;br/&amp;gt;reject malformed authority&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    attacker &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;-.-&amp;gt;&lt;/span&gt;&lt;span&gt; expected&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So now we can see why this bug is narrow in isolation but potentially dangerous under the right conditions and so therefore still deserves a &lt;code&gt;high&lt;/code&gt; risk rating.&lt;/p&gt;
&lt;p&gt;The potential for &lt;a rel=&quot;external&quot; href=&quot;https://owasp.org/www-community/attacks/server_side_request_forgery&quot;&gt;server side request forgery&lt;/a&gt; is present here. The reason why SSRF is not mentioned in the CVE is that this is only a potential second order effect, and highly situational. That said, URL validation followed by server-side fetching is an extremely common pattern. Applications using an affected Go runtime alongside this kind of unsafe validation logic may have been vulnerable, and unpatched applications may remain so.&lt;/p&gt;
&lt;h3 id=&quot;the-lab&quot;&gt;The lab&lt;/h3&gt;
&lt;p&gt;To prove this out for real, I built a small Docker Compose network that mimics the trust boundary you’d find in any real deployment. There are exactly two services on a pinned internal subnet (&lt;code&gt;172.28.0.0/24&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;tripper&lt;/strong&gt; (&lt;code&gt;172.28.0.20&lt;/code&gt;) - our vulnerable unfurler, and the &lt;em&gt;only&lt;/em&gt; thing exposed to the outside world, bound to &lt;code&gt;127.0.0.1:8080&lt;/code&gt; on the host.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;victim&lt;/strong&gt; (&lt;code&gt;172.28.0.10&lt;/code&gt;) - a stand-in for something juicy and internal. It listens &lt;em&gt;internally&lt;/em&gt; on port 80 and dumps whatever it receives to its logs. Crucially, it has no port mapping at all: so it is invisible to our attacker. For now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The attacker (that’s us, sitting out on the “internet”) has exactly one route into this network: the unfurl endpoint. We can’t reach the victim directly, we can’t sweep the subnet from the host, and the SSRF guard string-matches the hostname precisely to keep it that way. And yet, with a single smuggled URL, the guard waves us straight through and tripper - a &lt;em&gt;trusted internal service&lt;/em&gt; - knocks on the victim’s door on our behalf. The defender’s control and the attacker’s egress are the same socket.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title: Lab topology&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    subgraph&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; Internet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        A&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;curl / ffuf&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    subgraph&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; Docker network 172&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;28&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;website&amp;lt;br/&amp;gt;int: 172.28.0.20:8080&amp;lt;br/&amp;gt;ext: vulnerable.site:8080&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        V&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;victim&amp;lt;br/&amp;gt;172.28.0.10:80&amp;lt;br/&amp;gt;no ext. comms&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;http://vulnerable.site:8080&amp;lt;br/&amp;gt;/unfurl?url=&amp;lt;br/&amp;gt;http://amazon.com[::ffff:ac1c:a]:80&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;|&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    T &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;SSRF fetch amazon.com port 80&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;|&lt;/span&gt;&lt;span&gt; V&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    V &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;-.-&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;direct access impossible&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt;|&lt;/span&gt;&lt;span&gt; V&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To demonstrate this I’ve written a contrived example of a vulnerable webservice that does server side web fetching, available as a &lt;a rel=&quot;external&quot; href=&quot;https://gist.github.com/akses0/75206bef66ae9889ac26a86a74520308&quot;&gt;gist&lt;/a&gt; it takes a url as a get param, (which is what makes it contrived - use your imagination from here), and a vulnerable network in which to test it from your host. The demo shows that basic tools can do an address sweep to find other attack-able web servers on an internal network by fuzzing for IPv6 addresses.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;As far as I could tell, IPv6 addresses would need to be written in fully hexadecimal form. For e.g. to sweep a network, you’d want a list like this…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ::ffff:ac1c:02&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ::ffff:ac1c:03&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ::ffff:ac1c:04&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ::ffff:ac1c:05&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ...and so on&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Using &lt;code&gt;ffuf&lt;/code&gt; we would take aim at a vulnerable service in the following way, noting that usual issues like encoding might get in the way of a good time:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 254&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt; awk&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;{printf &amp;quot;::ffff:ac1c:%x\n&amp;quot;, $1}&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-5&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; ips.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-1&quot;&gt;ffuf&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;http://vulnerable.site:8080/unfurl?url=http%3A%2F%2Fdummy.com%5BFUZZ%5D%3A80&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;     -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; ips.txt&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-8&quot;&gt;fr&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;deadline exceeded&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-2&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The sweep above is then just automation on top: ask tripper to unfurl the mapped-hex form for every candidate address on the subnet and watch the timing oracle light up when something answers. Two hosts exist on this network, and from outside, only one of them is supposed to be findable.&lt;/p&gt;
&lt;script src=&quot;https://asciinema.org/a/GthJhGlIL5xjUwAS.js&quot; id=&quot;asciicast-GthJhGlIL5xjUwAS&quot; async=&quot;true&quot;&gt;&lt;/script&gt;
&lt;h1 id=&quot;what-treasures-can-we-extract-from-this-spelunk&quot;&gt;What treasures can we extract from this spelunk?&lt;/h1&gt;
&lt;p&gt;Most teams kind of ‘patch and move on’ from something like this, however the real lesson is not to trust that input at all. &lt;code&gt;url.Parse&lt;/code&gt; was never meant to be a security boundary, it just tells you if the URL is valid. Besides, what if it happens again?&lt;/p&gt;
&lt;p&gt;The truth is that it is up to application logic AND network design to prevent SSRF from becoming a problem in your architecture. So here are some final thoughts on additional mitigations we have at our disposal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parse the URL once and use that same parsed representation for both validation and retrieval.&lt;/li&gt;
&lt;li&gt;Permit only the schemes they actually require, usually &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;https&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Apply destination controls consistently to IPv4, IPv6, and IPv4-mapped IPv6 addresses. This isn’t an excuse to turn off IPv6 IMO.&lt;/li&gt;
&lt;li&gt;Reject loopback, private, link-local and otherwise prohibited destinations &lt;em&gt;after&lt;/em&gt; DNS resolution.&lt;/li&gt;
&lt;li&gt;Apply the same checks to every redirect target.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforce outbound network restrictions so the fetcher cannot reach sensitive internal services even if application validation fails.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Add malformed authorities such as example.com[::1] to regression tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;until-next-time&quot;&gt;Until next time!&lt;/h2&gt;
&lt;p&gt;In summary, I hope you can see that the exploitability of a flaw like this depends heavily on the architecture around it. A finding from a dumb scanner could be meaningless noise, or genuine cause for alarm.&lt;/p&gt;
&lt;p&gt;Even LLM-assisted reachability analysis may get this wrong, because source code alone may not reveal the runtime routing, configuration and trust boundaries that determine whether the flaw is exploitable. Sometimes, confirming the real risk requires testing under the representative dynamic conditions of the production environment.&lt;/p&gt;
&lt;p&gt;Thanks for reading, I do hope you like the new theme as well :)&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>The Cost of Complacency: Why &#39;Secure by Default&#39; Isn&#39;t Just Nice to Have.</title>
        <published>2024-08-26T00:00:00+00:00</published>
        <updated>2024-08-26T00:00:00+00:00</updated>
        
        <author>
          <name>akses</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://trapdoorsec.com/posts/the-cost-of-complacency/"/>
        <id>https://trapdoorsec.com/posts/the-cost-of-complacency/</id>
        
        <content type="html" xml:base="https://trapdoorsec.com/posts/the-cost-of-complacency/">&lt;p&gt;In an era where cyber threats loom larger than ever, being a good global citizen means prioritizing not just functional
software but also security by design. &lt;em&gt;Security is an expected function.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;&quot;&gt;&lt;img src=&quot;/img/stock-lock.jpeg&quot; alt=&quot;stock image of a lock being damaged using ice&quot; /&gt;&lt;/h2&gt;
&lt;h1 id=&quot;software-isn-t-difficult-humans-are&quot;&gt;Software isn’t difficult, humans are.&lt;/h1&gt;
&lt;p&gt;You know that overused &lt;a rel=&quot;external&quot; href=&quot;https://martinfowler.com/bliki/TwoHardThings.html&quot;&gt;joke in software circles&lt;/a&gt; about there being two
hard things? Well, one of those things, ‘naming things’ I feel extends to &lt;em&gt;defining things&lt;/em&gt;, because this is where software’s
value actually lies: the interpretation and delivery of human requirements, which are notoriously difficult to pinpoint sometimes.&lt;/p&gt;
&lt;p&gt;Example time, “Make the car drive autonomously” might look like a requirement to the average person, but in fact it is more of a &lt;em&gt;desirement&lt;/em&gt;
because it doesn’t adequately express the complexities involved such that two different designs would both meet
a standard. Did you mean safely? What does that mean? Should it drive on the left or the right side of the road? Oh, it’s country
dependent? How will it know, oh, so it needs GPS. Right. What if that fails? *&lt;/p&gt;
&lt;p&gt;So we need to understand, that to a product team, saying ‘secure by default plzkthxbai’ is really just a way of being annoying and 100%
non-constructive. They &lt;em&gt;know&lt;/em&gt; it’s a good idea, just… how?&lt;/p&gt;
&lt;h1 id=&quot;why-do-we-even-care-about-secure-by-default&quot;&gt;Why do we even care about secure by default?&lt;/h1&gt;
&lt;p&gt;OK so, I’ll admit, if somebody says to me that secure by default is not a priority, I get a bit hot-blooded. It makes me want
to lean into the fact that I’m a grumpy old man and tell the war stories again.&lt;/p&gt;
&lt;p&gt;Reality is though, people clutch their pearls every time something awful happens, but nothing materially changes the status quo.&lt;/p&gt;
&lt;h2 id=&quot;the-morris-worm-incident&quot;&gt;The Morris Worm incident&lt;/h2&gt;
&lt;p&gt;In 1988, an enterprising young student named Robert created what he thought was a harmless experiment, presumably, to measure the size of
… um… the Internet. (Morris is reported to have stated that he only did it to see if it could be done.)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.vice.com/wp-content/uploads/sites/2/2017/10/1508840382333-robert-morris-primo-worm.jpeg&quot; alt=&quot;Robert Morris relaxing at his computer drinking a coke&quot; /&gt;&lt;/p&gt;
&lt;p&gt;However, his program relied on a default password and a buffer overflow vulnerability in the canonical email service of the day: &lt;code&gt;sendmail&lt;/code&gt; - a Unix program.&lt;/p&gt;
&lt;p&gt;He designed a self replication component to his program, and before he could say ‘off by one error’ he had infected around 10% of
the Internets servers at the time (approx 6000 machines), and caused millions of dollars damage in lost productivity.&lt;/p&gt;
&lt;p&gt;This moment was pretty significant, in that it hadn’t really happened on this scale before, but it also perfectly demonstrates
why having insecure defaults opens us up to one of the nastiest types of malware: the worm - a self replicating program
capable of spreading itself without user interactions.&lt;/p&gt;
&lt;h2 id=&quot;the-code-red-incident&quot;&gt;The Code Red Incident&lt;/h2&gt;
&lt;p&gt;Another example: we used to be OK with Windows Server 2003 leaving port 445 (SMB protocol) open on install. Code Red made
especially good use of this fact - some of you will remember - their cyberattack of 2001 which targeted another default
configuration in IIS (open port 80). 24 hours, 350000 servers brought to their knees, billions in lost productivity. (Moore, Shannon, Klaffy 2002)&lt;/p&gt;
&lt;p&gt;You can see where the product design decisions come from: make the Internet easy to play with! Make networking easy! Minimize the clicks
a server admin needs to take in order to ‘get online’! All laudable, money making ideas. Entirely insecure.&lt;/p&gt;
&lt;p&gt;Alas, these weren’t entirely addressed until 5 years later, in Windows Server 2008 as Microsoft now had the ‘very insecure’
label that they probably wanted to shake.&lt;/p&gt;
&lt;h2 id=&quot;fast-forward-to-2024-ipv6-has-the-same-problem&quot;&gt;Fast forward to 2024: IPv6 has the same problem&lt;/h2&gt;
&lt;p&gt;It has recently been revealed that &lt;a rel=&quot;external&quot; href=&quot;https://www.theregister.com/2024/08/14/august_patch_tuesday_ipv6/&quot;&gt;IPv6 had a vulnerability&lt;/a&gt;, causing concern among IT professionals.&lt;/p&gt;
&lt;p&gt;The reason for this is that it also is ‘wormable’. Why is that? How can a bug in an internet protocol do that, when there was
no default password?&lt;/p&gt;
&lt;p&gt;In this case, the issue is that many devices and indeed operating systems, enable IPv6 by default, &lt;em&gt;even though they don’t strictly need it&lt;/em&gt;. Combine that fact with
the remote code execution vulnerability in IPv6, and suddenly, we have a worm.&lt;/p&gt;
&lt;h2 id=&quot;conclusion-water-is-wet-and-investors-don-t-care&quot;&gt;Conclusion: Water is wet and investors don’t care.&lt;/h2&gt;
&lt;p&gt;All this did not ruin Microsoft, Unix still exists today, SMB is still a protocol that is used.
So, none of the impacts where so bad that humanity cancelled them from all relevance. This tale is repeated in the Solarwinds
breach and Crowdstrike outages of late. Go have a look at Crowdstrike share price, I dare you.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/CRWD-stock-price.png&quot; alt=&quot;CRWD stock price showing their almost immediate recovery from perhaps the biggest outage in IT history&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now look at Equifax.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/img/EFX-stock-price.png&quot; alt=&quot;EFX stock price showing their continued rise in value since a massive databreach in 2017&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It would seem that lost productivity makes for a good (bad?) news story, but as a society, I don’t think we value it as much as
journalists would have you believe. &lt;strong&gt;Surely, we move to fix things all-proper-like when people die though, right?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Right?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Stuxnet&quot;&gt;Stuxnet&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/WannaCry_ransomware_attack#Affected_organisations&quot;&gt;WannaCry&lt;/a&gt;, Ransomware in general, heck arguably, even the old &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Therac-25#Root_causes&quot;&gt;Therac-25 Radiation Therapy Machine&lt;/a&gt; of the 1980s were all situations
where human lives could have been, if not were, affected because of insecure by design or other design flaws we would consider
to be security adjacent.&lt;/p&gt;
&lt;p&gt;So no, fact is, when it all comes down to the cold hard math of making said crusts, people (not just ‘big evil companies’ I might add),
put their earning potential ahead of all else.&lt;/p&gt;
&lt;h1 id=&quot;this-is-extremely-short-sighted&quot;&gt;This is extremely short-sighted&lt;/h1&gt;
&lt;p&gt;At the moment we enjoy relatively cheap technology, maybe a few more ads than I’d like, but for those with enough means
to purchase a device, much of the software you need to make your life easier is near enough to free.&lt;/p&gt;
&lt;p&gt;The thing that does change though, is the rate at which we embed technology into the critical parts of our lives. This is a given.&lt;/p&gt;
&lt;p&gt;In order to protect lives, we are now looking at the alternative solution to businesses regulating themselves. Of course,
I mean governments doing the regulation bit. And this will make everything more expensive.&lt;/p&gt;
&lt;h1 id=&quot;where-businesses-fail-to-act-governments-step-in&quot;&gt;Where businesses fail to act, governments step in&lt;/h1&gt;
&lt;p&gt;Remember when cars didn’t have seat belts? OK, so I don’t either, but that was a big issue in the 60s, people were dying enough that &lt;a rel=&quot;external&quot; href=&quot;https://www.youtube.com/watch?v=vTnWMnLJqT8&quot;&gt;Ralph Nader wrote a book about it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That led to loads of litigation and then government regulation, and finally, a massive increase in safety.&lt;/p&gt;
&lt;p&gt;It also added well over 10% to the price of a car, depending on what sources you refer to. Could businesses have avoided this? Could cars have been cheaper and safer?&lt;/p&gt;
&lt;p&gt;So given the above, in my opinion, tech companies will have their ‘Ralph Nader’ moment in the future, and until then, things aren’t likely to change.&lt;/p&gt;
&lt;h1 id=&quot;the-us-government-is-actually-doing-something-meaningful-to-prevent-the-repeat-of-history&quot;&gt;The US Government is actually doing something meaningful to prevent the repeat of history&lt;/h1&gt;
&lt;p&gt;Enter the &lt;a rel=&quot;external&quot; href=&quot;https://www.cisa.gov/resources-tools/resources/secure-by-design&quot;&gt;CISA recommendations of 2023&lt;/a&gt;, which is the first attempt at
a government (that I’m aware of, at least), that tries to properly define ‘secure by design’.&lt;/p&gt;
&lt;p&gt;The subtext is often missed though. CISA is trying to give us all a massive hint: “start doing these things before we force you to do them.”
They know that the lawsuits are coming, &lt;a rel=&quot;external&quot; href=&quot;https://www.sec.gov/newsroom/press-releases/2023-139&quot;&gt;governments are even enabling them&lt;/a&gt;, as one of the biggest customers of technology, this makes perfect sense.&lt;/p&gt;
&lt;h1 id=&quot;what-if-we-adopted-the-cisa-recommendations-then&quot;&gt;What if we adopted the CISA recommendations then…&lt;/h1&gt;
&lt;p&gt;Alright, so you want to be a good global citizen and make software that is secure by design? First up. Thank you, for trying to
play the long game, and make software cheaper for everyone by raising the bar and customers expectations!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is no single solution to end the persistent threat of malicious
cyber actors exploiting technology vulnerabilities, and products that are
“secure by design” will continue to suffer vulnerabilities; however, a large
set of vulnerabilities are due to a relatively small subset of root causes&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;-&lt;em&gt;Secure by Design: Principles and Approaches to Secure By Design Software, CISA, 2023&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this document two definitions now exist that you can hang your hat on as a product designer, or software engineer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;h4 id=&quot;secure-by-design&quot;&gt;Secure by design&lt;/h4&gt;
&lt;p&gt;“Secure by design” means that technology products are built in a way
that reasonably protects against malicious cyber actors successfully
gaining access to devices, data, and connected infrastructure Software
manufacturers should perform a risk assessment to identify and enumerate
prevalent cyber threats to critical systems, and then include protections in
product blueprints that account for the evolving cyber threat landscape.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;h4 id=&quot;secure-by-default&quot;&gt;Secure by default&lt;/h4&gt;
&lt;p&gt;“Secure by default” means products are resilient against prevalent
exploitation techniques out of the box without added charge These
products protect against the most prevalent threats and vulnerabilities
without end-users having to take additional steps to secure them Secure
by default products are designed to make customers acutely aware that
when they deviate from safe defaults, they are increasing the likelihood
of compromise unless they implement additional compensatory controls
Secure by default is a form of secure by design&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Security should not be a luxury option, but
should be considered a right [that] customers receive
without negotiating or paying more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Honestly, there are so many good reasons to read this paper, just do it.&lt;/p&gt;
&lt;p&gt;Summarizing for you though, they do a great job of boiling this down to three core principles that any business owner can apply
to their company.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Take ownership of customer security outcomes&lt;/li&gt;
&lt;li&gt;Embrace radical transparency and accountability&lt;/li&gt;
&lt;li&gt;Build organizational structure and leadership to achieve these goals&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For product designers and engineers we go deeper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Memory safe language use&lt;/li&gt;
&lt;li&gt;Lean on hardware that can use fine-grained memory protection&lt;/li&gt;
&lt;li&gt;Acquire and maintain secure software components (yes, this means libraries and middleware)&lt;/li&gt;
&lt;li&gt;Lean on web frameworks that properly escape inputs&lt;/li&gt;
&lt;li&gt;Use parameterized database queries to avoid injection flaws&lt;/li&gt;
&lt;li&gt;Use static and dynamic application security testing tools to assist in error detection&lt;/li&gt;
&lt;li&gt;Code review should be a thing you do (i.e. QA)&lt;/li&gt;
&lt;li&gt;Provide an SBoM&lt;/li&gt;
&lt;li&gt;Establish Vulnerability Disclosure programs&lt;/li&gt;
&lt;li&gt;Include root cause or CWE references in CVE reports&lt;/li&gt;
&lt;li&gt;Design infrastructure such that the compromise of a single security control does not result in total system compromise.&lt;/li&gt;
&lt;li&gt;Meet a baseline of Cybersecurity Performance Goals, which are too numerous to mention in this article, &lt;a rel=&quot;external&quot; href=&quot;https://www.cisa.gov/cross-sector-cybersecurity-performance-goals&quot;&gt;use this link as reference instead&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;at-what-cost&quot;&gt;At what cost?&lt;/h1&gt;
&lt;p&gt;Every time we have a ‘black swan’ event your customers governments are more likely to react with legislation.
If you simply build like this today, you amortize that cost over the course of years, not months. A recent estimate puts this
cost in the US at “$300 billion annually, only $53 billion less than firms spend on corporate income taxes.” (T)&lt;/p&gt;
&lt;p&gt;Your customers and investors probably won’t notice immediately, but when your competitors jack their prices up, you’ll be smugly pointing to all the good work you did
over the past few years and reaping the churn.&lt;/p&gt;
&lt;p&gt;History shows us that without proactive measures from within, industries often face stringent external regulations. By adopting CISA’s 2023 recommendations now, technology companies can not only avert crises but also pave the way for a safer digital future. It’s not just about avoiding penalties—it’s about leading the charge towards a more secure world. What steps will you take to ensure your products are secure by design?&lt;/p&gt;
&lt;p&gt;Final thought, consider &lt;a rel=&quot;external&quot; href=&quot;https://www.theregreview.org/2024/02/28/hoguet-estimating-the-impact-of-regulation-on-business/&quot;&gt;how much government regulation costs other industries&lt;/a&gt;
and start factoring it into your strategic thinking, today. Because the warning shots have been fired.&lt;/p&gt;
&lt;p&gt;*- Complete aside: &lt;em&gt;In the author’s opinion, this is why, time and time again, ‘no code’ solutions fail to live up to expectations (because they produce
an unmaintainable mess that defies to be safely modified) and, why the armies of new wave AI-only ‘programmers’
aren’t taking all the jobs in IT (because programming isn’t the only skill we’re hiring for here).&lt;/em&gt;&lt;/p&gt;
&lt;h1 id=&quot;references&quot;&gt;References&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;https://www.abc.net.au/news/2017-05-14/ransomware-cyberattack-threat-lingers-as-people-return-to-work/8525554&lt;/li&gt;
&lt;li&gt;https://www.wired.com/2002/01/find-the-cost-of-virus-freedom/&lt;/li&gt;
&lt;li&gt;Code-red: case study on the spread and victims of an internet worm, D. Moore, C. Shannon, K. Claffy, https://dl.acm.org/doi/10.1145/637201.637244&lt;/li&gt;
&lt;li&gt;The Internet Worm Program: An Analysis, Eugene H. Spafford, 1988 https://spaf.cerias.purdue.edu/tech-reps/823.pdf&lt;/li&gt;
&lt;li&gt;https://x.com/paulg/status/1323246618326507524&lt;/li&gt;
&lt;li&gt;https://www.theregister.com/2024/08/14/august_patch_tuesday_ipv6/&lt;/li&gt;
&lt;li&gt;https://www.cisa.gov/resources-tools/resources/secure-by-design&lt;/li&gt;
&lt;li&gt;https://www.sec.gov/newsroom/press-releases/2023-139&lt;/li&gt;
&lt;li&gt;https://www.theregreview.org/2024/02/28/hoguet-estimating-the-impact-of-regulation-on-business/&lt;/li&gt;
&lt;li&gt;https://obamawhitehouse.archives.gov/omb/inforeg_intro&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
</feed>
