0x00 序
隨著蘋果對iOS系統(tǒng)多年的研發(fā),iOS上的安全防護機制也是越來越多,越來越復雜。這對于剛接觸iOS安全的研究人員來說非常不友好,往往不知從何入手。因此,為了讓大家能夠更加系統(tǒng)性的了解iOS上的安全機制,我們從三個方面著眼:代碼簽名(CodeSign)、沙盒機制(SandBox) 和利用緩解(Exploit Mitigation),對iOS的系統(tǒng)安全機制做了一個總結。希望能夠給大家的學習以及研究帶來一定的幫助。注意,以下內容是以最新版的iOS 9.3.4做為標準進行講解。
0x01 代碼簽名(CodeSign)
為了保護開發(fā)者的版權以及防止盜版應用,蘋果系統(tǒng)擁有非常嚴格的簽名保護機制。想要開發(fā)iOS程序,必須先注冊開發(fā)者賬號,并向蘋果申請相關的證書,否則程序只能在模擬器上運行,無法在真機上調試,也無法上架App Store。除了傳統(tǒng)的簽名機制以外,蘋果還額外增加了Team ID的安全防護措施,用來增強iOS系統(tǒng)的安全性。
(1). 傳統(tǒng)簽名機制 - 數(shù)字證書
傳統(tǒng)的簽名機制即iOS系統(tǒng)中使用的數(shù)字證書機制。數(shù)字證書是一種對數(shù)字內容進行校驗的方法,它首先對內容使用摘要算法(例如MD5,SHA1)生成一段固定長度的hash值(可以理解為原內容的摘要),然后利用私鑰對這個摘要進行加密,得到原內容的數(shù)字簽名。接受方一并接收到原內容和數(shù)字簽名,首先用相同的摘要算法生成原內容的摘要,同時用公鑰解密數(shù)字簽名,得到摘要2,然后比較摘要1和摘要2,若相同,則驗證原內容有效。我們從蘋果MC(Member Center)中獲得的數(shù)字證書就是被蘋果CA簽過名的合法的證書。而iOS設備在執(zhí)行app前,首先要先驗證CA的簽名是否合法,然后再通過證書中我們的公鑰來驗證app是否的確是開發(fā)者發(fā)布的,且中途沒有對程序進行過篡改。理論上想要破解或者繞過這個簽名機制,需要能夠獲取到蘋果的私鑰,或者能夠找到簽名校驗過程中的漏洞。
(2). 簽名校驗的實現(xiàn)
iOS在運行代碼前,都會對即將運行的代碼進行簽名校驗。簽名的校驗機制是運行在內核里的。因此想要關閉這個校驗的話,需要對系統(tǒng)進行越獄才行。內核在vm_fault_enter中規(guī)定了絕大部分情況下,具有執(zhí)行位的頁需要進行簽名有效性檢查,如果檢查到該頁簽名無效會為進程設置kill flag。簽名校驗分兩種情況;如果binary是platform binary,系統(tǒng)會直接校驗binary的哈希值是否存在于trustcache中。如果binary是第三方應用程序,會先在內核在檢查執(zhí)行頁對應hash值,而頁hash對應的簽名由用戶態(tài)進程amfid校驗其正確性。