Vulnerabilidades y código malicioso en sistemas de automatización industrial

Las herramientas de automatización industrial desarrolladas hace 15-20 años prácticamente no contenían funciones de seguridad. Durante las últimas décadas, las empresas han acumulado una flota completa de equipos con fallas arquitectónicas fatales que están disponibles para su explotación por parte de los ciberdelincuentes. En este post, hablamos sobre las vulnerabilidades de los sistemas de automatización industrial y brindamos recomendaciones para mejorar la situación.



imagen



En 2019, encontramos una tienda en Internet que distribuye software para máquinas industriales pesadas. Descargamos algunas de estas aplicaciones y les aplicamos ingeniería inversa para comprender cómo funcionan. Su código fue escrito en uno de los lenguajes de programación patentados que se utilizan para automatizar robots industriales que ensamblan automóviles y empacan alimentos en transportadores. Se descubrió una vulnerabilidad en una de estas aplicaciones, que inició nuestra investigación sobre Rogue Automation: código vulnerable y malicioso en la programación industrial .



Después de examinar los detalles técnicos y las debilidades de ocho de los entornos de programación industrial más populares (ABB, Comau, Denso, Fanuc, Kawasaki, Kuka, Mitsubishi y Universal Robots), descubrimos que estos lenguajes se pueden usar para crear malware de gusano que se moverá de uno robot vulnerable a otro, obedeciendo los comandos remotos de sus operadores.



Las deficiencias encontradas son el resultado de una elección de diseño realizada hace varias décadas. Estas soluciones definieron la tecnología, los métodos y las herramientas que todavía se utilizan hoy para programar equipos industriales. Considere las implicaciones de esta elección en el contexto de las amenazas cibernéticas modernas.



Robar datos de un robot



Encontramos un caso real de un servidor web vulnerable implementado como una aplicación para ejecutarse en un robot industrial. El servidor web, escrito en ABB Rapid, contenía una vulnerabilidad transversal que permitía a un atacante conectarse al robot a través de la red y copiar cualquier archivo del controlador del robot, incluidos los registros. Es muy probable que dichos archivos contengan diversos datos confidenciales y conocimientos técnicos, por lo que pueden venderse de forma rentable en los mercados clandestinos.



Si un atacante logra hackear una computadora en la misma red que el robot, podrá conectarse al servidor web del controlador disfrazado de agente, solicitar un archivo de interés y recuperarlo sin autorización, ya que el programa cumple con las solicitudes del agente.



imagen

Un fragmento del código de la aplicación vulnerable. Fuente (en adelante, a menos que se indique lo contrario): Trend Micro



Line 493 llama a la función sendFile para enviar el archivo solicitado al cliente. El pageString no se filtra de ninguna manera, por lo que puede contener "... /" o alguna otra ruta. Esto le permite recorrer el sistema de archivos y descargar casi cualquier archivo.



imagen

Esquema de explotación de vulnerabilidades



En este caso, cabe destacar el comentario dejado por el desarrollador del servidor web vulnerable en el código. Sabía que el código que había escrito era vulnerable, pero no hizo nada para solucionar el problema, porque asumió que todas las solicitudes vendrían del navegador "correcto", que validaría los datos de entrada y no permitiría una cadena como ".. . \\ ... \\ ":



imagen

,





La explotación de algunas vulnerabilidades puede tener consecuencias en el mundo físico, por ejemplo, dañar los productos terminados o incluso a las personas que los rodean.

En el proyecto de código abierto para robots industriales Kuka, descubrimos una vulnerabilidad que le permite cambiar la trayectoria de una pieza en movimiento. El programa recibe un flujo de coordenadas a través de la red y las transfiere al actuador, que realiza los movimientos especificados. Para esto, se utiliza una clase especial de procedimientos: servidores de automatización de movimiento. Es una interfaz estándar que permite a los fabricantes de equipos originales de robots industriales proporcionar una forma coherente de controlar el movimiento de sus productos.



imagen

El código vulnerable del servidor de automatización del tráfico no contiene ningún control de la legitimidad de los datos que se le transfieren.



El código del servidor no verifica de ninguna manera de dónde provino la siguiente porción de coordenadas para el movimiento del robot; no proporciona autenticación interna. La única defensa es verificar la dirección MAC y la dirección IP del remitente, cualquiera de las cuales puede ser fácilmente falsificada por un intruso que haya penetrado en la red.



En nuestro banco de laboratorio, nos aseguramos de que, mediante la suplantación de identidad, sea posible falsificar el tráfico entre un robot y una estación de trabajo de ingeniería. Un atacante podría enviar coordenadas arbitrarias, y el robot simplemente las realizó, lo que en una producción real conduciría a un accidente.



Al inyectar paquetes de red con coordenadas incorrectas en el tráfico, pudimos empujar al manipulador fuera de la zona de seguridad varias veces y golpear el objeto físico con la "mano" del robot. Como resultado, el "brazo" con el que el robot recoge objetos se cayó: el brazo del robot que se cayó



imagen

es el resultado de introducir coordenadas inseguras en el tráfico.



Malware dinámico



Este tipo de ataque supone que el robot está ejecutando un programa escrito por un integrador de sistemas que se cree que es de confianza. En realidad, cualquier programa creado por un integrador se considera confiable y se implementa sin verificaciones de seguridad de código.



Al comprometer a un integrador o reemplazar un programa en un almacenamiento de red vulnerable, puede inyectar código malicioso de manera invisible en una red empresarial: agregue un cargador que descargue el módulo que el atacante necesita y lo ejecute como parte de un ciclo de producción estándar.



imagen

Descargador de malware escrito en un lenguaje de programación para robots industriales



Para probar este concepto, escribimos un cuentagotas en un lenguaje de programación para robots industriales y nos aseguramos de que se pueda usar un programa externo para cargar el código en el controlador del robot y ejecutarlo. Una vez controlado, un programa de este tipo puede realizar más acciones maliciosas mediante la recopilación de información sobre la infraestructura de la red y el robo de archivos y credenciales.



Vulnerabilidad inusual de RCE



Uno de nuestros hallazgos fue un programa completamente respetable que lanza funciones, cuyos nombres recibe a través de la red, para su ejecución. Para ejecutarlos, utiliza la carga de código dinámico, pero no le interesa qué es exactamente lo que lanza: el programa no prevé verificar la integridad de las bibliotecas cargadas.



imagen

Lógica vulnerable de una aplicación "respetable"



imagen

Un fragmento de código que implementa lógica vulnerable.



Aunque el programa en sí no contiene funciones maliciosas, un atacante puede usarlo para emitir comandos al robot en el momento adecuado, afectando el mundo físico.



Corona de la creación - Gusano malicioso



Para demostrar la gravedad de los problemas detectados, hemos desarrollado un programa con función de autopropagación y actualización automática, carga dinámica de código desde el servidor de control y capacidad para controlarlo de forma remota. El programa de escaneo también puede realizar escaneos en red, transferir archivos arbitrarios al servidor de comando y control, mantener una lista de dispositivos infectados y actuar como un bot.



imagen

La lógica del programa PoC que simula el trabajo de un malware real



imagen

Formación de una lista de archivos encontrados y envío al servidor de control



Fuente de problemas



Después de analizar ocho lenguajes de programación de automatización industrial populares desarrollados en las últimas décadas, llegamos a la conclusión de que la razón principal de las vulnerabilidades identificadas y potenciales es que estos lenguajes contienen medios de bajo nivel para acceder a los recursos del sistema. Aunque estas herramientas no son peligrosas en sí mismas, los atacantes pueden utilizarlas para otros fines distintos a los previstos, lo que afecta de manera crítica la seguridad del robot, su operador y los sistemas conectados. Por ejemplo, se pueden usar para mover el manipulador hacia arriba, levantar la pieza de trabajo, bajar el manipulador y soltar la pieza de trabajo.



Este rico conjunto de funciones sofisticadas brinda a los ingenieros de procesos la libertad de desarrollar aplicaciones en las que puedan recuperar datos de la red, leer y escribir archivos. Sin embargo, dado que las plataformas no brindan acceso seguro a estas funciones avanzadas, los atacantes pueden usarlas para escribir módulos maliciosos.

Otro problema con los lenguajes obsoletos para la automatización industrial (Industrial Robots Programming Language, IRPL), heredados junto con el equipo, es que no tienen herramientas para verificar el código en busca de patrones inseguros, similares a las herramientas para C, C ++, C #, Java. PHP y Python.



Cada OEM crea sus propios lenguajes y entorno en el que se ejecutarán los programas de destino. Algunos de ellos se basan en sistemas operativos en tiempo real (RTOS), pero en general no hay estandarización. La semántica de cada IRPL también es única y puede diferir significativamente de la semántica de los lenguajes de programación de propósito general. Algunas capacidades, como la manipulación de cadenas u operaciones criptográficas, están ausentes en el IRPL o no son tan avanzadas como en los lenguajes tradicionales.



Las principales fuentes de vulnerabilidades en programas escritos en IRPL son tres funciones principales:



  • trabajar con archivos y directorios,
  • cargar módulos dinámicamente y llamar a funciones por nombre,
  • Funciones de red: recepción y transmisión de datos a sistemas externos.


imagen

Funciones peligrosas disponibles en IRPL



Cómo protegerse



Como ocurre con cualquier aplicación de software que se ocupe de datos que no son de confianza, los sistemas de automatización industrial deben diseñarse, implementarse, configurarse y desplegarse con los mecanismos de seguridad adecuados.



imagen

Recomendaciones consolidadas para garantizar la seguridad de los programas de automatización industrial



Por lo tanto, al escribir dichos programas, debe guiarse por los siguientes principios:



  • Piense en los robots industriales como computadoras y las aplicaciones para ellos como un código extremadamente crítico;
  • autenticar todas las comunicaciones;
  • implementar políticas de control de acceso;
  • implementar la validación de entrada donde sea aplicable;
  • asegurar la higienización continua de la salida;
  • Al manejar errores, no exponga detalles técnicos innecesarios;
  • crear las configuraciones y los procedimientos de implementación correctos;
  • Implementar procesos de gestión de cambios para el código de automatización industrial.


¿Viejo o inteligente?



Si bien los desarrolladores de software tradicionales han luchado con las consecuencias de la programación insegura durante décadas y han desarrollado varias técnicas para garantizar la victoria, el mundo de la automatización industrial no estaba preparado para detectar y prevenir la explotación de vulnerabilidades.



Dado el ritmo de la convergencia de TI / OT, ​​es imperativo implementar métodos de desarrollo de código seguro en la industria de la automatización industrial como una prioridad. De lo contrario, los próximos años podrían traernos muchos informes de incidentes en la industria, y las consecuencias de estos incidentes se manifestarán no solo en el ciberespacio, sino también en el mundo físico.



All Articles