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

1

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.

2

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 | less
3

Verificar 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 "\*"
4

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.log
5

Avaliar 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 --help

Verifique:

  • 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).

6

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