Team82 Logo Claroty
Zurück zum Blog

Ausnutzung von Honeywell ControlEdge VirtualUOC

/

Zusammenfassung

Team82 hat Honeywell ControlEdge Virtual Unit Operations Center (UOC) untersucht und mehrere Schwachstellen in der EpicMo-Protokollimplementierung innerhalb von ControlEdge Virtual UOC-Instanzen gefunden. Diese Schwachstellen lassen sich ausnutzen und können zur unautorisierten Remotecodeausführung führen.

Die von uns gefundenen Schwachstellen befinden sich im EpicMo-Protokoll (TCP-Port 55565) - einem von Honeywell entwickelten proprietären Protokoll, das für die Kommunikation zwischen Honeywell Experion-Servern und -Steuerungen verwendet wird. Dieses Protokoll enthielt eine undokumentierte und gefährliche Funktion, die es uns ermöglichte, Dateien ohne Bereinigung auf virtuelle UOC-Steuerungen zu schreiben, wodurch die Geräte der Ausführung von nicht autorisiertem Code ausgesetzt waren. Ein Angreifer, der sich bereits in einem OT-Netzwerk befindet, könnte ein bösartiges Netzwerkpaket verwenden, um diese Schwachstelle auszunutzen und den virtuellen Controller zu kompromittieren. Dieser Angriff könnte aus der Ferne durchgeführt werden, um Dateien zu ändern, was zu einer vollständigen Kontrolle über den Controller und der Ausführung von bösartigem Code führen würde. 

Honeywell hat Virtual UOC aktualisiert, und die Benutzer werden dringend gebeten, auf die aktuellen Versionen umzusteigen. Die Cybersecurity Infrastructure & Security Agency (CISA) hat ein Advisory für CVE-2023-5389 (CVSS v3 score: 9.1) und CVE-2023-5390 (5.3) veröffentlicht. Honeywell hat ebenfalls einen Hinweis veröffentlicht.

Was ist Honeywell Virtual UOC?

Honeywell ist ein bedeutender Akteur auf dem Markt für industrielle Steuerungssysteme (ICS) und bietet eine umfangreiche Palette von Steuerungen für die industrielle Automatisierung an. Ein Produkt ist der Honeywell Control Edge Unit Operations Controller (UOC), ein modularer physikalischer Controller, der die Experion Control DCS-Umgebung erweitert. Der ControlEdge UOC verfügt über integrierte fehlertolerante Ethernet-, ModbusTCP- und EtherNet/IP-Schnittstellen. UOC wird auch als virtuelle Steuerung angeboten. Der virtuelle UOC verringert den Hardware-Footprint eines Unternehmens, da er keinen physischen Controller benötigt. Dabei handelt es sich im Wesentlichen um eine Linux-basierte virtuelle Maschine, die in einer virtuellen Umgebung installiert werden kann.

Der VirtualUOC Standort auf Honeywell DCS Systemen.

Mehrere virtuelle UOC-Kommunikationsprotokolle

Honeywell-Steuerungen verwenden mehrere Protokolle für die Kommunikation. Ein Dienst namens NameServer ist für das Routing und die Eröffnung der Kommunikation für alle Protokolle zuständig. Um eine Kommunikation über ein bestimmtes Protokoll zu starten, müssen wir zunächst eine UDP-Nachricht an den NameServer Dienst (über UDP-Port 12321) mit Angabe des zu verwendenden Protokolls.

Ein UDP-Paket, das die Kommunikation mit dem EpicMo-Protokoll einleitet.

Nach dem Senden der UDP-Initialisierungsnachricht kann man mit der Kommunikation über TCP beginnen. Jede Sitzung beginnt mit einer TCP-Initialisierungsnachricht, in der das Protokoll erneut angegeben wird.

EpicMo-Protokoll

Das EpicMo-Protokoll (TCP-Port 55565) wird zur Fehlersuche und Diagnose von Honeywell-Steuerungen verwendet. Es umfasst Funktionscodes wie ReadMemory, WriteMemory, Neustart und ReadCrashBlockdie es ermöglichen, Fehler zu erkennen und zu beheben.

Struktur des Protokolls

Laufende Nummer

Länge des Pakets

Anzahl der Pakete
Empfangene

Anzahl der gesendeten Pakete

Funktion Code

2 Bytes

2 Bytes

2 Bytes

2 Bytes

1 Byte

  • Sequenznummer: Eine fortlaufende Nummer für das Paket.

  • Paketlänge: Länge des Pakets.

  • Anzahl empfangener Pakete: Zähler für die Anzahl der empfangenen Pakete.

  • Number Packet Sent: Zähler für die Anzahl der gesendeten Pakete.

  • Funktionscode: Der Funktionscode, den der Client aufrufen möchte.

Eine EpicMo-Protokollstruktur, geschrieben in Python.

Bei der Erforschung des EpicMo-Protokolls haben wir festgestellt, dass das Virtual UOC andere EpicMo-Funktionscodes implementiert als die C300-Steuerung.

EpicMo-Befehlshandler libepa.so

Zwei Befehle, die unsere Aufmerksamkeit erregten, sind LoadFileFromModule und LoadFileToModule. Nachdem wir diese Funktionen untersucht hatten, kamen wir zu dem Schluss, dass sie beliebiges Schreiben und Lesen von Dateien auf der virtuellen Steuerung ermöglichen.

CVE-2023-5389:

Von File Write zu preauth RCE über LoadFileToModule

(Befehl 0x51)

LoadFileToModule ermöglicht es dem Benutzer, Dateien in den Controller zu schreiben. Einer der Parameter, die diese Funktion erhält, ist ein Ziel_Pfadder den Pfad angibt, in den die angegebene Datei geschrieben werden soll. 

Wir haben festgestellt, dass diese Funktion es den Benutzern ermöglicht, einen beliebigen Pfad und beliebige Daten anzugeben, ohne dass eine Überprüfung oder Einschränkung des angegebenen Pfads erfolgt. Das bedeutet, dass Benutzer Dateien in alle beschreibbaren Speicherorte des Controllers schreiben können, was ein Sicherheitsrisiko darstellt. Durch Ausnutzung dieser Funktionalität könnten Angreifer Remote-Code-Ausführung auf dem Steuergerät erreichen, indem sie beispielsweise ausführbare Dateien schreiben.

Um eine Datei hochzuladen, verwenden Sie die LoadFileToModule Funktionscode müssen wir mindestens drei Pakete senden (Schreibstart, Schreibdaten, Schreibende). Jedes Paket beginnt mit dem regulären EpicMo-Header.

LoadFileToModule Schreibbefehl starten

Datei Typ

Packetnummer hochladen

Unbekannt

Datei Daten Prüfsumme

Datei Datenlänge

Zielpfad

1 Byte

4 Bytes

2 Bytes

4 Bytes

4 Bytes

Zeichenfolge

  • Dateityp: Firmware-Datei oder generische Datei. 0x05 wird für generische Datei verwendet

  • Upload-Paketnummer: Nummer des Pakets in der Upload-Sequenz. Das erste Paket ist 0.

  • Dateidaten-Prüfsumme: Prüfsumme für die gesamten Dateidaten

  • Dateidatenlänge: Länge der gesamten Daten

  • Zielpfad: Der Name der Datei, die auf dem Steuergerät gespeichert werden soll

LoadFileToModule Datenbefehl 

Die maximale Länge der Dateidaten in einem Datenbefehl beträgt 0x7F. Wenn die Datenlänge mehr als 0x7F beträgt, werden sie in mehrere Pakete aufgeteilt, wobei die Upload-Paketnummer entsprechend aktualisiert wird.

Datei Typ

Packetnummer hochladen

Datenlänge (0x7f max)

Daten

1 Byte

4 Bytes

2 Bytes

n-Bytes

LoadFileToModule letztes Kommando 

Der abschließende Befehl wird verwendet, um zu signalisieren, dass der Upload abgeschlossen ist.

Datei Typ

Packetnummer hochladen

Datenlänge: Muss 0 sein

1 Byte

4 Bytes

2 Bytes

Wenn die Upload-Paketnummer nicht 0 ist und die Datenlänge 0 ist, wird es als das letzte Upload-Paket betrachtet.

Für die Übermittlung einer gültigen LoadFileToModule start müssen wir eine Prüfsumme der Datei angeben. Um die Prüfsumme einer Datei zu berechnen, haben wir die folgende Funktion implementiert, die die korrekte Prüfsumme für eine bestimmte Datei zurückgibt (siehe unten).

Um zu demonstrieren, wie ein Angreifer diese Schwachstelle ausnutzen könnte, um Remotecode auszuführen, haben wir nach beschreibbaren Stellen auf dem virtuellen Controller gesucht. Dabei gab es jedoch einige Einschränkungen:

  1. Hochgeladene Dateien mit LoadFileToModule haben nicht das UNIX-Execute-Attribut

  2. Alle Dateien, die in /usr/honeywell sind schreibgeschützt und dieses Verzeichnis ist nicht beschreibbar.

Wir haben uns schließlich dafür entschieden, eine .so-Systemdatei zu überschreiben; .so-Dateien müssen nicht das Attribut execute haben, und wir können ein gemeinsames Objekt erstellen, das unseren Code ausführt, wenn es geladen wird. Wir wählten /lib/libcap.so.2 als gemeinsam genutztes Objekt, das wir überschreiben, da es beim Start geladen wird, aber das Überschreiben beeinträchtigt die Laufzeit in keiner Weise und ermöglicht ein stabiles Pre-Auth-RCE. 

Unser Code-Ausführungsablauf sieht folgendermaßen aus:

  1. Kompilieren libcap.so.2 mit unserer Nutzlast, die beim Starten ausgeführt werden soll

  2. Verwenden Sie die LoadFilefromModule zum Schreiben der Datei in /lib/libpcap.so.2 auf dem Controller

  3. Rufen Sie den Befehl Reboot auf, um ein Neuladen von libcap.so.2

Schließlich waren wir in der Lage, einen Preauth-RCE auf einem entfernten virtuellen UOC mit CVE-2023-5389 zu demonstrieren.

Schlussfolgerung 

Proprietäre Protokolle wie Honeywells EpicMo, die für die Kommunikation zwischen Honeywell-Experion-Servern und -Steuerungen verwendet werden, enthalten oft Schwachstellen, die industrielle Prozesse dem Risiko der Manipulation oder Störung aussetzen können. 

Wir haben Mechanismen mit einer Funktion gefunden, die eine Remotecodeausführung durch das Schreiben von Dateien auf virtuellen UOC-Controllern ohne Sanitization ermöglicht.

Wir fanden eine undokumentierte und gefährliche Funktion, die es uns ermöglichte, Dateien auf virtuelle UOC-Steuerungen zu schreiben, ohne sie zu bereinigen. Ein Angreifer im OT-Netzwerk konnte bösartige Pakete an den Controller senden und Dateien schreiben, ohne sich am Controller zu authentifizieren. 

Team82 hat diese Sicherheitslücken, CVE-2023-5389 und CVE-2023-5390, Honeywell mitgeteilt, das sie in einem Update behoben hat.

Bleiben Sie auf dem Laufenden

Erhalten Sie den Team82-Newsletter

Offenlegung verwandter Schwachstellen

Claroty
LinkedIn Twitter YouTube Facebook