Linux fork 폭탄 분석
그러나 해석 적 언어 로 서 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 모드 에 있 습 니 다. 명령 에 대한 설명 순 서 는 다음 과 같 습 니 다.
기본 적 인 상황 에서 bash 는 비 POSIX 모드 에 있 기 때문에 fork 폭탄 의 소수점 은 함수 로 우선 일치 합 니 다.(실제로 Jaromil 의 최초 디자인 은 소수점 이 아 닌 콜론 을 사용 하여 똑 같은 효 과 를 낼 수 있 습 니 다.) Bash 스 크 립 트 를 POSIX 모드 로 실행 하려 면 다음 세 가지 방법 을 사용 할 수 있 습 니 다.
마지막 방법 은 비교적 흥 미 롭 다. 비록 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 폭탄 을 실행 하면 대량의 프로 세 스 가 신속하게 발생 합 니 다. 그 후에 자원 이 부족 해서 계속 실행 할 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.