커널 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까지 영향을 미치며, 최신 버전도 영향을 받을 수 있습니다.