실행 파일 이름은 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()
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
이것은 사용자 영역 프로세스가 아닌 커널 스레드이며 다른 스레드입니다.규칙적용하다;-)