2023-05-19
Xpdf漏洞挖掘实战
新的安全形势下,漏洞已经成为网络安全的最大隐患,而漏洞挖掘与发现作为网络安全的核心技术之一,一直是安盟信息不断探索的方向。只有不断提升漏洞挖掘能力,才能持续提升网络安全主动防御能力和水平,安盟信息灵犀实验室带来Xpdf漏洞挖掘实战分享。

Xpdf 于 1995 年首次发布,是一项老牌的开源PDF浏览器,兼容linux、window、MacOS系统,除了PDF浏览功能外,Xpdf 还提供文本提取器、PDF-to-PostScript转换器和其他实用工具,它由 Derek Noonburg 编写并仍在维护中。
Xpdf 包是开源的,在 GPL v2 和 GPL v3 下双重许可。

一、环境搭建
实验机器

搭建虚机:Ubuntu 20.04.5 LTS

虚拟机内存:2GB

虚拟机处理器:单核单线程

实体机:windows11 21H2

实体机内存:16G

实体机处理器:i7-10750H CPU @2.60GHz

搭建AFL++

更新源、安装AFL++依赖

构建AFL++

在控制台输入 afl-fuzz显示下图界面表示安装成功。

搭建目标软件

下载Xpdf 3.02

在编译xpdf之前需要安装一些依赖

构建Xpdf


二、模糊测试
首先为模糊测试项目创建一个新目录


为AFL++准备一些测试用例


查看pdf的二进制信息。

清理 install 文件夹、xpdf-3.02文件夹的可执行文件。
使用 afl-clang-fast 编译器构建xpdf:

使用下面的命令开始模糊测试
如果AFL++没有正常运行,出现下面的错误,输入下面的命令就可以了。


因为在执行afl-fuzz前,如果系统配置为将核心转储文件(core)通知发送到外部程序,将导致将崩溃


信息发送到Fuzzer之间的延迟增大,进而可能将崩溃被误报为超时。所以得临时修改core_pattern文件。



很快就可以看到下图内容

在findings in depth这一列表中可以看到 total crashes 已经有16个了。在 process timing中还可以看见fuzz的时间。
三、详细分析

让它崩溃

在out目录找到变异后的文件。
使用下面的命令运行文件,发现程序崩溃。


动态调试

使用源码编译,调出带调试符号的文件。

使用gdb进行动态调试

无法读取 0x7fffff7fe0 处的内存

查看crash调用路径,发现很多 Parser::getObj 函数的调用,从这里看几乎可以确定是无限递归了。
查看 Parser.cc 源码。
查看源码发现Getobj函数——>makeStream函数——>shift函数,产生递归调用。
查看官方修补方案,发现添加了检查递归的次数。

安盟信息灵犀实验室汇聚众多专业技术研究人员,从事攻防技术研究,在安全领域前瞻性技术研究方向上不断前行,为各行业客户提供全方位的网络安全解决方案,快速提升客户整体网络安全性,助力网络安全升级,赋能数字经济安全发展!