HWASan1 和HWASanIO2 等借助ARM的高字节忽略(Top Byte Ignore,TBI)的硬件特性,使用内存标记检测内存错误。TBI是指64位ARM机器中,程序64位地址中最高的字节被硬件忽略,实际的地址空间只有56位。我们在鲲鹏服务器和openEuler操作系统上验证这个特性。x86的机器上没有这一特性,我们也在个人台式计算机的Ubuntu WSL上作验证。有基于此,本文编写代码并做对比测试。
验证代码
我们编写代码如下。逻辑很简单,将一个正常的指针的高字节置为0xff
,在鲲鹏服务器上,程序依然能够正确寻址,而在x86上不行。
#include <stdio.h>int main(){int a = 100;int *p = &a;printf("p=%p, *p=%d\n", p, *p);unsigned long tmp = (unsigned long)p;tmp |= 0xff00000000000000;p = (void*)tmp;printf("p=%p, *p=%d\n", p, *p);return 0;
}
运行结果
我们发现,在ARM机器上,篡改指针的头部字节,并不会影响指针访问内存;而在x86上则会报告段错误。
在ARM机器上的运行结果
p=0xfffff8f02e8c, *p=100
p=0xff00fffff8f02e8c, *p=100
在x86机器上的运行结果
p=0x7ffcbd058c44, *p=100
Segmentation fault
上述结果可以看出,ARM硬件确实忽略了指针的头部字节。而这个特性,在x86硬件上没有。
https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html ↩︎
https://dl.acm.org/doi/10.1145/3589250.3596139 ↩︎