ROOT工具自帶的su,
通常帶有權限管理工具配套使用,
卸載了權限管理工具,su就無法使用,
是不是覺得很煩人呢?
別著急!
本期「安仔課堂」,
ISEC實驗室劉老師手把手教你:
如何在Android 4.4以上版本DIY提權程序?
Android的提權程序實際上是手機系統分區中的一個su可執行程序。Android系統是基於linux內核,su相當於Linux下獲取ROOT權限的命令,執行su命令後,當前用戶會被切換成ROOT用戶。
ROOT用戶是一種存在於UNIX系統和類UNIX系統(如Linux)中的唯一的超級用戶,具有最高的系統權限。但是,手機廠商為了保證系統的安全性和完整性,手機出廠時是沒有ROOT的,普通用戶無法通過常規手段獲取ROOT權限。
獲取ROOT權限,常用的方法是把su程序寫入到system分區,並賦予系統最高權限,後續手機上的程序調用su執行指定的命令獲取到ROOT權限。我們把獲取手機ROOT權限的過程稱為ROOT手機。
通常,ROOT手機的方法有以下三種,原理都是把系統改成可修改的狀態,並把su寫入system分區並賦予最高權限。
一些公司發布的用於ROOT手機的工具,如kingroot、一鍵ROOT等,這些工具利用系統漏洞(內核漏洞或者以ROOT權限運行的進程漏洞),將自身進程權限提升到ROOT權限,修改系統system分區,寫入自己的su程序,達到ROOT手機的目的。
獲取第三方修改後的ROM,這類ROM通常會把super su相關組件打包到鏡像中,刷入系統後,會默認帶有ROOT功能,不過這類第三方ROM的安全性沒法保證,你無法確定作者是否加入了其他程序。
Recovery是Android手機恢復模式,在這種模式下,可以對手機進行升級、恢復出廠設置、清除數據等操作。通常,手機默認的recovery只有簡單功能,比如升級、清除數據等操作。為了能夠修改系統,可以刷入第三方recovery(如TWRP recovery),通過第三方recovery提供的功能,把super su刷入到系統中,達到ROOT目的。
su是elf格式,Linux下的可執行文件,之所以叫su,有切換用戶(switch user)的意思,也可以改成其他名稱。
在Android 4.4以前,因為沒有SEAndroid的限制,su的工作邏輯非常簡單,把su程序的用戶和用戶組設置為ROOT並設置s位(set uid,set gid)。s位的作用是,如果其他用戶執行該文件,該進程的euid會切換到0(ROOT),eguid·會切換到0(ROOT),因此就具有了ROOT用戶的權限。
圖 1、Android4.4以前的su二進位文件屬性
圖 2、Android下su的源碼片段
在Android 4.4之後,SEAndroid默認開啟,su的工作邏輯要比Android 4.4以前的複雜。
原因有以下三點:
a、ROOT權限的概念已經模糊,就算進程具有ROOT權限(euid=eguid=0),也無法進行高權限操作。
b、於權限的控制,是通過安全上下文(Security Context)和安全策略(Security Policy)控制。
可以通過ps -Z來查看一個進程的安全上下文:
圖 3、ps查看進程的context
可以通過ls -Zl來查看一個文件的安全上下文:
圖 4、ls –lZ 查看文件的context
在Android selinux中,對於進程,上下文為u:r:type:s0,其中,u、r、s0是固定的;文件上下文為u:object_r:type:s0 ,其中u、object_r、s0是固定的。一個進程能否對一個文件進行某種操作,是由進程中的type和文件的type決定的。
圖 5、安全策略的部分
圖5中,表示允許類型shell的進程,對類型的shell_data_file的文件(目錄)進行,創建文件,創建目錄。
c、SEAndroid開啟情況下,init進程的context為u:r:init:s0,是用戶模式下擁有最高權限context,雖是最高權限,但也有很多限制(比如:init對android service和shell_data_file的某些操作是不被允許的),沒有達到真正意義上的Root權限。
圖 6、init.te策略文件中對init的限制
由於以上原因,在SEAndroid存在的情況下,我們如何實現su提權呢?通常採用如下所述的C/S架構模式,在服務端動態修改SEAndroid的策略配置,來達到提權的效果。
由於SEAndroid的限制,在開啟SEAndroid的系統上,su的實現通常使用C/S模式。系統啟動時,通過init進程啟動su的daemon進程,作為服務端,此daemon進程擁有u:r:init:s0的context,服務端啟動後,通過從"/sys/fs/selinux/policy"或"/sepolicy"中讀取security policy內容,修改後寫入"/sys/fs/selinux/load";創建localsocket,等待客戶端的連接。
客戶端啟動su後,通過localsocket,把pty設備信息發送給服務端,服務端通過打開訪問對應的pty設備和客戶端通信。客戶端通過終端寫入命令,發送到服務端執行,執行後返回結果。
圖 7、客戶端流程
圖 8、服務端流程
C/S架構的su,服務端必須以用戶模式下最高權限啟動(即u:r:init:s0),通常做法是修改系統文件,隨系統啟動時由init進程啟動。
a、修改系統/system/etc/install-recovery.sh文件,install-recovery.sh是bash腳本文,由init進程啟動,可以加入su服務端啟動命令。如果在init.rc中對install-recovery進程設置了新的context u:r:install_recovery:s0,這種情況下就無法達到要求。
b、替換系統文件,比如替換/system/bin/debuggerd文件,先備份原/system/bin/debuggerd為debuggerd_real,在新的debuggerd中先啟動su的服務端,再啟動原debuggerd_real.
c、獲取ROM包,修改ramdisk中的init.rc,加入啟動su服務端的代碼。
在明白了SEAndroid下su的原理後,就可以DIY自己的su。本文介紹的方法適用於可以自定義手機程序、不需要授權操作的使用場景,比如:可以實現一個沒有UI交互授權管理的su,放到手機系統分區指定的目錄下,然後自定義授予我們想要的權限,如我們自己的APP在請求ROOT權限時直接允許,其它則拒絕。趕緊動手試試吧!
安勝作為國內領先的網絡安全檢測產品及服務提供商,秉承「創新為安,服務致勝」的經營理念,專注於網絡安全類產品的生產與服務;以「研發+服務+銷售」的經營模式,「裝備+平臺+服務」的產品體系,在技術研究、研發創新、產品化等方面已形成一套完整的流程化體系,為廣大用戶提供量體裁衣的綜合解決方案!
「ISEC實驗室」作為公司新技術和新產品的預研基地,秉承「我的安全,我做主」的理念,專注於網絡安全領域前沿技術研究,提供網絡安全培訓、應急響應、安全檢測等服務。
完成金磚「廈門會晤」保障工作;
完成北京「一帶一路」國際合作高峰論壇網絡安全保障。
為貴陽大數據與網絡安全攻防演練提供技術支持;
承擔G20峰會的網絡安保工作;
承擔國家兩會的網絡安保工作。
不忘初心、砥礪前行;未來,我們將繼續堅守、不懈追求,為國家網絡安全事業保駕護航!