什么是iOS的安全模式

jhwn8568 8年前發布 | 11K 次閱讀 安全技術 iOS開發 移動開發

作為iOS開發,作品App肯定需要提交到App Store審核。平心而論,App Store確實成功地將許多惡意軟件拒之門外。但是,對開發者而言,應用程序的審核流程是令人沮喪的黑箱操作。

當然,什么是惡意程序是由Apple來定義。因為App Store的存在,所以,如果想要實現某些特定的功能,唯一的手段就是將設備越獄或者騙過App Store的審查。

官方的App審查永遠無法抓到那些鉆空子的惡意程序,所以需要另外一套高效的機制,來阻止惡意程序破壞整個操作系統的安全。

安全啟動

當啟動一臺iOS設備時,系統首先會從只讀的引導ROM中讀取初始化指令,即系統引導程序。這個引導ROM包含Apple官方權威認證的公鑰,它會驗證底層啟動加載器(LLB)的簽名,一旦通過驗證就啟動它。

然后驗證第二級引導程序iBoot,iBoot啟動后設備就可以進入恢復模式或啟動內核。在iBoot驗證完成內核簽名的合法性之后,整個啟動程序開始步入正軌:加載驅動程序、檢測設備、啟動系統守護進程。

這個信任鏈確保所有的系統組件都由Apple寫入、簽名、分發,不能來自第三方機構,特別是那些惡意的攻擊者以及企圖越獄設備的黑客。App啟動時也會用信任鏈去審查簽名。所有的App都必須直接或間接由Apple簽名。

越獄工作的原理正是攻擊這一信任鏈。越獄工具的作者需要找到這一信任鏈條上的漏洞,從而禁掉鏈條中負責驗證的組件。破解引導ROM通常是最可取的方法,因為該組件不會因Apple今后的軟件更新而改變。

沙盒機制

App的沙盒機制是一種基于FreeBSD系統TrustedBSD框架的強制訪問控制(MAC)機制,它采用一種類似于Lisp的配置語言來描述哪些資源系統可以訪問,哪些禁止訪問。這些資源主要包括文件、系統服務、網絡連接、內存資源等。

MAC機制不同于傳統的訪問控制機制(比如自主訪問控制(DAC)),它不允許主體(比如用戶進程)操作對象(文件、套接字等)。DAC最常見的形式就是UNIX系統上的用戶、組和其它權限,所有這些都可以被授予讀、寫或執行的權限。在DAC系統中,用戶如果擁有一個對象的所有權,也就擁有該對象的修改權限。

MAC在沙盒中意味著App被關進了一個虛擬的容器。該容器遵循一系列的特定規則,即哪些系統資源可以訪問。

在文件訪問方面,一般只能訪問App的包目錄;App可以讀寫存儲在該位置的文件。

Android的訪問控制機制與MAC不同。Android實現了一個更加傳統的DAC模型,App都有自己的用戶ID和屬于該ID的文件夾,其權限管理嚴格按照傳統的UNIX文件權限管理運作。雖然這兩項機制工作起來都沒有問題,但MAC的擴展性總體來說還是更強一些。比如,除了App目錄隔離,MAC機制還可以限制網絡訪問或系統守護進程的操作。

數據保護和全盤加密

數據保護和全盤加密兩機制可以實現遠程抹除設備數據,在設備丟失的情況下保護用戶數據免于泄漏。

文件系統加密并不能防止從一個正在運行的設備上竊取數據的行為。如果一個App可以從磁盤中讀取一個文件,那文件系統加密并沒有任何用武之處,因為內核對于任何嘗試讀取這些文件的進程都是透明解密的。換句話說,相比那些讀取文件的調用行為,文件系統加密工作都是更底層。一旦攻破者攻破了系統驗證,那就能無障礙地讀取任意文件。

全盤加密對于以下兩個安全特性是必要的:安全刪除文件、遠程設備擦出。iOS中使用的加密密鑰是分層級的,只需要簡單丟棄一個加密密鑰就能徹底銷毀整層的數據,甚至是銷毀整個文件系統。

加密密鑰的層級

iOS文件系統中用于數據加密的密鑰是分等級的,即用密鑰來加密其它密鑰,這樣Apple就能更精確的控制數據什么時候可用。

文件密鑰(File Key)針對每個文件獨立生成,存儲在文件的元數據中。

層級密鑰(Class Key)為數據提供不同級別的保護。

文件系統密鑰(Filesystem Key)是一種全局加密密鑰,當元數據被層級密鑰加密后,使用文件系統密鑰來加密涉及文件安全的元數據。

設備密鑰(Device Key)通常被稱為UID密鑰,每臺設備唯一,只能通過硬件的AES引擎訪問,操作系統無法直接獲取。它是系統的主密鑰,用來加密文件系統密鑰和層級密鑰。

用戶密碼(User Passcode),可與設備密鑰結合起來加密層級密鑰。

一旦設置密碼,這個密鑰等級也允許開發者自己決定本地存儲的數據該如何保護,包括在設備鎖定時是否能被訪問、數據能否備份到其它設備等。

ASLR和XN及其它機制

iOS用兩套標準機制來預防代碼執行攻擊:地址空間結構隨機化(ASLR)和XN bit(eXecute Never,標記該段內存區域不包含可執行代碼)。

每次執行程序時,ASLR都會隨機分配程序、數據、堆和棧的內存位置。而共享庫的內存地址只在每次系統重啟時隨機設置,因為共享庫需要在多個進程中使用。ALSR機制可以預防緩存區移除攻擊(return-to-libc),因為函數和庫的內存地址隨機,而這種攻擊依賴于基本庫和函數的已知地址。

XN bit,一般對應非ARM平臺的NX(No-eXecute)bit,允許操作系統將某段內存標記為不可執行,這由CPU來控制。在iOS中,這個機制默認應用在程序的棧和堆上。

每個程序都有一段可寫可執行的內存,但是它必須是經過Apple官方簽名授權系統的簽名。Safari瀏覽器中的JavaScript-in-time(JIT)編譯器會用到這段內存。而WebView并不具備JIT功能,這樣雖然可以避免代碼執行攻擊,但是也使得iOS平臺上的Chrome無法做到像Safari那樣好用。

越獄檢測

越獄的本質就是通過一系列步驟來禁掉簽名機制,從而允許設備運行未經Apple官方審核的應用。黑箱測試應用程序是越獄的重要能力。

其實,越獄不一定要禁掉iOS的沙盒機制,它只是允許你在沙盒外安裝App。安裝在移動用戶主目錄下的App(即通過App Store安裝)仍然受到沙盒限制。第三方的App需要安裝在越獄設備中權限更高的 /Applications 目錄下,與Apple股票應用安裝在一起。

動態修復

一般來說,如果一段原生代碼沒有經過Apple發布的密鑰簽名認證,App則無法運行它。如果Apple的簽名驗證邏輯中存在bug或漏洞,可能會允許下載和執行原生代碼。

iOS有一個特性,可以讓程序分配一段沒有NX保護的內存區塊(該內存區塊可讀、可寫,甚至可執行),里面運行的代碼也不需要經過簽名認證。這個機制在Safari上的JIT編譯器上使用。這個運用場景中,就可能會產生漏洞,業界著名的例子就是Charlie Miller。

 

來自:http://charsdavy.github.io/2017/04/19/ios-security-pattern/

 

 本文由用戶 jhwn8568 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!