1. 程式人生 > >關於Android的root提權漏洞

關於Android的root提權漏洞

0x001 什麼是root?


在這裡插入圖片描述

三種常見的root方案:

第一種:利用漏洞提權,並將一個帶有恰當set-uid許可權的su檔案移動到系統分割槽。市面上的一鍵root等工具就是基於此原理。
往/system/xbin放進一個叫su的檔案,設定可執行許可權,並將SUID位設為有效
往/system/app放進一個superuser(superSU)的Android應用程式,重啟後系統會自動安裝該應用程式

apk應用請求su的授權過程

第二種:修改系統映象檔案(system.img),再刷有帶su和superuser的rom。
https://blog.csdn.net/u012417380/article/details/76143540


https://blog.csdn.net/wr132/article/details/52786960

第三種:使用自定義的recovery,並使用OTA升級的方法刷入我們自己的updater-script指令碼進行root
1,解鎖fastboot
2,於fastboot刷recovery(TWRP或CWM)映象
3,於剛裝好的recovery裡執行superSU的OTA格式安裝包(ADB sideload更好,連拷貝安裝包都不需要)
4,重啟到系統,便完成了root步驟
https://blog.csdn.net/a740169405/article/details/81103869
https://www.jianshu.com/p/393f5e51716e

需要解鎖bootloader和突破NAND鎖成為永久root

以下兩個轉自於知乎少仲哥和flanker_hqd的回答:

0x02歷史上已知的比較有代表提取漏洞


1.CVE-2009-2692(Wunderbar/asroot)

sock_sendpage()的空指標解引用.因為sock_sendpage 沒有對 socket_file_ops 結構的 sendpage 欄位做指標檢查,有些模組不具備sendpage 功能,初始時賦為 NULL,這樣,沒有做檢查的sock_sendpage 有可能直接呼叫空指標而導致出錯並提升許可權.

2.adbd setuid

ADB守護程序(adbd程序)以root許可權開始啟動,然後降權到shell使用者.在Android2.2及以前的版本中,ADB守護程序在降權時不會檢查setuid呼叫的返回值.在此之前,adb.c中的程式碼都是以root許可權執行,以完成部分初始化工作.通過呼叫setuid()將使用者從root切換回shell,但setuid()在shell使用者程序數達到上限RLIMIT_NPROC時,會失敗,因此adb.c繼續以root身份執行,而沒有報錯.

3.CVE-2011-3874(zergRush)

漏洞的本質是"use after free".具有root許可權的vold程序使用了libsysutils.so,其中某個函式存在棧溢位的問題,因此可以控制root身份的vold執行system(),藉以提權.

4.CVE-2012-0056(mempodroid)

Linux通過一個特殊字元裝置/proc/$pid/mem把每個程序的虛擬記憶體暴露為一個檔案.出於安全考慮,讀寫這個檔案的許可權被嚴格限制,擁有寫入許可權的只有記憶體的所屬程序.但是攻擊者可以開啟目標程序的mem裝置,把它複製到程序的stdout和stderr.當stdout重定向到與虛擬記憶體相關的字元裝置時,攻擊者可以寫入其他程式記憶體,但是寫入的地址是未知的.

5.CVE-2011-1823(GingerBreak)

在Android 3.0版本和2.3.4之前的2.x版本上的volume守護程序(vold)由於信任從PF_NETLINK套接字接收到的訊息,因此允許以root許可權執行任意程式碼,利用方法是通過一個負數索引繞過只針對最大值的有符號整數檢測.

6.Exynos-abuse

早期的三星手機,經常是某些裝置被chmod 755/666,造成了全域性可讀寫,然後只要將這些裝置mmap出來,就可以操作實體記憶體,之後可以通過patch相關引數或者構造payload函式達到提權的目的.

7.CVE-2012-4220(diag)

Android 2.3-4.2使用的QualcommInnovation Center (QuIC) Diagnostics核心模式驅動程式diagchar_core.c在實現上存在整數溢位漏洞,通過向diagchar_ioctl內傳遞特製的輸入,遠端攻擊者可利用此漏洞執行任意程式碼或造成拒絕服務.

8.CVE-2013-6282

ARM v6/v7架構的Linux核心中的get_user/put_user介面沒有驗證目標地址,由於硬體架構的更迭,get_user/put_user最初用於實現和控制域切換的功能被棄用了,導致任何使用該API的核心程式碼都可能存在安全隱患.讓任意應用來讀寫核心記憶體,造成許可權洩漏.

9.CVE-2014-3153

漏洞利用了 futex_requeue,futex_lock_pi,futex_wait_requeue_pi三個函式存在的RELOCK漏洞和REQUEUE漏洞,造成了對核心棧上的資料修改,知名root工具towelroot就是利用了這個漏洞可以覆蓋2014年6月以前的裝置.

10.CVE-2015-3636

該漏洞是Linux kernel的ping套接字上存在的一個Use-After-Free漏洞.


Android 2.*時代,vold有多個溢位漏洞,都被用來exploit和poc.
Android 4.*時代,大部分的exploit都盯上了核心中的堆疊溢位和整數溢位等.
Android 5.*以後,更強悍的SELinux策略,想通過kernel漏洞提取更加困難.


0x03如何入門android核心挖掘?


Andriod平臺漏洞也有很多種,分為不同的方向,比如核心漏洞挖掘/利用,使用者態高許可權程序漏洞挖掘/利用,瀏覽器漏洞挖掘/沙箱逃逸和針對Andriod自身結構的漏洞(許可權洩漏、敏感資訊洩漏等)。題主應該希望學習的是前兩種。

Android是一個基於Linux的複雜系統,想要熟練挖掘Android漏洞必須要了解Linux系統本身(核心,驅動),以及Android在Linux架構上新增的各式各樣的元件和功能(binder,media/graphics subsystem,zygote, chromium/skia和最上層的四大金剛等)。從問題中的角度來講,對於不熟悉Windows平臺的初學者,不建議將大量時間投入到Windows平臺上的漏洞利用學習上,因為兩個平臺的漏洞雖然核心思想相通,但具體到利用的細節不太相同。這些精力時間投入到Linux平臺和Android自身的研究學習上對於Android漏洞挖掘這個目的意義更大。並且從實際的角度出發,業界目前需要更多的也是Mobile系統方向上的人才。

基礎的漏洞型別例如棧溢位、堆溢位、未初始化、OOB、UAF、條件競爭/TOCTOU漏洞等必須要熟練理解掌握,這些在各種CTF平臺上在Linux平臺下都可以練習到。但是需要注意的一點是CTF還是和實際有些區別。例如CTF上的堆溢位題目絕大部分都基於dlmalloc,而Android早在5.0就切換到了jemalloc。現代軟體中最常見的條件競爭漏洞因為比賽平臺的限制也很少在CTF中看到(利用比較耗費資源,很難支撐比賽中的大規模併發需求)。

在瞭解了基礎知識之後,可以進一步學習Andriod自身的體系結構。
Binder方面可以學習除錯幾個經典漏洞(GitHub - flankerhqd/mediacodecoob: Infoleak and PC control poc for CVE-2015-6620 (24445127), I’ll add after conference, https://www.blackhat.com/asia-16/briefings.html#hey-your-parcel-looks-bad-fuzzing-and-exploiting-parcel-ization-vulnerabilities-in-android)

檔案格式漏洞自然是經典的stagefright,https://www.exploit-db.com/docs/39527.pdf。

驅動/核心漏洞3636和1805(https://www.blackhat.com/docs/us-15/materials/us-15-Xu-Ah-Universal-Android-Rooting-Is-Back.pdf)。

Chrome V8相關:GitHub - 4B5F5F4B/Exploits

關注每個月的android security bulletin, 嘗試從diff反推漏洞研究如何觸發和利用。

程式碼審計:經典書籍 The art of software security assessment

fuzzing

當然,只要掌握了計算機體系結構,熟悉了程式的運作方式,到達一定境界之後那麼各種漏洞、各種系統之間的界限也就漸漸模糊了。

Android漏洞列表:
http://androidvulnerabilities.org/by/version/