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


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.