安全:漏洞检测
在过去的12个月里,Spectre和Meltdown的发现占据了安全相关的主要议题。 但是,它们不是我们当前面临的仅有的安全挑战,arm一直和合作伙伴一起开发硬件工具以帮助软件抵御攻击。
许多常见的软件漏洞是由缓冲区溢出(buffer overrun)和 释放后使用(use-after-free)编程错误导致的。buffer overrun指一个程序试图访问超过其本来边界的内存。use-after-free发生在一个程序访问和重用它已经释放的内存时。通常,这些错误是情景相关的,需要特定的环境才会发生。非常有名的发生在1988年的Morris的蠕虫是有记载的第一个使用buffer overrun来制造病毒的。
Memory Tagging(内存标签)
Armv8.5-A引进一个叫Memory Tagging 的新功能。 当使用Memory Tagging时,每个内存分配(memory allocation)都会分配一个标签(tag). 所有内存必须通过有正确标签的指针来访问。 错误的标签会被注意到,操作系统可以选择马上汇报这个问题给用户,或是通知进程发生过这个问题,以便后面去研究。
比如,在下面的图中,对0x8000的内存访问没有问题,因为用来访问的指针有和被访问的内存有相同的标签(用颜色来表示)。但是,对0x9000的访问会失败,因为指针和被访问的内存用不同标签。
内存标签技术可以用在很多场合。在开发阶段,它可以在测试环境中用来检测内存错误问题。在产品量产阶段,它可以在线检测问题,并将反馈提供给开发者。一旦受到反馈,可以分析这个漏洞,并在它被攻击者发现之前修复它。
安全:限制利用(Exploits)
一旦攻击者发现可以利用的漏洞,他们下一步的目标就是能执行代码来获取机器的控制权。攻击者可以使用ROP和JOP(Return- and Jump-Oriented Programming)的工具方式,这些技术通过发现有漏洞程序中一个个小段代码片段(叫做gadgets),并将它们连接起来形成攻击者想要的代码运行。这种方式可以被利用,因为构架没有限制跳转指令可以跳转的地址,也没有限制代码可以从哪里跳转过来。这使攻击者可以使用这些代码片段,做他们想做的事情。
在Armv8.3-A中,我们引入了指针鉴权(Pointer Authentication)功能,我们可以用这个功能保证函数返回到程序期望的地址。
在Armv8.5-A中,我们引入了Branch Target Indicators (BTI). 支持BTI的系统可以强制非直接跳转只能跳到一小部分允许的指令上(译者:BTI指令,和一些PAC Signing指令). 这可以减少攻击者执行任意代码的能力。
指针鉴权和BTI功能一起使用,可以显著减少攻击者能用的gadget的数量。剩下可用的gadget的代码大小就比较大,这使攻击者想去使用这些gadget更加困难,即使他们发现了一个可以获得机器控制的漏洞。
其他功能
Armv8.5-A也包含一些小功能:
Cache clean到Point of Deep Persistence – 用来支持新兴的Persistent Memory标准
细化的虚拟化trap控制 -用来提供虚拟机的性能
支持debug over power down -用来使机器在下电复位过程中可以做外部调试
随机数指令 – 提供符合各个国家和国际标准的确定性随机数和真随机数(Deterministic and True Random Number)
总结
这篇博客提供了简要的Armv8.5-A构架功能介绍。
原作者:Matthew Gretton-Dann
|