/proc/でLinuxの実行可能ファイル名を取得し、切り捨てられたかどうかを検出します。

/proc/でLinuxの実行可能ファイル名を取得し、切り捨てられたかどうかを検出します。

実行可能ファイル名はlinuxであり、さまざまな方法で読み取ることができます。

  1. 16文字またはTASK_COMM_LENに達した後に切り捨てられる文字列を含む/ proc / [pid] / commを読みます。
  2. パラメータで使用するコマンドラインを含む/proc/[pid]/cmdlineを読み込みます。

/proc/[pid]/stat または /proc/[pid]/status を読むなど、他の方法もありますが、1 と似ています。

ポイント1の場合、工程(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に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

これはユーザー領域プロセスではなくカーネルスレッドであり、別のスレッドです。ルール適用する;-)

おすすめ記事