Vulnerabilidad remota (Root) en controladores HID


Si has estado alguna vez dentro de un aeropuerto, universidad, hospital, centros gubernamentales o edificio de oficinas, probablemente has visto uno de los lectores de tarjeta HID que prohíben el acceso fisico no autorizado.
HID es uno de los fabricantes más grandes en el mundo de sistemas de control de acceso, los cuales se han convertido en parte de la seguridad física de muchas compañías
Cada uno de esos lectores se une a un regulador que suelen estar en lugares ocultos o atrás de la puerta, controlando todas las funciones de la puerta incluyendo bloqueo y desbloqueo, horarios, alarmas, etc.
En los últimos años, estos controladores se han conectado a las interfaces de red de modo que pueden ser gestionados de manera remota. Son muy prácticos a la hora de actualizar la base de datos de las tarjetas, calendarios control de huellas y demás, pero como todo lo demás que está conectado a la red existe el riesgo de tener vulnerabilidades que comprometen la seguridad del sistema. Y en el caso de los sistemas de seguridad física, que el riesgo es más tangible de lo habitual.
HID tiene dos lineas emblemáticas de estos controladores (VertX y EDGE). Para que estos controladores sean integrados fácilmente, en las configuraciones tienen un servicio llamado "discoveryd" que responde a un paquete UDP en particular.
Un atacante remoto puede enviar una señal broadcast al puerto 4070 y todos los controladores responderán con sus direcciones MAC, tipo de dispositivo, versión de firmware, y el nombre del dispositivo (como "puerta principal").
Es la única finalidad de este servicio, lo que puedo decir. Sin embargo, no es la única función de este servicio. Por alguna razón, discoveryd también contiene la funcionalidad de cambiar el patrón intermitente del LED del controlador. Esto se logra enviando un paquete de "command_blink_on" al servicio de discoveryd con el número de veces que el LED parpadee.
Discoveryd hace una ruta a /mnt/apps/bin/blink y llama a system() para ejecutar el programa con ese numero como argumento.
Y probablemente puedas adivinar lo que viene después #pwned

Existe una vulnerabilidad de inyección de comandos en esta función debido a la falta de sanitización en la entrada del usuario que se alimenta de la llamada a system(). 
En lugar de enviar el número de veces que parpadeara el LED, enviamos un comando Linux en comillas simples como 'id' que se ejecutara en la Shell Linux del dispositivo. Para empeorar las cosas, el servicio funciona como Root, por lo que cualquier comando que se envíe se ejecutara como Root, lo cual nos dará un control completo del dispositivo.
En este caso el dispositivo es un controlador de seguridad nos dará un control completo que incluye todas las alarmas y el desbloqueo de puertas. Esto significa que con simples paquetes UDP y sin autentificación alguna podemos tener control completo de un sistema de seguridad física de manera remota.
Aún la falla no ha sido corregida.

Comentarios

Entradas populares