Manipulação de Glob (Expansão de Coringas) em Contexto Privilegiado
Esta página apresenta como a funcionalidade de expansão de coringas presente em interpretadores de linha de comando (shells) pode ser usada para elevar privilégios em sistemas GNU/Linux. O Guia para verificação de vulnerabilidade explica as condições que tornam a expansão explorável e fornece instruções práticas para avaliar se um binário privilegiado está exposto a esse vetor.
Pré-requisitos
Esta seção elenca, em forma de lista, alguns assuntos fundamentais sobre sistemas operacionais cujo conhecimento prévio é necessário para o pleno entendimento da seção Explicações Conceituais.
Expansão de padrões (globbing);
Coringas (wildcards);
Explicações conceituais
Em sistemas GNU/Linux, coringas (wildcards) são metacaracteres interpretados pelo shell para realizar a expansão de padrões. Esse processo, denominado globbing, consiste em substituir o padrão contendo coringas por uma lista de arquivos ou diretórios que correspondem ao critério especificado. A expansão é efetuada pelo shell antes da execução do comando, de modo que o comando não recebe o padrão em si, mas sim a lista resultante da expansão.
O asterisco (*) é um dos metacaracteres usados como coringa para correspondência de padrões. Ele, especificamente, corresponde a qualquer número de caracteres desconhecidos (ou seja, qualquer sequência).
Considere um binário privilegiado (SUID, SGID ou executado via sudo) acessível a algum usuário não administrativo. Internamente, esse binário invoca um shell para executar um comando cujos argumentos incluem um asterisco (*). Como o asterisco é expandido, qualquer arquivo existente no diretório correspondente passa a integrar a lista de argumentos do comando. Caso o atacante possa criar arquivos nesse diretório, ele consegue controlar parte dos argumentos resultantes da expansão (por exemplo, se o atacante criar um arquivo cujo nome é igual a um argumento desse comando, isso pode levar o comando a ser executado com esse argumento). Se o comando chamado pelo binário interpretar esses argumentos de forma a permitir execução de comandos, a manipulação pode levar à injeção de comandos. Uma vez que o binário é executado em contexto privilegiado, tal injeção pode resultar em elevação de privilégios.
Instruções práticas
Trata-se de um guia prático de verificação de segurança que apresenta uma sequência de instruções passo a passo, incluindo o uso de ferramentas/comandos, cujo objetivo é identificar a presença de uma vulnerabilidade em sistemas Linux. A vulnerabilidade em questão envolve o abuso de binários em contexto privilegiado, em conjunto com manipulação de glob (expansão de coringas).
Guia para verificação de vulnerabilidade
Identificação de binários privilegiados
1.1. Para identificar riscos potenciais associados às permissões especiais SUID e SGID, consulte esta página.
1.2. Para identificar riscos potenciais associados ao mecanismo de controle de acesso sudo, consulte esta página.
Verificar se o binário invoca algum interpretador shell
Objetivo: Determinar se o binário privilegiado invoca algum shell para executar comandos.
Motivo: A funcionalidade de expansão de coringas (globbing) é uma funcionalidade suportada pela maioria dos interpretadores de linha de comando (como sh, bash, dash, zsh). Se o binário privilegiado invoca algum shell para executar algum comando, a expansão de coringas pode ocorrer em contexto privilegiado. Caso o binário utilize outras funções para invocar comandos (como execve(), por exemplo) que não suportam essa funcionalidade, a expansão não ocorre.
Método:
É possível utilizar a ferramenta de análise estática strings para procurar referências a shells:
strings /caminho/para/binario | grep -E "sh|bash|dash|zsh|system|popen|popen2|popen3"E, quando em ambiente controlado, desassemble:
objdump -d /caminho/para/binario | lessVerificar presença de padrões com coringas no binário
Objetivo: Detectar padrões literais contendo asterisco (*) usados na formação de comandos dentro do binário.
Motivo: A existência de um padrão como comando /caminho/alvo/* é pré-condição para que a expansão de coringa inclua arquivos controláveis pelo atacante nos argumentos do comando.
Método:
É possível buscar por string literal com asterisco no binário usando análise estática:
strings /caminho/para/binario | grep "\*"Identificar quais diretórios são alvo da expansão de coringas
Objetivo: Determinar o caminho (absoluto ou relativo) cujo conteúdo será expandido pelo coringa no momento da execução do binário privilegiado.
Motivo: A exploração só é possível se o atacante puder criar ou alterar arquivos no diretório que será expandido; conhecer o diretório é necessário para posteriormente avaliar suas permissões.
Método:
Se o padrão estiver em um caminho absoluto, provavelmente já foi identificado nas etapas anteriores, então basta anotá-lo. Porém, se for relativo, será necessário observar o working directory em tempo de execução:
# Execute em ambiente controlado com strace
strace -f -o /tmp/trace.log /caminho/para/binario_privilegiado
# Procure por chamadas a open/stat/readdir
grep -E "open|stat|lstat|opendir|readdir" /tmp/trace.log | less
# Para binários que mudam o cwd, rastreie as chamadas chdir:
grep "chdir" /tmp/trace.logAvaliar se a ferramenta chamada recebe argumentos de forma a permitir execução de comandos
Objetivo: Verificar se os argumentos expandidos podem ser interpretados pela ferramenta invocada como instruções, comandos, templates ou parâmetros que provoquem execução de código.
Motivo: Nem toda expansão de nomes de arquivo é perigosa: o risco existe quando a ferramenta trata o nome de arquivo como entrada executável ou como parte de uma string que será reinterpreteda/avaliada (por exemplo opções --exec, --eval, --format que aceitam código ou comandos).
Método:
Consulte a documentação da ferramenta:
man comando # ou
comando --helpVerifique:
Opções que aceitam execução direta de comandos (por exemplo
--exec,--run,--action,--post,--hook);Parâmetros que permitem avaliar expressões externas (como
--eval,--command,--format);Opções que processam nomes de arquivos como comandos (existem utilitários que suportam esse uso, como o
git).
Avaliar permissões do diretório alvo da expansão de coringas
Objetivo: Determinar se usuários não administrativos podem criar ou alterar arquivos no diretório cujo conteúdo é expandido pelo coringa.
Motivo: A capacidade de criar ou alterar arquivos no diretório alvo é o vetor necessário para controlar os itens que serão inseridos na expansão; permissões inadequadas tornam a manipulação factível.
Método:
Avalie as permissões POSIX no diretório:
ls -ld /caminho/alvo/A verificação deve responder:
O usuário não administrativo tem permissão de escrita (
w) no diretório?O grupo ao qual ele pertence possui permissão de escrita (
w)?Outros usuários possuem permissão de escrita (
w)?Se o diretório possuir SGID ativo, novos arquivos podem herdar o grupo, podendo permitir manipulação por usuários de determinados grupos.
Verifique se ACLs concedem permissões adicionais:
getfacl /caminho/alvo/Se qualquer usuário não privilegiado puder criar arquivos, há risco.
Referências
Lista de fontes usadas para a elaboração do material, bem como recomendações para estudo aprofundado.
Last updated