最新漏洞

Bitdefender在处理PE代码签名的organizationName字段时存在缓冲区溢出漏洞

一、漏洞概要


本文描述了Bitdefender PE引擎中存在的一个缓冲区溢出漏洞。

Bitdefender提供了“反恶意软件(antimalware)”引擎,该引擎可以集成到其他安全厂商的产品中,Bitdefender在自家产品中(如Bitdefender Internet Security 2017及以下版本)也使用了该引擎。在安全产品的众多功能中,反恶意软件引擎是核心功能,用于扫描潜在的恶意便携式可执行文件(portable executable,PE)。

二、漏洞细节


PE文件可以使用X.509证书进行签名。签名机制可确保可执行文件内容没被篡改,且文件来自于可信来源。

证书信息存放在PE数据的某个目录中,该目录由IMAGE_NT_HEADERS.IMAGE_OPTIONAL_HEADER字段进行定义。

PE文件中的IMAGE_NT_HEADERS结构体以特征字符“PE\0\0”开始:

IMAGE_OPTIONAL_HEADER结构体的最后部分包含若干个类型为IMAGE_DATA_DIRECTORY的DataDirectory结构体:

DataDirectory[4]代表的是IMAGE_DIRECTORY_ENTRY_SECURITY,指向一个包含WIN_CERTIFICATE结构体的列表。VirtualAddress字段指的是文件偏移量,而不是RVA(相对虚拟地址,Relative Virtual Address)。

WIN_CERTIFICATE结构体的定义如下所示:

vsserv.exe是Bitdefender的系统服务,该进程会自动扫描PE文件,通过cevakrnl.rv8模块分析PE文件的数字签名。cevakrnl.rv8模块是一个压缩模块,位于“%ProgramFiles%\Common Files\Bitdefender\Bitdefender Threat Scanner\Antivirus_…\Plugins\”目录。

Bitdefender服务启动时,会解压cevakrnl.rv8模块,并将其加载为可执行代码。当处理经过签名的PE文件时,cevakrnl.rv8!sub_40ACFF0()函数就会被调用。

程序会从先前定义的偏移量处读取不超过0x2400个字节的数据,并将该数据载入到堆缓冲区中。

经过一些无关紧要的操作后,Bitdefender开始在待处理数据中搜索X.509中的“organizationName”属性。程序会搜索0x0A045503这个dword来定位该属性,这个dword是organizationName OID 2.5.4.10的ASN.1表示形式。

当程序找到“organizationName”时,该字段对应的字符串值会经某个调用传递给负责计算CRC32校验码的函数,该函数会返回该字符串经反转处理(即按位取非(NOT))后的CRC32校验值。

请注意,在“organizationName”中,只有可打印的ASCII字符(0x20-0x7E)才会被认为是有效字符。

如果之前没处理过该CRC值:

该值会存放在某个大小为8个dwords的本地栈数组中。对于每个不同的CRC值,这个数据的索引都会相应地增加,但程序却没有检查数组的大小限制。这样一来,如果程序在处理过程中遇到数量足够的不同的“organizationName”值时,就会导致基于栈的缓冲区溢出漏洞。

攻击者可以利用这个漏洞将大量任意数据覆盖到栈中。通过逆向CRC32算法可知,我们可以构造某个ASCII字符串,生成我们需要的CRC值,从而将任意数据写入栈中。

虽然存在该漏洞的函数会在返回时检查某个cookie值,我们还是可以在函数返回之前,将某个对象放置于栈中,从而实现代码执行。

该对象作为第一个参数传递给存在漏洞的函数,位于0x1C偏移处(PoC中该值更改为0xdeadbeef)的字段会被传递给global_function0()函数。

global_function0()函数会调用sub_2F70B90(),并将[0xdeadbeef+0x22C]处数据作为当前对象传递给调用的函数。

sub_2F70B90()函数会从当前对象指针中提取一个dowrd:

最终该数据会作为当前对象传递给sub_2F6F120()函数:

sub_2F6F120()最终会从某个指针中提取一个dword,这个指针有可能是攻击者构造的任意指针,这样会导致程序跳转到某个任意地址上。

能否跳转到任意地址取决于攻击者能否将构造的内容存放到某个固定的地址中。攻击者可以通过堆喷射(heap spraying)技术实现这一目标。根据Bitdefender引擎的复杂度,我们认为这种可能性是存在的。

三、其他说明


感谢独立安全研究员Pagefault将该漏洞报告给SecuriTeam安全披露项目。

Bitdenfender已经在7.71417版中修复了该漏洞。

转自安全客,原文链接:http://bobao.360.cn/learning/detail/3891.html

(0)

本文由 安全周 作者:空心 发表,转载请注明来源!

热评文章

发表评论