内存破坏漏洞利用并不总是需要以攻击者编写的指令替换程序原有的控制流。在仅数据攻击中,攻击者会修改一个随后被程序视为合法的值,例如路径、权限标志、文件名或命令参数,而程序仍继续执行其正常代码。一篇发表于 2024 年 7 月 1 日的 USENIX 文章介绍了 Einstein,这是一种旨在自动发现并验证此类路径的研究工具,也对“此类攻击过于专门化或过于耗费人力,因而不具实用性”的假设提出了挑战。

USENIX 为这篇关于仅数据攻击的文章制作的配图
USENIX 为这篇关于仅数据攻击的文章制作的封面配图。www.usenix.org

USENIX 官方文章配图标明了全文讨论的研究来源。

这一区别十分重要,因为常见防御措施主要着眼于阻止控制流劫持。数据执行禁用(DEP)和控制流完整性等防御手段旨在防止攻击者重定向执行流程或运行注入的代码。仅数据攻击则可以保持程序原本预期的控制流不变,同时通过改变一个已获批准操作所消费的数据,仍然造成有害行为。其结果并非绕过了内存安全;它只是内存写入缺陷所造成的一种不同后果。

文章用一个简化的 Web 服务器示例说明了这一点。该服务器通常会将一个已配置的 CGI 目录与所请求的脚本名称组合起来,再通过 `execve` 调用操作系统。如果内存安全漏洞允许客户端将目录变量覆盖为 `/bin`,那么随后对 `/sh` 的请求就可能使服务器执行系统 Shell。服务器执行的仍是同一套操作序列,但其受信任的数据如今让一项普通操作变得危险。

Einstein 所采用的方法刻意与应用无关。它并不为每一种协议或业务规则建立模型,而是在二进制层面对程序进行插桩,标记攻击者可能破坏的数据,并观察这些数据是否会到达安全敏感系统调用的参数。作者将一种特别简单的关系称为“恒等数据流”,即攻击者可控的数据被原样复制到敏感参数中。随后,Einstein 会生成一个候选内存写入,并重新启动程序,以确认该候选方法确实有效。

这一确认阶段非常重要。被污染的值到达系统调用,并不会自动证明漏洞可利用:后续验证、沙箱限制或应用逻辑仍可能阻止攻击者预期的效果。因此,该工具的作者区分了候选方法生成与可用漏洞利用确认。这使结果比静态警告更有说服力,但也意味着相关证据针对的是经过测试的路径和工作负载,而非每一种可能的攻击路线。

USENIX 文章称,评估以 `httpd`、`lighttpd`、`nginx`、`postgres` 和 `redis` 为目标,并利用它们的测试套件生成工作负载。文章还称,针对 nginx 的候选漏洞利用已经得到确认。这些细节表明,研究人员关注的并不只是一个玩具式示例,而是广泛部署的服务器软件。然而,所给文本并不能证明列出的每一款产品目前都存在漏洞,也不能证明某个特定已部署版本可以利用,或证明测试套件中的路径代表了生产配置中最重要的路径。

对防御者而言,最有用的操作性问题并不仅仅是攻击是否避开了恶意代码,而是哪些受信任值在发生内存写入后具有安全关键性。`execve` 使用的路径、传给 `write` 的文件名,或稍后被消费的与权限有关的值,都可能把一条原本普通的代码路径变成高影响操作。这正是数据流分析具有相关性的原因:它有助于追踪可被破坏的字节如何在程序中移动,以及它们在哪里开始具有操作层面的意义。

这些证据也存在局限。文章由 Einstein 的开发者撰写,因此能够直接支持他们对方法和评估的描述,但它并不是针对所有目标开展的独立安全审计。所给材料没有提供漏洞利用代码、受影响版本列表、供应商公告,或与其他分析工具之间可复现的比较。因此,它支持的是一项聚焦的结论:仅数据漏洞利用应当作为一种独立的内存安全后果类别受到重视,尤其是在敏感系统调用参数能够从攻击者可破坏的状态中到达时。

对防御者而言,实际启示是将控制流保护措施与针对敏感数据及系统调用边界的检查结合起来。内存安全仍是根本问题,但阻止代码执行并不等同于阻止合法代码遭到有害利用。Einstein 的价值在于让一类危险的数据流变得可见且可测试;它并未表明所有仅数据攻击都很容易实施,也未表明每一个内存安全漏洞都能被武器化。