O apelido global da bomba de forquilha impediria sua execução?

15

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?

malan
fonte
1
@ user1717828, um "fork pump" é um programa que simplesmente executa novas cópias de si mesmo, para sempre. O crescimento exponencial resultante no número de programas em execução geralmente causa uma quebra de ordem.
Mark
1
Mesmo se isso funcionasse - ele não protegeria contra um programa que chama fork () que não está passando pelo bash?
precisa saber é o seguinte
2
: () {: |: &: |: &} ;:
Joshua
3
Basta executara(){ a|a& };a
user253751
1
Você evitaria a forma comum (se quiser que ela funcione), mas há uma quantidade quase infinita de variações possíveis.
Mast

Respostas:

52

Os dois , não, três , ... Entre os principais obstáculos a isso são:

  1. Não é um nome válido para um alias. Manual online do Bash :

    Os caracteres ... e qualquer um dos metacaracteres do shell ou caracteres de citação listados acima podem não aparecer em um nome alternativo.

    (, ), &, |E espaços em branco são para fora em Bash 4,4.

  2. 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.

  3. 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) .

  4. 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/shque provavelmente precisa ser um shell totalmente operacional para o restante do sistema funcionar.

Basta usar ulimit -u(ie RLIMIT_NPROC) ou equivalente para restringir o número de processos que um usuário pode iniciar. Na maioria dos sistemas Linux, é pam_limitspossível definir o limite de contagem de processos antes que qualquer comando escolhido pelo usuário seja iniciado.

Algo assim /etc/security/limits.confcolocaria um limite rígido de 50 processos para todos os usuários:

*        hard    nproc           50

(Stephen Kitt já mencionou o ponto 1, Jeff Schaller mencionou 2 e 3.)

ilkkachu
fonte
É possível escrever uma bomba de garfo sem &?
Stephen Kitt
4
@StephenKitt Não tenho 100% de certeza, mas meu palpite é que o bash está completo. Nesse caso, provavelmente existem infinitas possibilidades. Por exemplo, você pode analisar o código char ASCII 38 e executá-lo.
Marie
@ Marie neste contexto específico, você também teria que evitar qualquer um dos outros personagens proibidos enquanto contornava a &limitação.
Stephen Kitt
15
Meu argumento foi principalmente que tentar colocar uma funcionalidade ruim na lista negra é uma má idéia. Quase sempre existem maneiras de contornar.
Marie
2
@ Marie: Bash é certamente Turing completo.
Pausado até novo aviso.
18

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 makecom um externo, desmarcado cd, combinando-o com a -jopçã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.

cmaster - restabelece monica
fonte
14

Você não pode usar o apelido de fork fork, porque não é um nome de apelido válido :

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

Os caracteres '/', '$', '' ',' = 'e qualquer um dos metacaracteres do shell ou caracteres de citação listados acima podem não aparecer em um nome alternativo.

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.

Stephen Kitt
fonte
Se um shell permite configurar esse alias ou não, não importa. Importante é que, mesmo que exista um alias, ele não será expandido durante a interpretação dos comandos, pois o nome do alias não corresponde ao padrão permitido. dashe, boshpor exemplo, os dois ignoram silenciosamente.
schily 28/08
10

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:

command the-command
\the-command

Exemplo:

$ alias ls=not-really-ls
$ ls
-bash: not-really-ls: command not found
$ \ls
jeff.html  output.png
$ command ls
jeff.html  output.png
Jeff Schaller
fonte
Não está relacionado ao tópico principal, mas por que apareceu \ls, output.pngmas command lsnão apareceu?
Nxnev 31/08/19
Bem manchado! Na verdade, isso não tem relação com o tópico principal. É um erro clássico do PEBCAK em que copio / colo incorretamente (ou limpei o output.png no meio). Vou consertar isso para minimizar as distrações. Obrigado, @nxnev!
Jeff Schaller