如何避免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镜像:
|
|
re3eot.png图像大小为1,044,358字节,而out_re3eot.png为697,182字节。虽然这表明文件大小显著减小,但此时我们无法确定原因;例如,可能是不同压缩设置的结果。
接下来,让我们查找此过程中的盲点:
|
|
我们感兴趣的输出是:re3eot.png,697120,1044358
这告诉我们从偏移量697,120到文件末尾的数据在生成输出图像时被忽略了。我们找到了一个盲点!额外的347,238字节未使用数据可能来自原始图像——这是aCropalypse漏洞的迹象。
PolyFile来救援
PolyTracker有一个姊妹工具:PolyFile,这是一个纯Python实现的libmagic清洁室实现,具有来自Kaitai结构体的插桩解析和交互式十六进制查看器。我们将使用PolyFile生成文件结构的HTML渲染来理解为什么文件处理在文件结束之前就终止了。
首先,我们使用以下命令生成表示文件格式的HTML文件:
|
|
当我们在浏览器中打开re3eot.html文件时,会看到文件的初始表示。通过反复展开左侧的文件结构,我们最终到达最后一个块。
如上图所示,在解释PNG格式时,最后一个块的类型是IEND。该块之后是来自原始文件的剩余数据。注意多余数据从偏移量0xaa320开始——即697,120,与识别的盲点偏移量完全相同。
不止于此
在几乎不了解PNG文件格式的情况下,我们能够使用PolyTracker对现有PNG处理应用程序进行插桩检测,不仅可以检测具有盲点的文件,还可以确定它们的精确位置和范围。
PolyTracker可以检测文件中任何位置的盲点,而不仅仅是在末尾。尽管我们分析的是PNG文件,但PolyTracker不限于特定格式。我们之前使用MμPDF分析过PDF到PostScript的转换。相同的技术适用于任何执行加载/存储或反序列化/序列化操作的应用程序。
致谢
这项研究部分得到了国防高级研究计划局(DARPA)SafeDocs项目的支持。所表达的观点、意见和发现仅代表作者个人,不应解释为代表国防部或美国政府的官方观点或政策。
特别感谢所有为方法和工具提供宝贵反馈的同事,以及分享受漏洞影响文件的贡献者。特别感谢PolyTracker的原始创建者Carson Harmon,他的想法和讨论孕育了这项研究,以及Evan Sultanik帮助撰写这篇博客文章。