Mac의 포크 폭탄?

Mac의 포크 폭탄?

방금 한 가지에 대해 배웠어요포크 폭탄, 흥미로운 유형의 서비스 거부 공격입니다. Wikipedia(및 일부 다른 곳) :(){ :|:& };:에서는 UNIX 시스템에서 포크된 프로세스를 무제한으로 사용할 것을 권장합니다. 그러나 Mac OS X Lion에서는 작동하지 않는 것 같습니다(가장 널리 사용되는 운영 체제는 이 직접적인 공격에 취약하지 않다는 내용을 읽었던 기억이 납니다). 하지만 저는 이 공격이 어떻게 작동하는지(그리고 어떻게 생겼는지) 매우 궁금하고 제 Mac에서 시도해 보고 싶습니다. 시스템의 보안 조치를 우회할 수 있는 방법이 있습니까? 아니면 Mac에서는 포크 폭탄이 불가능합니까?

답변1

포크 폭탄 작동 방식: C(또는 C와 유사한) 코드에서는 fork()이름이 지정된 함수를 호출합니다. 이로 인해 Linux, Unix 또는 Unix 계열이 완전히 새로운 프로세스를 생성하게 됩니다. 이 프로세스에는 주소 공간, 프로세스 ID, 신호 마스크, 열린 파일 설명자 및 운영 체제 커널의 제한된 메모리 공간을 차지하는 모든 것이 있습니다. 새로 생성된 프로세스는 또한 프로세스가 실행될 커널의 데이터 구조에서 위치를 얻습니다. 호출 프로세스에서는 fork()아무 일도 일어나지 않은 것처럼 보입니다. 포크밤 프로세스는 fork()가능한 한 빨리, 가능한 한 여러 번 호출을 시도합니다.

비결은 새로 생성된 프로세스입니다.또한 에서 돌아오다fork()같은 코드에서. 분기 후에는 동일한 코드를 실행하는 두 개의 프로세스가 생성됩니다. 각각의 새로운 포크 폭탄 프로세스는 fork()가능한 한 빨리, 가능한 한 여러 번 호출을 시도합니다 . 예시로 제공하신 코드는 포크 폭탄의 Bash 스크립트 버전입니다.

곧 운영 체제 커널의 프로세스 관련 리소스가 모두 소모됩니다. 프로세스 테이블이 가득 찼습니다. 실행 대기 중인 프로세스 목록이 가득 찼습니다. 실제 메모리가 가득 차서 페이징이 시작됩니다. 이것이 충분히 오래 지속되면 스왑 파티션이 가득 차게 됩니다.

사용자에게 보이는 모습: 모든 것이 매우 느리게 실행됩니다. .lsps​때때로 이 상황에서는 전원 코드를 통한 재부팅이 필요할 수 있습니다.

포크폭탄은 과거에는 '토끼'로 알려졌습니다. 번식이 너무 빠르기 때문이죠.

그냥 재미로 C로 포크 폭탄 프로그램을 작성했습니다.

#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
        while (1)
                fork();

        return 0;
}

저는 Arch Linux의 xterm에서 프로그램을 컴파일하고 실행했습니다. 다른 xterm에서 프로세스 목록을 얻으려고 합니다.

1004 % ps -fu bediger
zsh: fork failed: resource temporarily unavailable

fork()첫 번째 xterm과 관련된 포크 폭탄 프로세스가 생성 및 실행 중인 프로세스와 관련된 모든 커널 리소스를 소진했기 때문에 두 번째 xterm의 Z 셸을 성공적으로 호출할 수 없습니다 .

답변2

포크 폭탄이 작동하는 것을 방지하기 위해 마련할 수 있는 안전 장치는 많습니다.

가장 간단한 것은 다음과 같습니다.

ulimit -u 1024

사용자 프로세스 수를 1024로 제한합니다.

시스템 보호를 우회하는 경우에는 확실히 그렇게 할 수 있는 방법을 찾을 수 있지만 여기 누구도 그렇게 할 수 있는 방법을 제공하지 않을 것 같습니다. 그러나 기본적으로 시스템에 PID가 부족하여 재생성할 수 없습니다. 폭탄이 CPU의 100%를 차지하고 더 많은 폭탄을 생성하려고 하면 기본적으로 완전히 중지됩니다.

답변3

포크 폭탄이 어떻게 작동하는지 정말로 이해하고 싶다면, 예를 들어 실행해 보고 또 다른 경고를 :(){ :|:& }받으세요 :. 우분투에서 직접 시도해 보았습니다. 시스템이 정지됩니다!

간략하게 분석해 보겠습니다.

:() { #Define a new shell function
  :|:& #Pipe function named ':' through itself, creating two copies of itself, and make them run in the background
} #End of function definition block
;: #Call the ':' function. Note how the function is defined with two calls to itself piped through each other. This starts a chain reaction: those two copies will in turn create two more, and so on, ad infinitum

이런 종류의 피해를 입히려고 할 때 이 점을 주의하시기 바랍니다.

답변4

이렇게 할 수 있지만 파일 이름이 file.py인지 확인하세요.

import os 
while True
  os.startfile(file.py)

그런 다음 실행하십시오.

python file.py

관련 정보