<?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-16T01:30:55.985057+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-326975</id>
    <title>EUVD-2026-326975</title>
    <updated>2026-10-16T01:30:55.987219+00:00</updated>
    <content>EUVD-2026-326975</content>
    <link href="https://cve.radiocsirt.org/vuln/euvd-2026-326975"/>
  </entry>
  <entry>
    <id>https://cve.radiocsirt.org/vuln/fkie_cve-2026-47260</id>
    <title>fkie_cve-2026-47260</title>
    <updated>2026-10-16T01:30:55.987249+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>Koel is a free, open-source music streaming solution. Prior to version 9.3.5, Koel validates the podcast feed URL via the SafeUrl rule (DNS resolution + public IP check), but the individual episode &lt;enclosure url="..."&gt; values extracted from the RSS XML are stored directly into the database without any SSRF validation. When a user plays an episode, the server downloads the full HTTP response from the unvalidated enclosure URL via Http::sink()-&gt;get() and streams it back to the user, enabling full-read SSRF against internal services. This issue has been patched in version 9.3.5.</p>
      </div>
    </content>
    <link href="https://cve.radiocsirt.org/vuln/fkie_cve-2026-47260"/>
  </entry>
  <entry>
    <id>https://cve.radiocsirt.org/vuln/ghsa-7j2f-6h2r-6cqc</id>
    <title>GHSA-7j2f-6h2r-6cqc — Koel Vulnerable to SSRF via Podcast Episode Enclosure URLs</title>
    <updated>2026-10-16T01:30:55.987281+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> Packagist: phanan/koel</p>
<p>## Summary</p>
<p>Koel validates the podcast feed URL via the `SafeUrl` rule (DNS resolution + public IP check), but the individual episode `&lt;enclosure url="..."&gt;` values extracted from the RSS XML are stored directly into the database without any SSRF validation. When a user plays an episode, the server downloads the full HTTP response from the unvalidated enclosure URL via `Http::sink()-&gt;get()` and streams it back to the user, enabling full-read SSRF against internal services.</p>
<p>---</p>
<p>## Vulnerability Details</p>
<p>### Episode URL Stored Without Validation</p>
<p>**File:** `app/Services/Podcast/PodcastService.php`, line 146</p>
<p>```php
'path' =&gt; $episodeValue-&gt;enclosure-&gt;url,  // Unvalidated URL from RSS XML
```</p>
<p>The `SafeUrl` rule is applied to the podcast feed URL at subscription time (`SubscribeToPodcastRequest`), but episode enclosure URLs parsed from the feed XML are stored as-is.</p>
<p>### SSRF Trigger: Full Content Download</p>
<p>**File:** `app/Values/Podcast/EpisodePlayable.php`, line 42</p>
<p>```php
Http::sink($file)-&gt;get($episode-&gt;path)-&gt;throw();
```</p>
<p>When an episode is played, `PodcastStreamerAdapter::stream()` first attempts `getStreamableUrl()` (OPTIONS/HEAD requests to the episode URL). If no CORS header is present (which internal services won't have), it falls through to `EpisodePlayable::createForEpisode()`, which downloads the full response body and streams it back to the user.</p>
<p>### SafeUrl Applied Only to Feed URL</p>
<p>**File:** `app/Http/Requests/API/Podcast/SubscribeToPodcastRequest.php`</p>
<p>```ph…</p></div>
    </content>
    <link href="https://cve.radiocsirt.org/vuln/ghsa-7j2f-6h2r-6cqc"/>
  </entry>
</feed>
