SSRF Contra o Serviço de Metadados da Nuvem para Ler o Papel IAM
O desafio
Este proxy de imagens busca qualquer URL que você passar e devolve o corpo - sem nenhuma lista de permissão de para onde pode ir. Ele roda num servidor de nuvem que expõe um serviço de metadados interno em 169.254.169.254. Aponte o proxy para o caminho das credenciais IAM desse serviço, envie e leia o nome do papel IAM que ele vaza.
O que você vai aprender
- Reconhecer a falsificação de requisição no lado do servidor (SSRF) quando um servidor busca uma URL fornecida pelo usuário sem lista de permissão
- Alcançar o serviço de metadados da instância de nuvem no endereço link-local 169.254.169.254
- Navegar pelo caminho de credenciais de segurança do IAM para ler o nome do papel anexado
- Entender como o nome do papel vazado leva a credenciais de nuvem de curta duração
- Explicar por que uma lista de permissão de saída e o IMDSv2 são as defesas corretas
Habilidades testadas
Pré-requisitos
- Entendimento básico de requisições HTTP e URLs
- Familiaridade com a ideia de que servidores de nuvem rodam dentro de uma instância com um papel anexado
- Consciência de que endereços link-local (169.254.0.0/16) só são alcançáveis a partir do próprio host
Como funciona
Falsificação de requisição no lado do servidor (SSRF) ocorre quando uma aplicação busca uma URL fornecida pelo usuário, e o atacante consegue fazer com que ela requisite um destino que a aplicação nunca pretendia. Um recurso como um proxy de imagens, um testador de webhook ou um "desenrolador" de links é o veículo clássico: ele recebe uma URL e a busca fielmente a partir do servidor. Como a requisição parte do servidor, ela pode alcançar endereços que o atacante não consegue tocar de fora, serviços internos, painéis administrativos e o endpoint de metadados da nuvem.
Em uma instância de nuvem, o serviço de metadados da instância (IMDS) responde no endereço link-local 169.254.169.254. Ele só é alcançável a partir da própria instância, então qualquer coisa que rode ali, incluindo um proxy vulnerável, pode consultá-lo. O caminho /latest/meta-data/iam/security-credentials/ lista o papel IAM anexado à máquina, e acrescentar esse nome de papel devolve chaves de acesso AWS ativas e de curta duração. Um SSRF que consegue alcançar o IMDS, portanto, se converte diretamente em credenciais de nuvem com as permissões da instância.
A falha não é o serviço de metadados; é o fato de o proxy buscar uma URL arbitrária sem nenhuma restrição sobre o destino. Sem uma lista de permissão, o servidor é um adjunto confuso: ele carrega a intenção do atacante com sua própria posição de rede e privilégios.
Erros comuns
- Assumir que o proxy só consegue alcançar CDNs públicas, quando na verdade ele busca qualquer endereço para o qual o próprio servidor consiga rotear, incluindo endereços internos e link-local.
- Mirar primeiro em
localhostou127.0.0.1e não perceber que os segredos da nuvem ficam no endereço de metadados link-local separado169.254.169.254. - Parar na listagem de diretório de credenciais sem perceber que o nome do papel devolvido é a resposta (e o próximo passo até as chaves ativas).
- Tratar o SSRF como um bug de parsing em vez da falha real: não existe lista de permissão restringindo para onde o servidor pode enviar requisições.
Como se proteger
A correção é restringir para onde o servidor pode enviar requisições de saída e reforçar o próprio serviço de metadados. Nunca busque uma URL fornecida pelo usuário sem validar o destino resolvido contra uma lista de permissão.
- Coloque em lista de permissão os hosts/domínios autorizados para o proxy e rejeite todo o resto; resolva o nome do host e bloqueie as faixas privadas, loopback e link-local (incluindo
169.254.0.0/16) depois da resolução para impedir DNS rebinding. - Exija o IMDSv2 (com token de sessão obrigatório) para que um SSRF simples baseado em GET não consiga mais ler credenciais, e defina o limite de saltos dos metadados como 1.
- Restrinja o papel IAM da instância ao menor privilégio necessário, para que uma credencial vazada seja muito menos útil.
- Registre e alerte sobre buscas de saída para endereços internos ou link-local, para que tentativas de SSRF fiquem visíveis.