How we use Dirty Pipe to get reverse root shell on Android Emulator and Pixel 6

中文現場演講惡意程式

在今年2月時,Linux kernel 5.8 之後被揭露了 arbitrary write read-only file 的漏洞,該漏洞被命名為 Dirty Pipe。對應到 Android 有 Google Pixel 6 和 SAMSUNG Galaxy S22 使用的 Android 12 可以觸發漏洞,我們嘗試在 Android 12 上透過此漏洞進行提權,並使用 Android Emulator x86_64 作為本次的環境,並移植到 Google Pixel 6。

在一般 Linux 環境上使用 Dirty Pipe 提權是一件相對容易的事情。攻擊者可以透過修改帶有 suid flag 的 binary,或者對 /etc/shadow 進行寫入就可以提權。然而,在 Android 環境中兩者皆不存在,除此之外,Android 預設開機會開啟 SELinux,限制使用者只能做 policy 許可的操作。我們嘗試找到另一條路徑,在獲得 root 權限的同時,也能夠 bypass SELinux。

Read-only file 在被惡意寫入時不會有 CoW 的行為,因此只要寫入 process 已經 mmap 的 read-only file 就會改到對應的 memory。根據這種特性,我們透過 Dirty Pipe 覆寫 init 使用到的 read-only file 來劫持 init,取得 root 和 init context 來進行後續的攻擊。

SELinux 有很強大的權限管理,但權限限制的太嚴謹在開發上時會礙手礙腳,所以 SELinux 存在一些後門方便開發者使用,這也讓攻擊者方便繞過 SELinux,只是仍然要 load kernel module 才能繞過。

SELinux 存在特別的 rule transition 能夠在 execve 時改變 process 的 context,init 能夠 transition 到有 module_load 權限的 context,還可以 open、read 對應的 executable 和 loadable file,透過 Dirty Pipe 就可以 load kernel module。

在本次演講中,我們將會介紹到我們是如何找到能夠 hijack 到 init process 的路徑、在 Dirty Pipe 無法寫入 page 的第一個 byte 的情況下 load kernel module、繞過 SELinux 的保護機制,以及最後我們是如何在實際手機上也能夠成功拿到 reverse root shell的。

YingMuo

YingMuo

TeamT5 杜浦數位安全 D39 Vulnerability Researcher (Intern),最近開始研究 Android 和 Linux Kernel 漏洞,同時也是 Balsn CTF 戰隊的新成員。

LiN

LiN

TeamT5 杜浦數位安全 D39 Vulnerability Researcher (Intern),最近開始研究 Android 和 Linux Kernel 漏洞。

所有非英語議程都將提供即時同步口譯翻英

議程表

Use event local timezone
TimeZone

00:30

  • 報到時間

01:20

  • 開幕式 - 貴賓致詞與活動介紹

02:10

03:00

  • Break

03:15

04:05

  • Lunch

05:00

05:45

  • Break

06:00

06:45

  • Tea Time

07:00

07:25

08:10

  • Break

08:25

09:10

  • Closing