-
-
[原创]CVE-2025-8088 WinRAR目录穿越漏洞简单分析
-
-
[原创]CVE-2025-8088 WinRAR目录穿越漏洞简单分析
漏洞概述
7.12及以下版本的WinRAR软件存在目录穿越漏洞,在知道“用户文件夹名”或者其他信息的前提下,攻击者可以构造恶意压缩包,并诱导受害者解压,进而将恶意文件释放到任意位置(如开机启动目录,但需要满足权限要求),甚至获得目标的控制权限。2025年7月30日,WinRAR发布了针对该漏洞(编号CVE-2025-8088)的修复程序,版本为7.13。
环境构建
WinRAR程序
WinRAR 7.01

PoC
3e8K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6K6P5s2W2J5P5s2W2&6i4K6u0r3b7#2k6q4i4K6u0V1x3U0l9J5y4g2)9J5k6o6R3H3z5o6S2Q4x3X3c8i4K9h3&6d9b7g2u0Q4x3X3c8b7M7X3!0G2k6W2)9J5k6r3!0X3i4K6u0V1b7$3!0F1j5$3g2H3N6q4)9J5k6q4m8G2b7#2)9J5k6p5g2^5M7r3I4G2K9i4c8Q4x3X3b7`.

操作系统版本
Windows 11
漏洞复现
执行如下命令构造恶意压缩包,当解压时,通过跨目录的方式在指定路径释放恶意文件payload.bat。
1 | python poc.py --decoy resume.txt --payload payload.bat --drop "D:\test\a" --rar "C:\Program Files\WinRAR\rar.exe"
|
需要注意的是,这里指定的路径为D:\test\a,但实际上只能指定路径,不能指定盘符,即释放文件的目录可能是D:\test\a,也可能是E:\test\a,具体由解压的时候所在的盘符决定。


解压之后,一方面正常解压了cve-2025-8088-sxy-poc,另一方面,跨目录在指定的D:\test\a目录生成了payload.bat。

在D:\test\a生成了payload.bat,由此验证了该版本的WinRAR在解压文件时确实存在目录穿越问题。

还做些一些其他测试,就不放截图了,直接说结果。
| 释放文件的目录 |
标准用户权限操作 |
管理员权限操作 |
| C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp |
失败,权限不够 |
成功 |
| C:\Users\xxx\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup |
需要知道xxx具体值,特定条件下可绕过该限制(比如Download上级目录即为“用户文件夹”,控制相对路径即可,可以多试几次;同理,桌面上的文件解压也可以。) |
略 |
| ... |
|
|
漏洞分析
行为分析
在D盘目录下解压的cve-2025-8088-sxy-poc.rar,最终会把恶意文件释放到D:\test\a\payload.bat。于是,通过ProcMon进行行为分析时,可以把程序名设为WinRAR.exe,路径包含test字符,这样就可以观察到解压文件时的关键函数调用。


通过ProcMon可以知道,释放恶意文件的关键操作主要就CreateFile、WriteFile。
断点调试
1 | 使用x64dbg对WinRAR.exe进行附加调试,对CreateFileW下断点,很快就能找到写..\..\payload.bat的地方。文件名很有特点,形如“xxx:..\..\..\payload.bat”。
|

代码复现
1 | 使用CreateFileW创建文件L"hello:..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\test\\a\\abc.txt",看看是否会生成D:\testa\abc.txt文件。
|
main.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <windows.h>
#include <stdio.h>
int main() {
HANDLE hFile;
DWORD bytesWritten;
LPCWSTR filename = L"hello:..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\test\\a\\abc.txt";
hFile = CreateFileW(
filename,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
printf("无法创建文件! 错误代码: %d\n", GetLastError());
return 1;
}
char data[] = "CVE-2025-8088 test!";
if (!WriteFile(
hFile,
data,
sizeof(data) - 1,
&bytesWritten,
NULL
)) {
printf("写入文件失败! 错误代码: %d\n", GetLastError());
CloseHandle(hFile);
return 1;
}
if (bytesWritten != sizeof(data) - 1) {
printf("写入字节数不匹配!\n");
} else {
printf("成功写入 %d 字节到文件: %ls\n", bytesWritten, filename);
}
CloseHandle(hFile);
return 0;
}
|
编译
效果
成功跨目录生成了文件abc.txt。

尝试修改文件路径filename,并在D盘目录下执行demo.exe,具体测试结论如下表。

分析结论
条件限制
1.需要确保目标路径存在,且有写权限
大概就是需要知道“用户文件夹名”(特定条件下可绕过),并且目标位置要有写权限。
对于习惯用Administrator登录的用户来说,危害比较大,可以通过写启动项直接拿权限。对于标准登录的大部分人来说,“用户文件夹名”是不同的,这给攻击者增加了难度,不过攻击者可以暴力猜测用户的解压目录(如下载或桌面),然后控制释放payload.bat的相对路径来达到写启动项的目的。
2.不能跨盘符写文件
行为特征
1 | WinRAR进程调用CreateFileW函数时,如果其文件路径参数含有“:..\”特征,则很危险。
|
相关说明
备用数据流(Alternate Data Streams, ADS)
备用数据流(ADS)是NTFS文件系统的一项特性,它允许将隐藏的数据像“秘密附件”一样依附于主文件,而主文件的可见大小和内容却不发生改变。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 创建普通文件hello
echo 123 >hello
创建和hello关联的备用数据流
echo 123 >hello:abc.txt
查看备用数据流
dir /R
more <hello:abc.txt
使用powershell查看备用数据流:
Get-Item -Path hello -Stream *
Get-Content -Path hello -Stream 'abc.txt'
|



WinRAR打包命令

| WinRAR参数 |
含义 |
| a |
添加文件到压缩包 |
| -ep |
在添加文件夹时,不包含文件夹本身的路径名。 |
| -os |
保存文件的NTFS备用数据流(ADS)。 |
解压报错样式

可继续深究的内容
1 | ADS的形式大体上是"abc:def"这个样子的,如何构造"abc:..\..\def"这样的路径,并完成打包,感觉还是有些技巧的。详细内容可以查看POC源码。
|
参考
ce5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6k6h3y4J5M7%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8U0R3I4z5o6V1J5
843K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6k6h3y4J5M7%4y4Q4x3X3g2U0L8$3#2Q4x3V1k6S2M7Y4c8A6j5$3I4W2M7#2)9J5c8U0R3J5x3U0b7#2
b5dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7q4)9J5k6i4N6W2K9i4S2A6L8W2)9J5k6i4q4I4i4K6u0W2j5$3!0E0i4K6u0r3M7#2)9J5c8W2b7^5d9h3I4c8j5W2S2$3c8h3S2I4N6q4S2o6b7i4c8Q4y4h3j5&6L8W2y4V1N6H3`.`.
(不保证文章完全正确,请辩证的看待)
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 2025-9-4 16:37
被Jtian编辑
,原因: