2016年8月11日 星期四

CVE-2016-5340 研究

0x00 前言

前陣子為了研究 Android App 的動態分析,在拍賣徵到二手的 Nexus 5,結果隔沒多久就看到 Defcon STUMPING THE MOBILE CHIPSET 的簡報,發現手機剛好有 2016-5340 的洞就順手研究一下。不過 Android kernel 架構跟一些特殊機制我並沒有很清楚,只能根據簡報內容,發現自己不懂什麼再查點資料學習,所以有些地方如果我有講錯的話,再麻煩指正,感謝!


0x01 預備知識

Ashmem 機制:簡單來說,是讓不同的 processes 間彼此能共用相同的記憶體位址。若有在研究 Linux 記憶體管理機制的話,就是類似 mmap。


舉例:A process 的 memory address space 在 0x00000000~0xFFFFFFFF;B process 在0x00000000~0xFFFFFFFF。而當這兩個 processes 需要共用一個檔案或相同的空間時,可透過 Ashmem 機制建立另一個 address space,把要共用的檔案 mapping 到這個位址,最後再讓 A process 和 B process mapping 過來。


補充資料:
Android Binder 分析——匿名共享内存(Ashmem)


0x02 漏洞發生原因

漏洞是發生在高通晶片的 GPU 驅動上,原因在於高通為了讓它的 GPU 驅動能更方便藉由檔案標示符(File Descriptor,fd)存取 Android 子系統的 API,因此對 ashmem(drivers/staging/android/ashmem.c;原檔 ashmem.c)動了點手腳。


0x03 漏洞分析

首先看一下 diff(點圖片顯示原圖大小):




可以發現主要多了三個 function:is_ashmem_file、get_ashmem_file、put_ashmem_file

再來分析 get_ashmem_file:



大致上就是先透過 fget 取得檔案的 fd,再檢查該 fd 是否已指向一個藉由 ashmem 機制共享的檔案,若條件成立,就把該檔案共享給 private_data。

而關鍵的問題是在 is_ashmem_file:



可以看到 773 行僅透過 strcmp() 去比對字串,而非去檢查檔案是否為 ashmem 的格式,因此我們就只要把偽造的檔案改名為 ashmem 就能騙過它。


0x04 PoC.....???

這部分我還沒研究出來,就把我目前做到的說明一下。

根據簡報內容所述,漏洞利用有四個條件:

(1)你自定義的檔案名稱必須為「ashmem」
(2)根目錄可讀取
(3)/sdcard 為符號連結的目錄
(4)檔案透過 OBB 方式掛載

再看 Checkpoint 的報告提到:

「Attackers can use a deprecated feature of Android, called Obb to create a file named ashmem on top of a file system. With this feature, an attacker can mount their own file system, creating a file in their root directory called “ashmem.”」

看起來意思大概是透過 OBB 掛載一個 file system 到手機上,然後在這個系統的根目錄建立一個 ashmem 的任意檔案。


首先就載個 ROM(以Secure_Spaces_Nexus5_ROM_3.5.1為例),解壓後只留下boot.img、recovery.img、system.img。


然後載入 Linux kernel module(santoku0.5 上測試ok):
sudo modprobe cryptoloop
sudo modprobe twofish
sudo modprobe vfat


接著修改一下 obbtool 內的 mkobb.sh,line 28、29 行的值調整為 1024。

建立一個 file system image:
sudo ./mkobb.sh -d <obbdir> -o <obbfile.obb>

然後就沒有然後了,卡在怎麼讓 GPU 驅動藉由 fd 的方式存取到我偽造的 ashmem 檔案,這已經超出我的腦容量,還請各位大大們指導。


0x05 漏洞影響範圍:
  • BlackBerry Priv and Dtek50
  • Blackphone 1 and Blackphone 2
  • Google Nexus 5, 5X, Nexus 6 and Nexus 6P
  • HTC One, HTC M9 and HTC 10
  • LG G4, LG G5, and LG V10
  • New Moto X by Motorola
  • OnePlus One, OnePlus 2 and OnePlus 3
  • US versions of the Samsung Galaxy S7 and Samsung S7 Edge
  • Sony Xperia Z Ultra

欲自行修補請參考flar2/shamu,或慢慢等廠商更新。


0x06 參考資料:

沒有留言:

張貼留言