実行可能ファイル名はlinuxであり、さまざまな方法で読み取ることができます。
- 16文字またはTASK_COMM_LENに達した後に切り捨てられる文字列を含む/ proc / [pid] / commを読みます。
- パラメータで使用するコマンドラインを含む/proc/[pid]/cmdlineを読み込みます。
/proc/[pid]/stat または /proc/[pid]/status を読むなど、他の方法もありますが、1 と似ています。
ポイント1の場合、工程(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
。ramdisk/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に15桁(+ \ nは16)に切り捨てずに「kworker / 3:1-xfs-reclaim / sda2」を含めることはできますか?
ポイント2の場合のように実際に切り取られたかどうかはどうすればわかりますか?
答え1
信頼できる唯一の方法は、/proc/PID/exe
実行可能ファイルが削除されたか単に存在しない場合でもviaです(たとえば、memfd_create()
viafexecve()
またはを使用して実行されます)execveat(AT_EMPTY_PATH)
。
/proc/PID/comm
どちら/proc/PID/cmdline
もプロセス自体によって簡単に偽造することができます(電子はprctl(PR_SET_NAME)
単にargv[]
文字列を上書きするだけです)。
15桁(+は16)に切り捨てずにファイルにコンテンツを
comm
含めることができる方法は何ですか?kworker/3:1-xfs-reclaim/sda2
\n
これはユーザー領域プロセスではなくカーネルスレッドであり、別のスレッドです。ルール適用する;-)