포크 폭탄으로 시스템을 충돌시킬 수 없는 이유는 무엇입니까?

포크 폭탄으로 시스템을 충돌시킬 수 없는 이유는 무엇입니까?

저는 최근 GNU/Linux 프로세스에 대한 정보를 검색하다가 악명 높은 포크 폭탄을 발견했습니다.

:(){ : | :& }; :

이론적으로는 시스템 리소스가 부족해질 때까지 무한히 자신을 복사해야 합니다.

그러나 나는 시도했다명령줄 인터페이스그리고시나몬 민트distro에서는 시스템에 거의 영향을 미치지 않는 것 같습니다. 예, 많은 프로세스가 생성되었으며 잠시 후 다음과 같은 콘솔 메시지를 읽었습니다.

bash: 포크: 리소스를 일시적으로 사용할 수 없습니다.

bash: 포크: 재시도: 하위 프로세스 없음

그러나 일정 시간이 지나면 모든 프로세스가 종료되고 모든 것이 정상으로 돌아갑니다. 내가 읽고한계값사용자당 최대 프로세스 수를 설정하지만 너무 많이 늘릴 수는 없는 것 같습니다.

포크폭탄에 대한 시스템 보호 조치는 무엇입니까? 모든 것이 정지되거나 적어도 많이 지연될 때까지 자체 복제되지 않는 이유는 무엇입니까? 실제로 포크 폭탄으로 시스템을 충돌시킬 수 있는 방법이 있습니까?

답변1

아마도 systemd를 사용하는 Linux 배포판이 있을 것입니다.

Systemd는 각 사용자에 대해 cgroup을 생성하고 사용자의 모든 프로세스는 동일한 cgroup에 속합니다.

Cgroup은 최대 프로세스 수, CPU 주기, RAM 사용량 등과 같은 시스템 리소스 제한을 설정하기 위한 Linux 메커니즘입니다. 이는 시스템 호출을 ulimit사용하는 것과는 getrlimit()다르고 더 현대적인 리소스 제한 계층 입니다.

systemctl status user-<uid>.slice(사용자의 cgroup을 대신하여) 실행하면 현재 및 최대 수를 볼 수 있습니다.이 cgroup에 허용되는 프로세스 및 스레드입니다.

$ systemctl 상태 user-$UID.slice
● user-22001.slice - UID 22001의 사용자 조각
   로드됨: 로드됨
  삽입: /usr/lib/systemd/system/user-.slice.d
           └─10-defaults.conf
   활성: 2018-09-10 17:36:35 EDT 1주 3일 전 월요일부터 활성 상태입니다.
    임무: 17(한도: 10267)
   메모리: 616.7M

기본적으로 systemd에서는 사용자당 최대 작업 수를 "시스템 전체 최대 작업 수"( )의 33%로 허용합니다. sysctl kernel.threads-max이는 일반적으로 약 10,000개의 작업에 해당합니다. 이 한도를 변경하려면 다음을 수행하세요.

  • systemd v239 이상에서는 사용자 기본 설정이 다음을 통해 이루어집니다.최대 작업 수 =존재하다:

    /usr/lib/systemd/system/user-.slice.d/10-defaults.conf
    

    특정 사용자에 대한 제한을 조정하려면(즉시 적용되고 /etc/systemd/system.control에 저장됨) 다음을 실행하십시오.

    systemctl [--runtime] set-property user-<uid>.slice TasksMax=<value>
    

    장치 설정을 재정의하는 일반적인 메커니즘(예 systemctl edit: )도 여기에서 사용할 수 있지만 재부팅이 필요합니다. 예를 들어 다음 제한을 변경하려는 경우모든생성할 수 있는 /etc/systemd/system/user-.slice.d/15-limits.conf사용자

  • systemd v238 및 이전 버전에서 사용자 기본 설정은 다음을 통해입니다.사용자 작업 최대값=존재하다 /etc/systemd/logind.conf. 이 값을 변경하려면 일반적으로 재부팅이 필요합니다.

이에 대한 추가 정보:

답변2

그럼에도 불구하고 이로 인해 더 이상 최신 Linux 시스템이 충돌하지 않습니다.

많은 프로세스를 생성하지만 프로세스가 유휴 상태일 때 실제로 그렇게 많은 CPU를 소비하지는 않습니다. 이제 RAM이 부족해지기 전에 프로세스 테이블의 슬롯을 모두 사용했습니다.

Hkoof가 지적한 대로 cgroup을 제한하지 않으면 다음 변경 사항으로 인해 시스템이 계속 충돌하게 됩니다.

:(){ : | :& : | :& }; :

답변3

나는 90년대에 우연히 이 중 하나를 내 몸에 풀었습니다. 실수로 fork() 명령이 포함된 C 소스 파일에 실행 비트를 설정했습니다. 두 번 클릭하면 csh는 내가 원하는 대로 편집기에서 열지 않고 실행을 시도합니다.

그럼에도 불구하고 시스템이 충돌하지는 않았습니다. Unix는 귀하의 계정 및/또는 운영 체제에 프로세스 제한이 있을 만큼 강력합니다. 대신 속도가 매우 느려지고 프로세스를 시작하는 데 필요한 모든 작업이 실패할 수 있습니다.

뒤에서 일어나는 일은 프로세스 테이블이 새로운 프로세스를 생성하려는 프로세스로 가득 차 있다는 것입니다. 프로세스 중 하나가 종료되면(프로세스 테이블이 가득 차서 포크 오류가 발생하거나 시스템을 정상 상태로 복원하려는 절박한 운영자로 인해) 다른 프로세스 중 하나가 기꺼이 새 프로세스를 포크하여 채울 것입니다. 공허함.

"포크 폭탄"은 기본적으로 프로세스 테이블을 가득 채우는 역할을 하는 의도하지 않은 프로세스 자가 치유 시스템입니다. 그것을 막을 수 있는 유일한 방법은 어떻게든 한 번에 모두 죽이는 것입니다.

관련 정보