포크 폭탄은 어떻게 작동합니까?


22
  • 경고 생산 기계에서이를 실행하지 마십시오.

주제에 대한 Wikipedia 페이지를 읽으면 일반적으로 다음 코드로 진행되는 작업을 따릅니다.

:(){ :|:& };:

설명의 발췌

다음 포크 폭탄은 2002 년에 예술로 소개되었습니다.56 정확한 기원은 알 수 없지만 2002 년 이전 Usenet에 존재했습니다. 폭탄은 다음 13자를 bash 또는 zsh 와 같은 UNIX 쉘 에 붙여 넣어 실행됩니다 . ':'라는 함수를 정의하여 작동합니다.이 함수는 포 그라운드에서 한 번, 백그라운드에서 한 번 두 번 호출됩니다.

그러나 마지막 비트는 완전히 명확하지 않습니다. 함수 정의를 봅니다.

:(){ ... }

그러나 다른 일이 있습니까? 또한 같은 다른 쉘을 수행 ksh, cshtcsh도 비슷한을 구성 할 수있는 동일한 운명을 고통을?


2
이것은 스택 교환에서 자주 나타납니다. 좋은 대답은 다음과 같습니다. stackoverflow.com/questions/991142/…
Drav Sloan

@DravSloan-여기에 그 내용 중 일부를 만들려고했습니다. 제 질문은 그런 식으로 조금로드되었습니다. 8-).
slm

"하나님의 사랑을 위해 이것을 생산 기계에서 실행하지 마십시오. 기계를 계속 사용하려면 계속해서 실행하십시오!" message :)
Drav Sloan

1
@ MartinSchröder-당신은이 질문이 그 질문을받는 주요 원인이라는 것을 알고 있습니까? 8-). 나는 금요일 밤에 무언가를 얻기 위해 이것을 물었고 다른 질문은 그 후 한두 시간 후에 나왔습니다.
slm

1
@ MartinSchröder-아마도 별개로 남겨 두는 것이 가장 좋으며 약간 다릅니다. 이것은 포크 폭탄의 작동 방식에 대한 전체적인 세부 정보를 요구하고 다른 하나는 포크 폭탄 내에서 시스템이 포크되는 방식의 메커니즘에 대한 세부 사항을 요구하고 있다는 것입니다. 나는 그것이 관련 b / c가 혼란스러워 보일지 모르지만 그것들은 다르다 (IMO-분명히). 나는 심지어 다른 Q에 대답하고 포크를 구동시키는 후드 아래의 메커니즘을 보여 주려고했지만 그것을 멍청이로 표시하지 않았습니다.
slm

답변:


23

이 포크 폭탄은 AI 프로그래밍 교사가 내가 처음 접한 수업 중 하나에서 "재귀를 이해하려면 먼저 재귀를 이해해야합니다"라고 말한 것을 상기시킵니다.

핵심은이 폭탄이 재귀 함수입니다. 본질적으로, 시스템 리소스가 소비 될 때까지 자체를 호출하고 자신을 호출하는 기능을 생성합니다. 이 특정 예에서, 재귀는 함수를 그 자체로 파이핑하고 배경을 사용하여 증폭됩니다.

나는 이것이 StackOverflow 에서 답을 얻은 것을 보았고 , 주어진 예제가 그것이 한 눈에 이해하기 쉽기 때문에 (위의 링크에서 도난 당했기 때문에) 가장 잘 설명한다고 생각합니다 ...

☃(){ ☃|☃& };☃

버그 함수를 정의하는 ☃() { ... }본문 (버그 함수), 출력을 자체 파이프 (버그 함수) ☃|☃및 결과의 배경을 정의하십시오 &. 그런 다음 함수가 정의 된 후에 실제로 버그 함수를 호출하십시오 ; ☃.

최소한 내 Arch VM에서 프로세스를 백그라운드로 처리해야 할 필요는 없습니다. 사용 가능한 모든 프로세스 공간을 소비하고 호스트를 b0rked로 렌더링하기 위해 동일한 최종 결과를 요구할 필요는 없습니다. 실제로 지금은 때때로 도망가는 프로세스를 종료하는 것으로 보이며 한 번의 심사 후에 -bash: fork: Resource temporarily unavailableTerminated(와 함께 journalctlbash 코어 덤프가 표시됨) 중지됩니다 .

csh / tcsh에 대한 질문에 대답하기 위해 해당 쉘 중 어느 것도 함수를 지원하지 않으므로 별칭 만 사용할 수 있습니다. 따라서 해당 쉘의 경우 재귀 적으로 호출되는 쉘 스크립트를 작성해야합니다.

zsh는 (동일한 코드로) 동일한 운명을 겪고 코어 덤프를하지 않으며 Arch 가주는 원인이 Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.되지만 여전히 포크합니다. 잠시 후 그것은 상태 Killed process 162 (systemd-logind) ...(그리고 여전히 포크 zsh를 계속)를 나타냅니다.

아치에는 pacmanksh 버전 이없는 것 같아서 대신 데비안에서 시도해야했습니다. ksh 객체를 :함수 이름으로 사용하지만 무언가를 사용 b()하면 원하는 결과를 얻는 것처럼 보입니다.


그 캐릭터는 무엇입니까? 나는 그들이 버그라는 것을 알고 있지만 어떻게 만들었습니까?
slm

10
작은 글꼴 크기이지만 버그처럼 보이지만 실제로는 눈사람임을 알 수 있습니다. 공백없이 & # x 2603을 입력하여 html로 표시 할 수있는 유니 코드 문자 U + 2603입니다.
sambler

2
분명히 리눅스에서는 상당히 많은 Gnome 관련 앱과 Firefox가 지원됩니다. Ctrl+Shift+u+<hex>여기서 16 진수는 표시하려는 유니 코드 문자의 16 진수 코드입니다. 볼 수있는 유니 코드 목록은 fileformat.info/info/unicode/utf8test.htm 에서 찾을 수 있습니다 (홀수의 대부분은 "기타"섹션에 있음). Windows는 superuser.com/questions/47420/… 을 체크 아웃해야 하며, 링크에 언급 된 도구를 개인적으로 사용 unicodeinput.exe하거나 브라우저를 통해 잘라내어 붙여 넣습니다. sambler에서 제안한대로 항상 html 시퀀스를 사용할 수 있습니다.
Drav Sloan

1
위키에는 또한 유니 코드 문자 목록이 있습니다 : en.wikipedia.org/wiki/List_of_Unicode_characters
Drav Sloan

눈사람 버그가 마음에 들었습니다. 여기에서 사용중인 버그가 시스템에 표시되지 않습니다. 🐛은 16 진수가있는 상자처럼 나타납니다.
terdon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.