麦斯科技 · 2021年07月04日

赞助帖子:使用Arm内存标签扩展(MTE)保证应用程序的内存安全

https://www.anandtech.com/show/16759/sponsored-post-keep-your-apps-memory-safe-with-arm-memory-tagging-extension-mte

作者:Sponsored Post 美国东部时间2021年6月14日12:30

Hero_678x452.jpg

细微的内存错误,包括缓冲器溢出和指点错误,在应用程序内创建滴答作响的定时炸弹。恶意行为者可以利用这些错误执行未经授权的代码,接管系统将其添加到恶意软件僵尸网络,或者只是导致应用程序和系统崩溃。1988 年臭名昭著的Morris 蠕虫是恶意应用利用缓冲溢出的最早例子之一。创建潜在漏洞的记忆安全问题的公告以惊人的频率出现,无论是来自安全研究人员还是在野外发现松散。

对用户的影响可能很大。流氓应用程序可以利用不安全的内存,以便访问嗅出敏感数据,如用户凭据和密码,从而能够访问系统中更高级别的权限。这允许不良行为者访问机密数据或使系统成为更大的僵尸网络的一部分。导致问题的并不总是外部力量-有时不安全的内存会导致不可预知的系统崩溃,由于内存泄漏和相关问题,令人沮丧的用户。据估计,三分之二的Android漏洞是由于不安全的内存实践造成的。

Arm内存标记扩展

基于软件的解决方案,包括地址消毒剂(Asan),通过将内存损坏检测集成到现代编译器中,有助于缓解这些内存问题。然而,Asan需要在应用程序代码中添加软件工具,这会显著降低应用程序运行速度并增加内存使用,尤其是在移动和嵌入式系统中。

我们需要的是一个解决方案来检测和最小化内存错误,而对性能和内存使用的影响最小。正确地实现基于硬件的方法来检测潜在的不安全内存使用,可以减少内存使用并提高性能,同时提高系统的可靠性和安全性。

Arm引入了内存标记扩展作为Armv8.5指令集的一部分。MTE现在内置于Arm最近宣布的兼容Armv9的CPU中,比如Cortex-X2、Cortex-A710和Cortex-A510。未来基于Armv9的cpu也将集成MTE。这些都包括作为体系结构基本部分的内存标记。

内存标记背后的思想非常简单:在内存块中添加一小部分位,以确定它们对于应用程序使用是安全的。Arm将内存标记作为一个两阶段系统来实现,即锁和钥匙:

  • 地址标记。

这将向进程中每个指针的顶部添加四位。

地址标记只适用于64位应用程序,因为它使用顶级字节忽略,这是Arm的64位功能。

地址标签充当虚拟“钥匙”

  • 记忆标记。内存标记也由4位组成,但与应用程序内存空间中的每个对齐的16字节区域相链接。Arm将这些16字节区域称为标记颗粒。这四个位不用于应用程序数据,而是单独存储的。记忆标签是“锁”。

虚拟地址标记(钥匙)必须与内存标记(锁)匹配。否则,就会发生错误。

MTE_Fig1_575px.png

图1。锁和钥匙访问内存的示例

因为地址标签必须与内存标签匹配,所以您可能会注意到的第一件事是4位只有16个变量。这使得MTE是一个随机过程,这意味着一把钥匙可能与另一把锁不匹配。据Arm称,这种情况发生的可能性不到8%。

由于地址和内存标签经常被动态地创建和销毁,内存分配单元的作用是确保顺序内存标签总是不同的。MTE也支持随机标签生成。内存分配器理解顺序标记必须是不同的,再加上随机标记生成功能意味着标记冲突的实际频率非常低。此外,在数百万(或数十亿)设备上运行MTE可以为系统和应用软件提供健壮的错误检测。

底层架构

Armv8.5和v9实现了一种新的内存类型,Arm为普通的标记内存配音。CPU可以通过比较地址标签和相应的存储器标签来确定存储器访问的安全性。开发人员可以选择标记不匹配是导致同步异常还是异步报告异常,从而允许应用程序继续。图2显示了如何在ARMCPU设计中实现MTE。
MTE_Fig2_575px.png

图2.Arm总体计算解决方案(Armv9)

异步不匹配详细信息在系统寄存器中累积。这意味着操作系统可以隔离与特定执行线程的不匹配,并根据正在进行的操作做出决策。

同步异常可以直接识别导致标记不匹配的特定加载或存储指令。Arm向指令集添加了各种新指令,用于操作标记、处理指针和堆栈标记,以及用于低级系统。

实现Arm MTE

MTE在硬件上处理;已修改加载和存储指令以验证地址标记是否与内存标记匹配,并且硬件内存分配确保地址和内存标记创建的随机化。这对操作系统开发人员和最终用户应用程序程序员有不同的含义。

Arm增强了其AMBA 5相干互连以支持MTE。标记检查逻辑通常内置于系统级缓存中,标记检查和标记缓存发生在DRAM接口之前。图3显示了一个示例框图。

MTE_Fig3_575px.png

图3:显示如何在SoC设计中实现MTE的示例框图(来源:Arm)

必须修改操作系统才能完全支持MTE。Arm最初通过创建一个实现标记的Linux内核版本来原型化MTE。谷歌已表示有意将MTE添加到Android中,并正在与SoC开发者合作,以确保兼容性。

最终用户应用程序开发人员在假设操作系统支持MTE时会更容易一些。由于MTE发生在操作系统和硬件的幕后,因此应用程序不需要修改源代码。堆内存的MTE标记不需要额外的工作。但是,使用堆栈内存标记现有运行时上的内存需要编译器支持,因此需要重新编译现有的二进制文件。这是直接的,因为移动应用程序开发人员经常推出更新无论如何。图4显示了实现MTE时的软件开发时间表。

MTE_Fig4_575px.png

图4:MTE软件开发时间表

确保内存受到保护可能需要将内存对象与标记颗粒对齐(16字节对齐)。这可以提高堆栈和内存的利用率,尽管影响似乎相当小。

为什么使用Arm MTE?

MTE为开发者提供了一些生活质量的改进。MTE允许程序员快速找到与内存相关的bug,从而加快应用程序的调试和开发过程。由于可以更快地发现并消除内存错误,因此诸如内存泄漏、内存争用情况和其他与内存相关的崩溃等问题变得更加罕见。这反过来又改善了最终用户体验。

内存安全漏洞约占所有常见漏洞和暴露(CVE)漏洞的三分之二,因此MTE允许公司以更少的漏洞更快地发布应用程序。最终用户通常不愿意升级到新的硬件或操作系统软件,但MTE为他们提供了升级的切实理由,包括改进的稳定性和整体安全性。

更多信息

您可以在各种源代码中找到关于Arm内存标记扩展的更详细信息。

Arm的白皮书描述了其MTE的实现。https://developer.arm.com/-/media/Arm%20Developer%20Community/PDF/Arm_Memory_Tagging_Extension_Whitepaper.pdf

Google的Konstantin Serebryany 在一篇关于MTE如何用C/C++提高内存安全性的详细论文。https://www.usenix.org/system/files/login/articles/login_summer19_03_serebryany.pdf

Arm如何在Linux内核中实现MTE。https://www.kernel.org/doc/html/v5.12-rc4/arm64/memory-tagging-extension.html

推荐阅读
关注数
5845
内容数
525
定期发布Arm相关软件信息,微信公众号 ArmSWDevs,欢迎关注~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息