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