O nome de arquivo que executa: Tar Wildcard Injection até root
O desafio
Uma máquina de finanças da Calderwell executa um backup a cada hora: ela entra no diretório de upload e empacota tudo o que está nele com tar. O diretório é gravável pelo usuário web, e foi assim que três arquivos que ninguém enviou apareceram nele durante a noite. Dois deles não são relatórios de forma alguma. Leia o job de backup e o diretório, e indique o arquivo exato que um atacante deixou para que o próximo backup executasse o código dele como root.
O que você vai aprender
- Explicar como o shell expande um glob em argumentos separados antes de o comando vê-los
- Reconhecer que o tar não distingue um nome de arquivo de uma opção depois que o shell os separou
- Identificar --checkpoint-action como o recurso do tar que transforma um nome de arquivo em execução de código
- Entender por que um diretório gravável sob um glob privilegiado já é a vulnerabilidade
- Citar as alternativas seguras (find -exec, listas explícitas de arquivos, prefixo ./)
Habilidades testadas
Pré-requisitos
- Comandos básicos de shell (ls, cat)
- O que um glob (*) faz
Como funciona
Quando o shell vê tar czf out.tgz *, ele substitui o * por todos os nomes de arquivo do diretório e passa cada um como um argumento separado. O comando nunca vê um *; ele vê uma lista. Se um desses nomes começa com um hífen, o comando o lê como uma opção.
O GNU tar tem uma opção, --checkpoint-action=exec=..., que executa um comando em intervalos. Assim, um arquivo chamado --checkpoint-action=exec=sh run.sh, dentro do diretório, vira uma instrução para o tar executar run.sh. Um atacante que só consegue gravar arquivos no diretório sobre o qual o job privilegiado aplica o glob tem seu código executado como o usuário desse job.
A mesma armadilha vale para qualquer cmd * sobre conteúdo controlado pelo atacante: chown, chmod, rsync e outros também têm escapes em forma de opção.
Erros comuns
- Indicar
run.sh. Esse é o payload que as opções plantadas chamam, não o arquivo que sequestra o tar. O tar só o executa porque o arquivo de opção manda. - Indicar um CSV. Os dois relatórios são o conteúdo normal do spool e são inofensivos.
- Esperar executar o backup aqui. O job roda como root em um agendamento; você só precisa reconhecer o que a próxima execução vai fazer.
- Procurar um binário SUID ou uma regra de sudo. A escalação está inteiramente no glob e no nome do arquivo, nada mais está mal configurado.
Como se proteger
Nunca deixe um comando privilegiado aplicar glob sobre um diretório em que outros podem gravar.
- Troque o glob por uma lista explícita e com prefixo:
find /srv/upload -maxdepth 1 -type f -print0 | tar --null -T - -czf ..., para que nomes de arquivo nunca sejam lidos como opções. - Ou neutralize o hífen:
tar czf out.tgz -- *ou./*, para que todo operando seja claramente um caminho. - Não rode o backup como root sobre um spool gravável pela web. Reduza os privilégios, ou copie o spool para uma área de staging que o usuário web não consiga tocar e faça o backup dela.
Solução completa
Estatísticas da comunidade
Hacks de hoje relacionados
Colaboradores creditados
Estes hackers relataram problemas, melhoraram o conteúdo e ajudaram a fortalecer esta página.