CVE-2026-46337
WWBN AVideo: Unauthenticated Arbitrary Image Read via Path Traversal in `view/img/image404Raw.php`
WWBN AVideo is an open source video platform. In 29.0 and earlier, an unauthenticated remote attacker can read arbitrary image files anywhere on disk that the PHP user can open — including private user-profile photos that the application's normal serving wrappers gate behind ACLs, admin-uploaded thumbnails, encrypted-video poster frames, and image content under sibling-app directories reachable via .. traversal. The endpoint requires no authentication.
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
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
6.9
WWBN AVideo: Unauthenticated Arbitrary Image Read via Path Traversal in `view/img/image404Raw.php`
WWBN AVideo is an open source video platform. In 29.0 and earlier, an unauthenticated remote attacker can read arbitrary image files anywhere on disk that the PHP user can open — including private user-profile photos that the application's normal serving wrappers gate behind ACLs, admin-uploaded thumbnails, encrypted-video poster frames, and image content under sibling-app directories reachable via .. traversal. The endpoint requires no authentication.
- Record
CVE-2026-46337- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-33305
6.9
WWBN AVideo is an open source video platform. In 29.0 and earlier, an unauthenticated remote attacker can read arbitrary image files anywhere on disk that the PHP user can open — including private user-profile photos that the application's normal serving wrappers gate behind ACLs, admin-uploaded thumbnails, encrypted-video poster frames, and image content under sibling-app directories reachable via .. traversal. The endpoint requires no authentication.
- Record
EUVD-2026-33305- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-w4qq-74h6-58wq
6.9
AVideo: Unauthenticated Arbitrary Image Read via Path Traversal in `view/img/image404Raw.php`
Summary
The endpoint requires no authentication. An unauthenticated remote attacker can read arbitrary image files anywhere on disk that the PHP user can open — including private user-profile photos that the application's normal serving wrappers gate behind ACLs, admin-uploaded thumbnails, encrypted-video poster frames, and image content under sibling-app directories reachable via .. traversal.
Details
view/img/image404Raw.php reads the image GET parameter and joins it directly into a filesystem path served via readfile(). view/img/image404Raw.php (full file, current master @ 0dbadbcaaa1b415c7db078a72dc4b26d9fac0485):
<?php
// Fetch requested image URL
$imageURL = !empty($_GET['image']) ? $_GET['image'] : $_SERVER["REQUEST_URI"];
$rootDir = dirname(__FILE__) . '/../../';
if ($imageURL == 'favicon.ico') {
$imgLocalFile = "{$rootDir}/videos/{$imageURL}";
} else {
$imgLocalFile = "{$rootDir}/{$imageURL}"; // ← attacker-controlled
}
if (file_exists($imgLocalFile)) {
$imageInfo = getimagesize($imgLocalFile); // ← format gate
if (empty($imageInfo)) {
die('not image');
}
// …extension → Content-Type mapping…
header("HTTP/1.0 200 OK");
header('Content-Type: ' . $type);
header('Content-Length: ' . filesize($imgLocalFile));
readfile($imgLocalFile); // ← exfil bytes
exit;
}
Issues:
- No authentication. The file is reachable via direct GET; no
requireofglobals.php, no session check, no API-key gate. - No basename / realpath / prefix containment.
$_GET['image']is concatenated into$imgLocalFilewith no..filtering, norealpath()resolution, no allowlist check against the intendedview/img/directory. getimagesize()is a magic-bytes check, not a path constraint. Any file on disk whose first bytes match a recognized image format (FFD8FFJPEG,89504E47PNG,474946GIF,52494646…57454250WebP) passes the gate — including images stored outside any ACL'd area of the application.$_SERVER["REQUEST_URI"]fallback whenimageis empty widens the attack surface (path components in the URI itself land in$imgLocalFile).
Re-verified pre-submission on 2026-05-13 against view/img/image404Raw.php blob SHA c670b0faff4fbea1fd0508f179956975477d4340 — unsafe shape unchanged since first discovery on 2026-05-12.
Recommended fix — three layered checks, any one alone is insufficient:
// view/img/image404Raw.php — proposed fix
<?php
$imageURL = !empty($_GET['image']) ? $_GET['image'] : '';
if ($imageURL === '') {
http_response_code(400);
exit('bad request');
}
// 1. Reject any path-traversal segment outright.
if (strpos($imageURL, '..') !== false
|| strpos($imageURL, "\0") !== false
|| strpos($imageURL, '://') !== false) {
http_response_code(400);
exit('bad request');
}
// 2. Resolve to a real path and verify prefix containment under the
// intended image directory.
$rootDir = realpath(dirname(__FILE__) . '/../../');
$imgLocalFile = realpath($rootDir . '/' . $imageURL);
if ($imgLocalFile === false
|| (strpos($imgLocalFile, $rootDir . '/videos/') !== 0
&& strpos($imgLocalFile, $rootDir . '/view/img/') !== 0)) {
http_response_code(404);
exit('not found');
}
// 3. Existing getimagesize() check stays as defense-in-depth.
if (!is_file($imgLocalFile)) {
http_response_code(404);
exit('not found');
}
$imageInfo = @getimagesize($imgLocalFile);
if (empty($imageInfo)) {
http_response_code(404);
exit('not image');
}
// …rest of the original Content-Type + readfile() flow unchanged…
Drop the $_SERVER["REQUEST_URI"] fallback entirely; if no image
parameter is provided, return 400.
PoC
Discovery probe — any HTTP client, no authentication, no cookies:
GET /view/img/image404Raw.php?image=../videos/userPhoto/photo1.jpg HTTP/1.1
Host: avideo.example.com
If…
- Record
GHSA-w4qq-74h6-58wq- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-22, CWE-284, CWE-862
- Updated
- 2026-11-02
NVD
6.9
WWBN AVideo is an open source video platform. In 29.0 and earlier, an unauthenticated remote attacker can read arbitrary image files anywhere on disk that the PHP user can open — including private user-profile photos that the application's normal serving wrappers gate behind ACLs, admin-uploaded thumbnails, encrypted-video poster frames, and image content under sibling-app directories reachable via .. traversal. The endpoint requires no authentication.
- Record
CVE-2026-46337- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/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
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
6.9
WWBN AVideo: Unauthenticated Arbitrary Image Read via Path Traversal in `view/img/image404Raw.php`
WWBN AVideo is an open source video platform. In 29.0 and earlier, an unauthenticated remote attacker can read arbitrary image files anywhere on disk that the PHP user can open — including private user-profile photos that the application's normal serving wrappers gate behind ACLs, admin-uploaded thumbnails, encrypted-video poster frames, and image content under sibling-app directories reachable via .. traversal. The endpoint requires no authentication.
- Record
CVE-2026-46337- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVGHSA-w4qq-74h6-58wq
6.9
AVideo: Unauthenticated Arbitrary Image Read via Path Traversal in `view/img/image404Raw.php`
Summary
The endpoint requires no authentication. An unauthenticated remote attacker can read arbitrary image files anywhere on disk that the PHP user can open — including private user-profile photos that the application's normal serving wrappers gate behind ACLs, admin-uploaded thumbnails, encrypted-video poster frames, and image content under sibling-app directories reachable via .. traversal.
Details
view/img/image404Raw.php reads the image GET parameter and joins it directly into a filesystem path served via readfile(). view/img/image404Raw.php (full file, current master @ 0dbadbcaaa1b415c7db078a72dc4b26d9fac0485):
<?php
// Fetch requested image URL
$imageURL = !empty($_GET['image']) ? $_GET['image'] : $_SERVER["REQUEST_URI"];
$rootDir = dirname(__FILE__) . '/../../';
if ($imageURL == 'favicon.ico') {
$imgLocalFile = "{$rootDir}/videos/{$imageURL}";
} else {
$imgLocalFile = "{$rootDir}/{$imageURL}"; // ← attacker-controlled
}
if (file_exists($imgLocalFile)) {
$imageInfo = getimagesize($imgLocalFile); // ← format gate
if (empty($imageInfo)) {
die('not image');
}
// …extension → Content-Type mapping…
header("HTTP/1.0 200 OK");
header('Content-Type: ' . $type);
header('Content-Length: ' . filesize($imgLocalFile));
readfile($imgLocalFile); // ← exfil bytes
exit;
}
Issues:
- No authentication. The file is reachable via direct GET; no
requireofglobals.php, no session check, no API-key gate. - No basename / realpath / prefix containment.
$_GET['image']is concatenated into$imgLocalFilewith no..filtering, norealpath()resolution, no allowlist check against the intendedview/img/directory. getimagesize()is a magic-bytes check, not a path constraint. Any file on disk whose first bytes match a recognized image format (FFD8FFJPEG,89504E47PNG,474946GIF,52494646…57454250WebP) passes the gate — including images stored outside any ACL'd area of the application.$_SERVER["REQUEST_URI"]fallback whenimageis empty widens the attack surface (path components in the URI itself land in$imgLocalFile).
Re-verified pre-submission on 2026-05-13 against view/img/image404Raw.php blob SHA c670b0faff4fbea1fd0508f179956975477d4340 — unsafe shape unchanged since first discovery on 2026-05-12.
Recommended fix — three layered checks, any one alone is insufficient:
// view/img/image404Raw.php — proposed fix
<?php
$imageURL = !empty($_GET['image']) ? $_GET['image'] : '';
if ($imageURL === '') {
http_response_code(400);
exit('bad request');
}
// 1. Reject any path-traversal segment outright.
if (strpos($imageURL, '..') !== false
|| strpos($imageURL, "\0") !== false
|| strpos($imageURL, '://') !== false) {
http_response_code(400);
exit('bad request');
}
// 2. Resolve to a real path and verify prefix containment under the
// intended image directory.
$rootDir = realpath(dirname(__FILE__) . '/../../');
$imgLocalFile = realpath($rootDir . '/' . $imageURL);
if ($imgLocalFile === false
|| (strpos($imgLocalFile, $rootDir . '/videos/') !== 0
&& strpos($imgLocalFile, $rootDir . '/view/img/') !== 0)) {
http_response_code(404);
exit('not found');
}
// 3. Existing getimagesize() check stays as defense-in-depth.
if (!is_file($imgLocalFile)) {
http_response_code(404);
exit('not found');
}
$imageInfo = @getimagesize($imgLocalFile);
if (empty($imageInfo)) {
http_response_code(404);
exit('not image');
}
// …rest of the original Content-Type + readfile() flow unchanged…
Drop the $_SERVER["REQUEST_URI"] fallback entirely; if no image
parameter is provided, return 400.
PoC
Discovery probe — any HTTP client, no authentication, no cookies:
GET /view/img/image404Raw.php?image=../videos/userPhoto/photo1.jpg HTTP/1.1
Host: avideo.example.com
If…
- Record
GHSA-w4qq-74h6-58wq- CVSS 4.0
- 6.9 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-22, CWE-284, CWE-862
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
WWBN/AVideoPackagist |
through 29.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-46337 is a medium vulnerability (CVSS 6.9) in Wwbn Avideo, published May 19, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.46%, the 39th percentile. No source names a fixed version.
References
Left out here: the rest of 2 source descriptions. The JSON record has them.