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.
- Um destino
- Vários destinos
npx lagune read network --url 'http://example.com/'
# => safe
npx lagune read network --url 'http://0x7f000001/'
# => private-target
Repita --url para avaliar uma allowlist ou denylist inteira em uma só chamada, com um veredito por linha, na mesma ordem.
npx lagune read network \
--url 'http://example.com/' \
--url 'http://[::1]/' \
--url 'http://allowed.com@evil.example/'
# => safe
# => private-target
# => parser-divergent
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
| Veredito | Significado |
|---|---|
safe | O destino se conecta a um host público, e um validador descuidado leria o mesmo host. |
private-target | O host resolve para um endereço privado, de loopback, link-local, não especificado ou de metadados da nuvem. |
parser-divergent | Um validador de texto descuidado leria um host real diferente daquele ao qual o cliente se conecta. |
invalid url | A 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ção | Valor | Descrição |
|---|---|---|
--url | uma URL ou um host | Verifica 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.
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 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.
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.
