Hace pocos días fue dada a conocer una técnica de ataque (CVE-2019-14899), que permite reemplazar, cambiar o sustituir paquetes en conexiones TCP reenviadas a través de túneles VPN. El problema afecta a Linux, FreeBSD, OpenBSD, Android, macOS, iOS y otros sistemas similares a Unix.
El método permite la sustitución de paquetes al nivel de las conexiones TCP que pasan dentro del túnel encriptado, pero no permite la conexión en conexiones utilizando capas adicionales de encriptación (por ejemplo, TLS, HTTPS, SSH). Los algoritmos de cifrado utilizados en las VPN no importan, ya que los paquetes falsos provienen de la interfaz externa, pero el núcleo los procesa como paquetes de la interfaz VPN.
El objetivo más probable del ataque es interferir con las conexiones HTTP sin cifrar, pero no se excluye el uso del ataque para manipular las respuestas de DNS.
La sustitución exitosa de paquetes se ha demostrado para túneles creados con OpenVPN, WireGuard e IKEv2/IPSec.Tor. No se ve afectada por el problema, ya que utiliza SOCKS para reenviar el tráfico y se une a la interfaz de bucle invertido.
Para IPv4, es posible un ataque si rp_filter se pone en modo Loose. El mecanismo rp_filter se usa para verificar adicionalmente las rutas de paquetes para evitar la suplantación de identidad de la dirección de origen.
- Cuando se establece en 0, la dirección de origen no se verifica y cualquier paquete se puede redirigir entre las interfaces de red sin restricciones.
- El modo 1 «Estricto» incluye verificar que cada paquete que llega desde el exterior cumpla con la tabla de enrutamiento, y si la interfaz de red a través de la cual se recibió el paquete no está conectada con la ruta de entrega de respuesta óptima, el paquete se descarta.
- El modo 2 «Loose» suaviza la prueba para permitir la operación cuando se usan equilibradores de carga o enrutamiento asimétrico, en el que la ruta de respuesta puede no pasar por la interfaz de red a través de la cual llegó el paquete entrante.
En el modo «Loose», se comprueba que el paquete entrante cumple con la tabla de enrutamiento, pero se considera válido si se puede acceder a la dirección de origen a través de cualquier interfaz de red disponible.
Para llevar a cabo un ataque:
Primero se debe controlar la puerta de enlace a través de la cual el usuario ingresa a la red (por ejemplo, a través de la organización MITM, cuando la víctima se conecta a un punto de acceso inalámbrico controlado por el atacante o mediante un enrutador hackeado).
Al controlar la puerta de enlace a través de la cual el usuario está conectado a la red, el atacante puede enviar paquetes ficticios que se percibirán en el contexto de la interfaz de red VPN, pero las respuestas se enviarán a través del túnel.
Al generar un flujo de paquetes ficticios en el que se sustituye la dirección IP de la interfaz VPN, se intenta influir en la conexión establecida por el cliente, pero la influencia de estos paquetes solo se puede observar a través del análisis pasivo del flujo de tráfico encriptado asociado con la operación del túnel.
Para llevar a cabo un ataque, debe averiguar la dirección IP de la interfaz de red del túnel asignada por el servidor VPN y también determinar que la conexión a un host específico está actualmente activa a través del túnel.
Para determinar la IP de la interfaz VPN de la red virtual, son enviados paquetes a los paquetes SYN-ACK del sistema de la víctima, ordenando secuencialmente todo el rango de direcciones virtuales.
De manera similar, se determina la presencia de una conexión con un sitio específico y el número de puerto en el lado del cliente: ordenando los números de puerto hacia el usuario, se envía un paquete SYN como la dirección de origen en la que se sustituye la IP del sitio, y la dirección de destino es IP VPN virtual.
El puerto del servidor se puede predecir (80 para HTTP), y el número de puerto en el lado del cliente se puede calcular por fuerza bruta, analizando para diferentes números el cambio en la intensidad de las respuestas ACK en combinación con la ausencia de un paquete con el indicador RST.
En esta etapa, el atacante conoce los cuatro elementos de la conexión (dirección/puerto IP de origen y dirección/puerto IP de destino), pero para generar un paquete ficticio que el sistema víctima aceptará, el atacante debe determinar la secuencia y los números de reconocimiento (seq y ack) TCP -conexiones.
Solucion.
Finalmente para la protección cuando se usan túneles con direcciones IPv4, es suficiente establecer rp_filter en modo «Estricto»
sysctl net.ipv4.conf.all.rp_filter = 1
En el lado de VPN, el método para determinar el número de secuencia se puede bloquear agregando relleno adicional a los paquetes cifrados, haciendo que el tamaño de todos los paquetes sea el mismo.
Excelente aportación de seguridad, sobre todo en estos tiempos que los ataques a la seguridad se han incrementado. Gracias y saludos.