포크 폭탄(Fork Bomb)은 리눅스 기반 시스템을 표적으로 삼는 DoS(Denial of Service, 서비스 거부) 공격의 일종입니다. 이 공격은 fork() 시스템 콜을 무한히 반복 호출하여 프로세스와 메모리 자원을 고갈시키고, 결국 시스템 전체를 마비시키려는 목적을 가지고 있습니다.
BASH 포크 폭탄
가장 유명한 포크 폭탄은 다음과 같은 한 줄짜리 BASH 스크립트입니다.
:(){ :|: & };:얼핏 보면 난해해 보이지만, 구조를 하나씩 뜯어보면 단순합니다.
:()—:라는 이름의 함수를 정의하는 부분입니다.{ }— 함수의 본문(실행될 코드 블록)을 감싸는 역할을 합니다.:|:&— 자기 자신을 호출한 결과를 다시 자기 자신에게 파이프로 전달하면서 백그라운드(&)로 실행합니다. 이 과정에서 새로운 메모리 공간이 계속 생성되며 해제되지 않습니다.;:— 정의된 함수를 즉시 실행하여 폭탄을 터뜨립니다.
결국 이 함수는 스스로를 끝없이 재귀 호출하면서 무한한 프로세스 생성을 유발하고, 시스템 자원을 순식간에 소진시킵니다.
C 언어 포크 폭탄
C 언어로 작성된 포크 폭탄도 원리는 동일합니다. 다만 BASH가 아닌 C 컴파일러로 빌드되어 실행된다는 점이 다릅니다. 마찬가지로 무한히 fork()>를 호출하여 메모리 할당 요청을 계속 발생시키고, 시스템의 가용 메모리를 모두 소진시킵니다.
예제 코드
#include <unistd.h>
#include <malloc.h>
int main() {
while (1) {
fork();
}
}실행 결과
무한한 프로세스 호출 (Infinite calls)
위 코드는 while(1) 무한 루프 안에서 fork()>를 계속 호출합니다. 각각의 자식 프로세스 역시 같은 루프를 실행하기 때문에 프로세스 수가 기하급수적으로 늘어나며, 최종적으로 시스템은 새로운 프로세스를 생성할 수 없는 상태에 빠집니다.
정리
BASH 포크 폭탄과 C 포크 폭탄은 공격 원리와 결과 면에서 본질적으로 같습니다. 차이점은 구현 방식뿐입니다. BASH 버전은 셸 함수와 파이프를 활용한 극도로 압축된 문법을 사용하고, C 버전은 시스템 콜을 직접 호출하는 무한 루프로 구현됩니다. 두 방식 모두 시스템에 심각한 부하를 주므로, 학습 목적 외에는 절대 실제 환경에서 실행해서는 안 됩니다.