contributed by < rota1001 >
想法
在 rooty 這個專案可以看到它利用 filep_open 去找到特定路徑的 file_operations 結構體,以劫持對應目錄的 VFS 界面。這個方法的價值是不管對應的檔案操作函式的 symbol 有沒有被釋放出來,只要我知道那個目錄的路徑我都能獲得它所有的檔案操作函式。然而,專案內使用的 readdir 函式在 linux 3.11 之後就已經從 file_operations 裡面移除了。而目前我實驗上,如果我建立一個 process file,使用 filep_open 打開之後,那個 file 結構體裡面的 file_operations 結構體和我用來註冊的 proc_ops 結構體裡面的函式是不一樣的,所以需要去找到新的方法做這件事情。
以下做的事情是去了解 proc_dir_entry 的資料結構,並且利用創建惡意檔案來得到根目錄的地址。另外,在 linux 原始碼中這個結構體有 __randomize_layout,所以以下會在不知道結構體內部實作的前提下,利用紅黑樹結點的結構去計算出偏移量。
這樣可以做到什麼事情呢?舉個例子,在 /proc 底下有 kallsyms,可以讀 symbol,那我利用這個方法獲取了 proc_dir_entry 結構體,又計算出 proc_ops 的偏移量,所以我能找到 proc_read 的函式指標,所以就能獲取 symbol。
實驗環境