Kernel

Android x86 核心中的 vDSO 文件路徑

  • February 15, 2018

我正在學校對 Dirty CoW 進行研究(如果您不知道它是什麼並且您認為實施可能與我的問題有關,請參閱下面的 PS)。

我找到了一些使用 Dirty CoW 將一些 shellcode 注入 vDSO 的解決方案(即https://github.com/scumjr/dirtycow-vdso )。連結中的一個適用於桌面 Linux,但也有適用於 Android 的解決方案(基本相同,除了一些更改)。

我正在嘗試分析現有的解決方案,但遇到了一個問題 - vDSO 儲存在 Android 中的什麼位置?

手冊頁(http://man7.org/linux/man-pages/man7/vdso.7.html)說,您可以使用

find arch/$ARCH/ -name '*vdso*.so*' -o -name '*gate*.so*'

通過在我的 Ubuntu 64 位 ( ) 上執行類似的命令,find / -name '*vdso*' -o -name '*gate*.*so'輸出中會出現以下行:

/lib/modules/4.13.0-32-generic/vdso
/lib/modules/4.13.0-32-generic/vdso/vdsox32.so
/lib/modules/4.13.0-32-generic/vdso/vdso32.so
/lib/modules/4.13.0-32-generic/vdso/vdso64.so
/lib/modules/4.13.0-21-generic/vdso
/lib/modules/4.13.0-21-generic/vdso/vdsox32.so
/lib/modules/4.13.0-21-generic/vdso/vdso32.so
/lib/modules/4.13.0-21-generic/vdso/vdso64.so

通過在其中一個上使用objdumphexdump,我可以看到它是映射到記憶體中的那個(我編寫了一個程序,找到它並將其轉儲到文件中)。

但是,當我跑步時

adb root
adb shell find -name '*vdso*' -o -name '*gate*.so*'

在我的 Android 4.4-r4 x86 上,唯一的輸出是/proc/sys/vm/vdso_enabled(並且文件內容是1)。

我知道程序的記憶體中有 vDSO,我也為此編寫了一個從 ADB 執行的轉儲程序。我還調整了 Dirty CoW 漏洞利用,將我的 shellcode 注入 vDSO。我可以從我編寫的應用程序以及我之前提到的轉儲程序中看到 shellcode 在 vDSO 中。我的 shellcode 只存在於 vDSO 中,直到我重新啟動設備。

vDSO 如何在 Android 中工作?是否有儲存它的文件?似乎不是,因為如果它在那裡,注入的程式碼在重啟後也會在那裡。但是 shellcode 是如何傳播到其他程序的呢?

我非常感謝您的回答。

PS: Dirty CoW 是 Linux 核心的一個漏洞,通過導致兩個執行緒的競爭條件,您可以寫入只讀文件(或任何可以映射到記憶體中的文件)——第一個執行緒有一個循環,它正在寫入任何文本進入記憶體(進入/proc/self/mem或使用ptraceusingmmap找到正確的位置),另一個告訴系統(也在循環中)不再需要相同的記憶體部分(使用madvise(MADV_DONTNEED))。

vDSO不儲存在磁碟上的單獨文件中,它是核心的一部分,並由核心映射到每個程序的地址空間。您找到的.so文件僅用於調試目的。文件中的find命令以建構核心時為例,在核心建構樹中查找生成的vDSO;沒有要求單獨.so的 s 出現在/lib/modules這個問題上或其他任何地方。

您正在處理的漏洞利用注入的 shellcode 會傳播,因為記憶體中有 vDSO 的單個副本,因此任何成功的寫入都會顯示在所有目前和未來程序的 vDSO 映射中……

引用自:https://unix.stackexchange.com/questions/424367