/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

프로그래밍 방식으로 과 사이에 무엇이 있는지 확인할 수 \u0000있으며 이를 .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에 15자리(+\n은 16)로 잘리지 않고 "kworker/3:1-xfs-reclaim/sda2"가 포함될 수 있습니까?

포인트 2의 경우처럼 실제로 잘렸는지 어떻게 알 수 있나요?

답변1

신뢰할 수 있는 유일한 방법은 /proc/PID/exe실행 파일이 삭제되었거나 단순히 존재하지 않는 경우에도 via 입니다(예: memfd_create()via fexecve()또는 를 사용하여 실행됨) 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

이것은 사용자 영역 프로세스가 아닌 커널 스레드이며 다른 스레드입니다.규칙적용하다;-)

관련 정보