指標驗證碼對於iOS越獄意味著什麼?
9月12日,蘋果公司釋出了他們的下一代iPhone,三款新的iphone分別是iphoneX S、iphoneX S Max和iphoneX r,不得不說今年的蘋果命名方式真的很奇葩。不過,對蘋果來說,這幾款手機的功能可謂是史上最強大的。在這份 ofollow,noindex">介紹裡 ,他們談到了新一代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的想法了。