El hook network decide si el destino de una petición hecha desde el servidor está a salvo de SSRF (una petición que se puede dirigir contra servicios internos, metadatos de la nube o hosts privados). Es el motor determinista en el que se apoya la especialización network, y puedes ejecutarlo tú mismo.
Cómo ejecutarlo
Pasa cada destino con --url. El hook muestra una palabra por destino, que se interpreta con la tabla de más abajo.
- Un destino
- Varios destinos
npx lagune read network --url 'http://example.com/'
# => safe
npx lagune read network --url 'http://0x7f000001/'
# => private-target
Repite --url para evaluar toda una lista de permitidos o de bloqueados en una sola llamada, con un veredicto por línea y en el mismo orden.
npx lagune read network \
--url 'http://example.com/' \
--url 'http://[::1]/' \
--url 'http://allowed.com@evil.example/'
# => safe
# => private-target
# => parser-divergent
Resuelve el host igual que lo hace la red, así que las formas codificadas de una dirección interna no se cuelan: hexadecimal, octal, decimal sin puntos, abreviada, IPv6 e IPv4 mapeada dan todas private-target. Y cuando un validador descuidado y el cliente que hace la petición real leerían hosts distintos, el veredicto es parser-divergent.
Cómo interpretar el veredicto
| Veredicto | Significado |
|---|---|
safe | El destino apunta a un host público, y un validador descuidado leería el mismo host. |
private-target | El host se resuelve a una dirección privada, de loopback, de enlace local, no especificada o de metadatos de la nube. |
parser-divergent | Un validador de texto descuidado leería un host real distinto del host al que se conecta el cliente. |
invalid url | La cadena no es una URL válida, así que no hay nada que pedir. |
Solo safe equivale a permitir. Trata private-target, parser-divergent e invalid url como un bloqueo.
Opciones de la CLI
| Opción | Valor | Descripción |
|---|---|---|
--url | una URL o un host | Comprueba un destino. Repítela para comprobar varios, con un veredicto por línea. |
Se necesita al menos un --url. El destino nunca va como argumento posicional suelto, así que no se puede confundir con una opción.
Cada destino se pasa como valor de una opción, nunca interpolado en el comando. Un valor con comillas o comillas invertidas queda inerte y no puede inyectar nada en la shell. Escríbelo siempre entre comillas simples para que tu shell no lo expanda antes.
El hook es puro y nunca resuelve DNS, así que dos huecos que solo aparecen en tiempo de ejecución quedan fuera de su alcance: el DNS rebinding (un nombre que se resuelve a una dirección pública al comprobarlo y a una interna al hacer la petición) y las cadenas de redirecciones (un primer salto que pasa la comprobación y luego redirige hacia dentro). Ciérralos resolviendo una sola vez y conectándote a la dirección validada, y rechazando las redirecciones. Trata los nombres de loopback reservados (localhost y la familia .localhost) como internos sin consultar el DNS, pero cualquier otro nombre DNS da safe, porque afirmar que se resuelve hacia dentro exigiría resolverlo: de esos nombres se encarga la lista de permitidos, que es justo lo que este comprobador valida.
Es la misma comprobación que ejecuta la especialización network para demostrar que un filtro de destinos se sostiene.
Preguntas frecuentes
Ejecuta el hook network. Evalúa el destino de una petición y devuelve safe, private-target, parser-divergent o invalid url. Solo safe equivale a permitir.
Una URL que distintos parsers leen de forma diferente, una forma clásica de eludir la protección contra SSRF. El hook network la señala en lugar de permitirla.
