CSIRTS // UNIFIED SECURITY ADVISORY FEEDSYS ● ONLINE · POWERED BY INTELFUSIONS.COM

GHSA-jr4p-4xjh-fwvw: Koel: Server-Side Request Forgery (SSRF) in radio station creation due to missing validation bail

mediumCVSS 6.3CVE-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

Details

Source
GitHub Security Advisories (INTL · database · site)
Severity
medium — CVSS 6.3
Published
2026-07-15
Last updated
2026-07-15
Exploitation
Not in CISA KEV at last sync

Original advisory: https://github.com/advisories/GHSA-jr4p-4xjh-fwvw

Exploitation outlook

EPSS (FIRST.org) estimates each CVE’s probability of exploitation in the next 30 days — here is the CSIRTS.com read on those numbers.

Referenced CVEs

CVECSIRTS overviewExternal
CVE-2026-50552coverage & exploitation statusNVD · CVE.org

More from GitHub Security Advisories