Linux fork 폭탄 분석

6065 단어
Linux/Unix 시스템 에서 커 널 과 사용자 간 의 인터페이스 로 서 셸 은 사용 하기에 편리 하고 상호작용 능력 이 강 하 며 강력 한 프로 그래 밍 능력 등 특성 을 가지 기 때문에 광범 위 하 게 응용 된다.bash (Bourne Again shell) 는 Bourne shell 에 대한 확장 이 고 많은 csh 와 Korn Shell 의 장점 을 종합 하여 bash 가 매우 유연 하고 강력 한 프로 그래 밍 인 터 페 이 스 를 가지 게 하 는 동시에 우호 적 인 사용자 인터페이스 도 가지 게 한다.bash 가 제공 하 는 명령 보완, 어댑터, 명령 기록, 별명 과 같은 새로운 기능 은 많은 사용자 들 의 최 우선 순위 가 되 었 습 니 다.
그러나 해석 적 언어 로 서 bash 가 프로 그래 밍 능력 에 대한 지원 은 다른 컴 파일 적 언어 (예 를 들 어 C 언어) 처럼 완선 되 지 않 고 실행 효율 도 매우 낮 습 니 다. 이러한 단점 은 함수 (특히 재 귀 함수) 를 작성 할 때 보 여 주 는 한눈 에 볼 수 있 습 니 다.본 고 는 고전적 인 포크 폭탄 에서 착안 하여 bash 에서 귀속 함 수 를 작성 할 때 주의해 야 할 문 제 를 하나씩 소개 하고 각종 문제 의 해결 방안 을 연구 하고 자 한다.
비록 본 고 는 bash 를 예 로 들 어 관련 개념 을 소개 하지만 유사 한 사상 은 기본적으로 다른 셸 에 도 적용 된다.
포크 폭탄
함 수 는 프로 그래 밍 에서 매우 중요 한 개념 으로 프로그램 을 하나의 기능 이 상대 적 으로 독립 된 코드 블록 으로 나 누 어 코드 의 모듈 화 를 더욱 잘 하고 구조 가 더욱 뚜렷 하 며 프로그램의 코드 량 을 효과적으로 줄 일 수 있다.재 귀 함 수 는 이러한 장점 을 충분히 제시 했다. 함수 정의 에서 자신 을 호출 하면 복잡 한 계산 문 제 를 간단 한 교체 알고리즘 으로 바 꿀 수 있다. 경계 조건 으로 거 슬러 올 라 갈 때 다시 한 층 한 층 함수 로 돌아 갈 수 있다.많은 수학 문 제 는 순환 적 인 사상 으로 절 차 를 설계 하 는 데 매우 적합 하 다. 예 를 들 어 계단, 한 노 (hanoi) 탑 등 이다.
많은 사람들 이 fork 폭탄 을 들 어 본 적 이 있 을 것 입 니 다. 그것 은 실제 적 으로 매우 간단 한 재 귀 프로그램 일 뿐 입 니 다. 프로그램 이 하 는 일 은 똑 같 습 니 다. 끊임없이 fork 의 새로운 프로 세 스 입 니 다.프로그램 이 재 귀적 이기 때문에 아무런 제한 이 없다 면 이 간단 한 프로그램 은 시스템 안의 모든 자원 을 신속하게 소모 하 게 될 것 이다.
bash 에서 이러한 fork 폭탄 을 설계 하 는 것 은 매우 간단 하 다. Jaromil 은 2002 년 에 가장 간단 한 fork 폭탄 의 실현 을 설계 했다. 전체 프로그램 은 함수 정의 에서 호출 까지 13 글자 만 포함 하고 목록 1 과 같다.
목록 1. bash 의 포크 폭탄
                
.(){ .|.& };.

 
이 문 자 는 언뜻 보기 에는 전혀 그 이 유 를 알 아 볼 수 없 을 것 같다. 다음은 그것 이 도대체 무엇 을 하고 있 는 지 하나씩 설명해 보 자.설명 이 편리 하도록 목록 1 의 내용 에 대해 형식 을 다시 설정 하고 목록 2 와 같은 줄 번 호 를 붙 였 습 니 다.
목록 2. bash 의 fork 폭탄 에 대한 설명
                
1 .()
2 {
3 .|.&
4 }
5 ;
6 .

 
  • 첫 번 째 줄 은 다음 에 함 수 를 정의 해 야 한 다 는 것 을 설명 합 니 다. 함수 이름 은 소수점 이 고 선택 할 수 있 는 매개 변수 가 없습니다.
  • 두 번 째 줄 은 함수 체 의 시작 을 나타 낸다.
  • 세 번 째 줄 은 함수 체 가 진정 으로 해 야 할 일 입 니 다. 먼저 이 함 수 를 재 귀적 으로 호출 한 다음 에 파 이 프 를 이용 하여 새로운 프로 세 스 를 호출 합 니 다 (할 일 도 재 귀적 으로 이 함 수 를 호출 합 니 다). 그리고 이 를 배경 에 놓 고 실행 합 니 다.
  • 네 번 째 줄 은 함수 체 가 끝 났 음 을 나타 낸다.
  • 다섯 번 째 줄 은 아무런 조작 도 하지 않 고 명령 줄 에서 두 명령 을 구분 하 는 데 사용 된다.전체적으로 보면 이 프로그램 은 두 부분 을 포함 하고 먼저 하나의 함 수 를 정의 한 다음 에 이 함 수 를 호출 한 다 는 것 을 나타 낸다.
  • 여섯 번 째 줄 은 본 함 수 를 호출 하 는 것 을 나타 낸다.

  • 함수 명 에 대해 서 는 의 심 스 러 울 수 있 습 니 다. 소수점 도 함수 명 으로 사용 할 수 있 습 니까?소수점 은 셸 의 내장 명령 이기 때문에 현재 셸 환경 에서 지정 한 파일 을 읽 고 명령 을 실행 합 니 다.실제로 가능 하 다. 이것 은 bash 가 명령 에 대한 해석 순서 에 달 려 있다.기본 적 인 상황 에서 bash 는 비 POSIX 모드 에 있 습 니 다. 명령 에 대한 설명 순 서 는 다음 과 같 습 니 다.
  • 키워드, 예 를 들 어 if, for 등.
  • 별명.별명 은 키워드 와 같 을 수 없 지만 키워드 에 별명 을 정의 할 수 있 습 니 다. 예 를 들 어 end = fi.
  • 특수 내장 명령, 예 를 들 어 break, contine 등.POSIX 가 정의 하 는 특수 내장 명령 은. (소수점),: (콜론), break, continue, eval, exec, exit, export, readonly, return, set, shift, times, trap 과 unset 를 포함한다.bash 에 특별한 내장 명령 source 가 추가 되 었 습 니 다.
  • 함수.비 POSIX 모드 에 있 으 면 bash 는 함수 와 우선 일치 한 다음 내장 명령 과 일치 합 니 다.
  • cd, test 등 특수 내장 명령 이 아 닙 니 다.
  • 스 크 립 트 와 실행 가능 한 프로그램.PATH 환경 변수 가 지정 한 디 렉 터 리 에서 검색 하여 첫 번 째 일치 하 는 항목 을 되 돌려 줍 니 다.

  • 기본 적 인 상황 에서 bash 는 비 POSIX 모드 에 있 기 때문에 fork 폭탄 의 소수점 은 함수 로 우선 일치 합 니 다.(실제로 Jaromil 의 최초 디자인 은 소수점 이 아 닌 콜론 을 사용 하여 똑 같은 효 과 를 낼 수 있 습 니 다.) Bash 스 크 립 트 를 POSIX 모드 로 실행 하려 면 다음 세 가지 방법 을 사용 할 수 있 습 니 다.
  • - posix 옵션 을 사용 하여 bash 를 시작 합 니 다.
  • bash 를 실행 한 후 set - o posix 명령 을 실행 합 니 다.
  • 사용/bin/sh.

  • 마지막 방법 은 비교적 흥 미 롭 다. 비록 sh 는 대부분의 시스템 에서 bash 를 가리 키 는 기호 링크 이지 만 POSIX 모드 를 사용 하고 모든 행 위 는 POSIX 규범 을 완전히 준수 한다.목록 3 에서 보 여 준 예 에서 우 리 는 소수점 이 기본 bash 에서 하나의 함수 로 해석 되 어 정상적으로 실 행 될 수 있 음 을 발견 할 수 있 습 니 다.그러나 sh 에서 소수점 은 내장 명령 으로 간주 되 기 때문에 함 수 를 호출 할 때 문법 오류 가 있어 정상적으로 실행 할 수 없다 고 여 겨 집 니 다.
    목록 3. bash 와 sh 의 명령 일치 순서 차이
                    
    [root@localhost ~]# ls -l /bin/bash /bin/sh
    -rwxr-xr-x 1 root root 735144 2007-08-31 22:20 /bin/bash
    lrwxrwxrwx 1 root root 4 2007-12-18 13:26 /bin/sh -> bash
    [root@localhost ~]# echo $SHELL
    /bin/bash
    [root@localhost ~]# .() { echo hello; } ; .
    hello
    [root@localhost ~]# sh
    sh-3.2# echo $SHELL
    /bin/bash
    sh-3.2# .() { echo hello; } ; .
    sh: `.': not a valid identifier
    sh: .: filename argument required
    .: usage: . filename [arguments]
    sh-3.2#

     
    목록 1 에 제 시 된 fork 폭탄 을 실행 하면 2 의 지수 차 멱 속도 로 새로운 프로 세 스 가 계속 발생 하여 시스템 자원 이 신속하게 소 모 될 수 있 습 니 다. 결국 기 계 를 다시 시작 하지 않 으 면 기본적으로 방법 이 없습니다.이것 이 너무 큰 손 해 를 입 히 는 것 을 방지 하기 위해 서, 목록 4 와 같은 모든 사용자 가 만 들 수 있 는 프로 세 스 수 를 제한 할 수 있 습 니 다.
    목록 4. 사용자 가 만 들 수 있 는 프로 세 스 수 를 제한 합 니 다.
                    
    [root@localhost ~]# ulimit -u 128
    [root@localhost ~]# ulimit -a
    core file size (blocks, -c) 0
    data seg size (kbytes, -d) unlimited
    max nice (-e) 20
    file size (blocks, -f) unlimited
    pending signals (-i) unlimited
    max locked memory (kbytes, -l) unlimited
    max memory size (kbytes, -m) unlimited
    open files (-n) 1024
    pipe size (512 bytes, -p) 8
    POSIX message queues (bytes, -q) unlimited
    max rt priority (-r) unlimited
    stack size (kbytes, -s) 8192
    cpu time (seconds, -t) unlimited
    max user processes (-u) 128
    virtual memory (kbytes, -v) unlimited
    file locks (-x) unlimited
    [root@localhost ~]# .() { .|.& } ; .
    [1] 6152
    [root@localhost ~]# bash: fork: Resource temporarily unavailable
    bash: fork: Resource temporarily unavailable
    bash: fork: Resource temporarily unavailable
    ...

     
    목록 4 에서 저 희 는 사용자 가 만 들 수 있 는 최대 프로 세 스 수 를 128 로 제한 합 니 다. fork 폭탄 을 실행 하면 대량의 프로 세 스 가 신속하게 발생 합 니 다. 그 후에 자원 이 부족 해서 계속 실행 할 수 없습니다.

    좋은 웹페이지 즐겨찾기