이 비밀스러운 Bash 명령은 무엇을 의미합니까?


23

악성 명령에 대한 우분투 포럼의 경고를 읽고이 흥미로운 보석을 발견했습니다.

:(){ :|:& };:

경고 : 하드 프로트 업을 요구하는 엄격한 프록 제한이없는 한 위의 코드 컴퓨터와 충돌합니다.

이 코드는 running과 비슷합니다 sudo rm -rf /.

그러나 그것은 무엇을 의미합니까? 프로그래밍 경험이 있어도 어셈블리 언어가 아닌 암묵적인 명령을 본 적이 없습니다.


16
추가 사항 : 이것은 실제로는 결코 비슷하지 않습니다 sudo rm -rf /. 이 명령은 모든 파일을 삭제합니다. 이 기능은 사용할 수 없게되어 다시 시작해야 할 때까지 머신의 리소스를 막습니다.
jtbandes

@ jtban : 그런 다음 편집하십시오. 두 코드 조각 모두 "위험한"실행으로 간주됩니다. 예 sudo rm -rf /이다 위험하지만 사람들이 원격 서버에서이 작업을 실행 보았다 "그냥 무슨 짓을했는지보고 싶어" 당신은 힘든 시간을 제어 패널에 액세스하지 않고 다시 시작하는이 곳.
Josh K

7
그것의 감정 폭탄 : P
RCIX

이 될 수 있습니다 arbitrary_name(){ arbitrary_name|arbitrary_name& };arbitrary_name. 이름 :은이 명령을 짧고 암호로 만들뿐만 아니라 아무것도: 하지 않는 내장 함수를 많이 하는 함수로 바꿉니다 . :(){ :|:& }다른 사람의 환경에 정의 를 숨기고 거기에 머무르면 피해자 가 가장 적게 기대할 때 파업 합니다 .
Kamil Maciorowski

답변:


40

당신이 말했듯이, 그것은 폭탄 폭탄입니다. 그것이하는 일은 함수를 정의한 다음 호출하는 것입니다. 이 기능을 호출 :합니다.

forkbomb무슨 일이 일어나고 있는지 더 잘 볼 수 있도록 이름을 지정합시다 .

forkbomb(){ forkbomb|forkbomb& };forkbomb

보시다시피 프로그래밍 경험에서 추측 할 수 있듯이 첫 번째 부분은 함수 정의 ( forkbomb(){ ... })이고 마지막 :은 함수가 호출되는 위치 ;입니다 (Bash에서 명령문을 구분).

자,이 기능은 무엇을합니까? Bash에 익숙하다면 |캐릭터가 한 명령 / 프로그램의 표준 출력을 다른 명령 / 프로그램의 표준 출력으로 파이프 한다는 것을 알게 될 것입니다 . 기본적으로 함수의 인스턴스를 :|:시작합니다 (여기서는 "포크").

그리고 마술 :이 &명령은 백그라운드에서 해당 명령을 넣어 원래의 기능이 반환되도록하고 각 인스턴스는 암소가 백그라운드로 돌아올 때까지 포크하므로 모든 리소스를 사용하고 시스템을 중단시킵니다 (한계가없는 한) 그것에 부과).


1
좋은 답변입니다! 함수 이름으로 :을 사용할 수 있다는 것을 몰랐습니다. 이름 바꾸기가 도움이됩니다. 3 분 후에 수락합니다.
TheLQ

1
+1 쿨 ... 훌륭한 설명. 이것은 OS 작업 스위처의 스택 오버플로와 같습니다. 실제로 커널에 충돌을 일으키거나 사용하기에 너무 견딜 수 없을 때까지 리소스를 소비합니까?
Evan Plaice

적어도 그것이 직접적으로 커널이 충돌하지는 않는다고 생각합니다. 그것은 기하 급수적으로 더 많은 프로세스를 생성하며, 각 프로세스는 CPU 및 메모리를 차지하며 프로세서가 모든 프로세스를 처리하려고 시도하면 실제로 사용할 수 없게됩니다. 커널이 결국로드에서 충돌 할 수도 있지만 (확실하지는 않습니다) 그 전에는 사용할 수 없습니다.
jtbandes

3
:실제로 함수를 실행하는 final을 설명하는 것을 잊지 마십시오 !
Phoshi

@Phoshi : 내가 한 줄 알았지 만 명확히하기 위해 편집 할 것입니다!
jtbandes

9

Wikipedia 기사 Forkbomb에서 가져온 것 :

:()      # define ':' -- whenever we say ':', do this:
{        # beginning of what to do when we say ':'
    :    # load another copy of the ':' function into memory...
    |    # ...and pipe its output to...
    :    # ...another copy of ':' function, which has to be loaded into memory
         # (therefore, ':|:' simply gets two copies of ':' loaded whenever ':' is called)
    &    # disown the functions -- if the first ':' is killed,
         #     all of the functions that it has started should NOT be auto-killed
}        # end of what to do when we say ':'
;        # Having defined ':', we should now...
:        # ...call ':', initiating a chain-reaction: each ':' will start two more.

7

세분화 :

: () // Define ':' as a function. When you type ':' do the following
{
    : // Call ':' 
    | // Redirect output
    : // Into ':'
    & // Push process to the background
}; // End of ':' def
: // Now do ':'

변경 :bomb하고, 당신은 :

bomb(){ bomb|bomb& };bomb

정말 우아합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.