赞
踩
HWASan1 和HWASanIO2 等借助ARM的高字节忽略(Top Byte Ignore,TBI)的硬件特性,使用内存标记检测内存错误。TBI是指64位ARM机器中,程序64位地址中最高的字节被硬件忽略,实际的地址空间只有56位。我们在鲲鹏服务器和openEuler操作系统上验证这个特性。x86的机器上没有这一特性,我们也在个人台式计算机的Ubuntu WSL上作验证。有基于此,本文编写代码并做对比测试。
我们使用装载鲲鹏920(ARMv8.2)处理器的泰山服务器上完成验证,操作系统为openEuler。
$ uname -a
Linux Taishan200 5.10.0-60.18.0.50.oe2203.aarch64 #1 SMP Wed Mar 30 02:43:08 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
我们编写代码如下。逻辑很简单,将一个正常的指针的高字节置为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;
}
使用gcc编译运行,发现,在ARM机器上,篡改指针的头部字节,并不会影响指针访问内存;而在x86上则会报告段错误。
p=0xfffff8f02e8c, *p=100
p=0xff00fffff8f02e8c, *p=100
p=0x7ffcbd058c44, *p=100
Segmentation fault
上述结果可以看出,ARM硬件确实忽略了指针的头部字节。而这个特性,在x86硬件上没有。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。