Evitar injeção de comando com o sistema () api [closed]

5

Temos um código C legado usado para permitir que usuários menos privilegiados executem scripts personalizados com privilégios escalados. Isto tem o bit SUID definido. Este código restringe o env PATH a uma pasta específica e, em seguida, usa system() api para executar o script com shell restrito:

/bin/bash -r -c "script <arg>"

Como o caminho é restrito, ele pode executar apenas scripts dessa pasta específica.

Agora, sabendo de todas as armadilhas para injeção de comando com system() api, que medidas podem ser tomadas para evitar a injeção de comando? Isso é usado em muitos lugares em vários scripts, etc., portanto, não é necessário executar uma implementação completamente nova para evitar qualquer regressão.

    
por Rajesh 27.08.2018 / 06:50

2 respostas

6

Como é difícil acertar, sugiro remover o SUID em seu código. Altere seu código C para usar sudo . Usando o sudo, os aspectos mais difíceis de obter uma programação segura do sistema são feitos.

Depois, você pode construir cuidadosamente uma configuração sudo, usando o visudo, que faz o mínimo necessário para executar a tarefa e restringir isso aos usuários / grupos necessários. Depois de configurar o sudo, peça a alguém que não seja você para testá-lo e tentar quebrar as restrições pretendidas.

    
por 27.08.2018 / 07:44
2

A injeção de código requer a capacidade do usuário de passar cadeias arbitrárias como parâmetros para a chamada system() . Isso é bem parecido com as injeções de SQL e deve ser evitado de maneira semelhante: não passe nenhuma string definida pelo usuário diretamente para a chamada:

    Os parâmetros numéricos
  • devem ser convertidos em números inteiros e, em seguida, convertidos novamente em sequências no momento da chamada

  • Os parâmetros
  • que pertencem a um dicionário fixo devem ser convertidos para valores "enum" ou semelhantes e, em seguida, retornados para as strings no momento da chamada

  • A entrada de texto livre
  • deve ser restrita ao conjunto de caracteres inofensivos, quando possível (por exemplo, [a-zA-Z0-9]* ). Quando forem necessários caracteres problemáticos (incluindo espaço), deve-se aplicar o escape adequado (ou seja, a b deve ser substituído por a\ b , etc.)

por 27.08.2018 / 11:49

Tags