標籤:

科普 | 你必須了解的漏洞利用緩解及對抗技術

隨著軟體系統越來越複雜,軟體漏洞變得無法避免。業界逐漸推出了讓漏洞無法利用或利用難度提高的方法,簡稱漏洞緩解技術。我們簡單介紹下android和ios中廣泛使用的一些漏洞緩解及可能的繞過技術。當然這裡也包含一些相關聯的安全限制,而非真正意義的緩解技術。

緩解及繞過技術點

User Permissions

每個app有自己uid,selinux_context,只有申請並且用戶允許才有許可權做它想做的事。要突破這些限制,可以考慮通過每個app合理的許可權相互結合後產生的不合理性來入手。或者App之間交互的漏洞,如Android的FileProvider,先拿下此app等。

SELinux、MAC、Sandbox

SELinux是Security Enhanced Linux縮寫,可解釋為「安全加固型Linux內核」,MAC是Mandatory Access Control的縮寫,意為強制訪問控制。Sandbox即沙盒。它們含了一套很複雜的許可權管理策略。基本採用白名單模式,默認禁止任意進程的絕大部分的行為,限制文件訪問,限制系統調用及調用參數。即限制了每個app的行為,也減少了被攻擊面。要突破這些限制,比較可行的方法是攻擊如內核關閉等。

PIE、ASLR、KALSR

PIE是Position Independent Executable的縮寫,與PIC,Position Independent Code一樣。ALSR是Address Layout Space Randomization增強內存地址空間分配的隨機度。可執行文件和動態載入的庫之間的間隔,前後順序均不同,更沒有規律。準確地址未知的情況下攻擊者幾乎不可能完成攻擊,相當於戰場上目標都沒有找到。KALSR中的K是kernel的縮寫,保證每次設備啟動內核的虛擬地址是不同的。要突破這些限制,可採用堆噴射等噴射加各種類型的滑板,提高利用成功幾率。信息泄漏漏洞,如泄漏內存,泄漏文件,獲取內存地址。

DEP、PXN

DEP是Data Execution Protection的縮寫數據不可執行,意味著攻擊者不能直接執行自己的代碼,使攻擊難度變高。PXN是Privileged Execute Never的縮寫,內核態無法運行用戶態可執行數據。要突破這些限制,可利用ROP(Return Orient Program),JOP(Jump Orient Program),stack pivot技術,用程序自己的代碼做攻擊者想做的事。原理是利用現在ABI(Application Binary Interface)的特點,改寫程序的棧,控制多個函數返回地址從而形成鏈,將原有程序自己的代碼片段連起來做攻擊者想做的事。類似生物上的病毒。瀏覽器的話可以改寫JIT(Just In Time)編譯器所用的內存。Android用戶態mprotect,mmap系統調用,把內存改成可執行。

Trust Zone

可信空間,完成指紋、支付、解鎖、DRM和其他認證最保險的一步。即使是操作系統內核也無法訪問其內存。它完成簽名,加密等工作。要突破這些限制,先考慮拿下有許可權訪問的service進程drmservie,gatekeeper。通過Fuzz介面找漏洞。如果拿到代碼執行的許可權的話,就可以跳過指紋驗證悄悄的扣款了。

平滑升級

App自動更新,系統自動下載並提醒開關機時候升級,保證及時修復bug,我們也將此列入到漏洞緩解中。要突破這些限制,可以考慮使用Google的app之間彼此信任,先拿下Google的一個app。讓這個app向Google Play發送安裝請求。

Code Sign

對代碼進行簽名,保證代碼從商店到用戶手機上不會有變化,防止被惡意植入代碼,也防止執行未被蘋果公司審核的代碼。繞過方法這裡就不闡述了。

Secure Boot、Verifying Boot

Secure Boot是iOS中的、Verifying Boot是Android中的,它們保證系統代碼不被修改,保證完美越獄、完美root無法實現。還有一些手機廠商自定義的緩釋措施,如Android的system分區強制只能只讀掛載,需要修改部分驅動中的數據才能實現對system分區的修改

示例初探

在之前發布的《PXN防護技術的研究與繞過》這篇文章,裡面詳細解釋了如何繞過DEP、PXN這兩種緩釋措施,用的基本方法就是JOP和ROP技術。我們將在此基礎上解釋root工具中繞過其他幾種防護的方法。

文章提到將thread_info中的addr_limit改為0xffffffffffffffff:

addr_limit是用於限制一個線程虛擬地址訪問範圍,為0至addr_limit,改成0xffffffffffffffff表示全部64位地址全部可訪問。Google至今沒有在Android上啟用KALSR,arm64內核一般都固定在0xffffffc000000000開始的虛擬地址上,並沒有隨機化也就是說可以隨意讀寫內核了。雖然Android沒有KALSR但內核堆的地址依舊是不可預知的相當於一種隨機化,想要利用CVE-2015-3636(pingpong)這類UAF類型漏洞必須要用到噴射或者ret2dir這類內存掩蓋技術。

一般是將uid、gid修改為0,0是root的uid,即此線程擁有了root許可權,capabilities修改為0xffffffffffffffff掩蓋所有比特位,表示擁有所有capability。至此user permissions緩釋就被繞過了,也可以把自己偽造成其他任意用戶。

將「selinux_enforcing」這個內核中的全局變數設為0後,selinux相當於被關閉了。此舉可以繞過SElinux的緩釋。

MAC、Sandbox是iOS中的緩釋措施,作用相當於Android中的SELinux。蘋果公司的Code Sign要求除了開發所用程序,所有可執行代碼必須要蘋果公司簽名才能在iPhone運行。Android雖然要對APK簽名但APK依舊可以任意載入可執行程序。

在此次阿里聚安全攻防挑戰賽中便可以體驗一把如何突破ASLR、DEP等漏洞緩解技術該題是由螞蟻金服巴斯光年實驗室(AFLSLab) 曲和、超六、此彼三位同學完成設計,將模擬應用場景準備一些包含bug的程序,並側重於PWN形式,服務端PWN需要選手具備二進位程序漏洞挖掘和利用能力,通過逆向服務端程序,找出服務端程序的各類問題,然後編寫利用代碼,在同服務端程序的交互中取得服務端程序的shell許可權,進而拿到伺服器上的敏感信息。另外在Android應用PWN能力方面,需要選手具有遠程獲得任意代碼執行和arm64平台反彙編理解邏輯的能力,尋找能夠突破DEP、ASLR等防護,進而控制目標APP執行自己的代碼。

這次參與出題的螞蟻金服巴斯光年實驗室(AFLSLab)是螞蟻金服安全中心(俗稱螞蟻神盾局)旗下近期剛成立不久的移動安全實驗室,除護航支付寶錢包及螞蟻金服相關產品的安全外,也同時為守護外部廠商、商戶、生態夥伴終端基礎安全。雖然成立時間很短,但已經為google、三星、華為等公司上報多個安全漏洞。實驗室技術負責人曲和表示,期望通過此次比賽吸引更多應用及系統漏洞挖掘和漏洞利用的選手進行交流學習,共同為互聯網安全新生態而努力。

重磅預告,今晚20:00阿里聚安全攻防挑戰賽預熱賽整點開啟!但是我們不做任何淘汰!不淘汰!不淘汰!不淘汰!

作者:此彼@巴斯光年實驗室,更多挑戰賽信息,請關注阿里聚安全攻防挑戰賽官網


推薦閱讀:

邏輯漏洞簡單的分析
哪家公司的漏洞獎勵最高?
如何將漏洞CVE-2017-1000112應用到其他內核上
macOS root賬戶登錄憑據驗證錯誤(CVE-2017-13872)漏洞分析

TAG:漏洞 | Android | iOS |