Linux

從 /proc/ 獲取 Linux 中的執行檔名並檢測它是否被截斷

  • January 19, 2021

執行檔名為 linux,可以通過多種方式讀取。

  1. 通過閱讀 /proc/$$ pid $$/comm,其中包含在達到 16 個字元或 TASK_COMM_LEN 後被截斷的字元串。
  2. 通過閱讀 /proc/$$ pid $$/cmdline 包含與參數一起使用的命令行。

還有其他方法,例如閱讀 /proc/

$$ pid $$/stat 或 /proc/$$ pid $$/status,但它們類似於 1。 在第 1 點的情況下,proc(5)手冊頁說:

括號中的執行檔的文件名。長度超過 TASK_COMM_LEN (16) 個字元(包括終止空字節)的字元串將被靜默截斷。無論執行檔是否被換出,這都是可見的。


我有 3 個程序我看到不匹配並突出顯示它們(現在在我的系統上):

  1. PID 7610
  2. PID 38193
  3. PID 37030

考慮以下情況:

  1. PID 7610:
  • 的內容/proc/7610/commWeb Content
  • 但是內容/proc/7610/cmdline/opt/firefox-developer-edition/firefox-bin-contentproc-childID17-isForBrowser-prefsLen7837-prefMapSize238232-parentBuildID20201215185920-appdir/opt/firefox-developer-edition/browser4080truetab
  1. PID 38193:
  • 的內容/proc/38193/commzyxwvutsrqponml
  • 但是內容/proc/38193/cmdline/ramdisk/abcdefghijklmnopqrstuvwxyz./zyxwvutsrqponmlkjihgfedcba

有一個\u0000between ramdisk/abcdefghijklmnopqrstuvwxyz./zyxwvutsrqponmlkjihgfedcba我可以通過程式方式看到,我將其替換為\s.

  1. PID 37030
  • 的內容/proc/37030/commkworker/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)?

那是一個核心執行緒,而不是使用者態程序,並且適用不同的規則;-)

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