포크 폭탄의 전역 별칭이 실행을 방해합니까?


15

전 세계적으로 설정했다면

alias ':(){ :|:& };:'='echo fork bomb averted'

이것이 Bash 포크 폭탄 실행을 피하는 효과적인 보안 전략입니까, 아니면 실행할 방법이 있습니까?

나는 질문이 현금화된다고 생각한다 : 명령이 다른 것에 별칭이있을 때 명령을 실행하는 방법이 있습니까?


1
"포크 폭탄"인 @ user1717828은 단순히 새 사본을 영원히 실행하는 프로그램입니다. 실행중인 프로그램 수의 기하 급수적 증가로 인해 일반적으로 무언가가 짧은 순서로 중단됩니다.
— Mark

1
이것이 작동하더라도-bash를 거치지 않는 fork ()를 호출하는 프로그램으로부터 보호하지 않습니까?
— UKMonkey

2
: () {: | : & : | : &} ;:
— Joshua

3
그냥 실행a(){ a|a& };a
— user253751

1
일반적인 형식은 피할 수 있지만 (만약 작동한다면) 거의 무한한 변형이있을 수 있습니다.
— 마스트

답변:


52

그 둘 , 아니, 셋 , ... 그 주요 장애물 중 하나는 다음과 같습니다.

  1. 별칭의 올바른 이름이 아닙니다. 배쉬 온라인 매뉴얼 :

    위에 나열된 문자 ... 및 쉘 메타 문자 또는 인용 문자는 별명으로 표시되지 않을 수 있습니다.

    (, ), &, |및 공백 배쉬 4.4에서입니다.

  2. 쉘에서 포크 폭탄을 작성하는 유일한 방법은 모호한 것처럼 보이기 때문입니다. 예를 들어 :실제로 문자로 구성된 것 대신 함수를 호출 할 필요가 없습니다 .

  3. 별명을 설정할 수있는 경우, 사용자는 별명을 설정 해제하거나, 명령 행에서 별명을 이스케이프하여 별명을 피하거나, 스크립트에서 함수를 실행하여 별명을 사용 불가능하게 할 수 있습니다 (Bash는 비 대화식 쉘에서 별명을 확장하지 않습니다) .

  4. 쉘이 모든 버전의 포크 폭탄을 멈출 수있을 정도로 제한되어 있더라도, 범용 시스템에는 서브 프로세스를 재귀 및 포크 오프 할 수있는 다른 프로그램 가능 유틸리티가 있습니다. Perl 또는 C 컴파일러가 있습니까? 충분히 쉽다. 아마도 awk조차도 할 수 있습니다. 설치되어 있지 않더라도 시스템 외부에서 컴파일 된 바이너리를 가져 오거나 /bin/sh나머지 시스템이 작동하려면 완전히 작동 가능한 쉘이어야하는 실행을 중지해야 합니다.

사용자가 시작할 수있는 프로세스 수를 제한 하려면 ulimit -u(즉 RLIMIT_NPROC) 또는 이와 동등한 것을 사용하십시오. 대부분의 Linux 시스템에는 pam_limits사용자가 선택한 명령이 시작되기 전에 프로세스 수 제한을 설정할 수 있습니다.

이와 같은 것은 /etc/security/limits.conf모든 사용자에게 50 개의 프로세스를 제한합니다.

*        hard    nproc           50

(Stephen Kitt은 이미 포인트 1을 언급 했으며 Jeff Schaller 는 2와 3을 언급했습니다. )


없이 포크 폭탄을 쓸 수 &있습니까?
— Stephen Kitt

4
@StephenKitt 100 % 확신 할 수는 없지만 배쉬가 완료되었습니다. 그렇다면 무한한 가능성이있을 것입니다. 예를 들어 ascii char-code 38을 구문 분석하고 실행할 수 있습니다.
— Marie

이 특정 맥락에서 @Marie는 &제한을 해결하면서 다른 금지 된 문자를 피해야합니다 .
— Stephen Kitt

15
내 요점은 주로 잘못된 기능을 블랙리스트에 올리는 것이 나쁜 생각이라는 것입니다. 거의 항상 주위에 방법이 있습니다.
— Marie

2
@ 마리 : 배쉬는 확실히 튜링 완료입니다.
— 추후 공지가있을 때까지 일시 중지되었습니다.

18

아니요. 포크 폭탄을 작성하는 방법은 너무 많습니다.

사악한 포크 폭탄 작가는 다른 기능 이름으로 다시 시도합니다. 또는 그의 포크 폭탄이 성공할 때까지 다른 변경.

부주의 한 포크 폭탄 제작자는 처음에는 표준 포크 폭탄을 생성하지 않습니다.

실제로 부주의 한 포크 폭탄 작가가되는 것은 오히려 쉽습니다. 예를 들어, make외부의 선택되지 않은 재귀 를 옵션 및 존재하지 않는 하위 디렉토리와 cd결합 하여 사용할 수 있습니다 -j.

모든 가능성에 대해 보호 할 수 없으며, 확실히 확실한 공격자에 대해서는 보호 할 수 없습니다. 시스템의 복잡성을 높이기 만하면됩니다.


14

포크 별칭 은 유효한 별칭 이름이 아니기 때문에 별칭을 지정할 수 없습니다 .

$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name

문자 '/', '$', '`', '='및 위에 나열된 쉘 메타 문자 또는 인용 문자는 별명에 나타나지 않을 수 있습니다.

일부 쉘은 선언 될 때 별명을 확인하지 않고 명령을 해석 할 때 유효하지 않은 이름을 건너 뜁니다. 포크 폭탄에는 항상가 포함 &되며 유효한 별칭 이름에 포함 할 수 없으므로 이런 식으로 자신을 보호 할 수 없습니다.


쉘이이 별명을 설정할 수 있는지 여부는 중요하지 않습니다. 이러한 별명이 존재하더라도 별명 이름이 허용 된 패턴과 일치하지 않으므로 명령을 해석하는 동안 확장되지 않습니다. dash그리고 bosh모두 예하면 자동으로 무시.
— schily

10

두번 요

이것이 포크 폭탄을 쓰는 유일한 방법은 아닙니다.

별칭이있을 때 "명령"을 실행하는 방법에는 여러 가지가 있습니다.

command the-command
\the-command

예:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png

주요 주제와 관련된 그런데 왜하지 않았다 \ls보여 output.png하지만 command ls하지 않았다?
— nxnev

잘 발견! 그것은 실제로 주요 주제와 관련이 없습니다. 고전적인 PEBCAK입니다복사 / 붙여 넣기 (또는 그 사이의 output.png를 정리) 오류입니다. 산만을 최소화하기 위해 수정하겠습니다. @nxnev 감사합니다!
— Jeff Schaller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.