Linux
從 /proc/ 獲取 Linux 中的執行檔名並檢測它是否被截斷
執行檔名為 linux,可以通過多種方式讀取。
- 通過閱讀 /proc/$$ pid $$/comm,其中包含在達到 16 個字元或 TASK_COMM_LEN 後被截斷的字元串。
- 通過閱讀 /proc/$$ pid $$/cmdline 包含與參數一起使用的命令行。
還有其他方法,例如閱讀 /proc/
$$ pid $$/stat 或 /proc/$$ pid $$/status,但它們類似於 1。 在第 1 點的情況下,proc(5)手冊頁說:
括號中的執行檔的文件名。長度超過 TASK_COMM_LEN (16) 個字元(包括終止空字節)的字元串將被靜默截斷。無論執行檔是否被換出,這都是可見的。
我有 3 個程序我看到不匹配並突出顯示它們(現在在我的系統上):
- PID 7610
- PID 38193
- PID 37030
考慮以下情況:
- PID 7610:
- 的內容
/proc/7610/comm
是Web Content
- 但是內容
/proc/7610/cmdline
是/opt/firefox-developer-edition/firefox-bin-contentproc-childID17-isForBrowser-prefsLen7837-prefMapSize238232-parentBuildID20201215185920-appdir/opt/firefox-developer-edition/browser4080truetab
- PID 38193:
- 的內容
/proc/38193/comm
是zyxwvutsrqponml
- 但是內容
/proc/38193/cmdline
是/ramdisk/abcdefghijklmnopqrstuvwxyz./zyxwvutsrqponmlkjihgfedcba
有一個
\u0000
betweenramdisk/abcdefghijklmnopqrstuvwxyz
,./zyxwvutsrqponmlkjihgfedcba
我可以通過程式方式看到,我將其替換為\s
.
- PID 37030
- 的內容
/proc/37030/comm
是kworker/3:1-xfs-reclaim/sda2
- 的內容
/proc/37030/cmdline
為空。
- 在案例 1 中,我們看到 cmdline 和 comm 完全不同。
- 在案例 2 中,我們看到 cmdline 顯示了整個命令,但 comm 被截斷為 15 個字元。
- 在案例 3 中,我們看到 cmdline 為空,但 comm 沒有按預期截斷。
文件 comm 如何包含“kworker/3:1-xfs-reclaim/sda2”而不被截斷為 15 個位置(+ \n 為 16)?
我怎麼知道它是否真的被截斷了,就像第 2 點一樣?
唯一可靠的方法是 via
/proc/PID/exe
,即使執行檔已被刪除,或者它根本不存在(如執行使用memfd_create()
viafexecve()
或execveat(AT_EMPTY_PATH)
.兩者
/proc/PID/comm
和/proc/PID/cmdline
都可以很容易地被程序本身偽造(前者通過prctl(PR_SET_NAME)
,後者只是通過覆蓋argv[]
字元串)。文件如何
comm
包含kworker/3:1-xfs-reclaim/sda2
而不被截斷為 15 個位置(+\n
為 16)?那是一個核心執行緒,而不是使用者態程序,並且適用不同的規則;-)