IPBUF安全漏洞报告
English
CVE-2017-20218 CVSS 7.8 高危

CVE-2017-20218: Serviio PRO 1.8 未加引号路径权限提升漏洞

披露日期: 2026-03-16

漏洞信息

漏洞编号
CVE-2017-20218
漏洞类型
未加引号的路径漏洞/权限提升
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Serviio PRO 1.8

相关标签

未加引号的路径漏洞权限提升本地提权ServiioWindows服务CVE-2017-20218路径遍历服务劫持

漏洞概述

CVE-2017-20218是Serviio PRO 1.8版本中存在的严重安全漏洞,攻击者利用Windows服务中的未加引号搜索路径(Unquoted Service Path)缺陷,配合不当的目录权限设置,实现本地权限提升。该漏洞允许经过身份验证的低权限用户在系统根路径放置恶意可执行文件,当服务启动或系统重启时,Windows会按照PATH环境变量顺序搜索可执行文件,攻击者可利用搜索顺序在合法程序执行前劫持进程。此外,安装目录的权限配置存在严重问题,Users组具有完全控制权限,使得普通用户可以替换原始可执行文件为恶意程序。由于Serviio服务通常以SYSTEM或管理员权限运行,攻击成功后将获得系统最高权限,完全控制目标主机。

技术细节

该漏洞涉及两个安全缺陷的组合利用。首先是未加引号的搜索路径问题:Serviio服务在Windows系统中注册为自动启动服务,其可执行文件路径未使用引号包裹。当服务启动时,Windows服务控制管理器会按照PATH环境变量顺序搜索可执行文件,如果路径中包含空格且未加引号,Windows会尝试将路径按空格分割后匹配。例如路径C:\Program Files\Serviio\bin\ServiioService.exe可能被解析为尝试执行C:\Program.exe或C:\Program Files\Serviio\bin\ServiioService.exe。其次是权限配置问题:Serviio安装目录对Users组开放了完全控制权限,允许经过身份验证的用户写入、修改和替换文件。攻击者可在系统可访问的路径(如C:\)放置名为Program.exe的恶意可执行文件,服务启动时将优先执行该恶意程序,从而在SYSTEM上下文执行任意代码。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者首先识别目标系统上是否安装了Serviio PRO 1.8,并确认服务以SYSTEM或管理员权限运行。使用sc qc Serviio命令查询服务配置,检查BINPATH是否未加引号。
STEP 2
步骤2: 权限探测
检查Serviio安装目录的NTFS权限,确认Users组是否具有写入权限。使用icacls命令验证当前用户是否可以替换可执行文件。
STEP 3
步骤3: 恶意程序植入
攻击者将精心制作的恶意可执行文件(如Program.exe)放置在服务路径的某个目录中。根据未加引号的路径C:\Program Files\Serviio\bin\ServiioService.exe,应将恶意程序放在C:\目录并命名为Program.exe。
STEP 4
步骤4: 触发执行
等待服务重启、系统重启或管理员手动重启服务。当Serviio服务启动时,Windows会按PATH顺序搜索ServiioService.exe,在找到C:\Program.exe后会先执行该恶意程序。
STEP 5
步骤5: 权限提升
恶意程序以SYSTEM权限(服务运行账户)执行,攻击者成功获得系统最高权限。可通过创建管理员账户、安装后门、窃取凭据等方式实现持久化控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 """ CVE-2017-20218 PoC - Serviio PRO Unquoted Service Path Privilege Escalation This PoC demonstrates the vulnerability by checking if Serviio service exists and if the service path is unquoted. """ import subprocess import os import sys def check_serviio_service(): """Check if Serviio service exists and its configuration""" try: # Query Serviio service information result = subprocess.run( ['sc', 'qc', 'Serviio'], capture_output=True, text=True ) if 'BINPATH' in result.stdout: print("[+] Serviio service found!") # Extract binary path for line in result.stdout.split('\n'): if 'BINPATH' in line: path = line.split(':', 1)[1].strip() print(f"[+] Binary path: {path}") # Check if path is quoted if not (path.startswith('"') and path.endswith('"')): print("[!] VULNERABLE: Path is not quoted!") print("[!] Attackers can place malicious executable in path segments") return True else: print("[-] Path is properly quoted") return False else: print("[-] Serviio service not found") return False except Exception as e: print(f"[-] Error checking service: {e}") return False def check_directory_permissions(path): """Check if Users group has excessive permissions""" try: result = subprocess.run( ['icacls', path], capture_output=True, text=True ) if 'Users' in result.stdout and 'Full' in result.stdout: print(f"[!] VULNERABLE: Users group has Full control on {path}") return True return False except Exception as e: print(f"[-] Error checking permissions: {e}") return False def main(): print("=" * 60) print("CVE-2017-20218 - Serviio PRO Unquoted Service Path PoC") print("=" * 60) # Check if running on Windows if sys.platform != 'win32': print("[-] This PoC only works on Windows systems") return print("\n[1] Checking Serviio service configuration...") service_vuln = check_serviio_service() print("\n[2] Checking Serviio directory permissions...") default_path = r'C:\Program Files\Serviio' if os.path.exists(default_path): check_directory_permissions(default_path) else: print(f"[-] Serviio directory not found at {default_path}") print("\n[3] Summary") print("-" * 40) if service_vuln: print("[!] System is VULNERABLE to CVE-2017-20218") print("[!] An attacker with low privileges can:") print(" 1. Place a malicious Program.exe in C:\\") print(" 2. Wait for service restart or system reboot") print(" 3. Gain SYSTEM level code execution") else: print("[-] System appears to be patched") if __name__ == '__main__': main()

影响范围

Serviio PRO 1.8

防御指南

临时缓解措施
立即限制Serviio安装目录的写权限,移除Users组的完全控制权限。可使用icacls命令修改权限:icacls "C:\Program Files\Serviio" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"。同时考虑使用Windows资源管理器或第三方工具配置服务路径加引号,或在服务启动前添加对恶意程序的检测机制。

参考链接

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