Armadilhas do sistema de chamada (3) ou popen (3) com uma string constante?

2

Assumindo por um segundo que você definiu explicitamente variáveis de ambiente "problemáticas" como PATH , IFS e possivelmente algumas das variáveis LC_* , que idéia é ruim usar popen e system com uma string cujo valor é uma constante de tempo de compilação (para permitir diferenças entre Unices e estranheza como não-POSIX /bin/sh 's).

Por exemplo, se eu tenho algum código em C que usa um trecho como o seguinte para realizar uma pesquisa em profundidade dos arquivos no diretório atual, isso é um problema do ponto de vista de segurança / correção?

FILE* fh = popen("2>/dev/null /usr/bin/find . -print0 -type f");

EDIT: exemplo que força um ambiente limpo e não inclui opções não portáteis

FILE* fh = popen("2>/dev/null /usr/bin/env -i /usr/bin/find . -type f");
    
por Gregory Nisbet 13.03.2017 / 21:19

1 resposta

3

Assuming for a second that you explicitly set "problematic" environment variables like...

Não faça isso.

É um pouco difícil identificar todas as variáveis de ambiente que algum programa pode se interessar. Um pouco mais fácil apenas fornecer ao programa um ambiente limpo com apenas as variáveis necessárias definidas.

Se você estiver executando um comando simples como esse, use apenas uma das funções exec , para não precisar se preocupar com problemas relacionados a diferentes shells.

Se você sabe que está chamando um utilitário padrão, pode ter certeza de que sabe o que está fazendo, e qualquer limite de recursos e tal provavelmente também afetaria seu programa se você fosse implementar a função sozinho. Mas há variantes de find com extensões não padrão, como o -print0 que você usou, portanto, se você usá-las, você depende de uma versão do programa externo que as suporta.

    
por 13.03.2017 / 22:27

Tags