利用PolyTracker检测aCropalypse漏洞:技术解析与实践指南

本文深入解析aCropalypse漏洞的检测技术,详细介绍如何通过PolyTracker工具识别PNG文件中的盲点数据。通过实际案例演示漏洞检测流程,包含Docker环境配置、文件结构分析和数据流追踪等实操步骤,为开发人员提供有效的安全检测方案。

如何避免aCropalypse漏洞

aCropalypse来袭!

上周,被昵称为"aCropalypse"的CVE-2023-21036漏洞消息在Twitter和其他媒体上迅速传播。我很快意识到,我们的工具PolyTracker能够检测到这个底层缺陷。我将解释PolyTracker如何在不具备特定文件格式知识的情况下检测受此漏洞影响的文件,使用acropalypse.app可以恢复文件的哪些部分,以及谷歌和微软本可以通过使用我们的工具来发现这个漏洞。

巧合的是,我和同事Evan Sultanik、Marek Surovič合著的一篇论文描述了这类漏洞,定义了一种新的检测方法,并介绍了我们的实现和工具。该论文将出现在今年IEEE安全与隐私研讨会上的语言理论安全(LangSec)研讨会上。

理解aCropalypse

根据这条推文,可以从经过裁剪或编辑的截图中恢复原始图像的部分内容。简而言之,当使用谷歌Pixel内置的截图编辑工具Markup进行图像裁剪或调整大小时,它会覆盖原始图像,但只覆盖到新图像结束的偏移量位置。原始图像在该偏移量之后的任何数据都会在文件中保持完整。David Buchanan设计了一种算法来恢复文件中遗留的原始图像数据。

最近,Chris Blume发现了Windows截图工具的类似漏洞。我们在此描述的方法论也可用于分析Windows截图工具生成的图像。

处理aCropalyptic文件会出现盲点

PolyTracker有一个我们在几年前引入的功能,称为盲点检测。我们将盲点定义为那些数据流既不影响导致输出的控制流,也不影响输出本身的输入字节集合。换句话说,就是可以更改为任何内容而不影响输出的未使用文件数据。

跟踪PNG图像或PDF文档等真实世界输入的字节并检测盲点的一个挑战是污点爆炸。PNG文件格式包含压缩的图像数据块。压缩特别容易导致污点爆炸,因为输入字节以多种方式组合产生输出字节。PolyTracker独特的污点结构表示允许我们跟踪2^31个独特的污点标签,这对于分析图像数据zlib解压缩过程中传播的污点是必要的。

实际操作演示!

使用PolyTracker插桩的pngtest应用程序,我们加载、解析以下图像,然后再次存储到磁盘。在此处理过程中,我们通过PNG和zlib处理跟踪所有输入字节,直到它们以某种形式到达输出文件。

我们使用包含PolyTracker插桩pngtest应用程序的Docker镜像:

1
2
3
$ docker run -ti --rm -v $(pwd):/workdir acropalypse
$ cd /workdir
$ /polytracker/acropalypse/libpng-1.6.39/pngtest.instrumented re3eot.png.png out_re3eot.png.png

re3eot.png图像大小为1,044,358字节,而out_re3eot.png为697,182字节。虽然这表明文件大小显著减小,但此时我们无法确定原因;例如,可能是不同压缩设置的结果。

接下来,让我们查找此过程中的盲点:

1
2
3
4
5
$ polytracker cavities polytracker.tdag

100%|███████████████████| 1048576/1048576 [00:01<00:00, 684922.43it/s]
re3eot.png,697120,1044358
out_re3eot.png,37,697182

我们感兴趣的输出是:re3eot.png,697120,1044358

这告诉我们从偏移量697,120到文件末尾的数据在生成输出图像时被忽略了。我们找到了一个盲点!额外的347,238字节未使用数据可能来自原始图像——这是aCropalypse漏洞的迹象。

PolyFile来救援

PolyTracker有一个姊妹工具:PolyFile,这是一个纯Python实现的libmagic清洁室实现,具有来自Kaitai结构体的插桩解析和交互式十六进制查看器。我们将使用PolyFile生成文件结构的HTML渲染来理解为什么文件处理在文件结束之前就终止了。

首先,我们使用以下命令生成表示文件格式的HTML文件:

1
$ polyfile --html re3eot.html re3eot.png

当我们在浏览器中打开re3eot.html文件时,会看到文件的初始表示。通过反复展开左侧的文件结构,我们最终到达最后一个块。

如上图所示,在解释PNG格式时,最后一个块的类型是IEND。该块之后是来自原始文件的剩余数据。注意多余数据从偏移量0xaa320开始——即697,120,与识别的盲点偏移量完全相同。

不止于此

在几乎不了解PNG文件格式的情况下,我们能够使用PolyTracker对现有PNG处理应用程序进行插桩检测,不仅可以检测具有盲点的文件,还可以确定它们的精确位置和范围。

PolyTracker可以检测文件中任何位置的盲点,而不仅仅是在末尾。尽管我们分析的是PNG文件,但PolyTracker不限于特定格式。我们之前使用MμPDF分析过PDF到PostScript的转换。相同的技术适用于任何执行加载/存储或反序列化/序列化操作的应用程序。

致谢

这项研究部分得到了国防高级研究计划局(DARPA)SafeDocs项目的支持。所表达的观点、意见和发现仅代表作者个人,不应解释为代表国防部或美国政府的官方观点或政策。

特别感谢所有为方法和工具提供宝贵反馈的同事,以及分享受漏洞影响文件的贡献者。特别感谢PolyTracker的原始创建者Carson Harmon,他的想法和讨论孕育了这项研究,以及Evan Sultanik帮助撰写这篇博客文章。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计