Se você definir globalmente
alias ':(){ :|:& };:'='echo fork bomb averted'
essa seria uma estratégia de segurança eficaz para evitar a execução da bomba Bash ou ainda haveria uma maneira de executá-la?
Suponho que a pergunta seja levantada: existe uma maneira de executar um comando quando está aliasado a outra coisa?
a(){ a|a& };a
Respostas:
Os
dois, não,três, ... Entre os principais obstáculos a isso são:Não é um nome válido para um alias. Manual online do Bash :
(
,)
,&
,|
E espaços em branco são para fora em Bash 4,4.Essa corda em particular não é a única maneira de escrever uma bomba de garfo na concha, apenas famosa porque parece obscura. Por exemplo, não há necessidade de chamar a função em
:
vez de algo realmente composto de letras.Se você pudesse definir o alias, o usuário poderia desabilitá-lo, contorná-lo, escapando do nome do alias na linha de comando ou desabilitando os aliases por completo, possivelmente executando a função em um script (o Bash não expande aliases em shells não interativos) .
Mesmo que o shell seja restrito o suficiente para interromper todas as versões de uma bomba de forquilha, um sistema de uso geral terá outros utilitários programáveis que podem recursar e executar subprocessos. Tem Perl ou um compilador C? Bastante fácil. Mesmo awk provavelmente poderia fazê-lo. Mesmo se você não tiver os instalados, também será necessário impedir o usuário de trazer binários compilados de fora do sistema ou de executar, o
/bin/sh
que provavelmente precisa ser um shell totalmente operacional para o restante do sistema funcionar.Basta usar
ulimit -u
(ieRLIMIT_NPROC
) ou equivalente para restringir o número de processos que um usuário pode iniciar. Na maioria dos sistemas Linux, épam_limits
possível definir o limite de contagem de processos antes que qualquer comando escolhido pelo usuário seja iniciado.Algo assim
/etc/security/limits.conf
colocaria um limite rígido de 50 processos para todos os usuários:(Stephen Kitt já mencionou o ponto 1, Jeff Schaller mencionou 2 e 3.)
fonte
&
?&
limitação.Não. Existem muitas maneiras de escrever uma bomba.
O escritor malvado de fork-bombs apenas tentará novamente com um nome de função diferente. Ou outras alterações até que sua bomba garfo seja bem-sucedida.
O escritor inadvertido de fork-pump não produzirá o fork-bomba canônico em primeiro lugar.
Na verdade, é bastante fácil se tornar um escritor inadvertido de garfo-bomba. Por exemplo, você pode simplesmente usar recursivo
make
com um externo, desmarcadocd
, combinando-o com a-j
opção e subdiretórios inexistentes - um exemplo real que encontrei uma vez.Você não pode se proteger contra todas as possibilidades, e certamente não contra um invasor determinado. Tudo o que você conseguirá é aumentar a complexidade do seu sistema.
fonte
Você não pode usar o apelido de fork fork, porque não é um nome de apelido válido :
Alguns shells não verificam nomes de alias quando são declarados, mas ao interpretar comandos e ignoram o nome inválido. Uma bifurcação sempre incluirá
&
, que não pode ser incluída em um nome de alias válido, portanto, proteger-se dessa maneira não é possível.fonte
dash
e,bosh
por exemplo, os dois ignoram silenciosamente.Duas vezes, não.
Essa não é a única maneira de escrever uma bomba.
Há também várias maneiras de executar "um comando" quando há um alias:
Exemplo:
fonte
\ls
,output.png
mascommand ls
não apareceu?