O aliasing globalmente da bomba bifurcada impediria sua execução?

14

Se você fosse definir globalmente

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

seria uma estratégia de segurança eficaz para evitar a execução da Bash Fork ou ainda haveria uma maneira de executá-la?

Suponho que a pergunta seja: existe uma maneira de executar um comando quando ele é aliado a outra coisa?

    
por malan 28.08.2018 / 15:19

4 respostas

52

Os dois , não, three , ... Entre os principais obstáculos para isso estão:

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

    The characters ... and any of the shell metacharacters or quoting characters listed above may not appear in an alias name.

    ( , ) , & , | e espaço em branco estão no Bash 4.4.

  2. Essa sequência específica não é a única maneira de escrever uma bifurcação na casca, 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 cancelar o alias, contorná-lo, escapando o nome do alias na linha de comando, ou desabilitar todos os aliases, possivelmente executando a função em um script (Bash não expanda aliases em shells não interativos).

  4. Mesmo que o shell seja restrito o suficiente para interromper todas as versões de uma fork fork, um sistema de propósito geral terá outros utilitários programáveis que podem recorrer e separar subprocessos. Got Perl ou um compilador C? Bastante fácil. Até o awk provavelmente poderia fazer isso. Mesmo que você não tenha aqueles instalados, você também precisará parar o usuário de trazer binários compilados de fora do sistema, ou executando /bin/sh , que provavelmente precisa ser um shell totalmente operacional para o resto do sistema. função.

Basta usar ulimit -u (ou seja, RLIMIT_NPROC ) ou equivalente para restringir o número de processos que um usuário pode iniciar. Na maioria dos sistemas Linux, há pam_limits que pode definir o limite de contagem de processos antes de qualquer comando escolhidos pelo usuário são iniciados.

Algo como isso em /etc/security/limits.conf colocaria um limite de 50 processos para todos os usuários:

*        hard    nproc           50

(Stephen Kitt já mencionado , ponto 1, Jeff Schaller simitado 2 e 3.)

    
por 28.08.2018 / 16:02
17

Não. Existem muitas maneiras de escrever uma garfo-bomba.

O malvado fork-bomb writer tentará novamente com um nome de função diferente. Ou outras alterações até que sua bifurcação tenha sucesso.

O escritor de garfo-bomba inadvertido não produzirá a garfo-bomba canônica em primeiro lugar.

É realmente fácil se tornar um escritor inadvertido de garfo-bomba. Por exemplo, você poderia usar apenas% recursivomake com um cd externo e não verificado, combinando-o com a opção -j e subdiretórios não existentes - um exemplo real que eu encontrei uma vez.

Você não pode salvaguardar contra todas as possibilidades, e certamente não contra um atacante determinado. Tudo o que você conseguirá é aumentar a complexidade do seu sistema.

    
por 28.08.2018 / 19:09
14

Você não pode aliasar uma bifurcação, porque não é um nome de alias válido :

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

The characters ‘/’, ‘$’, ‘'’, ‘=’ and any of the shell metacharacters or quoting characters listed above may not appear in an alias name.

Alguns shells não verificam nomes de alias quando são declarados, mas ao interpretar comandos, ignoram o nome inválido. Uma garfo bomba sempre incluirá & , que não pode ser incluído em um nome de alias válido, portanto, proteger-se dessa maneira não é possível.

    
por 28.08.2018 / 15:22
10

Duas vezes, não.

Essa não é a única maneira de escrever uma garfada.

Há também várias maneiras de executar "um comando" quando houver 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
    
por 28.08.2018 / 15:24