ARM-指针认证

一、介绍

2016年10月,ARMV8.3-A指令集中加入了指针认证(Pointer Authentication)机制,在使用寄存器的值作为指针访问数据或代码之前验证其内容,目的是为了对抗ROP/JOP攻击。

在地址总线宽度为64位的处理器中,并不是所有位全部都使用了,例如,64位的linux使用低48位地址来表示虚拟地址空间,40位地址来表示物理地址和空间,高位地址空间是符号位的扩展。PA利用这一特性,通过特殊指令在寄存器的高位中存入一个验证码(Pointer Authentication Code,PAC),在寄存器内容使用之前进行验证,保证寄存器内容的完整性,并将寄存器中内容恢复原状。攻击者如果想修改寄存器中的内容必须同时正确的修改PAC(这和PAC的机制有关系,下一节详细说)。显然PA只能用在ARMV8.3-A的64位架构中。

64位地址空间的划分

二、指针认证的原理

指针认证机制的基本原理是利用特殊指令根据一个64位的上下文、指针的原始值和一个128位的密钥通过一个加密算法的运算之后得到一个64位的密文,对其进行截断之后作为PAC,在使用该指针之前利用特殊指令对指针值进行验证,验证通过之后将指针的高位恢复原状,否则在指针高位填入错误代码,在寻址阶段会触发例外。

1、特殊指令

PA机制提供了三类特殊的指令:

一类是PAC*指令,用来生成和向指针值中插入PAC。例如,PACIA X3,X4;X3寄存器中是指针的原始值,该指令把X4作为上下文,IA作为密钥,计算PAC,并将PAC添加到指针值中,最后将结果写回X3寄存器中。此时指针的值不可用


PAC加密计算

二类是AUT*指令,用来验证和从指针值中移除PAC。例如,AUTIA X3,X4;X3寄存器中是添加PAC之后的指针值,该指令以X4作为上下文,IA作为密钥再次计算PAC值,并与寄存器中的PAC进行比较,如果计算得到的PAC和寄存器中的PAC是相同的则代表验证通过,把PAC从指针值中去除掉,并将结果写回X3寄存器。

PAC验证计算

三类是XPAC* 类指令,该指令可以移除一个指针的 PAC 并且在不验证指针有效性的前提下恢复指针的原始值。

2、密钥

PA机制中有五类密钥,指令指针密钥IA、IB,数据指针密钥DA、DB和用于PACGA指令的特殊通用密钥GA。密钥是在进程创建时产生的随机值,在进程复制时子进程继承父进程的密钥值,当子进程执行exec()时,得到子进程自己的密钥。这些密钥存储在CPU内部的寄存器中,EL0特权级无法读取该寄存器,EL1特权级的密钥由更高特权级进行管理。

3、加密算法

理论上来说,使用什么加密算法是微体系结构设计者的工作,但是高通白皮书中推荐使用QARMA算法,这种算法是由高通设计的专门用于生成较短的tag的算法,加密时间短,并且安全性足够高。该算法的输入是指针值和上下文,PAC是截断之后的QARMA输出。截断长度取决于处理器虚拟地址的大小配置以及是否使用了“标记地址”功能。与PAC不同,“标记地址”功能允许软件在指针上添加8位标记而不会影响地址转换。如果未启用标记地址功能,则PAC可以使用这些位。由于虚拟地址的大小可以配置为介于32位和52位之间,并且一位(第55位)用于选择虚拟地址空间的高半部分或低半部分,因此当禁用标记地址时,PAC的大小范围为11到31位,启用标记地址时PAC大小范围是从3到23位。PACGA指令始终从QARMA输出截断32位PAC。


禁用标记地址
启用标记地址

三、应用场景

1、软件栈防御

PA机制可以用来保护栈内存空间,防御栈溢出攻击和ROP/JOP攻击。如下示例代码所示,使用的PACIASP和AUTIASP指令是更通用的PACIA X30 SP和AUTIA X30 SP的专用版本。它们分别使用堆栈指针作为上下文标记和验证链接寄存器(X30)。这些专用指令位于NOP空间中,这意味着生成的代码与旧处理器保持二进制兼容。如果不需要向后兼容,则可以使用与AUTIASP + RET等效的组合指针认证指令RETAA来节省额外的指令。

在函数的装入代码中,利用PACIASP对函数的返回地址添加验证码之后再将其存入栈中,函数结束时排空代码中读出栈中的返回地址,对返回地址中的验证码进行验证,验证通过之后将返回地址恢复成原始值。攻击者如果想实施ROP攻击必须更改X30寄存器中的内容,也就必须拿到密钥和SP的值。构造一个相同的SP是容易的,但是,想要拿到密钥没有高权限是很难的。还有一种方法是暴力猜解PAC的值,这种攻击手段的难度取决于PAC的位数。

ROP防御

2、控制流完整性

利用编译时产生的位置信息和上下文,作为PA机制计算PAC时的上下文输入,可以实现控制流完整性。

参考文献

[1]ARM Connected Community Blog, 2016, “ARMv8-A architecture – 2016 additions”,https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/armv8-a-architecture-2016-additions

[2]googleprojectzero,看我如何绕过 iPhone XS 中指针验证机制 (上),https://www.anquanke.com/post/id/171358

[3]高通,https://www.qualcomm.com/media/documents/files/whitepaper-pointer-authentication-on-armv8-3.pdf

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350