Pointer Authentication
简介
Pointer Authentication是ARM v8.3特性,Qualcomm和Apple的芯片均使能了该功能。Apple在iOS12中引入该功能,并通过PAC实现了用户态以及内核态的CFI,DFI。
PAC利用内存虚拟地址的高位存储内存地址的MAC值来计算和验证指针的完整性,从而保证控制流和数据流的完整性。
如Linux内核文档Documentation/arm64/pointer-authentication.rst中描述,PAC特性使用从54位开始到VA_SIZE位的空闲位存储PAC值。一般虚拟地址有效位为48位,那么用于PAC的就是7位,如果VA_SIZE是52位,那么PAC就只有4位。
与PAC类似的MTE特性,如Documentation/arm64/pointer-authentication.rst所述,则使用虚拟地址的59-56位。
工作原理
PAC的工作原理如下图所示:
假设指针值为ptr,且虚拟地址有效长度为48位,则PAC = ptr[54..48] = QARMA(ptr[47..0], context, key)
。其中QARMA为ARM为PAC设计的MAC算法,算法输入为: