%20api%20.png)
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 b
deverá ser substituído pora\ b
, etc.)