전 세계적으로 설정했다면
alias ':(){ :|:& };:'='echo fork bomb averted'
이것이 Bash 포크 폭탄 실행을 피하는 효과적인 보안 전략입니까, 아니면 실행할 방법이 있습니까?
나는 질문이 현금화된다고 생각한다 : 명령이 다른 것에 별칭이있을 때 명령을 실행하는 방법이 있습니까?
a(){ a|a& };a
전 세계적으로 설정했다면
alias ':(){ :|:& };:'='echo fork bomb averted'
이것이 Bash 포크 폭탄 실행을 피하는 효과적인 보안 전략입니까, 아니면 실행할 방법이 있습니까?
나는 질문이 현금화된다고 생각한다 : 명령이 다른 것에 별칭이있을 때 명령을 실행하는 방법이 있습니까?
a(){ a|a& };a
답변:
그 둘 , 아니, 셋 , ... 그 주요 장애물 중 하나는 다음과 같습니다.
별칭의 올바른 이름이 아닙니다. 배쉬 온라인 매뉴얼 :
위에 나열된 문자 ... 및 쉘 메타 문자 또는 인용 문자는 별명으로 표시되지 않을 수 있습니다.
(
, )
, &
, |
및 공백 배쉬 4.4에서입니다.
쉘에서 포크 폭탄을 작성하는 유일한 방법은 모호한 것처럼 보이기 때문입니다. 예를 들어 :
실제로 문자로 구성된 것 대신 함수를 호출 할 필요가 없습니다 .
별명을 설정할 수있는 경우, 사용자는 별명을 설정 해제하거나, 명령 행에서 별명을 이스케이프하여 별명을 피하거나, 스크립트에서 함수를 실행하여 별명을 사용 불가능하게 할 수 있습니다 (Bash는 비 대화식 쉘에서 별명을 확장하지 않습니다) .
쉘이 모든 버전의 포크 폭탄을 멈출 수있을 정도로 제한되어 있더라도, 범용 시스템에는 서브 프로세스를 재귀 및 포크 오프 할 수있는 다른 프로그램 가능 유틸리티가 있습니다. 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을 언급했습니다. )
&
있습니까?
&
제한을 해결하면서 다른 금지 된 문자를 피해야합니다 .
아니요. 포크 폭탄을 작성하는 방법은 너무 많습니다.
사악한 포크 폭탄 작가는 다른 기능 이름으로 다시 시도합니다. 또는 그의 포크 폭탄이 성공할 때까지 다른 변경.
부주의 한 포크 폭탄 제작자는 처음에는 표준 포크 폭탄을 생성하지 않습니다.
실제로 부주의 한 포크 폭탄 작가가되는 것은 오히려 쉽습니다. 예를 들어, make
외부의 선택되지 않은 재귀 를 옵션 및 존재하지 않는 하위 디렉토리와 cd
결합 하여 사용할 수 있습니다 -j
.
모든 가능성에 대해 보호 할 수 없으며, 확실히 확실한 공격자에 대해서는 보호 할 수 없습니다. 시스템의 복잡성을 높이기 만하면됩니다.
포크 별칭 은 유효한 별칭 이름이 아니기 때문에 별칭을 지정할 수 없습니다 .
$ alias ':(){ :|:& };:'='echo fork bomb averted'
bash: alias: `:(){ :|:& };:': invalid alias name
문자 '/', '$', '`', '='및 위에 나열된 쉘 메타 문자 또는 인용 문자는 별명에 나타나지 않을 수 있습니다.
일부 쉘은 선언 될 때 별명을 확인하지 않고 명령을 해석 할 때 유효하지 않은 이름을 건너 뜁니다. 포크 폭탄에는 항상가 포함 &
되며 유효한 별칭 이름에 포함 할 수 없으므로 이런 식으로 자신을 보호 할 수 없습니다.
dash
그리고 bosh
모두 예하면 자동으로 무시.
두번 요
이것이 포크 폭탄을 쓰는 유일한 방법은 아닙니다.
별칭이있을 때 "명령"을 실행하는 방법에는 여러 가지가 있습니다.
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
하지 않았다?