2017-12-09 10 views
-1

나의 CS 과정 중 하나에서 주어진 과제에서, 우리는 멈추기가 매우 어려운 포크 폭탄을 만드는 임무가 있습니다.진보 된 forkbomb 면역 신호 완충

면역 제어 -c, control-z 및 control-d가 있어야 터미널을 종료 할 수 있습니다. 그것은 또한 sigkill과 시그널 9에 면역성을 가져야 만합니다. 우리는 sigsegv로 곧 시그널 처리를 끝 냈지만 그게 전부였습니다. 나는 sigaction이 sigkill이나 sigstop 신호를 잡을 수 없다는 것을 읽었습니다.

나는 또한 프로세스를 백그라운드에서 실행할 수있게 해주는 데몬싱을 통해 터미널을 닫으면 멈추지 않을 것이라고 읽었다.

포크 폭탄 공정을 sigkill 신호에 면역시키는 방법은 무엇입니까?

이것은 우리가 전에 만든 포크 폭탄입니다.

#include<unistd.h> 

int main(){ 

    while(1){ 
     fork(); 
    } 
    return 0; 
} 

또한 안전하게 테스트하기 위해 가상 박스를 사용하고 있습니다.

+4

프로세스를 SIGKILL 신호로부터 보호 할 수 없습니다. 그것은 항상 치명적입니다. 그러나 포크 폭탄을 터뜨린 원래의 과정이 SIGKILL에서 사망하더라도 그 많은 자손은 그 신호를받지 못할 것이므로 아이들을 산란시키고 시스템을 무릎에 가까이 가져 가도록 할 수 있습니다. 동시 실행이 허용되는 프로세스의 수에 대한 제한이 허용됩니다. 시도하지 않는 것이 좋습니다. 아마도 재부팅해야합니다. (프로세스 그룹과 세션이 적절할 것입니다.) –

+0

가상 박스를 사용하여 폭탄을 테스트하고 있습니다. 어떻게 아이 프로세스가 SIGKILL을받지 못하게 할 수 있습니까? – Will

+1

프로세스는 적절한 권한이 부여 된 프로세스 (예 :'root '가 실행하는 프로세스)에서 SIGKILL을 수신하지 못하게 할 수 있습니다. 하위 프로세스가 ID를 생성 한 사용자 (예 : SUID가 다른 사용자이기 때문에)에서 ID를 변경하면 해당 사용자는 일종의 면책권을 얻을 수 있습니다. 그러나 '루트'가 SIGKILL을 전송하는 프로세스를 시작하면 프로세스가 갑자기 중단되고 유예 옵션이 없어집니다. 실패 할 수있는 유일한 시간은 프로세스가 중단되지 않는 시스템 호출에 매달려있는 경우입니다.이 호출은 가끔 사용할 수없는 NFS 파일 시스템에서 발생할 수 있지만 그 이전에는 ... –

답변

1

신호/면역 sigkill 신호를 피할 수 없습니다. 이 된 신호 SIGKILL 말했다과 SIGSTOP 잡은 또는

while(1){ 
     fork(); 
    } 

당신은 당신이 원하는만큼 프로세스를 생성 할 수 있기 때문에 좋은 생각이 아니다을 무시할 수없는 signal() 의 매뉴얼 페이지를 읽기 , 약간의 제한이 있습니다. ulimit을 확인하십시오. 리소스가 없을 때 한 번에 실패합니다 (sh는 오류 메시지를 표시합니다).

+2

이는 답변의 일부일뿐입니다. 대답의 아주 중요한 부분 임에도 불구하고. –

+0

포크 폭탄을 어떻게 만들겠습니까? 나는 그것을 읽었다 :() {: | : & }; : forkbomb은 단순한 것이지, 이것이 더 좋은 선택일까요? – Will

+0

@Will : 쉘 조각':() {: | :}}은 간단한 포크 폭탄이지만, 보여준 C 코드와 크게 다르지 않습니다. 다른 유사한 코드와 마찬가지로 SIGKILL과 마찬가지로 취약합니다. 그 코드 (셸 조각)가 실제로 무엇을하는지 이해합니까? –

관련 문제