导语:随着iphoneX S及其新款A12 Bionic芯片的推出,苹果也在加紧用ARMv8.3替代其他框架,并且随着这种架构的使用,指针验证码(PAC)也出现了。
9月12日,苹果公司发布了他们的下一代iPhone,三款新的iphone分别是iphoneX S、iphoneX S Max和iphoneX r,不得不说今年的苹果命名方式真的很奇葩。不过,对苹果来说,这几款手机的功能可谓是史上最强大的。在这份介绍里,他们谈到了新一代iPhone的新硬件,新功能,新尺寸等。不过他们却没有提到的这些新手机变化最大也是最重要的一个方面,就是采用了新版本的ARM架构:ARMv8.3。使用ARMv8.3 Qualcomm可以为新款手机配置一种全新的指令,这些指令使用了一种称为指针验证码的惊人内存保护技术。
到目前为止,大多数公共越狱涉及到缓冲区溢出、整数溢出、面向返回编程(ROP)、内存泄漏以及其他内存攻击。这些攻击的基本思想是能够执行攻击者控制的代码,并尝试以尽可能高的权限执行。所有现代架构都使用某种类型的内存保护组合,如“Canaries” 探测,DEP,ASLR,但所有这些方法目前都已被越狱,特别是在iOS / ARMv8上,就像越狱iOS 11.3.1-12 beta 4甚至是iPhone X,这使他们越狱最新的软件和硬件成为可能。
随着iphoneX S及其新款A12 Bionic芯片的推出,苹果也在加紧用ARMv8.3替代其他框架,并且随着这种架构的使用,指针验证码(PAC)也出现了。
2016年11月,ARM公司公开了未来的ARMv8.3-A处理器标准中的一些新特性,其中包括增加的CCSIDR寄存器,更弱化的RCpc内存一致性模型,高级SIMD浮点复数支持,改进Javascript数据类型转换和嵌套虚拟化(在Xen中嵌套Xen再嵌套KVM?),也包括了一个值得关注的安全特性:用于防御ROP/JOP攻击的指针验证(Pointer authentication)。这个特性会对寄存器的内容在间接分支和数据引用作为地址使用前进行验证,64位地址的一些最高有效位会作为Pointer Authentication Code (PAC)和地址本身一起存在,验证失败的地址会造成一个异常,创建PAC可以使用标准的QARMA块算法,也可以使用其他私有算法。
为了理解PAC,我们需要了解一下有关加密学的内容,以及消息验证码(又称MACs)。MACs是一小段数据或标签,用于识别某些数据是否被修改,MACs旨在为消息提供完整性检测。目前有许多方法可以在消息上构建MAC,但归根结底它们都使用密钥、签名算法和验证算法。
假设有一个公开可用的签名算法(S)和一个验证算法(V),你和我共享一个密钥(k),这意味着,只有我们知道该密钥。如果我想向你发送一条消息(m),你就需要使用该密钥来验证此消息。无论此消息是加密还是明文形式,我们都会执行以下操作:
1.我用m: tag:= S(m,k)来计算MAC;
2.然后我会发给你m和tag;
3.你收到后,将在m: tag_to_verify:= S(m,k)上计算MAC;
4.验证两次的tag是否相同:if V(tag, tag_to_verify) == true {accept_message};
一个流行的MAC是HMAC或基于哈希的消息验证代码,它使用一个哈希函数(比如SHA256)作为签名和验证算法以及密钥。HMAC通常用于为使用经过身份验证的加密模式(例如aes-128-cbc-hmac-sha-256)加密的密文提供完整性检测, HMAC只是安全MAC的结构之一。
可靠的密码体制必须遵守Auguste Kerckhoffs在1883年提出的一个假设,即Kerckhoffs原理:
即使除密钥外的整个系统的一切都是公开的,这个密码体制也必须是安全的。尤其是即使攻击者知道系统的加密算法和解密算法,此系统也必须是安全的。
A cryptosystem should be secure even if everything about the system, except the key, is public knowledge
Kerckhoffs原理也适用于MAC结构,这意味着签名和验证算法是已知的,唯一的秘密就是密钥。重要的是,如果攻击者想要在任意消息上创建有效的MAC(例如消息的修改版本),为了安全构建MAC,他们需要破坏密钥,否则将产生无效MAC且系统将拒绝该消息。
正在使用的MAC示例:
看一下返回的ARMv8.3和指针验证代码,可以发现PACs使用的是与MAC完全相同的原语,但不是任意消息或数据块,而是为指针提供完整性。
在ARMv8.3中PACs是如何运行的?
1.由于64位架构的地址空间小于64位,因此Qualcomm可以利用PACs的未使用位;
2.由于验证指针在整个程序中会发挥不同的用途,因此要添加上下文变量;
3.根据指针的用途,PACs有5种不同的密钥;
4.指令编码会确定使用哪个密钥;
5.上下文变量值会使用相同的密钥区分不同用途的验证指针;
6.指针验证过程需要两个主要操作:计算和添加PAC,验证PAC并恢复指针值。
7.高通公司为其PAC构建设计了自己的分组密码QARMA;
Qualcomm基本上就是在指令的未使用位上添加完整性信息( PACs),在跳转到指针之前,它们检查这些PACs,如果验证失败,则发出验证失败的错误警报,程序将不再执行下一条指令。如果感兴趣,你可以点此,详细阅读Qualcomm关于指针验证代码的完整描述,你也可以阅读Jonathan Levin(一位经验丰富的技术培训师,他是Technologeeks.com公司的创始人和首席技术官(CTO),在DefCON会议上发表了很多技术演讲)的博文。
不过幸运的是,加密系统很难得到正确的消息。 SSL/TLS、加密币、全磁盘加密……证明我们需要不断更新密码系统以避免攻击,其中一些系统已经存在了20-30年,并经过了许多专家的详细审查。这意味着这些PACs很容易受到MACs 和加密系统的类似攻击,比如:
1.密钥管理攻击:设备生成PAC密钥的方式必须正确,这样攻击者就不会预测到密钥了;
2.在从系统获得许多有效的PAC之后,攻击者不应该能够生成有效的PACs ;
3.定时攻击:对于不同功能的标签和相同功能的标签,验证算法需要花费相同的时间;
4.边信道攻击:攻击者无法通过监控来恢复密钥,例如,使用不同类型的指针执行指令所花费的时间;
总结
对于一个致力于攻击苹果系统的黑客来说,除了要熟知内存管理的知识之外,黑客现在还必须了解加密学以及如何执行完整性检查,只有这样才能攻破高通公司在ARMv8.3上添加的内存/堆栈保护。不过这也说明,苹果公司已经开始注重用密码与内存保护结合的方式来保护iphone了。
目前,黑客已经有了如何攻击PACs的想法了。