La sicurezza dei sistemi di controllo industriale e degli ambienti OT dagli attacchi remoti è più che mai critica, soprattutto con vulnerabilità come CVE-2017-14469 e ora CVE-2021-22659 che hanno come obiettivo il controllore Micrologix 1400 di Rockwell Automation, ampiamente utilizzato. Gli studenti dell'OPSWAT Fellowship Program hanno testato questa vulnerabilità in un ambiente controllato, evidenziando la necessità di sicurezza.
In questo blog esploriamo il modo in cui gli studenti hanno dimostrato come gli aggressori potrebbero sfruttare la vulnerabilità per causare il blocco dei sistemi e come la mancanza di un'adeguata convalida degli input potrebbe essere sfruttata per interrompere le operazioni del PLC.
Che cos'è un PLC? Spiegazione di Micrologix 1400 di Rockwell Automation
Un PLC (Programmable Logic Controller) è un computer industriale progettato per automatizzare i processi controllando macchinari e altre operazioni industriali. Funziona in ambienti difficili ed è programmato per eseguire compiti specifici in base agli input dei sensori. Il controllore MicroLogix 1400 di Rockwell Automation è un PLC compatto e modulare comunemente utilizzato in applicazioni di piccole e medie dimensioni. Noto per la sua economicità e flessibilità, supporta diversi protocolli di comunicazione e offre opzioni di I/O digitali e analogici per l'interfacciamento con i dispositivi.
La programmazione avviene tipicamente tramite il software di Rockwell Automation attraverso la logica ladder, che consente agli utenti di creare sequenze di controllo. MicroLogix 1400 è versatile e adatto a compiti quali il controllo delle macchine e l'automazione dei processi. La sua modularità consente agli utenti di espandere e personalizzare il sistema in base a requisiti applicativi specifici.
Introduzione a CVE-2021-22659
Nel gennaio 2021, Rockwell Automation ha ricevuto una segnalazione da Parul Sindhwad e dal Dr. Faruk Kazi del COE-CNDS del Veermata Jijabai Technological Institute (VJTI), India, relativa a una vulnerabilità nel controllore MicroLogix™ 1400. Hanno identificato una falla di sicurezza nella versione 21.6 e precedenti che consente a un aggressore remoto non autenticato di inviare un pacchetto Modbus appositamente creato, consentendo all'aggressore di recuperare o modificare valori casuali nel registro. Se sfruttato con successo, questo potrebbe portare a un buffer overflow, con conseguente condizione di denial-of-service. Il LED FAULT lampeggia in ROSSO e le comunicazioni possono essere interrotte. Il ripristino della condizione di denial-of-service richiede la cancellazione dell'errore da parte dell'utente.
NVD ha valutato questa vulnerabilità di sicurezza come di gravità elevata.
Fasi di attacco
Un aggressore remoto non autenticato con accesso alla rete del PLC MicroLogix 1400 vulnerabile potrebbe inviare un pacchetto appositamente creato per modificare i valori del registro. Ciò potrebbe causare una condizione di denial-of-service per il dispositivo, con conseguente corruzione del sistema e tempi di inattività. Un incidente di questo tipo può interrompere in modo significativo le operazioni di produzione e altre attività commerciali dell'organizzazione.
Protocollo Modbus
Sviluppato da Modicon nel 1979, il protocollo Modbus è una struttura di messaggistica progettata per stabilire una comunicazione client-server tra dispositivi intelligenti. Originariamente progettato per l'uso con i PLC di Modicon, da allora è diventato un protocollo di comunicazione standard per la comunicazione tra dispositivi elettronici industriali.
Esistono protocolli Modbus per Ethernet (Modbus TCP) e per linee seriali (Modbus RTU e Modbus ASCII). Il Modbus RTU (Remote Terminal Unit) trasmette direttamente i dati in forma binaria attraverso la comunicazione seriale, mentre il Modbus TCP (Transmission Control Protocol) incorpora i dati del protocollo Modbus in pacchetti TCP per la trasmissione su reti TCP/IP.
Struttura dei messaggi Modbus
Modbus è un protocollo richiesta-risposta in cui il client trasmette una richiesta a un dispositivo Modbus e il dispositivo fornisce successivamente una risposta.
Un messaggio Modbus inviato da un primario a un secondario contiene l'indirizzo del secondario, il "comando" (ad esempio "read register" o "write register"), i dati e una somma di controllo (LRC o CRC).
Gli indirizzi dei dati sono utilizzati nei messaggi di interrogazione Modbus quando si leggono o modificano i dati. Modbus definisce quattro tipi di dati: Coil, Input Status, Input Register e Holding Register. Due di questi memorizzano valori on-off (1 bit), chiamati Coil e Discrete Inputs, e due memorizzano valori numerici come parole a 16 bit, chiamati Registers. Ciascuno di essi è di sola lettura o di lettura/scrittura.
Tipo di dati | Accesso | Descrizione |
Bobina | Lettura-scrittura | Uscite a bit singolo. |
Ingresso discreto | Solo lettura | Ingressi a bit singolo. |
Registro di ingresso | Solo lettura | Registri di ingresso a 16 bit. |
Registro di mantenimento | Lettura-scrittura | Registri di uscita a 16 bit. |
Esistono tre categorie di codici funzione Modbus:
- Codici funzione pubblica - Da 1 a 127, ad eccezione dei codici definiti dall'utente.
- Codici funzione definiti dall'utente - in due intervalli, da 65 a 72 e da 100 a 110.
- Codici funzione riservati - Utilizzati da alcune aziende per i prodotti legacy e non disponibili per l'uso pubblico.
Tipo di funzione | Nome della funzione | Codice funzione | ||
Accesso ai dati | Accesso ai bit | Ingressi discreti fisici | Lettura degli ingressi discreti | 2 |
Bit interni o bobine fisiche | Leggere le bobine Scrivere la bobina singola Scrivere più bobine | 1 5 15 | ||
Accesso a 16 bit | Registri di ingresso fisico | Lettura dei registri di ingresso | 4 | |
Registri interni o registri di uscita fisici | Lettura di più registri di mantenimento Scrittura di un singolo registro di mantenimento Scrittura di più registri di mantenimento Lettura/Scrittura di più registri Registro di scrittura della maschera Coda FIFO di lettura | 3 6 16 23 22 24 | ||
Accesso ai record dei file | Leggere il record del file Scrivere il record del file | 20 21 | ||
Diagnostica | Leggere lo stato di eccezione Diagnostica Ottenere il contatore di eventi Com Ottenere il registro eventi Com Segnala l'ID dello slave Leggere l'identificazione del dispositivo | 7 8 11 12 17 43 | ||
Altro | Trasporto di interfaccia incapsulata | 43 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso ai bit Categoria: Ingressi discreti fisici Nome funzione: Lettura ingressi discreti Codice funzione: 2 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso ai bit Categoria: Bit interni o bobine fisiche Nome della funzione: Lettura bobine Codice funzione: 1 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso ai bit Categoria: Bitinterni o bobine fisiche Bit interni o bobine fisiche Nome funzione: Scrivi bobina singola Codice funzione: 5 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso ai bit Categoria: Bitinterni o bobine fisiche Bit interni o bobine fisiche Nome della funzione: Scrittura di bobine multiple Codice funzione: 15 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a 16 bit Categoria: Registri di ingresso fisico Nome della funzione: Lettura dei registri di ingresso Codice funzione: 4 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a 16 bit Categoria: Registri interni o registri fisici di uscita Nome della funzione: Lettura di più registri di mantenimento Codice funzione: 3 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a 16 bit Categoria: Registri interni o registri fisici di uscita Nome della funzione: Write Single Holding Register Codice funzione: 6 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a 16 bit Categoria: Registri interni o registri fisici di uscita Nome della funzione: Scrittura di registri di mantenimento multipli Codice funzione: 16 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a 16 bit Categoria: Registri interni o registri fisici di uscita Nome della funzione: Lettura/Scrittura di registri multipli Codice funzione: 23 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a 16 bit Categoria: Registri interni o registri fisici di uscita Nome della funzione: Mask Write Register Codice funzione: 22 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a 16 bit Categoria: Registri interni o registri fisici di uscita Nome della funzione: Lettura coda FIFO Codice funzione: 24 |
Tipo di funzione: Accesso ai dati Sottotipo: Accesso a record di file Nome della funzione: Read File Record Codice funzione: 20 |
Tipo difunzione: Accesso ai dati Sottotipo:Accesso ai record di file Accesso a record di file Nome della funzione: Scrivi record di file Codice funzione: 21 |
Tipo di funzione: Diagnostica Nome della funzione: Read Exception Status Codice funzione: 7 |
Tipo di funzione: Diagnostica Nome funzione: Diagnostica Codice funzione: 8 |
Tipo di funzione: Diagnostica Nome funzione: Get Com Event Counter Codice funzione: 11 |
Tipo di funzione: Diagnostica Nome funzione: Get Com Event Log Codice funzione: 12 |
Tipo di funzione: Diagnostica Nome della funzione: Report Slave ID Codice funzione: 17 |
Tipo di funzione: Diagnostica Nome della funzione: Read Device Identification Codice funzione: 43 |
Tipo di funzione: Altro Nome funzione: Encapsulated Interface Transport Codice funzione: 43 |
Sfruttamento
Analisi delle vulnerabilità
Attraverso l'analisi, i nostri borsisti OPSWAT hanno scoperto che durante la comunicazione Modbus TCP, il protocollo manca di autenticazione e crittografia per i pacchetti trasmessi. Inoltre, la convalida dell'input nel PLC MicroLogix 1400 non è implementata correttamente. Di conseguenza, un aggressore remoto può analizzare il pacchetto Modbus TCP tramite packet sniffing e inviare qualsiasi richiesta al PLC senza autenticazione tramite il protocollo Modbus TCP. A causa della mancanza di convalida dell'input del dispositivo PLC MicroLogix 1400, un aggressore remoto autenticato potrebbe inviare un gran numero di pacchetti con valori casuali, causando potenzialmente un arresto anomalo del PLC.
Sovrascrittura del registro
Inizialmente, abbiamo cercato di catturare i pacchetti Modbus TCP utilizzati per leggere o scrivere i registri del PLC. A tal fine, abbiamo esaminato i pacchetti generati da un'applicazione denominata Modbus Poll, che facilita la lettura e la scrittura dei registri sul PLC MicroLogix 1400.
Utilizzando Wireshark per catturare tutti i pacchetti dall'interfaccia di rete, è stato possibile identificare il pacchetto Modbus TCP per la scrittura di un singolo registro:
Sulla base della struttura dei pacchetti sniffati, abbiamo sviluppato un semplice script Python per inviare pacchetti TCP che richiedono la scrittura di un registro sul PLC di destinazione. In questo scenario, l'indirizzo IP del PLC è 192.168.93.89.
Il registro del PLC è stato modificato dopo aver ricevuto il nostro pacchetto malevolo non autenticato.

In Micro Logix 1400, la maggior parte delle istruzioni matematiche utilizza tre parametri: Sorgente A, Sorgente B e Destinazione
I valori per le sorgenti A e B possono provenire da due registri a 16 bit denominati N13:3 e N13:4. Inoltre, i valori di questi registri a 16 bit, come N13:3 e N13:4, sono limitati all'interno di un intervallo compreso tra -32.768 e +32.767. Se i valori di N13:3 e N13:4 sono grandi, il risultato dell'istruzione match può superare l'intervallo massimo del tipo di dati, causando potenzialmente un arresto anomalo del PLC. Di conseguenza, per indurre un crash nel PLC, è necessario scrivere valori casuali di grandi dimensioni in tutti i registri, compresi N13:3 e N13:4. Per ottenere questo risultato, abbiamo modificato il nostro script Python come segue:
Simulare l'attacco
Per simulare un attacco reale, i nostri borsisti OPSWAT hanno cercato di indurre un crash nel PLC MicroLogix 1400 situato nei laboratori CIP OPSWAT , partendo dal presupposto che sia l'attaccante che il PLC siano sulla stessa rete e in grado di comunicare tra loro.
Nello stato operativo normale del PLC MicroLogix 1400 presso i laboratori OPSWAT , con il PLC in modalità REMOTE RUN, tutti i valori dei registri sono validi e rientrano nell'intervallo designato per i rispettivi tipi di dati, a indicare che il programma utente funziona correttamente.
All'esecuzione del nostro script Python, verranno inviati numerosi pacchetti Modbus TCP al PLC, richiedendo la scrittura di grandi valori casuali in tutti i registri senza autenticazione:
Dopo aver ricevuto queste richieste di pacchetti malevoli, i valori di tutti i registri, compresi N13:3 e N13:4, vengono impostati a 16.990. Il risultato dell'operazione ADD sui registri N13:3 e N13:4 supera l'intervallo valido di un registro a 16 bit. Questo problema causa un overflow di numeri interi, che provoca un errore e interrompe il funzionamento del PLC, come indicato dallo stato FAULTED.
I nostri borsisti OPSWAT sono riusciti a bloccare il PLC MicroLogix 1400 sfruttando CVE-2021-22659.
Bonifica
Di fronte a vulnerabilità come CVE-2021-22659, una bonifica completa è fondamentale per proteggere i sistemi OT e cyber-fisici. Di seguito sono riportate alcune delle strategie chiave che possono essere impiegate per prevenire la diffusione degli attacchi:
- Rilevamento di CVE note: Eseguire regolarmente una scansione delle reti alla ricerca di vulnerabilità come CVE-2021-22659.
- Monitoraggio di comportamenti anomali: Segnalazione di aumenti insoliti della frequenza di comunicazione con il PLC Micrologix 1400, che potrebbero suggerire un attacco in corso di trasferimento non autorizzato di dati.
- Identificazione delle connessioni di nuovi dispositivi: Il sistema deve rilevare quando un nuovo dispositivo si collega al PLC.
- Segmentazione della rete: L'isolamento dei dispositivi colpiti può aiutare a prevenire la diffusione laterale degli attacchi, riducendo così al minimo l'impatto.
MetaDefender OT Security di OPSWATrisponde a queste esigenze rilevando i CVE, monitorando continuamente la rete per individuare comportamenti insoliti e identificando le connessioni non autorizzate. Utilizzando l'intelligenza artificiale, il sistema apprende i normali modelli di traffico, stabilisce un comportamento di base e implementa criteri per segnalare le anomalie. Ciò consente di reagire in modo istantaneo e consapevole alle potenziali minacce.
Nel caso di un attacco che sfrutta CVE-2021-22659, MetaDefender OT Security si integra con MetaDefender Industrial Firewall per bloccare le comunicazioni sospette in base alle regole impostate. Il firewall utilizza l'intelligenza artificiale per apprendere i modelli di traffico regolari e applicare le policy per impedire le connessioni non autorizzate.
Combinando queste funzionalità di rilevamento, avviso e segmentazione della rete, MetaDefender OT Security diventa il meccanismo di difesa ideale per gli ambienti industriali, riducendo in modo significativo il rischio e l'impatto delle minacce informatiche negli ambienti tecnologici operativi.
Scoprite come la piattaforma di cybersecurity di OPSWATpuò migliorare e maturare la vostra postura. Parlate con un esperto oggi stesso per una demo gratuita.