2020年6月,英特尔宣布其首个基于硬件的控制流执行技术(Control-flow Enforcement Technology,CET)正式可用。这一硬件级保护机制自第10代和第11代酷睿处理器起逐步部署,并已集成进新版的 Windows 和 Linux 系统。CET 的目标是让所谓的代码重用攻击更难实施——在这类攻击中,攻击者并不注入新代码,而是滥用程序中已有的代码片段来破坏系统。
不过,研究人员发现,即便启用了 CET,攻击者仍然可以在不同程序库之间进行跳转,从而绕过保护。为应对这一问题,CISPA 教授 Christian Rossow 团队的 Apostolos Chatzianagnostou 和 Marcos Bajo 设计了额外安全层 PLaTypus,用于限制这种跨库自由跳转。相关成果将于 2026 年 5 月 18 日至 21 日在旧金山举行的第 47 届 IEEE 安全与隐私研讨会(SP2026)上正式发布。
代码重用攻击已经威胁软件安全超过二十年。攻击者通常利用现有程序组件,而不是注入全新的恶意代码。这类攻击往往依赖内存破坏类漏洞,例如 C/C++ 软件中的缓冲区溢出或 use-after-free(使用后释放)错误。
CISPA 研究员 Chatzianagnostou 指出:“这类漏洞可能出现在网络服务器、浏览器或 VPN 系统等多种环境中。一旦攻击成功,攻击者就可能窃取敏感数据、植入恶意软件,甚至完全接管系统。”
PLaTypus:收紧库间任意跳转
为了削弱代码重用攻击的威力,现代处理器越来越多地依赖硬件级防护,例如英特尔 CET 和 ARM 的分支目标识别(Branch Target Identification,BTI)。这些机制的设计初衷,是阻止攻击者通过篡改间接调用或返回地址,将程序控制流导向意料之外的代码位置。
“预计 CET 或 BTI 等机制在未来几年会成为现代系统的标配。但我们的研究表明,它们仍然留下了关键攻击面:攻击者依旧可以在不同库的函数之间任意跳转。”Chatzianagnostou 解释道。

PLaTypus 正是为弥补这一缺口而提出的额外加固层。它的核心思路是:尽可能将间接跳转限制在同一程序库内部。若需要在不同库之间跳转,则必须通过明确指定的路径,尤其是通过 PLT 存根。PLT 存根是在 Linux 系统中用于在运行时解析和调度共享库函数调用的一小段代码。通过这种方式,PLaTypus 试图阻止攻击者利用被破坏的函数指针,随意跳转到其他库中的任意函数。
“我们的动机其实很直接:如果某个模块在设计上并不需要访问某个函数,那它就不应该能够通过间接跳转到达该函数。”Chatzianagnostou 表示。
注重实用的安全加固
与不少偏理论的学术安全方案不同,PLaTypus 更强调可落地性。它并不试图替代现有的硬件保护,而是作为补充,叠加在已有安全特性之上,并充分利用现代操作系统中已经存在的机制。这样一来,运行时额外开销可以保持在较低水平,也更有利于在现有软件中实际集成。
根据研究团队的评估,PLaTypus 能将库间可被间接访问的函数数量减少超过 98%。在 Nginx 和 Redis 等实际应用上的测试显示,该方案带来的额外运行时开销低于 0.5%。“目前我们的原型是针对英特尔架构实现的,但这一方法同样可以迁移到 ARM 系统上。”Chatzianagnostou 补充道。
从研究原型到工具链集成
目前,PLaTypus 仍处于研究原型阶段。不过,研究团队已经与 LLVM 社区展开沟通,探讨将其集成进标准 LLVM 工具链的可行路径。由于 PLaTypus 是基于 LLVM 的编译器级缓解措施,进入主流工具链将是迈向实际部署的关键一步。
“从学术安全方案走向真实开发工具的过程相当复杂,只有与社区紧密合作才有可能实现——在我们的案例中,就是与 LLVM 开发者协作。我非常期待能在联合项目中把这一目标变成现实。”Chatzianagnostou 表示。
