Skip to content

Commit a59b2cb

Browse files
1 parent f969820 commit a59b2cb

5 files changed

Lines changed: 288 additions & 0 deletions

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-2vg4-rrx4-qcpq",
4+
"modified": "2026-04-04T06:16:49Z",
5+
"published": "2026-04-04T06:16:49Z",
6+
"aliases": [
7+
"CVE-2026-35450"
8+
],
9+
"summary": "AVideo: Unauthenticated FFmpeg Remote Server Status Disclosure via check.ffmpeg.json.php",
10+
"details": "## Summary\n\nThe `plugin/API/check.ffmpeg.json.php` endpoint probes the FFmpeg remote server configuration and returns connectivity status without any authentication. All sibling FFmpeg management endpoints (`kill.ffmpeg.json.php`, `list.ffmpeg.json.php`, `ffmpeg.php`) require `User::isAdmin()`.\n\n## Details\n\nThe entire file at `plugin/API/check.ffmpeg.json.php`:\n\n```php\n<?php\n$configFile = __DIR__.'/../../videos/configuration.php';\nrequire_once $configFile;\nheader('Content-Type: application/json');\n\n$obj = testFFMPEGRemote();\n\ndie(json_encode($obj));\n```\n\nNo `User::isAdmin()`, `User::isLogged()`, or any access control check exists.\n\nCompare with sibling endpoints in the same directory:\n- `kill.ffmpeg.json.php` checks `User::isAdmin()`\n- `list.ffmpeg.json.php` checks `User::isAdmin()`\n\n## Proof of Concept\n\n```bash\ncurl \"https://your-avideo-instance.com/plugin/API/check.ffmpeg.json.php\"\n```\n\nReturns information about whether the platform uses a standalone FFmpeg server and its current reachability.\n\n## Impact\n\nInfrastructure reconnaissance revealing the encoding architecture. Limited direct impact but aids targeted attack planning.\n\n## Recommended Fix\n\nAdd an admin authentication check at `plugin/API/check.ffmpeg.json.php:3`, after `require_once $configFile;`:\n\n```php\nif (!User::isAdmin()) {\n forbiddenPage('Admin only');\n}\n```\n\n---\n*Found by [aisafe.io](https://aisafe.io)*",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Packagist",
21+
"name": "wwbn/avideo"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"last_affected": "26.0"
32+
}
33+
]
34+
}
35+
]
36+
}
37+
],
38+
"references": [
39+
{
40+
"type": "WEB",
41+
"url": "https://github.com/WWBN/AVideo/security/advisories/GHSA-2vg4-rrx4-qcpq"
42+
},
43+
{
44+
"type": "PACKAGE",
45+
"url": "https://github.com/WWBN/AVideo"
46+
}
47+
],
48+
"database_specific": {
49+
"cwe_ids": [
50+
"CWE-306"
51+
],
52+
"severity": "MODERATE",
53+
"github_reviewed": true,
54+
"github_reviewed_at": "2026-04-04T06:16:49Z",
55+
"nvd_published_at": null
56+
}
57+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-3v7m-qg4x-58h9",
4+
"modified": "2026-04-04T06:15:37Z",
5+
"published": "2026-04-04T06:15:37Z",
6+
"aliases": [
7+
"CVE-2026-35448"
8+
],
9+
"summary": "AVideo: Unauthenticated Access to Payment Order Data via BlockonomicsYPT check.php",
10+
"details": "## Summary\n\nThe BlockonomicsYPT plugin's `check.php` endpoint returns payment order data for any Bitcoin address without requiring authentication. The endpoint was designed as an AJAX polling helper for the authenticated `invoice.php` page, but it performs no access control checks of its own. Since Bitcoin addresses are publicly visible on the blockchain, an attacker can query payment records for any address used on the platform.\n\n## Details\n\nIn `plugin/BlockonomicsYPT/check.php` at lines 20-30, the endpoint accepts a Bitcoin address and returns the corresponding order data:\n\n```php\n$addr = $_GET['addr'];\n$order = new BlockonomicsOrder(0);\n$obj = $order->getFromAddressFromDb($addr);\ndie(json_encode($obj));\n```\n\nThere is no authentication check. The endpoint does not verify that the requesting user is logged in, nor does it verify that the requesting user owns the order associated with the given address.\n\nThe response includes:\n- User ID of the buyer\n- Total payment value\n- Currency\n- BTC amounts (expected and received)\n- Transaction ID\n- Payment status\n\nThe `invoice.php` page that was designed to consume this endpoint does require authentication, but `check.php` itself does not inherit or enforce that requirement.\n\nBitcoin addresses are publicly queryable on the blockchain, so an attacker does not need to guess them. Addresses associated with the platform can be discovered by monitoring blockchain transactions to known platform wallets.\n\nThe BlockonomicsYPT plugin is tagged as deprecated by the AVideo project, but remains available and functional in current installations.\n\n## Proof of Concept\n\n```bash\n# Query payment data for a known Bitcoin address without authentication\ncurl \"https://your-avideo-instance.com/plugin/BlockonomicsYPT/check.php?addr=1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa\"\n```\n\nExample response:\n\n```json\n{\n \"id\": 42,\n \"users_id\": 15,\n \"value\": \"29.99\",\n \"currency\": \"USD\",\n \"btc_value\": \"0.00085\",\n \"btc_received\": \"0.00085\",\n \"txid\": \"abc123def456...\",\n \"status\": \"confirmed\",\n \"created\": \"2025-01-15 10:30:00\"\n}\n```\n\nNo session cookie or API key is required.\n\n## Impact\n\n- Unauthenticated disclosure of payment order data including user IDs, amounts, and transaction details\n- Bitcoin addresses are publicly discoverable on the blockchain\n- Links on-chain transactions to specific platform user IDs\n- Privacy violation for users who made cryptocurrency payments on the platform\n- Plugin is deprecated but still functional in existing deployments\n\n## Recommended Fix\n\nAdd an authentication check at `plugin/BlockonomicsYPT/check.php:17`:\n\n```php\nif (!User::isLogged()) {\n echo json_encode([\"error\" => \"Login required\"]);\n exit;\n}\n```\n\n---\n*Found by [aisafe.io](https://aisafe.io)*",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Packagist",
21+
"name": "wwbn/avideo"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"last_affected": "26.0"
32+
}
33+
]
34+
}
35+
]
36+
}
37+
],
38+
"references": [
39+
{
40+
"type": "WEB",
41+
"url": "https://github.com/WWBN/AVideo/security/advisories/GHSA-3v7m-qg4x-58h9"
42+
},
43+
{
44+
"type": "PACKAGE",
45+
"url": "https://github.com/WWBN/AVideo"
46+
}
47+
],
48+
"database_specific": {
49+
"cwe_ids": [
50+
"CWE-862"
51+
],
52+
"severity": "LOW",
53+
"github_reviewed": true,
54+
"github_reviewed_at": "2026-04-04T06:15:37Z",
55+
"nvd_published_at": null
56+
}
57+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-737v-mqg7-c878",
4+
"modified": "2026-04-04T06:17:53Z",
5+
"published": "2026-04-04T06:17:53Z",
6+
"aliases": [
7+
"CVE-2026-35209"
8+
],
9+
"summary": "defu: Prototype pollution via `__proto__` key in defaults argument",
10+
"details": "### Impact\n\nApplications that pass unsanitized user input (e.g. parsed JSON request bodies, database records, or config files from untrusted sources) as the first argument to `defu()` are vulnerable to prototype pollution.\n\nA crafted payload containing a `__proto__` key can override intended default values in the merged result:\n\n```js\nimport { defu } from 'defu'\n\nconst userInput = JSON.parse('{\"__proto__\":{\"isAdmin\":true}}')\nconst config = defu(userInput, { isAdmin: false })\n\nconfig.isAdmin // true — attacker overrides the server default\n```\n\n### Root Cause\n\nThe internal `_defu` function used `Object.assign({}, defaults)` to copy the defaults object. `Object.assign` invokes the `__proto__` setter, which replaces the resulting object's `[[Prototype]]` with attacker-controlled values. Properties inherited from the polluted prototype then bypass the existing `__proto__` key guard in the `for...in` loop and land in the final result.\n\n### Fix\n\nReplace `Object.assign({}, defaults)` with object spread (`{ ...defaults }`), which uses `[[DefineOwnProperty]]` and does not invoke the `__proto__` setter.\n\n### Affected Versions\n\n<= 6.1.4\n\n### Credits\n\nReported by [@BlackHatExploitation](https://github.com/BlackHatExploitation)",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "npm",
21+
"name": "defu"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"fixed": "6.1.5"
32+
}
33+
]
34+
}
35+
],
36+
"database_specific": {
37+
"last_known_affected_version_range": "<= 6.1.4"
38+
}
39+
}
40+
],
41+
"references": [
42+
{
43+
"type": "WEB",
44+
"url": "https://github.com/unjs/defu/security/advisories/GHSA-737v-mqg7-c878"
45+
},
46+
{
47+
"type": "PACKAGE",
48+
"url": "https://github.com/unjs/defu"
49+
}
50+
],
51+
"database_specific": {
52+
"cwe_ids": [
53+
"CWE-1321"
54+
],
55+
"severity": "HIGH",
56+
"github_reviewed": true,
57+
"github_reviewed_at": "2026-04-04T06:17:53Z",
58+
"nvd_published_at": null
59+
}
60+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-99j6-hj87-6fcf",
4+
"modified": "2026-04-04T06:17:17Z",
5+
"published": "2026-04-04T06:17:17Z",
6+
"aliases": [
7+
"CVE-2026-35452"
8+
],
9+
"summary": "AVideo: Unauthenticated Information Disclosure via Missing Auth on CloneSite client.log.php",
10+
"details": "## Summary\n\nThe `plugin/CloneSite/client.log.php` endpoint serves the clone operation log file without any authentication. Every other endpoint in the CloneSite plugin directory enforces `User::isAdmin()`. The log contains internal filesystem paths, remote server URLs, and SSH connection metadata.\n\n## Details\n\nThe entire file at `plugin/CloneSite/client.log.php`:\n\n```php\n<?php\ninclude '../../videos/cache/clones/client.log';\n```\n\nNo authentication check. The log file is populated by `cloneClient.json.php` which writes operational details during clone operations:\n\n```php\n// plugin/CloneSite/cloneClient.json.php:118\n$log->add(\"Clone (2 of {$totalSteps}): Geting MySQL Dump file [$cmd]\");\n```\n\nThe `$cmd` variable contains wget commands with internal filesystem paths, and rsync command templates with SSH connection details (username, IP, port).\n\nCompare with sibling endpoints:\n- `plugin/CloneSite/index.php` checks `User::isAdmin()`\n- `plugin/CloneSite/changeStatus.json.php` checks `User::isAdmin()`\n- `plugin/CloneSite/clones.json.php` checks `User::isAdmin()`\n- `plugin/CloneSite/delete.json.php` checks `User::isAdmin()`\n\n## Proof of Concept\n\n```bash\ncurl \"https://your-avideo-instance.com/plugin/CloneSite/client.log.php\"\n```\n\nIf the CloneSite feature has been used, the response contains wget commands, filesystem paths, SSH metadata, and SQL dump file locations.\n\n## Impact\n\nUnauthenticated disclosure of internal infrastructure details that could aid targeted attacks against the clone source server.\n\n## Recommended Fix\n\nAdd an admin authentication check at `plugin/CloneSite/client.log.php`, before the include:\n\n```php\nrequire_once '../../videos/configuration.php';\nif (!User::isAdmin()) {\n http_response_code(403);\n die('Access denied');\n}\n```\n\n---\n*Found by [aisafe.io](https://aisafe.io)*",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Packagist",
21+
"name": "wwbn/avideo"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"last_affected": "26.0"
32+
}
33+
]
34+
}
35+
]
36+
}
37+
],
38+
"references": [
39+
{
40+
"type": "WEB",
41+
"url": "https://github.com/WWBN/AVideo/security/advisories/GHSA-99j6-hj87-6fcf"
42+
},
43+
{
44+
"type": "PACKAGE",
45+
"url": "https://github.com/WWBN/AVideo"
46+
}
47+
],
48+
"database_specific": {
49+
"cwe_ids": [
50+
"CWE-200"
51+
],
52+
"severity": "MODERATE",
53+
"github_reviewed": true,
54+
"github_reviewed_at": "2026-04-04T06:17:17Z",
55+
"nvd_published_at": null
56+
}
57+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-hg8q-8wqr-35xx",
4+
"modified": "2026-04-04T06:16:18Z",
5+
"published": "2026-04-04T06:16:18Z",
6+
"aliases": [
7+
"CVE-2026-35449"
8+
],
9+
"summary": "AVideo: Unauthenticated Information Disclosure via Disabled CLI Guard in install/test.php",
10+
"details": "## Summary\n\nThe `install/test.php` diagnostic script has its CLI-only access guard disabled by commenting out the `die()` statement. The script remains accessible via HTTP after installation, exposing video viewer statistics including IP addresses, session IDs, and user agents to unauthenticated visitors.\n\n## Details\n\nThe disabled guard at `install/test.php:5-7`:\n\n```php\nif (!isCommandLineInterface()) {\n //return die('Command Line only');\n}\n```\n\nThe script also enables verbose error reporting:\n\n```php\nerror_reporting(E_ALL);\nini_set('display_errors', '1');\n```\n\nIt then queries `VideoStatistic::getLastStatistics()` and outputs the result via `var_dump()`:\n\n```php\n$resp = VideoStatistic::getLastStatistics(getVideos_id(), User::getId());\nvar_dump($resp);\n```\n\nThe `VideoStatistic` object contains: `ip` (viewer IP address), `session_id`, `user_agent`, `users_id`, and JSON metadata. The `display_errors=1` setting also leaks internal filesystem paths in any PHP warnings.\n\nThe `install/` directory is not restricted by `.htaccess` (it only disables directory listing via `Options -Indexes`) and no web server rules block access to individual PHP files in this directory.\n\n## Proof of Concept\n\n```bash\n# Request viewer stats for video ID 1\ncurl \"https://your-avideo-instance.com/install/test.php?videos_id=1\"\n```\n\nConfirmed accessible on live AVideo instances (HTTP 200).\n\n## Impact\n\nUnauthenticated disclosure of viewer IP addresses (PII under GDPR), session identifiers, and user agents. The enabled `display_errors` also reveals internal server paths on errors.\n\n- **CWE**: CWE-200 (Exposure of Sensitive Information)\n- **Severity**: Low\n\n## Recommended Fix\n\nUncomment the CLI guard at `install/test.php:6` to restore the intended access restriction:\n\n```php\nif (!isCommandLineInterface()) {\n return die('Command Line only');\n}\n```\n\n---\n*Found by [aisafe.io](https://aisafe.io)*",
11+
"severity": [
12+
{
13+
"type": "CVSS_V3",
14+
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N"
15+
}
16+
],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "Packagist",
21+
"name": "wwbn/avideo"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"last_affected": "26.0"
32+
}
33+
]
34+
}
35+
]
36+
}
37+
],
38+
"references": [
39+
{
40+
"type": "WEB",
41+
"url": "https://github.com/WWBN/AVideo/security/advisories/GHSA-hg8q-8wqr-35xx"
42+
},
43+
{
44+
"type": "PACKAGE",
45+
"url": "https://github.com/WWBN/AVideo"
46+
}
47+
],
48+
"database_specific": {
49+
"cwe_ids": [
50+
"CWE-200"
51+
],
52+
"severity": "MODERATE",
53+
"github_reviewed": true,
54+
"github_reviewed_at": "2026-04-04T06:16:18Z",
55+
"nvd_published_at": null
56+
}
57+
}

0 commit comments

Comments
 (0)