Ctrl + Shift + ESC

cgroup으로 fork bomb 막아보기 본문

Linux

cgroup으로 fork bomb 막아보기

단축키실행해보세요 2025. 11. 14. 16:20

* 해당 포스트는 실무 초밀착 리눅스: 클라우드 환경 운영부터 성능분석까지 강의를 듣고 정리한 것입니다.

실습 시나리오

포크 폭탄이란 프로세스가 지속적으로 자신을 복제함으로써 이용 가능한 시스템 자원을 고갈시키고 시스템 속도를 떨어트려 결국엔 기아 상태로 인한 시스템 충돌을 일으키는 서비스 거부 공격이다.

bomb(){
  bomb | bomb &
}
bomb

 

Bash에서 포크 폭탄은 다중 재귀 함수를 선언하고 호출함으로써 수행할 수 있다.

 

:(){ :|:& };:

 

이 명령어는 상기 명령의 난독화된 버전이다.

여기서의 트릭은 :를 함수명으로 사용한다는 점인데, 이것이 가능한 이유는 콜론이 다른 대부분의 언어에서처럼 Bash의 예약된 문자가 아니기 때문이다.

 

포크 폭탄 공격을 당하는 경우 기아 상태로 인한 시스템 충돌이 발생하므로, cgroup으로 생성 가능한 프로세스에 제한을 걸면 해당 문제를 축소시켜 서비스 전체에 장애가 발생하는 경우를 막을 수 있다.

 

실습 진행

sudo su
cd /sys/fs/cgroup
mkdir police
cd police

 

police라는 이름의 cgroup을 생성한다.

 

echo $$ > cgroup.procs

 

현재 쉘을 cgroup에 추가한다.

 

echo 5 > pids.max

 

생성 가능한 최대 프로세스 수를 5개로 제한한다.

 

:(){ :|:& };:

 

포크 폭탄을 실행한다.

 

실습 결과

 

포크 폭탄이 실행된 쉘에서는 포크 폭탄을 당한 로그가 계속 올라오지만, 동일한 인스턴스의 다른 쉘에서는 cpu 사용률이나 echo 명령어 실행에 문제가 없는 것을 확인할 수 있다.

 

 

cgrop에서 실행되고 있는 프로세스는 5개였다. 포크 폭탄이 실행되어서 프로세스가 재귀적으로 생성되었지만, 위에서 최대 프로세스 제한을 5개로 걸어 두었기 때문에 5개까지만 생성된 것을 확인할 수 있었다.

 

미리 제한을 걸어두지 않았다면 인스턴스에 명령어를 입력할 수 없을 정도로 부하가 발생해 결국 인스턴스를 중단했다가 다시 실행해야 했을 것이다.