Mitmproxy 11: soporte completo para HTTP/3
(mitmproxy.org)- A medida que aumenta la proporción de tráfico QUIC y HTTP/3, mitmproxy 11 activa HTTP/3 por defecto para ampliar el alcance del análisis del tráfico web moderno
- HTTP/3 funciona no solo en proxy transparente y proxy reverso, sino también en WireGuard y local mode, por lo que puede aplicarse en distintos entornos de captura
- Chrome no confía en una Certificate Authority agregada por el usuario en QUIC, por lo que hay que elegir entre un certificado de confianza pública, un interruptor de línea de comandos o el fallback a HTTP/2
- La implementación de DNS cambia a una basada en Hickory DNS, y maneja consultas más allá de A/AAAA, HTTPS records, DNS-over-TCP, control del archivo hosts y eliminación de claves ECH
- Funciones de privacidad como ECH dificultan el flujo de generación de certificados de un proxy man-in-the-middle, pero mitmproxy mantiene la posibilidad de funcionar ajustando las respuestas DNS
Alcance del soporte de HTTP/3
- mitmproxy 11 soporta HTTP/3 en los modos de proxy transparente y proxy reverso
- En el proxy reverso, una sola instancia de mitmproxy recibe paquetes TCP y UDP y maneja la versión de HTTP que se transfiera
- Comando de ejemplo:
mitmproxy --mode reverse:https://http3.is
- Comando de ejemplo:
- También se puede usar HTTP/3 en WireGuard y local mode
- Comandos de ejemplo:
mitmproxy --mode wireguard mitmproxy --mode local
- Comandos de ejemplo:
- Se probó con Firefox, Chrome, varias compilaciones de cURL y otros clientes para reducir problemas de compatibilidad
- El trabajo de soporte para HTTP/3 fue iniciado en 2022 por Manuel Meitinger y Maximilian Hils, y en mitmproxy 11 queda activado por defecto
Restricciones de certificados QUIC en Chrome
- La principal limitación conocida actualmente es que Chrome no confía en una Certificate Authority agregada por el usuario en QUIC
- Para manejar tráfico HTTP/3 en Chrome, se necesita una de las siguientes opciones
- Proveer un certificado de confianza pública, como Let’s Encrypt
- Ejecutar Chrome con el interruptor de línea de comandos correspondiente
- Aceptar que el comportamiento haga fallback a HTTP/2
- Firefox no presenta este comportamiento
- Puedes consultar consejos para resolver problemas de HTTP/3 en #7025
Reimplementación basada en Hickory DNS
- Con la aparición de funciones de privacidad como DNS HTTPS records y Encrypted Client Hello(ECH), ha aumentado la importancia del procesamiento DNS en mitmproxy
- La implementación anterior de DNS tenía limitaciones porque usaba
getaddrinfo- Solo soportaba consultas A/AAAA para direcciones IPv4 e IPv6
- No podía responder a consultas como HTTPS records que anuncian soporte para HTTP/3
- mitmproxy 11 reimplementa el soporte DNS sobre Hickory DNS, una biblioteca DNS escrita en Rust
- A través de Hickory, obtiene los servidores de nombres predeterminados del sistema operativo en Windows, Linux y macOS, y reenvía a esos servidores las consultas que no sean A/AAAA
- La nueva opción
dns_name_serverspermite especificar a qué servidores de nombres reenviarmitmdump --mode dns --set dns_name_servers=8.8.8.8
Control del archivo hosts y DNS-over-TCP
- Junto con el cambio a Hickory, se añadió una opción para ignorar el archivo hosts del sistema
- La nueva opción
dns_use_hosts_filepermite controlar si se reflejan archivos hosts como/etc/hostsen Linux - También está previsto mover la resolución DNS interna de mitmproxy a Hickory, y después esta función será útil al redirigir de forma transparente dominios específicos en la misma máquina
- Actualmente, como siempre se considera el archivo hosts, mitmproxy puede conectarse recursivamente a sí mismo en configuraciones de redirección sobre la misma máquina
- Ejemplo de funcionamiento:
echo "192.0.2.1 mitmproxy.org" >> /etc/hosts mitmdump --mode dns dig @127.0.0.1 +short mitmproxy.org 192.0.2.1 mitmdump --mode dns --set dns_use_hosts_file=false dig @127.0.0.1 +short mitmproxy.org 3.161.82.13 - DNS usa UDP por defecto, pero puede requerirse TCP al manejar registros que no caben en un solo paquete UDP
- Como mitmproxy 11 soporta tipos de consulta arbitrarios, aumentó la importancia del tamaño de los mensajes y del manejo por TCP, y DNS-over-TCP también funciona
Eliminación de claves ECH y generación de certificados
- Cuando no hay un certificado personalizado, mitmproxy usa el Server Name Indication(SNI) del TLS ClientHello para construir un certificado válido
- Si no hay SNI, puede que no sea posible generar un certificado en el que el cliente confíe
- Encrypted Client Hello(ECH) es un método en el que el cliente obtiene una clave ECH mediante DNS HTTPS records y luego cifra con esa clave el mensaje inicial de handshake ClientHello
- Si tanto la consulta DNS como el handshake están cifrados, un intermediario pasivo no puede conocer el dominio de destino y solo puede verificar la dirección IP de destino
- En hosting compartido y redes de distribución de contenido, es difícil determinar el dominio objetivo solo con la dirección IP
- Esta mejora de privacidad entra en conflicto con la forma en que mitmproxy genera certificados
- mitmproxy 11 elimina las claves ECH de los HTTPS records para asegurar la información de dominio necesaria para la generación de certificados
- El cliente no puede obtener la clave para cifrar el mensaje inicial de handshake
- mitmproxy puede identificar el dominio de destino y construir un certificado coincidente
- ECH puede hacer más difícil el uso de mitmproxy, pero también puede verse como un cambio que mejora la privacidad en toda la web
1 comentarios
Opiniones en Hacker News
Me alegra que Mitmproxy todavía se siga desarrollando. Esta herramienta, de forma indirecta, construyó mi carrera.
En 2011 estaba aprendiendo desarrollo de APIs interceptando solicitudes de apps móviles, y descubrí que la API de Airbnb estaba expuesta a una vulnerabilidad de asignación masiva de Rails (https://github.com/rails/rails/issues/5228). Después de cambiar algunas propiedades inofensivas, contacté a la empresa, eso llevó a una entrevista, y el resto es literalmente historia.
A veces es más fácil conectar mitmproxy a una implementación existente que leer la documentación.
Me parece interesante que Chrome no confíe en autoridades certificadoras agregadas por el usuario en QUIC.
En el issue vinculado, el equipo de Chrome dice: “No permitimos explícitamente certificados que no sean de confianza pública para evitar el despliegue de software/hardware de interceptación de QUIC. De lo contrario, a largo plazo se perjudica la capacidad de evolución del protocolo QUIC. Los usos que dependan de certificados que no sean de confianza pública pueden usar TLS+TCP en lugar de QUIC”.
No sigo la evolución del protocolo, pero no entiendo bien cómo bloquear certificados personalizados se relaciona con la capacidad de evolución. Me pregunto si alguien sabe la razón.
Puede incluir en Chrome una versión ligeramente modificada de QUIC, soportarla en sitios como Youtube, y luego, con esas métricas, proponer un cambio al estándar “real” o seguir usando una versión especial solo en sus servicios.
Si se permiten certificados personalizados, las empresas que inspeccionan el tráfico de empleados mediante un intermediario, con cosas como ZScaler ZIA, corren el riesgo de romperse cuando cambie el protocolo. Si el flujo de datos está totalmente cifrado y es opaco para los equipos intermedios, Google puede hacer casi lo que quiera.
Concepto relacionado: https://en.wikipedia.org/wiki/Protocol_ossification
En un protocolo extensible, normalmente basta con actualizar cliente y servidor, pero si hay equipos intermedios, potencialmente también hay que actualizar N dispositivos. Los usuarios y proveedores de servicios tienen incentivos para adoptar nuevas funciones, pero los dueños de los equipos intermedios quizá no. Como resultado, se vuelve difícil que el protocolo evolucione.
Había mucho middleware que dependía fuertemente de detalles de implementación, así que con cambiar un poco algo era fácil romper sin querer la experiencia del usuario. Parece que en las nuevas versiones intentan evitar una situación parecida.
Me pregunto si HTTP/2 o HTTP/3 aportan beneficios cuando solo se soportan en el proxy inverso y no en el servidor web real.
La mayoría de los frameworks principales de JS/Python/Ruby no soportan los nuevos estándares HTTP. Entonces, ¿el servidor web no se convierte en el cuello de botella de la conexión con el proxy inverso?
La conexión entre el proxy inverso y el servidor web real suele ser mucho más rápida y estable, así que pasar ese tramo a HTTP/2 o HTTP/3 aporta mucho menos beneficio.
Incluso cuando se usa HTTP, el proxy inverso puede establecer conexiones con el backend mucho más rápido que con un cliente remoto real. Por eso sigue siendo ventajoso usar streams HTTP/2 en el tramo lento.
Es una herramienta que se ejecuta en una máquina local para hacer pruebas relacionadas con protocolos de bajo nivel o seguridad web.
Con HTTP/2 o superior, varias solicitudes simultáneas se manejan sobre una sola conexión.
Todavía queda el problema de la huella digital. Hasta que pueda imitar el handshake TLS de un navegador común, en alrededor del 80% de la web vas a ver páginas como “Just a quick check...” o “Sorry, it looks like you're a bot”.
https://github.com/mitmproxy/mitmproxy/issues/4575
Gracias por mencionar Hickory. Siempre es divertido ver qué construye la gente con eso, y es un trabajo bien hecho.
Son cosas que originalmente habrían sido difíciles de conseguir solo con Python.
Me pregunto si Mitmproxy puede usarse como Privoxy/Proxomitron/Yarip.
Por ejemplo, al navegar con Ungoogled Chromium, ¿podría poner Mitmproxy como proxy y eliminar las etiquetas script de ciertos sitios? ¿Qué impacto tendría en el rendimiento?
Al ver páginas web, pequeños retrasos acumulados cientos de veces pueden notarse.
Aun así, para quienes estén interesados en ese uso, puede ser una opción. Técnicamente no hay nada que lo impida.
Al reescribir archivos JavaScript hay un pequeño riesgo de tocar verificaciones de integridad de subrecursos, pero si eso causa problemas, creo que también se podría resolver reescribiendo los hashes.
¿mitmproxy puede ser una alternativa a Fiddler?
https://docs.mitmproxy.org/stable/addons-overview/
Mmm: https://github.com/mitmproxy/mitmproxy/issues/4170