BlackHat Europe 2023 议题学习(二)

BlackHat Europe 2023 - LogoFAIL: Security Implications of Image Parsing During System Boot

BlackHat USA 2009 - Attacking Intel® BIOS - PDF

0x01. 议题简介

《LogoFAIL: Security Implications of Image Parsing During System Boot》这个议题主要介绍 BIOS 启动时 Logo 图片解析相关的漏洞,顺便提及了 2009 年的一个类似的议题《Attacking Intel® BIOS》,也是 BIOS 启动时 BMP 解析导致的整数溢出漏洞。所以,作者也感叹 History Repeats Itself。

在漏洞挖掘过程中,攻击面的挖掘是一个很重要的点,如果能找到大家(厂商、安全研究员、攻击者)都没怎么关注过的攻击面,极有可能收获一波 Low Hanging Fruits。

0x02. Attacking Intel BIOS

2.1 研究思路

更新 BIOS 固件时,固件包必须有合法的数字签名,作者的思路是看看有没有不需要签名的数据,在这部分数据上做研究。而 BIOS 的 Logo 图片便满足这一条件,在启动的早期阶段,图片会被解析和展示,这就来到了经典的文件格式解析问题。

2.2 漏洞案例

解析 BMP 图片格式时,存在经典的整数溢出漏洞。

EFI_STATUS ConvertBmpToGopBlt()
{
// ......
if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') {
return EFI_UNSUPPORTED;
}
BltBufferSize = BmpHeader->PixelWidth * BmpHeader->PixelHeight
* sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
IsAllocated = FALSE;
if (*GopBlt == NULL) {
*GopBltSize = BltBufferSize;
*GopBlt = EfiLibAllocatePool(*GopBltSize);
}
// ......
}

因为触发了整数溢出,会导致向目标缓冲区写入大量数据,直到访问到未映射的内存页,触发 Page Fault 异常。作者的利用思路是,在溢出的过程中改写 Page Fault Exception Handler,让其跳转到 BMP 图片中的执行 Shellcode。利用思路如下:

BMP 解析整数溢出漏洞利用

0x03. LogoFAIL

研究思路和前面是完全一致的,发现 UEFI 固件会解析如下图片格式:BMP、GIF、PNG、JPEG、PCX 以及 TGA。作者在仿真的环境下做了一些基于 LibAFL 的 Fuzzing。

3.1 漏洞案例

BMP 解析缓冲区下溢漏洞。

BMP 解析缓冲区下溢漏洞

JPEG 解析内存破坏漏洞(未校验 Huffman Table 个数)。

JPEG 解析内存破坏漏洞

PNG 解析整数溢出漏洞。

PNG 解析整数溢出漏洞

3.2 种子文件

PCX 是一种上古时期的文件格式,现在基本没人用了,作者在 Internet Archive 上找到了一个压缩包下载连接。

https://archive.org/details/Universe_Of_PCX_1700_PCX_Files

笔者在过去的工作中也做过 PCX Fuzzing,不过都是 Google 上找的少量零星的样本🤣。

0x04. 小结

攻击面挖掘是重点,老议题也值得回顾(可以开阔思路)。当然,LogoFAIL 中的研究也是有较高门槛的,在当前的国内环境下,一般的公司很可能是不会给这个时间去研究的。

请作者喝杯咖啡☕