Quais são os problemas de segurança e condições de corrida no uso do `find -exec`?

14

Na findpágina do manual :

-exec command ;
    There are unavoidable security problems
    surrounding use of the -exec action; you should use the
    -execdir option instead.

-execdir command {} +
    Like -exec, but the specified command is run from the
    subdirectory containing the matched file, which is not
    normally the directory in which you started find.  This a much
    more secure method for invoking commands, as it avoids race
    conditions during resolution of the paths to the matched
    files.

O que isto significa? Por que existem condições de corrida com a execução no diretório inicial? E como são esses riscos à segurança?

Danny Tuppeny
fonte
Relacionado: Por que o loop sobre a prática inadequada da saída do find? onde isso é coberto em algumas das respostas.
Stéphane Chazelas

Respostas:

13

Encontre os detalhes aqui :

A -execação faz com que outro programa seja executado. Passa para o programa o nome do arquivo que está sendo considerado no momento. O programa chamado normalmente executará alguma ação nesse arquivo. Mais uma vez, há uma condição de corrida que pode ser explorada aqui. Tomaremos como exemplo específico o comando

 find /tmp -path /tmp/umsp/passwd -exec /bin/rm

Neste exemplo simples, estamos identificando apenas um arquivo a ser excluído e invocando /bin/rmpara excluí-lo. Existe um problema porque existe um intervalo de tempo entre o ponto em que find decide que ele precisa processar a -execação e o ponto em que o /bin/rmcomando realmente emite a chamada do sistema unlink () para excluir o arquivo do sistema de arquivos. Nesse período, um invasor pode renomear o /tmp/umsp diretório, substituindo-o por um link simbólico para /etc. Não há como /bin/rmdeterminar se ele está funcionando no mesmo arquivo que a descoberta tinha em mente. Depois que o link simbólico está em vigor, o atacante convenceu o find a causar a exclusão do /etc/passwdarquivo, que não é o efeito pretendido pelo comando que foi realmente chamado.

Não tenho certeza da probabilidade de alguém poder explorar isso; mas acho que há a resposta!

Danny Tuppeny
fonte
No caso acima, execdiro primeiro seria chdir /tmp/umspantes de executar o comando e, portanto, teoricamente, um atacante vincular novamente o diretório não teria efeito. Se a vinculação ocorrida depois de encontrar "decide" avaliar, -execmas antes que o rmcomando possa fazer seu trabalho. Mas me pergunto por que isso faria diferença: o invasor pode simplesmente fazer a vinculação novamente depois que o usuário decidir escrever o findcomando.
Otheus 03/04
1
@RuiFRibeiro O link não é o argumento passado ao comando, é um diretório intermediário. /tmp/umspé um diretório quando o findvisualiza, mas quando rmexecutado, o atacado o transformou em um link simbólico para /etc. /tmp/umsp/passwdé um arquivo regular o tempo todo, mas não o mesmo.
Gilles 'SO- stop being evil'
2

Acredito que a razão pela qual -execé perigoso é porque, se o usuário não especificar o nome completo e o caminho para o programa a ser executado, ele potencialmente executará o programa errado.

Exemplo:

find /some/path -exec coolprogram

Em /some/path, alguém fez outro coolprogram, e ele carrega todos os seus dados para algum ator ruim.

Mas espere, você diz, não precisa executá-lo como ./coolprogram? Sim, mas algumas pessoas têm PATH=.:/bin:whatever, que executará o programa no diretório atual.

Provavelmente isso é simplificado, mas acho que pode ser perigoso em alguns casos. Eu tive que solucionar um problema uma vez em que um byte zero cpioterminasse no diretório errado. Isso causou uma falha no programa porque cpionão funcionava, pois estava executando o arquivo de byte zero no diretório.

Doug
fonte
3
Esses riscos não estão isolados find -exec. Se você colocou .no seu caminho, basta executar coolprogramno seu diretório atual já é perigoso, quer você o findfaça ou não!
Danny Tuppeny
1
Concordo, mas parece que o -execdir observa a condição que eu mencionei também:The ‘-execdir’ action refuses to do anything if the current directory is included in the $PATH environment variable. This is necessary because ‘-execdir’ runs programs in the same directory in which it finds files – in general, such a directory might be writable by untrusted users. For similar reasons, ‘-execdir’ does not allow ‘{}’ to appear in the name of the command to be run.
Doug
Eu acho que a moral da história é essa. no seu caminho também é uma má ideia, e é por isso que eu garanto que não está lá.
Doug
Interessante saber sobre a proibição .no caminho e {}no comando. Talvez no futuro o Linux apenas proíba .totalmente o caminho e as ferramentas não precisem implementar suas próprias verificações de segurança! :)
Danny Tuppeny
1
Eu acho que 90% do código que escrevo é apenas para capturar os 5% de coisas que dão errado. :)
Doug