¡Ping de la muerte! FreeBSD corrige un error crashtastic en la herramienta de red PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

¡Ping de la muerte! FreeBSD corrige el error crashtastic en la herramienta de red

Una de las primeras herramientas de red de bajo nivel que cualquier usuario de computadora conoce es el venerable ping utilidad.

Llamado así por el efecto de sonido del mismo nombre de todas y cada una de las escenas de películas de guerra de la vieja escuela que involucran submarinos, el comando es un eco metafórico (¿ves lo que hicimos allí?) De la versión submarina de RADAR conocida como SONAR.

Envías un ping (más como un ruido haciendo, en realidad) en las profundidades salobres, y al medir cuánto tiempo tarda en volver a ti su misterioso eco, y al estimar la velocidad del sonido en el océano circundante, puedes calcular la distancia al objeto que produjo el eco.

Curiosamente, dado que probablemente haya escuchado la abreviatura TCP/IP utilizada como una descripción genérica del pegamento de protocolo que impulsa Internet, ping técnicamente no usa TCP/IP en absoluto.

De hecho, TCP/IP es la abreviatura de protocolo de control de transmisión sobre el protocolo de internet, y se refiere a un mecanismo de nivel bastante alto para enviar datos a través de Internet de tal manera que la red en sí misma pone mucho de "¿funcionó eso realmente correctamente?" esfuerzo por ti.

Por ejemplo, en las conexiones TCP, se garantiza que cualquier fragmento de datos que envíe llegue intacto al otro extremo o cause un error para que sepa que no lo lograron.

Además, incluso si diferentes fragmentos de datos terminan tomando diferentes rutas a través de Internet (por ejemplo, debido al equilibrio de carga, interrupciones temporales u otros errores recuperables), e incluso si algunos fragmentos tardan más en llegar que otros, los datos TCP se almacenarán correctamente en el búfer. hacia arriba y presentado en el orden correcto en el otro extremo.

ping es diferente

La ping Sin embargo, el comando generalmente se usa para verificar si una computadora que le interesa está en línea, especialmente si no acepta el tipo de conexiones TCP de alto nivel que esperaría, como recibir correo electrónico o permitir inicios de sesión SSH.

Esto lo ayuda a determinar rápidamente si es probable que una interrupción se deba a que la red o el servidor en sí se caen, o si los servicios individuales que se ejecutan en ese servidor no se inician correctamente.

Como resultado, ping utiliza un protocolo de nivel mucho más bajo que TCP.

Es verdad que la ping ni siquiera usa el primo más informal de TCP, UDP, abreviatura de protocolo de datagrama de usuario, que es una forma de transmitir fragmentos de datos que es rápido y fácil, pero que popularmente se conoce como enviar y esperar (o, si es cínico, como rociar y rezar).

UDP en sí mismo no le informa si sus datos llegaron al otro extremo o no, e incluso si llegan intactos, UDP no realiza un seguimiento del orden en que se enviaron originalmente sus paquetes, por lo que no puede reorganizarlos en el otro extremo si llegan fuera de secuencia.

Ping, si sirve de algo, utiliza un protocolo de muy bajo nivel, especialmente diseñado para solucionar problemas y reconfigurar la red, conocido como ICMP, o protocolo de mensajes de control de internet.

Por lo general, se maneja directamente en el kernel del sistema operativo, por lo que es casi seguro que los paquetes ICMP/IP se transmitan incluso si no se ha instalado correctamente ningún software de red de nivel superior. ICMP incluye, en particular, dos tipos de mensajes especiales:

  • Escriba 0x08. Oficialmente llamado ICMP Echo, esta especie de paquete generalmente se llama Solicitud de eco. es lo que el ping programa envía para sondear las computadoras activas en la red.
  • Escriba 0x00. Oficialmente llamado ICMP Echo Reply, este tipo de paquete es exactamente lo que dice. Se supone que una computadora que está viva, en línea y no configurada para bloquear el tráfico ICMP Echo debe enviar este tipo de paquete directamente a la computadora que lo solicitó.

Me gusta:

$ ping -c 3 -p 4E414B45445345435552495459 nudesecurity.sophos.com PATRÓN: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56(84) bytes de datos. 64 bytes desde 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 tiempo=84.0 ms 64 bytes desde 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 tiempo=85.1 ms 64 bytes desde 192.0.66.227. 192.0.66.227 (3): icmp_seq=53 ttl=84.8 tiempo=3 ms --- estadísticas de ping de news-sophos.go-vip.net --- 3 paquetes transmitidos, 0 recibidos, 2004 % de pérdida de paquetes, tiempo 84.025 ms rtt min/ promedio/máx/mdesv = 84.644/85.062/0.446/XNUMX ms

Para ver una ping en acción a un nivel ligeramente más bajo, usaremos el código Lua que puede encontrar al final del artículo para construir un paquete ICMP Echo propio y para leer la respuesta que regresa, si corresponde:

$ sudo luax ping.lua nudesecurity.sophos.com Envío de solicitud ICMP ECHO a 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |.....Zo.PingRequ| 00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estMensaje BB5A6| 00000020 46 31 44 |F1D | Regresé--> 00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |.........Zo.Ping| 00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |SolicitudMensaje B| 00000030 42 35 41 36 46 31 44 |B5A6F1D |

Por cierto, necesitábamos usar sudo arriba para ejecutar nuestro script con privilegios de superusuario, porque creamos lo que se conoce como un toma de IP sin procesar – uno que se puede diseñar en cualquier formato subyacente que nos guste, incluidos TCP, UDP y, según sea necesario aquí, ICMP.

En muchos sistemas Linux/Unix, el ping El comando proporcionado por su distribución funciona sin que se le otorguen explícitamente privilegios de root, generalmente porque está instalado con capacidades de seguridad especiales, o con su setuid conjunto de indicadores, lo que significa que comienza ejecutándose con una cuenta de usuario diferente a la del usuario que lo ejecutó.

Bien diseñado ping los programas, por supuesto, descartarán automáticamente sus privilegios adicionales una vez que hayan abierto el socket sin procesar que necesitan.

Omitimos este código de eliminación de privilegios de nuestro script de muestra en aras de la brevedad. Puedes usar el posix.unistd.setpid() función para cambiar a una cuenta sin privilegios después de crear el socket, pero antes de enviar o recibir datos.

examinando la respuesta

Como puede reconocer en el volcado de datos de nuestro script anterior, la función de socket de red que estamos usando para leer los datos del servidor que responde incluye no solo los datos de ICMP Echo Reply, sino también la IP de bajo nivel (encabezados de protocolo de Internet) en el paquete subyacente.

No hemos intentado analizar o procesar estos datos, pero FreeBSD ping El programa debe hacerlo para dar sentido a la respuesta, incluido el sentido de cualquier mensaje de error que regrese.

Si ping se rechaza de alguna manera, la respuesta de eco generalmente incluirá no solo sus propios encabezados de IP (como se ve arriba), sino también una copia de referencia de los encabezados de IP y los datos ICMP que aparecieron en la solicitud de salida original.

Los encabezados de paquetes IPv4 generalmente se parecen mucho a lo que ve arriba, donde los encabezados IP comienzan con 45 00 00 37... y continuar durante 20 bytes en total, hasta e incluyendo los bytes que se muestran como ...XX XX XX XX, que es la dirección IP de mi computadora portátil.

Me gusta:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX |.... | Versión IP y longitud del encabezado: 0x45 (4 = IPv4, 5 = cinco palabras de 32 bits, es decir, 20 bytes Tipo de servicio y datos de congestión: 0x00 Longitud total del paquete: 0x0037 (55 decimales) Información de secuencia: F6 AF 00 00 Tiempo de llegada -live (saltos a la izquierda): 0x35 (decimal 53) Tipo de protocolo: 0x01 (ICMP) Suma de comprobación: 0x947F (decimal 38015) Número de IP de la computadora de envío: C0 00 42 E3 (192.0.66.227 = nudesecurity.sophos.com) IP del destinatario (mi computadora portátil): XX XX XX XX (ELIMINADO = mi propio número de IP)

FreeBSD ping Los programadores, al parecer, asumieron que los encabezados de este tipo, de hecho, siempre tendrían exactamente 20 bytes de largo, según el valor de longitud del encabezado en el primer byte de 0x45, que denota IPv4 (0x4?) con 5 DWORD (0x?5), o encabezado de 20 bytes.

Con solo 20 bytes de los que preocuparse, los programadores asignaron búferes de tamaño fijo en la pila donde podían mantener una copia de los encabezados IP en la respuesta, además de cualquier encabezado IP incrustado de la solicitud original, si había una condición de error para manejar. .

Puedes adivinar a dónde va esto.

Ese primer byte en el encabezado de IPv4 puede tener legalmente cualquier valor de 0x45 (el tamaño de encabezado mínimo de 5 DWORD, o 20 bytes, como se muestra) hasta 0x4F (que indica 15 DWORD, porque 0xF es 15 decimal, o 60 bytes de datos de encabezado en total), lo que permite claramente 40 bytes adicionales opcionales de datos de encabezado.

Esos bytes de encabezado adicionales raros, pero legales, se pueden usar para varias "características" raras e inusuales con nombres curiosos como Difusión dirigida selectiva, Control de flujo experimental y Paquete de multidifusión ascendente – cosas de las que hemos oído hablar pero que nunca hemos usado a sabiendas, o incluso visto.

Cuidado con los ciberdelincuentes que te ponen a prueba

Como puede imaginar, dado que esos campos adicionales casi nunca se usan, es posible que nunca vea un paquete IPv4 con otra cosa que no sea 0x45 al principio, y con 20 bytes de datos de encabezado en total, a menos que te hayas topado con un montón de ciberdelincuentes que están listos para ponerte a prueba.

Lamentablemente, no hay mucho para evitar que un atacante instale un servidor que adivine si está utilizando FreeBSD y genere deliberadamente paquetes de respuesta de eco ICMP/IP de gran tamaño para provocar una desbordamiento del búfer de pila dentro de su ping .

Si alguna vez compruebas si su servidor está activo (¡lo que podrías hacer incluso, o quizás especialmente, si crees que es sospechoso!), podrías recibir una respuesta engañosa.

En el mejor de los casos, su ping el programa fallará; en el peor de los casos, sin embargo, como admite generosamente el aviso de seguridad de FreeBSD, "Puede ser posible que un host malicioso active la ejecución remota de código en ping".

Afortunadamente, como los autores de FreeBSD también señalar, “[e]l proceso de ping se ejecuta en un entorno limitado de modo de capacidad en todas las versiones afectadas de FreeBSD y, por lo tanto, está muy limitado en la forma en que puede interactuar con el resto del sistema en el punto donde puede ocurrir el error”.

En otras palabras, definitivamente necesita parchear, pero los riesgos pueden considerarse modestos.

Notablemente, el ping El programa no solo está bloqueado en una caja de arena, sino que no se ejecuta como root cuando se alcanza el código de error, como se confirma en el aviso de seguridad: "Cuando ping se ejecuta, crea el socket sin procesar necesario para hacer su trabajo y luego revoca sus privilegios elevados”.

Como se describió anteriormente, los poderes de superusuario solo se requieren para adquirir un socket de IP sin procesar del sistema operativo, no para usar el sendto() y recvfrom() funciones en ese zócalo después.

A este error se le ha dado el identificador oficial. CVE-2022-23093; está documentado en el aviso de seguridad FreeBSD-SA-22:15.ping.

¿Qué hacer?

  • Si es usuario de FreeBSD, simplemente actualice las versiones afectadas (FreeBSD 12 y FreeBSD 13) a sus últimas versiones, donde se solucionó este error.
  • Si eres programador de redes, asegúrese siempre de haber tenido en cuenta los encabezados de los paquetes que podrían indicar variaciones de tamaño inusuales. El hecho de que usted nunca haya visto ninguna variación no le impide enfrentarse mañana a un paquete fuera de lo común pero perfectamente legal.
  • Si es un administrador de red, considere bloquear paquetes IPv4 con encabezados IP que no tengan un tamaño de 20 bytes. Si realmente necesita permitir que algunos productos de software usen opciones de encabezado IPv4 inusuales, considere registrar esos paquetes inusuales para saber por qué.

¡Cuidado por ahí!


CÓDIGO DE EJEMPLO PARA DEMOSTRAR EL TRÁFICO DE PING


Sello de tiempo:

Mas de Seguridad desnuda