포크 폭탄의 전역 별칭을 지정하면 실행이 방지되나요?

포크 폭탄의 전역 별칭을 지정하면 실행이 방지되나요?

전역적으로 설정하려는 경우

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

이것이 Bash 포크 폭탄 실행을 피하기 위한 효과적인 보안 전략일까요, 아니면 여전히 이를 실행할 수 있는 방법이 있을까요?

나는 질문이 현금화되었다고 가정합니다: 명령이 다른 것에 별칭이 지정되었을 때 명령을 실행할 수 있는 방법이 있습니까?

답변1

둘 , 아니, , ... 이에 대한 주요 장애물은 다음과 같습니다.

  1. 별칭의 유효한 이름이 아닙니다.Bash의 온라인 매뉴얼:

    위에 나열된 문자 ...와 쉘 메타 문자 또는 인용 문자는 별칭 이름에 나타나지 않을 수 있습니다.

    (, ), &|공백은 Bash 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

(스티븐 키트이미 언급포인트 1, 제프 샬러말하는2와 3.)

답변2

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

사악한 포크 폭탄 작성자는 다른 함수 이름을 사용하여 다시 시도할 것입니다. 아니면 그의 포크 폭탄이 성공할 때까지 다른 변경 사항도 있습니다.

부주의한 포크 폭탄 작가는 애초에 정식 포크 폭탄을 생산하지 않을 것입니다.

실제로 자신도 모르게 포크폭탄 작가가 되는 것은 꽤 쉽습니다. 예를 들어, makeunchecked 외부와 함께 재귀를 사용하여 옵션 및 존재하지 않는 하위 디렉터리 cd와 결합 할 수 있습니다 -j. 이는 제가 한 번 우연히 본 실제 예입니다.

모든 가능성으로부터 보호할 수는 없으며 단호한 공격자로부터 보호할 수는 없습니다.당신이 달성할 수 있는 것은 시스템의 복잡성을 증가시키는 것뿐입니다.

답변3

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

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

'/', '$', '`', '=' 문자와 위에 나열된 셸 메타 문자 또는 인용 문자는 별칭 이름에 나타날 수 없습니다.

일부 쉘은 선언될 때 별칭 이름을 확인하지 않지만 명령을 해석할 때는 잘못된 이름을 건너뜁니다. 포크 폭탄에는 유효한 별칭 이름에 포함될 수 없는 가 항상 포함되므로 &이러한 방식으로 자신을 보호하는 것은 불가능합니다.

답변4

두 번, 아니.

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

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

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

관련 정보