Executando uma "fork fork" com segurança

6

Todos nós já vimos a "fork fork" que irá tornar um host não responsivo, mesmo se executado em um shell não privilegiado:

Aviso: não execute o script de shell a seguir. Apenas não faça isso.

:(){ :|:& };:

Também estou ciente dos cgroups , a estrutura de agrupamento de processos no nível do kernel do Linux que pode atribuir "controladores" a limite de memória, consumo de CPU, prioridade de agendamento de I / O, etc.

Teoricamente, deve ser possível usar esse mecanismo de controle para permitir que um usuário execute uma bifurcação em seu próprio shell sem fazer com que o sistema host seja rastreado.

Como não estou ciente de como uma bifurcação consome recursos, não sei como usar o cgroups para fazer isso.

    
por amphetamachine 13.11.2014 / 17:56

1 resposta

5

Tanto quanto eu estou preocupado, acho cgroups seria um exagero aqui. No entanto, tenho a tendência de usar ulimit sempre que executo algo com uma chamada de sistema fork (experiências ruins tornaram isso um hábito ...):

$ ulimit -u 2500
$ ./mypotentiallydeadlyprogram

Desta forma, eu coloquei um limite de 2.500 processos no meu shell atual. Graças a isso, minhas chamadas fork acabarão fracassando se ficarem muito numerosas, evitando assim que o sistema caia, e permitindo que eu atinja furiosamente Ctrl + C .

Na minha máquina, acho que o 2500 é um bom limite, mas você pode querer aumentar / diminuir esse valor de acordo com o que sua máquina pode levar, e até onde você quer que sua fork fork vá. Lembre-se também de que sua máquina precisa gerar coisas para sobreviver, não as sufoque. Eu vi pessoas escrevendo isso em ~/.bashrc , restringindo, assim, até mesmo o bash principal de sua sessão. Enquanto isso foi muito engraçado para o administrador de sistema, o usuário ficou muito infeliz em congelar após o login.

Embora ulimit possa ser usado para configurar um limite temporário, você pode definir algo mais permanente se tiver acesso raiz (e quiser impor o limite a usuários específicos). Isso pode ser feito através de /etc/security/limits.conf :

# <domain>      <type>      <item>      <value>
youruser        soft        nproc       2500
youruser        hard        nproc       2750

Na configuração acima, youruser tem um limite flexível de 2500 processos (máx. 2750). Este arquivo permite que você configure vários tipos de limites, para várias entidades em seu sistema (usuários, grupos, ...). Dê uma olhada em sua documentação se precisar de mais informações . No entanto, observe que essa é uma configuração de todo o sistema, o que significa que esse limite não é aplicado por-shell para youruser .

A propósito, /proc/sys/kernel/pid_max conterá o PID máximo que pode ser concedido pelo seu kernel. Como os PIDs são reutilizáveis, você pode considerar isso muito próximo do seu número máximo de processos .

    
por 13.11.2014 / 18:06