전역 별칭 ​​포크 폭탄으로 인해 실행이 방지됩니까?

전역 별칭 ​​포크 폭탄으로 인해 실행이 방지됩니까?

전역적으로 설정하고 싶다면

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

아니요. 포크 폭탄을 프로그래밍하는 방법에는 여러 가지가 있습니다.

사악한 포크 폭탄 작성자는 다른 함수 이름으로 다시 시도할 것입니다. 또는 그의 포크 폭탄이 성공할 때까지 다른 변경 사항이 있습니다.

의도하지 않은 포크폭탄 작성자는 애초에 정식 포크폭탄을 만들지 않습니다.

사실, 자신도 모르게 포크폭탄 작가가 되기 쉽습니다. 예를 들어 재귀를 make외부, unchecked 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

관련 정보