声明:该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。
前言
7-Zip是一款广泛使用的开源文件压缩工具,其高压缩率和支持多种格式的能力使得它成为用户日常工作中的重要工具。然而,正是由于其广泛的使用,7-Zip也不可避免地成为了攻击者的目标。最近,安全研究人员发现了一个严重的漏洞,涉及7-Zip LZMA解码器中的缓冲区溢出问题。该漏洞可以被利用来执行任意代码,进而实现恶意操作。
漏洞概述
近日,蓝V @NSA_Employee39 发布了一个针对 7-Zip 的 0day 漏洞,漏洞存在于 LZMA 解码器中。具体来说,攻击者可以构造一个恶意的 .7z
压缩文件,通过修改 LZMA 流,利用该漏洞触发缓冲区溢出,从而执行任意代码。攻击者只需要让受害者打开或者解压这个恶意的 .7z
文件,就能够触发漏洞,执行攻击者指定的恶意负载(例如运行 calc.exe
)。
漏洞细节
漏洞的根本原因出现在 LzmaDec.c 中的 RC_NORM
宏。该宏用于规范化解码过程中的范围和代码值,并通过 p->buf++
操作修改内部缓冲区指针。然而,代码并没有检查该指针是否超出了已分配的内存或缓冲区限制。这种缺乏边界检查的设计使得攻击者能够通过构造恶意的 LZMA 流,操控缓冲区指针,导致指针溢出,进而覆盖内存中的关键区域,如返回地址或函数指针,从而实现任意代码执行。
代码分析
攻击者通过精心设计的 LZMA 流,可以将溢出指针指向一个包含 shellcode 的区域。该 shellcode 通过缓冲区溢出被执行,最终执行任意代码。以下是攻击者利用该漏洞构造恶意 .7z
文件的示例代码:
这段代码演示了如何构造一个恶意的 .7z
文件,利用 LZMA 流的缓冲区溢出漏洞来执行恶意代码。
漏洞根本原因
从作者的推特评论中,我们了解到,RC_NORM 宏的定义并没有在 LzmaDec.c 中直接使用,而是只在 LzmaEnc.c 中被定义。作者通过 gdb 调试时发现,尽管设置了断点来观察 Ppmd7a_DecodeSymbol 和 Ppmd8_DecodeSymbol 这两个使用 RC_NORM 的函数,实际测试中,普通的 LZMA 文件和恶意 LZMA 文件都没有触发该宏的调用。
推测与分析
尽管 RC_NORM 宏没有直接触发,但漏洞的触发机制可能还是通过其他方式进行的。该漏洞可能并非直接与 RC_NORM 的调用相关,而是由于缓冲区溢出或内存操作不当所导致。具体来说,当解码器处理恶意构造的 LZMA 流时,恶意数据可能会修改缓冲区指针,导致内存溢出,从而实现任意代码执行。
2. 漏洞利用:概念验证
为了证明这一漏洞的存在并展示其危害,攻击者可以通过创建一个恶意的.7z
文件来触发缓冲区溢出。当受害者使用易受攻击版本的7-Zip打开或解压该文件时,恶意代码将被执行。具体来说,恶意.7z
文件中的LZMA流经过精心设计,以便在解码过程中引发溢出,并执行一个简单的shellcode(例如启动calc.exe
)。
2.1 构造恶意Shellcode
首先,攻击者需要构造一个能够执行任意代码的shellcode。下面的代码展示了一个简单的shellcode,它的作用是启动calc.exe
计算器:
unsignedcharshellcode[] = {0x55, 0x89, 0xE5, 0x83, 0xEC, 0x08, 0xC7, 0x04, 0x24,'c', 'a', 'l', 'c', 0x00, 0xCC, 0xCC, 0xCC, 0x89, 0xEC, 0x5D, 0xC3};
该shellcode通过system
函数调用执行calc.exe
,这是Windows系统中的一个常见示例。在漏洞利用的过程中,攻击者会将这个shellcode嵌入到LZMA流中。
2.2 修改Shellcode中的跳转地址
为了使shellcode能够成功执行,攻击者需要将shellcode中的跳转指令指向system
函数的地址。在此,攻击者通过计算偏移量并修改shellcode中的跳转地址:
UInt32jmpOffset= (UInt32)((unsignedchar*)&system- ((unsignedchar*)shellcode+addressOfSystemOffset+4));WriteUInt32LE(shellcode+18, jmpOffset);
这段代码确保了shellcode在执行时能够正确跳转到system
函数,从而触发calc.exe
的执行。
2.3 构造恶意LZMA流
接下来,攻击者需要构造一个恶意的LZMA流。在RC_NORM
宏的漏洞条件下,特制的LZMA流将导致buf
指针溢出到未分配的内存区域。攻击者通过设计具有极低频率符号的LZMA流,操控解码过程中缓冲区指针的行为,从而引发溢出。
unsignedcharmalicious_lzma_stream[] = {0x5D, 0x00, 0x00, 0x00, 0x01, 0x00,0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, ...};
这个恶意的LZMA流是经过仔细设计的,以确保解码过程中的溢出能够覆盖关键的内存区域,最终导致恶意代码的执行。
2.4 生成恶意.7z
文件
攻击者将上述各个组件(头部、LZMA属性、恶意LZMA流、shellcode)组合起来,最终生成一个恶意的.7z
文件。这个文件在受害者解压时会触发缓冲区溢出,从而执行恶意代码。
FILE*f=fopen("exploit.7z", "wb");if (!f) {perror("Failed to create exploit.7z");return1;}fwrite(payload, 1, payloadSize, f);fclose(f);
当受害者使用易受攻击版本的7-Zip解压该.7z
文件时,恶意shellcode将被执行,从而达到攻击的目的。
地址
蓝 V 作者:@NSA_Employee39
代码公布地址:https://pastebin.com/KxQYFqwR
原文始发于微信公众号(安全视安):【最新】推特蓝V公布 7zip 0day(续篇)7-Zip LZMA 解码器漏洞与缓冲区溢出攻击
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论