<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://db.gcve.eu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 01 Oct 2026 11:38:13 +0000</lastBuildDate>
    <item>
      <title>GHSA-3p68-rc4w-qgx5 — Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF</title>
      <link>https://db.gcve.eu/vuln/ghsa-3p68-rc4w-qgx5</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: axios&lt;/p&gt;
&lt;p&gt;Axios does not correctly handle hostname normalization when checking `NO_PROXY` rules.
Requests to loopback addresses like `localhost.` (with a trailing dot) or `[::1]` (IPv6 literal) skip `NO_PROXY` matching and go through the configured proxy.&lt;/p&gt;
&lt;p&gt;This goes against what developers expect and lets attackers force requests through a proxy, even if `NO_PROXY` is set up to protect loopback or internal services.&lt;/p&gt;
&lt;p&gt;According to [RFC 1034 §3.1](https://datatracker.ietf.org/doc/html/rfc1034#section-3.1) and [RFC 3986 §3.2.2](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2), a hostname can have a trailing dot to show it is a fully qualified domain name (FQDN). At the DNS level, `localhost.` is the same as `localhost`. 
However, Axios does a literal string comparison instead of normalizing hostnames before checking `NO_PROXY`. This causes requests like `http://localhost.:8080/` and `http://[::1]:8080/` to be incorrectly proxied.&lt;/p&gt;
&lt;p&gt;This issue leads to the possibility of proxy bypass and SSRF vulnerabilities allowing attackers to reach sensitive loopback or internal services despite the configured protections.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;**PoC**&lt;/p&gt;
&lt;p&gt;```js
import http from &amp;#34;http&amp;#34;;
import axios from &amp;#34;axios&amp;#34;;&lt;/p&gt;
&lt;p&gt;const proxyPort = 5300;&lt;/p&gt;
&lt;p&gt;http.createServer((req, res) =&amp;gt; {
  console.log(&amp;#34;[PROXY] Got:&amp;#34;, req.method, req.url, &amp;#34;Host:&amp;#34;, req.headers.host);
  res.writeHead(200, { &amp;#34;Content-Type&amp;#34;: &amp;#34;text/plain&amp;#34; });
  res.end(&amp;#34;proxied&amp;#34;);
}).listen(proxyPort, () =&amp;gt; console.log(&amp;#34;Proxy&amp;#34;, proxyPort));&lt;/p&gt;
&lt;p&gt;process.env.HTTP_PROXY…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: axios&lt;/p&gt;
&lt;p&gt;Axios does not correctly handle hostname normalization when checking `NO_PROXY` rules.
Requests to loopback addresses like `localhost.` (with a trailing dot) or `[::1]` (IPv6 literal) skip `NO_PROXY` matching and go through the configured proxy.&lt;/p&gt;
&lt;p&gt;This goes against what developers expect and lets attackers force requests through a proxy, even if `NO_PROXY` is set up to protect loopback or internal services.&lt;/p&gt;
&lt;p&gt;According to [RFC 1034 §3.1](https://datatracker.ietf.org/doc/html/rfc1034#section-3.1) and [RFC 3986 §3.2.2](https://datatracker.ietf.org/doc/html/rfc3986#section-3.2.2), a hostname can have a trailing dot to show it is a fully qualified domain name (FQDN). At the DNS level, `localhost.` is the same as `localhost`. 
However, Axios does a literal string comparison instead of normalizing hostnames before checking `NO_PROXY`. This causes requests like `http://localhost.:8080/` and `http://[::1]:8080/` to be incorrectly proxied.&lt;/p&gt;
&lt;p&gt;This issue leads to the possibility of proxy bypass and SSRF vulnerabilities allowing attackers to reach sensitive loopback or internal services despite the configured protections.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;**PoC**&lt;/p&gt;
&lt;p&gt;```js
import http from &amp;#34;http&amp;#34;;
import axios from &amp;#34;axios&amp;#34;;&lt;/p&gt;
&lt;p&gt;const proxyPort = 5300;&lt;/p&gt;
&lt;p&gt;http.createServer((req, res) =&amp;gt; {
  console.log(&amp;#34;[PROXY] Got:&amp;#34;, req.method, req.url, &amp;#34;Host:&amp;#34;, req.headers.host);
  res.writeHead(200, { &amp;#34;Content-Type&amp;#34;: &amp;#34;text/plain&amp;#34; });
  res.end(&amp;#34;proxied&amp;#34;);
}).listen(proxyPort, () =&amp;gt; console.log(&amp;#34;Proxy&amp;#34;, proxyPort));&lt;/p&gt;
&lt;p&gt;process.env.HTTP_PROXY…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-3p68-rc4w-qgx5</guid>
    </item>
  </channel>
</rss>
