CVE-2026-50552
Summary
Koel v9.5.0 contains a Server-Side Request Forgery (SSRF) vulnerability in the radio station creation endpoint (POST /api/radio/stations). The url field validation rules are declared without the bail keyword, so the HasAudioContentType rule — which issues HTTP requests to the supplied URL — still executes even after the SafeUrl rule has rejected the URL as pointing to a private/reserved address. Any authenticated, non-admin user can therefore coerce the server into making HEAD/GET requests to arbitrary internal hosts.
This is a blind SSRF: the response body is never returned to the client, but the two distinct validation error messages form a reliable internal-network reachability oracle.
Severity
Medium — CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N (5.4)
Authenticated (low-privilege) actor; blind SSRF (no response-body exfiltration). Confidentiality (L) reflects the internal reachability oracle; Integrity (L) reflects state-changing internal endpoints that act on GET/HEAD.
Affected Component
- Version: Koel v9.5.0 (latest release, HEAD b2e9a34, verified 2026-05-30)
- Endpoint: POST /api/radio/stations
- Files:
- app/Http/Requests/API/Radio/RadioStationStoreRequest.php (missing bail)
- app/Rules/HasAudioContentType.php (unguarded HTTP fetch)
Root Cause
app/Http/Requests/API/Radio/RadioStationStoreRequest.php (lines 25-34):
'url' => [
'required',
'url',
Rule::unique('radio_stations')->where(function ($query) {
return $query->where('user_id', $this->user()->id);
}),
new SafeUrl(),
new HasAudioContentType(),
],
In Laravel, validation rules within a single attribute run in sequence and do not stop on the first failure unless bail is present or FormRequest::$stopOnFirstFailure is set. Neither is the case here (App\Http\Requests\Request does not override stopOnFirstFailure, and authorize() simply returns true).
For a directly-supplied private/reserved address (e.g. http://169.254.169.254, http://127.0.0.1:6379, http://192.168.0.1):
1. SafeUrl (app/Ru
⚡ Watch CVE-2026-50552
Get an email if CVE-2026-50552 is added to CISA KEV, gains public exploit code, or a new advisory cites it — max one per day, one-click unsubscribe.
Exploitation outlook
- Low exploitation risk0.17% 30-day exploitation probability — currently an unlikely target, but scores change as exploit code circulates. Riskier than 7% of all EPSS-scored CVEs.
Advisory coverage (1)
External references
Embed the live status
— this badge updates automatically when the KEV or exploit status changes. How to embed it →
[](https://www.csirts.com/cve/CVE-2026-50552)