从 /proc/ 获取 Linux 中的可执行文件名称并检测它是否被截断

S.G*_*ami 2 linux process proc

可执行文件名为 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

有一\u0000ramdisk/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 点的情况一样?

use*_*777 6

唯一可靠的方法是 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)?

那是内核线程,而不是用户进程,并且适用不同的规则;-)