Hooks

Hook network: avalie URLs contra SSRF

Avalie um ou vários destinos de requisição contra SSRF, direto da linha de comando.

O hook network decide se um destino de requisição feita pelo servidor está protegido contra SSRF (uma requisição que pode ser direcionada a serviços internos, metadados da nuvem ou hosts privados). É o engine determinístico por trás da especialização network, e você mesmo pode executá-lo.

Como executar​

Passe cada destino com --url. O hook imprime uma palavra por destino, explicada na tabela abaixo.

npx lagune read network --url 'http://example.com/'
# => safe

npx lagune read network --url 'http://0x7f000001/'
# => private-target

Ele resolve o host do mesmo jeito que a rede, então as formas codificadas de um endereço interno não passam despercebidas: hexadecimal, octal, decimal sem pontos, abreviada, IPv6 e IPv4 mapeado em IPv6 resultam todas em private-target. E quando um validador descuidado e o cliente que faz a requisição leriam hosts diferentes, o veredito é parser-divergent.

Como ler o veredito​

VereditoSignificado
safeO destino se conecta a um host público, e um validador descuidado leria o mesmo host.
private-targetO host resolve para um endereço privado, de loopback, link-local, não especificado ou de metadados da nuvem.
parser-divergentUm validador de texto descuidado leria um host real diferente daquele ao qual o cliente se conecta.
invalid urlA string não pode ser interpretada como URL, então não há nada para buscar.

Só safe significa permitir. Trate private-target, parser-divergent e invalid url como bloqueio.

Opções da CLI​

OpçãoValorDescrição
--urluma URL ou um hostVerifica um destino. Repita para verificar vários, com um veredito por linha.

É obrigatório informar pelo menos um --url. O destino nunca é um argumento posicional solto, então não tem como ser confundido com uma flag.

Por que passar como flag

Cada destino é passado como valor de uma flag, nunca interpolado no comando. Um valor com aspas ou crases continua inerte e não consegue injetar nada no shell. Sempre coloque o valor entre aspas simples para que o seu shell não o expanda antes.

O que ele não cobre

O hook é puro e nunca resolve DNS, então duas lacunas de tempo de execução ficam fora do escopo: o DNS rebinding (um nome que resolve para um endereço público na verificação e para um interno na requisição) e as cadeias de redirecionamento (um primeiro salto que passa e depois redireciona para dentro). Feche essas lacunas resolvendo o nome uma única vez e se conectando ao endereço validado, e recusando redirecionamentos. Ele fixa os nomes de loopback reservados (localhost e a família .localhost) como internos sem nenhuma consulta, mas qualquer outro nome DNS resulta em safe, porque afirmar que ele resolve para dentro exigiria a resolução: quem protege esses nomes é a allowlist, e é ela que este verificador valida.

dica

Esta é a mesma verificação que a especialização network executa para comprovar que um filtro de destinos se sustenta.

Perguntas frequentes

Execute o hook network. Ele avalia um destino de requisição e retorna safe, private-target, parser-divergent ou invalid url. Só safe significa permitir.

Uma URL que parsers diferentes leem de formas diferentes, o que é um bypass clássico de SSRF. O hook network a sinaliza em vez de permiti-la.