Técnicas de programación segura en los PLC
Un controlador lógico programable (PLC), también conocido como autómata, se puede definir como un dispositivo electrónico diseñado para controlar diferentes dispositivos mediante listas de instrucciones programadas, sin la necesidad de que un operario esté continuamente interactuando con el proceso industrial. Entre los dispositivos que se pueden monitorizar y controlar se encuentran diferentes tipos de sensores, actuadores, sistemas SCADA (control, supervisor y adquisición de datos) y HMI (interfaz hombre-máquina), e incluso otros autómatas programables.
- PLC, módulos y sistemas HMI -
Los PLC empleados en los sistemas de control industrial (ICS) han sido capaces de remplazar en gran medida a los relés y temporizadores mecánicos, a los sistemas de control basados en circuitos eléctricos y también a los secuenciadores de batería.
Con la aparición de la industria 4.0 y la necesidad de realizar tareas de automatización industrial de forma repetitiva, rápida y fiable, la implementación de los PLC ha supuesto una mejora sustancial a la hora de recoger datos de dispositivos, procesarlos y ejecutar las diferentes tareas programadas. Para poder realizar las funciones programadas, los PLC disponen de diferentes módulos o secciones, entre los que se pueden encontrar la unidad central de procesamiento (CPU), el módulo de entradas y salidas, la fuente de alimentación y la unidad de programación.
Su funcionamiento es simple. Inicialmente, el operador realiza una programación mediante un software para establecer las instrucciones y acciones a realizar tras recibir las señales de los sensores o las variables internas creadas en el propio PLC. Tras el procesamiento de las señales y ejecución del código programado por el operario, el autómata activa las salidas a los dispositivos finales. El conjunto de estas operaciones, junto con la ejecución de rutinas (revisiones internas y revisión de errores), actualización de salidas, comunicaciones y el diagnóstico, componen el ciclo de SCAN, también definido como ciclo de ejecución del autómata. Tras la ejecución del ciclo de SCAN, el PLC reanuda sus operaciones y comienza el ciclo de nuevo.
- Ciclo de ejecución de un PLC -
Lenguajes de programación y software
Los lenguajes de programación en la industria de automatización, y más concretamente en los dispositivos PLC, permiten crear una serie de instrucciones o una secuencia de órdenes, cuyo objetivo es expr
esar procesos de forma simple para que sean llevados a cabo por el autómata, de forma metódica, fiable y rápida.
El estándar IEC 61131-3 considera estos lenguajes de programación y define cinco posibilidades:
- Diagrama de funciones secuenciales (SFC): hace referencia al uso de bloques de funciones secuenciales para la programación.
- Diagrama de bloques de funciones (FBD): hace referencia al uso de bloques de funciones secuenciales para la programación.
- Diagramas de tipo escalera (LD): lenguaje de diagramas de relés o también llamado lenguaje de escalera.
- Texto estructurado (ST): lenguaje de programación de alto nivel similar a C o Pascal.
- Lista de instrucciones (IL o STL): lenguaje de programación de tipo ensamblador.
Los lenguajes de programación SFC, FBD y LAD son lenguajes de tipo visual, es decir, están estructurados mediante símbolos gráficos, mientras que los lenguajes de programación ST, IL y STL están formados por listados de sentencias.
Es importante elegir el lenguaje más apropiado para el autómata, dependiendo de la función que lleve a cabo, con el objetivo de simplificar el código, y reducir así posibles vectores de ataque.
- Lenguajes de programación en un PLC-
Codificación segura de un PLC
Como se ha ido mencionando a lo largo del artículo, existen diferentes aspectos que permiten mejorar la seguridad del PLC con un mínimo esfuerzo, tanto por parte del autómata como por parte del programador. A continuación, se van a explicar diferentes métodos para la codificación segura de un PLC:
- Una de las principales opciones que simplifican el proceso del PLC a la hora de hacer revisiones de errores o códigos es la segmentación del código. Es recomendable separar las funciones siempre que sea posible, ya que esto permitirá hacer una rápida revisión del código en caso de fallos o posibles ataques de inyección de código por parte de un agente malicioso.
- La segmentación del código también nos permite realizar una diferenciación entre las entradas y salidas, es decir, eliminar las entradas o salidas emparejadas y excluyentes. Dentro de esta separación de entradas y salidas, es recomendable realizar una configuración independiente para las señales de INICIO y PARADA, los temporizadores de reinicio del sistema y las señales en algunos procesos industriales, como son las señales de AVANCE y RETROCESO y las de ABRIR y CERRAR. Esta reducción en las señales emparejadas permitirá disminuir de manera significativa las vulnerabilidades a la hora de realizar un ataque sobre dos variables excluyentes o la conmutación rápida en actuadores, gracias a la implementación de temporizadores de retardo, los cuales tienen un uso de recursos mínimo y su configuración es simple.
- Una de las segmentaciones que se han de realizar debe ser la introducción de un segmento que permita comprobar los tiempos de ejecución del autómata mediante la utilización de funciones pertenecientes al software del propio PLC. La implementación de este código permitirá comprobar unos valores máximos, mínimos y regulares durante el funcionamiento seguro del autómata para que, en caso de una alteración de los valores normales, en posteriores situaciones, podamos detectar un cambio en la codificación de forma sencilla. Una variación del 5% respecto a los valores usuales de funcionamiento o la introducción de un valor mínimo (0 ms) en el ciclo de SCAN representarían una alteración en el código y, por lo tanto, la explotación de una posible vulnerabilidad. Estos valores también están disponibles, junto con la utilización de la memoria, en los valores diagnóstico del propio PLC.
- Tiempo de ejecución del ciclo de un PLC -
- Enlazando con el apartado anterior y con la sección de comunicaciones del ciclo de SCAN, y más concretamente con las comunicaciones con dispositivos HMI, se han de codificar para que el máximo posible de operaciones se realice en el autómata, reduciendo así la carga en el HMI y, por lo tanto, el número de posibles vulnerabilidades. Además, la comprobación de los valores introducidos por parte del operario en el HMI han de ser comprobados por el PLC para determinar si la consigna introducida está en unos valores admisibles.
Por último, otra de las buenas prácticas que se pueden implementar en un PLC para tener una codificación segura, y que no es muy común entre los programadores, es la desactivación de los puertos y protocolos de comunicación innecesarios o que no se están utilizando. Un análisis de las comunicaciones necesarias desde el PLC a los diferentes dispositivos permitirá concretar que puertos y protocolos son necesarios, eliminando así los innecesarios y, por lo tanto, un posible vector de ataque. - Otro de los aspectos más relevantes a la hora de implementar una codificación segura para un PLC es la programación correcta de los modos operativos. Mantener el PLC en modo RUN (modo ejecución) el mayor tiempo posible reduce las posibilidades de realizar cambios en la programación por parte de un agente malicioso. Además, será más sencillo detectar un cambio mediante la visualización en diagnóstico de una parada en la ejecución del ciclo de SCAN. La utilización del modo PROGRAM (modo programa) ha de ser limitada, ya que durante este modo se permite realizar cambios en la programación de forma sencilla.
- Por último, otra de las buenas prácticas que se pueden implementar en un PLC para tener una codificación segura, y que no es muy común entre los programadores, es la desactivación de los puertos y protocolos de comunicación innecesarios o que no se están utilizando. Un análisis de las comunicaciones necesarias desde el PLC a los diferentes dispositivos permitirá concretar que puertos y protocolos son necesarios, eliminando así los innecesarios y, por lo tanto, un posible vector de ataque.
Conclusiones
Los PLC se utilizaron por primera vez en la década de los 60. En aquellos momentos su única función era la de mejorar las prestaciones proporcionadas por los sistemas de control basados en relés y contactores, se empleaban a pequeña escala y no era necesario un nivel elevado de seguridad.
En la actualidad, hay un crecimiento exponencial de dispositivos IoT (Internet de las cosas), de procesos industriales y, sobre todo, de dispositivos de control, como los PLC. Todo esto se ve contrastado por un aumento en la necesidad de tener todo interconectado, lo cual puede dar lugar a un incremento de vulnerabilidades, tanto en los equipos como en las comunicaciones industriales empleadas en los diferentes procesos.
Cabe destacar que un PLC puede tener ciertas debilidades, pero como se ha detallado anteriormente, existe también una gran cantidad de buenas prácticas o métodos de codificación que permiten al administrador configurar el código y software del autómata para mejorar el nivel de seguridad, disminuyendo o deteniendo así intentos de ataque sobre la codificación. Seguir los consejos detallados anteriormente se ve supeditado a una continua realización de informes, alertas y eventos, además de la implementación de las últimas versiones de librerías (para la lógica operativa) y la última versión del firmware empleado por el autómata.