Evite injeção de comando com system() api

Evite injeção de comando com system() api

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

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

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

Agora conhecendo todas as armadilhas da injeção de comando com system()API, quais medidas podem ser tomadas para evitar a injeção de comando? Isso é usado em muitos lugares, em vários scripts, etc., portanto, não queira fazer uma implementação completamente nova para evitar qualquer regressão.

Responder1

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

Então você pode construir cuidadosamente uma configuração sudo, usando visudo, que faça o mínimo necessário para executar a tarefa e restrinja 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.

Responder2

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

  • parâmetros numéricos devem ser convertidos em números inteiros e depois convertidos novamente em strings no momento da chamada

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

  • a entrada de texto livre deve ser restrita a conjuntos de caracteres inofensivos sempre que possível (por exemplo [a-zA-Z0-9]*, ). Onde caracteres problemáticos (incluindo espaço) forem necessários, o escape adequado deverá ser aplicado (ou seja, a bdeverá ser substituído por a\ b, etc.)

informação relacionada