如何避免aCropalypse - The Trail of Bits Blog
aCropalypse已经来临!
上周,关于CVE-2023-21036(绰号“aCropalypse”)的新闻在Twitter和其他媒体上传播开来,我很快意识到我们的工具PolyTracker可以检测到这一潜在缺陷。我将解释PolyTracker如何在没有特定文件格式知识的情况下检测受此漏洞影响的文件,使用acropalypse.app可以恢复文件的哪些部分,以及Google和Microsoft如何通过使用我们的工具来捕获这个错误。
巧合的是,我的同事Evan Sultanik、Marek Surovič和我合写了一篇论文,描述了这类错误,定义了一种检测它们的新方法,并介绍了我们的实现和工具。该论文将出现在今年IEEE安全与隐私研讨会上的语言理论安全(LangSec)研讨会上。
我们使用PolyTracker来检测图像解析器libpng。(任何解析器都可以,不仅仅是aCropalyptic解析器。)PolyTracker的检测告诉我们输入文件的哪些部分被解析器完全忽略,我们称之为盲点。盲点几乎总是文件格式设计缺陷、输入文件畸形和/或解析器错误的指标。正常图像应该几乎没有盲点,但通过libpng解析畸形的aCropalyptic图像会在大盲点中显示裁剪的数据。如果易受攻击的产品使用了PolyTracker进行检测,并测试其输出的盲点,aCropalypse错误本可以被捕获。
|
|
理解aCropalypse
根据这条推文,可以从裁剪或编辑的截图中恢复原始图像的部分内容。简而言之,当使用Google Pixel内置的截图编辑工具Markup来裁剪或调整图像大小时,它会覆盖原始图像,但只覆盖到新图像结束的偏移位置。原始图像中该偏移之后的所有数据都保留在文件中。David Buchanan设计了一种算法来恢复文件中遗留的原始图像数据;您可以在他的博客上阅读更多详细信息。
最近,Chris Blume发现了Windows Snipping Tool的类似漏洞。我们在此描述的Markup工具的方法可以用于Windows Snipping Tool生成的图像。
PolyTracker有一个我们几年前引入的功能,称为盲点检测。我们将盲点定义为输入字节集,其数据流从不影响导致输出的控制流或输出本身。或者,用外行的话说,未使用的文件数据可以更改为任何内容而不影响输出。根据定义,aCropalypse图像的裁剪区域是盲点,因此PolyTracker应该能够检测到它们!
跟踪输入字节并检测真实世界输入(如PNG图像或PDF文档)中的盲点的一个挑战是污点爆炸。PNG文件格式包含压缩的图像数据块。压缩尤其容易导致污点爆炸,因为输入字节以多种方式组合产生输出字节。PolyTracker独特的污点结构表示允许我们跟踪2^31个唯一的污点标签,这对于分析图像数据zlib解压缩过程中传播的污点是必要的。
aCropalyptic文件处理时会有盲点
要理解为什么aCropalypse漏洞会产生盲点,我们需要结合漏洞知识和盲点描述。当使用PNG解析器解析PNG文件时,解析器将解释头部数据并根据PNG规范消费块。特别是,它将在类型为IEND的块结束,即使该块不在文件的实际末尾。
我们使用PolyTracker检测一个工具(来自libpng项目的pngtest),该工具读取PNG文件并再次将其写入磁盘。这将产生一个额外的输出文件,称为polytracker.tdag,捕获运行时跟踪的数据流。使用该文件和PolyTracker的盲点检测功能,我们可以枚举不影响结果图像的输入字节。请记住,这些是输入文件的字节,既不影响任何控制流,也不(可能与其他数据混合)出现在输出文件中。它们在给定解析器的格式解释中没有实际意义。
展示给我看!
使用PolyTracker检测的pngtest应用程序,我们加载、解析并再次将以下图像存储到磁盘。在此过程中,我们通过PNG和zlib处理跟踪所有输入字节,直到它们以某种形式到达输出文件。
我们使用包含PolyTracker检测的pngtest应用程序的Docker镜像。
|
|
re3eot.png图像的大小为1044358字节,而out_re3eot.png为697,182字节。尽管这表明大小显著减少,但此时我们无法确定原因;例如,可能是不同压缩设置的结果。
接下来,让我们从该过程中找到盲点:
|
|
我们感兴趣的输出是:re3eot.png,697120,1044358
这告诉我们,从偏移697,120到文件末尾的数据在生成输出图像时被忽略。我们找到了一个盲点!额外的347,238字节未使用数据可能来自原始图像——这是aCropalypse漏洞的迹象。让我们使用acropalypse.app网页看看是否可以恢复它。
这表明该文件实际上是由易受攻击的应用程序生成的。此时,我们知道图像末尾包含原始图像的数据,因为这是漏洞的核心。我们还知道该数据的确切位置和范围(根据盲点的起始偏移和大小)。为了确认该数据确实是盲点,让我们手动裁剪原始图像并重新进行pngtest操作,以确保结果文件确实相等。首先,让我们只复制不是盲点的部分——用于生成输出图像的数据。
|
|
接下来,让我们再次运行pngtest应用程序:
|
|
如果我们的假设——只有前697,120字节用于生成输出图像——是正确的,我们应该有两个相同的输出文件,尽管从manually_cropped_re3eot.png输入文件中删除了347,238字节。
|
|
成功!为了确保手动裁剪的文件不再受漏洞影响,让我们使用网页尝试重建文件中的额外图像数据。此尝试未成功,因为我们已删除了原始图像内容。(是的,我已经检查了裁剪截图的盲点😁)。
为了更好地理解为什么盲点从特定偏移开始,我们需要检查原始图像的结构。
PolyFile来救援
PolyTracker有一个姊妹工具:PolyFile,一个纯Python的libmagic清洁室实现,具有来自Kaitai结构的检测解析和交互式十六进制查看器。我们将使用PolyFile生成文件结构的HTML渲染功能来理解为什么文件处理在文件结束之前结束。
首先,我们使用以下命令生成表示文件格式的HTML文件:$ polyfile –html re3eot.html re3eot.png。
当我们在浏览器中打开re3eot.html文件时,我们将看到文件的初始表示。
通过反复扩展左侧的文件结构,我们最终到达最后的块。
如上图所示,最后的块在解释PNG格式时具有类型IEND。该块之后是原始文件的剩余数据。注意多余数据从偏移0xaa320开始——即697,120,与识别的盲点偏移完全相同。如果您滚动到末尾,您会发现一个额外的IEND结构(来自原始图像),但这不被解释为PNG文件的有效部分。
不止于此
几乎不了解PNG文件格式,我们能够使用PolyTracker检测现有的PNG处理应用程序,不仅检测具有盲点的文件,还检测它们的精确位置和范围。
PolyTracker可以检测文件中任何位置的盲点,而不仅仅是末尾。尽管我们分析了PNG文件,但PolyTracker不限于特定格式。我们之前使用MμPDF分析了PDF到PostScript的转换。相同的技术适用于任何执行加载/存储或反序列化/序列化操作的应用程序。为了进一步增加我们对格式和漏洞影响的理解,我们使用PolyFile检查文件结构。
这些只是我们工具的几个用例,还有很多其他用例!我们鼓励您自己尝试我们的PolyTracker和PolyFile工具,看看它们如何帮助您识别意外处理并预防应用程序中类似aCropalypse的漏洞。
致谢
这项研究部分由国防高级研究计划局(DARPA)SafeDocs计划支持,作为Galois的子承包商,合同号为HR0011-19-C-0073。所表达的观点、意见和发现是作者的观点,不应解释为代表国防部或美国政府的官方观点或政策。
非常感谢Evan Sultanik、Marek Surovič、Michael Brown、Trent Brunson、Filipe Casal、Peter Goodman、Kelly Kaoudis、Lisa Overall、Stefan Nagy、Bill Harris、Nichole Schimanski、Mark Tullsen、Walt Woods、Peter Wyatt、Ange Albertini和Sergey Bratus对方法和工具的宝贵反馈。感谢Ange Albertini建议使用angles morts——法语中的“盲点”——来命名这个概念,以及Will Tan分享受漏洞影响的文件。特别感谢PolyTracker的原始创建者Carson Harmon,他的想法和讨论催生了这项研究,以及Evan Sultanik帮助撰写这篇博客文章。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News
页面内容 近期文章 使用Deptective调查您的依赖项 系好安全带,Buttercup,AIxCC的评分回合正在进行中! 使您的智能合约超越私钥风险 Go解析器中意外的安全陷阱 我们从审查Silence Laboratories的首批DKLs23库中学到了什么 © 2025 Trail of Bits. 使用Hugo和Mainroad主题生成。