Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Vulnerabilidad en los servidores NTP

Última Actualización: 21 de Mayo de 2.001 - Lunes

Artículo publicado en el boletín Una-Al-Día de Hispasec, el 24 de Abril de 2.001.

La implementación más popular del demonio NTP (Network Time Protocol) contiene un problema de seguridad que permite la ejecución de código arbitrario en el servidor NTP, típicamente con privilegios de administrador o "root".

NTP es un protocolo estándar para la sincronización de relojes de máquinas interconectadas a través de redes de datos, en particular Internet. Este protocolo permite que el reloj de un sistema mantenga una gran precisión, independientemente de su calidad intrínseca y de las condiciones de la red.

Ni que decir tiene que el poder garantizar una gran calidad en el reloj de un sistema es muy importante a nivel de servidores para, por ejemplo, mantener un sistema de logs y auditoría preciso, sobre todo si se están comparando ficheros de máquinas distintas.

El problema se localiza en la generación del datagrama de respuesta a una petición maliciosa. No es posible limitar las peticiones a servidores confiables, por cortafuegos, ya que el protocolo NTP utiliza UDP como medio de transporte, y falsear datagramas UDP es trivial.

Los administradores que no requieran un control extremadamente preciso del tiempo, puede eliminar el servidor NTP de sus sistemas, y sincronizar sus máquinas periódicamente utilizando comandos como "rdate" o "ntpdate".

Si es posible, deben actualizarse el NTP a la versión 4.0.99k23, del 11 de Abril. Existe una versión con la misma numeración, pero anterior en fecha, que es vulnerable.

Gracias a que NTP se distribuye en código fuente, existen parches que se pueden aplicar si no es posible actualizar el demonio ni retirarlo del servicio:

>>>>>
--- ntpd/ntp_control.c.20010412        Mon Apr  9 15:47:20 2001
+++ ntpd/ntp_control.c Thu Apr 12 17:11:47 2001
@@ -1759,9 +1759,11 @@
                                         }
                                        if (cp < reqend)
                                                cp++;
-                                       *tp = '\0';
-                                       while (isspace(*(tp-1)))
-                                               *(--tp) = '\0';
+                                        while (tp > buf) {
+                                                *tp-- = '\0';
+                                                if (!isspace((int)(*tp)))
+                                                        break;
+                                        }
                                        reqpt = cp;
                                        *data = buf;
                                        return v;

<<<<<

El problema parece afectar también a algunos entornos integrados, como las versiones 11.x del IOS de Cisco. Este extremo, no obstante, no ha sido confirmado.

Más información:



Python Zope ©2001 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS