指針驗證碼對於iOS越獄意味著什麼?
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 ;
一個流行的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的想法了。


※攻擊者的目標已經擴大到了宇宙中:國家安全應考慮衛星系統安全
※滲透測試神器之PowerShell入門必備
TAG:嘶吼RoarTalk |