Linux에서 하위 프로세스의 PID는 항상 상위 프로세스의 PID보다 큽니까?

Linux에서 하위 프로세스의 PID는 항상 상위 프로세스의 PID보다 큽니까?

커널 2.6부터 시작한다고 가정합니다.

나는 시스템에서 실행 중인 모든 프로세스를 관찰합니다.

자식의 PID는 항상 부모의 PID보다 큽니까?

"반전"이 가능한 특별한 상황이 있습니까?

답변1

아니요, PID가 최대 수치 값을 가질 수 있다는 단순한 이유 때문입니다. 프로세스의 PID가 가장 높으면 해당 프로세스가 분기하는 하위 프로세스는 더 큰 PID를 가질 수 없습니다. 하위 항목에 더 낮은 PID를 제공하는 대신 완전히 실패하는 방법이 있는데 fork(), 이는 그다지 생산적이지 않습니다.

PID는 순차적으로 할당되며, 가장 높은 PID가 사용된 후 시스템은 낮은 PID를 재사용(유휴)하므로 다른 상황에서도 하위 프로세스에 대해 더 낮은 PID를 얻을 수 있습니다.

내 시스템의 기본 최대 PID( ) /proc/sys/kernel/pid_max는 32768이므로 랩어라운드가 발생하는 조건을 달성하는 것은 어렵지 않습니다.

$ echo $$
27468
$ bash -c 'echo $$'
1296
$ bash -c 'echo $$'
1297

시스템이 PID를 무작위로 할당하는 경우(OpenBSD가 하는 것처럼) 연속(예: Linux) 대신 두 가지 옵션이 있습니다. 가능한 전체 PID 공간에서 무작위로 선택하십시오. 이 경우 하위 프로세스의 PID가 상위 프로세스의 PID보다 낮을 수 있습니다. 또는 하위 프로세스의 PID는 상위 PID보다 큰 값에서 무작위로 선택되며 평균적으로 상위 PID와 최대값 사이에 배치됩니다. 재귀적 포크 프로세스는 곧 최대치에 도달할 것이며 위에서 언급한 것과 동일한 지점에 도달하게 될 것입니다. 새 포크가 성공하려면 더 낮은 PID를 사용해야 합니다.

답변2

또한 커널 알림을 사용하고 프로세스 테이블 스캔에 의한 감지를 피하기 위해 자신을 분기하는 데 잠재적인 보안 허점이 있습니다. 올바르게 수행되면 프로세스의 PID가 낮아지고 문제의 프로세스가 프로세스 도구에 표시되지 않습니다.

http://cve.circl.lu/cve/CVE-2018-1121

procps-ng, procps는 경쟁 조건으로 인해 숨겨진 프로세스에 취약합니다. 커널의 proc_pid_readdir()은 PID 항목을 오름차순으로 반환하기 때문에 높은 PID를 차지하는 프로세스는 inotify 이벤트를 사용하여 프로세스 목록을 스캔할 시기를 결정하고 fork/exec를 사용하여 더 낮은 PID를 가져오므로 열거를 피할 수 있습니다. 권한이 없는 공격자는 /proc/PID 항목을 읽을 때 경쟁 조건을 이용하여 procps-ng 유틸리티에서 프로세스를 숨길 수 있습니다. 이 취약점은 procps 및 procps-ng 버전 3.3.15까지 영향을 미치며, 최신 버전도 영향을 받을 수 있습니다.

관련 정보