Im Jahr 2019 haben wir im Internet ein Geschäft gefunden, das Software für schwere Industriemaschinen vertreibt. Wir haben einige dieser Apps heruntergeladen und rückentwickelt, um zu verstehen, wie sie funktionieren. Ihr Code wurde in einer der proprietären Programmiersprachen geschrieben, mit denen Industrieroboter automatisiert werden, die Autos zusammenbauen und Lebensmittel auf Förderbändern verpacken. In einer dieser Anwendungen wurde eine Sicherheitsanfälligkeit entdeckt, mit der unsere Forschung zu Rogue Automation begann: Anfälliger und bösartiger Code in der industriellen Programmierung .
Nachdem wir die technischen Details und Schwächen von acht der beliebtesten industriellen Programmierumgebungen (ABB, Comau, Denso, Fanuc, Kawasaki, Kuka, Mitsubishi und Universal Robots) untersucht hatten, stellten wir fest, dass diese Sprachen verwendet werden können, um Wurm-Malware zu erstellen, die sich von einer entfernt anfälliger Roboter für einen anderen, der die Fernbefehle seiner Bediener befolgt.
Die festgestellten Mängel sind das Ergebnis einer vor einigen Jahrzehnten getroffenen Designentscheidung. Diese Lösungen definierten die Technologie, Methoden und Werkzeuge, die heute noch zur Programmierung von Industrieanlagen verwendet werden. Betrachten Sie die Auswirkungen dieser Wahl im Kontext moderner Cyber-Bedrohungen.
Daten von einem Roboter stehlen
Wir haben einen realen Fall eines anfälligen Webservers gefunden, der als Anwendung für die Ausführung auf einem Industrieroboter implementiert ist. Der in ABB Rapid geschriebene Webserver enthielt eine Durchquerungsanfälligkeit, die es einem Angreifer ermöglichte, über das Netzwerk eine Verbindung zum Roboter herzustellen und alle Dateien von der Robotersteuerung, einschließlich der Protokolle, zu kopieren. Solche Dateien enthalten höchstwahrscheinlich verschiedene vertrauliche Daten und Know-how, sodass sie in unterirdischen Märkten gewinnbringend verkauft werden können.
Wenn es einem Angreifer gelingt, sich in einen Computer im selben Netzwerk wie der Roboter zu hacken, kann er unter dem Deckmantel eines Agenten eine Verbindung zum Webserver des Controllers herstellen, die interessierende Datei anfordern und ohne Autorisierung empfangen, da das Programm alle Anforderungen des Agenten erfüllt.
Ein Fragment des anfälligen Anwendungscodes. Quelle (im Folgenden, sofern nicht anders angegeben): Trend Micro
Line 493 ruft die Funktion sendFile auf, um die angeforderte Datei an den Client zu senden. Der pageString wird in keiner Weise gefiltert, daher kann er "... /" oder einen anderen Pfad enthalten. Auf diese Weise können Sie das Dateisystem durchlaufen und fast jede Datei herunterladen.
Schema zur Ausnutzung von Sicherheitslücken
Bemerkenswert in diesem Fall war der Kommentar, den der Entwickler des anfälligen Webservers im Code hinterlassen hat. Er wusste, dass der von ihm geschriebene Code anfällig war, unternahm jedoch nichts, um das Problem zu beheben, da er davon ausging, dass alle Anforderungen vom "richtigen" Browser stammen würden, der die Eingabedaten validieren und keine Zeichenfolge wie "zulassen würde. . \\ ... \\ ":
,
Die Ausnutzung einiger Schwachstellen kann zu Konsequenzen in der physischen Welt führen, z. B. zu Schäden an fertigen Produkten oder sogar an Menschen in ihrer Umgebung.
Im Open-Source-Projekt für Industrieroboter Kuka haben wir eine Sicherheitslücke entdeckt, mit der Sie die Flugbahn eines beweglichen Teils ändern können. Das Programm empfängt einen Koordinatenstrom über das Netzwerk und überträgt diese an den Aktuator, der die angegebenen Bewegungen ausführt. Hierfür wird eine spezielle Klasse von Prozeduren verwendet - Motion Automation-Server. Es ist eine Standardschnittstelle, über die OEMs von Industrierobotern eine konsistente Möglichkeit zur Steuerung der Bewegung ihrer Produkte bieten können.
Der anfällige Code des Verkehrsautomatisierungsservers enthält keine Überprüfung der Legitimität der an ihn übertragenen Daten
Der Servercode überprüft in keiner Weise, woher der nächste Teil der Koordinaten für die Bewegung des Roboters stammt, und sieht keine interne Authentifizierung vor. Der einzige Schutz besteht darin, die MAC-Adresse und die IP-Adresse des Absenders zu überprüfen, die von einem Eindringling, der in das Netzwerk eingetreten ist, leicht gefälscht werden können.
Auf unserem Labortisch haben wir sichergestellt, dass mit Spoofing der Verkehr zwischen einem Roboter und einer Engineering-Workstation gefälscht werden kann. Ein Angreifer könnte beliebige Koordinaten senden, die der Roboter einfach ausführt, was in einer realen Produktion zu einem Unfall führen würde.
Durch das Einfügen von Netzwerkpaketen mit falschen Koordinaten in den Verkehr konnten wir den Manipulator mehrmals aus der Sicherheitszone schieben und das physische Objekt mit der „Hand“ des Roboters treffen. Infolgedessen fiel der "Arm", mit dem der Roboter Objekte aufnimmt, ab: Der heruntergefallene
Arm des Roboters ist das Ergebnis der Einführung unsicherer Koordinaten in den Verkehr
Dynamische Malware
Diese Art von Angriff setzt voraus, dass der Roboter ein Programm ausführt, das von einem Systemintegrator geschrieben wurde, von dem angenommen wird, dass er vertrauenswürdig ist. In der Realität gilt jedes von einem Integrator erstellte Programm als vertrauenswürdig und wird ohne Codesicherheitsüberprüfung bereitgestellt.
Indem Sie einen Integrator kompromittieren oder ein Programm in einem anfälligen Netzwerkspeicher ersetzen, können Sie unsichtbar schädlichen Code in ein Unternehmensnetzwerk einfügen: Fügen Sie einen Bootloader hinzu, der das vom Angreifer benötigte Modul herunterlädt und als Teil eines Standardproduktionszyklus ausführt.
Malware-Downloader in einer Programmiersprache für Industrieroboter
Um dieses Konzept zu testen, haben wir einen Dropper in einer Programmiersprache für Industrieroboter geschrieben und sichergestellt, dass ein externes Programm verwendet werden kann, um den Code in die Robotersteuerung zu laden und auszuführen. Einmal gesteuert, kann ein solches Programm weitere böswillige Aktionen ausführen, indem es Informationen über die Netzwerkinfrastruktur sammelt, Dateien und Anmeldeinformationen stiehlt.
Ungewöhnliche RCE-Sicherheitslücke
Eines unserer Ergebnisse war ein absolut seriöses Programm, das Funktionen zur Ausführung startet, deren Namen über das Netzwerk empfangen werden. Um sie auszuführen, wird dynamisches Code geladen, es interessiert jedoch nicht, was genau gestartet wird: Das Programm bietet keine Überprüfung der Integrität der geladenen Bibliotheken.
Anfällige Logik einer "seriösen" Anwendung
Ein Codefragment, das anfällige Logik implementiert.
Obwohl das Programm selbst keine schädlichen Funktionen enthält, kann ein Angreifer damit zum richtigen Zeitpunkt Befehle an den Roboter senden, die sich auf die physische Welt auswirken.
Krone der Schöpfung - Bösartiger Wurm
Um die Schwere der erkannten Probleme zu demonstrieren, haben wir ein Programm mit der Funktion der Selbstverbreitung und automatischen Aktualisierung, des dynamischen Ladens von Code vom Steuerungsserver und der Möglichkeit der Fernsteuerung entwickelt. Das Scan-Programm kann auch Netzwerk-Scans durchführen, beliebige Dateien an den Befehls- und Steuerungsserver übertragen, eine Liste infizierter Geräte führen und als Bot fungieren.
Die Logik des PoC-Programms, das die Arbeit einer echten Malware simuliert. Erstellen
einer Liste gefundener Dateien und Senden dieser an den Steuerungsserver
Quelle der Probleme
Nach der Analyse von acht gängigen Programmiersprachen für die industrielle Automatisierung, die in den letzten Jahrzehnten entwickelt wurden, kamen wir zu dem Schluss, dass der Hauptgrund für die identifizierten und potenziellen Schwachstellen darin besteht, dass diese Sprachen Mittel für den Zugriff auf Systemressourcen auf niedriger Ebene enthalten. Obwohl diese Werkzeuge an sich nicht gefährlich sind, können Angreifer sie für andere Zwecke verwenden, was die Sicherheit des Roboters, seines Bedieners und der angeschlossenen Systeme entscheidend beeinträchtigt. Sie können beispielsweise verwendet werden, um den Manipulator nach oben zu bewegen, das Werkstück anzuheben, den Manipulator nach unten abzusenken und das Werkstück freizugeben.
Diese umfangreichen Funktionen bieten Prozessingenieuren die Freiheit, Anwendungen zu entwickeln, mit denen sie Daten aus dem Netzwerk abrufen, Dateien lesen und schreiben können. Da Plattformen jedoch keinen sicheren Zugriff auf diese erweiterten Funktionen bieten, können Angreifer sie zum Schreiben bösartiger Module verwenden.
Ein weiteres Problem mit veralteten Sprachen für die industrielle Automatisierung (Industrial Robots Programming Language, IRPL), die zusammen mit dem Gerät vererbt werden, besteht darin, dass sie keine Tools zum Überprüfen des Codes auf unsichere Muster haben, ähnlich den Tools für C, C ++, C #, Java. PHP und Python.
Jeder OEM erstellt seine eigenen Sprachen und Umgebungen, in denen die Zielprogramme ausgeführt werden. Einige davon basieren auf Echtzeitbetriebssystemen (RTOS), aber insgesamt gibt es keine Standardisierung. Die Semantik jeder IRPL ist ebenfalls einzigartig und kann sich erheblich von der Semantik allgemeiner Programmiersprachen unterscheiden. Einige Funktionen, z. B. zum Bearbeiten von Zeichenfolgen oder kryptografischen Operationen, fehlen in der IRPL oder sind nicht so fortgeschritten wie in herkömmlichen Sprachen.
Die Hauptursachen für Schwachstellen in in IRPL geschriebenen Programmen sind drei Hauptfunktionen:
- Arbeiten mit Dateien und Verzeichnissen,
- Module dynamisch laden und Funktionen nach Namen aufrufen,
- Netzwerkfunktionen - Empfangen und Senden von Daten an externe Systeme.
Gefährliche Funktionen in IRPL verfügbar
Wie Sie sich schützen können
Wie bei jeder Softwareanwendung, die sich mit nicht vertrauenswürdigen Daten befasst, müssen industrielle Automatisierungssysteme mit geeigneten Sicherheitsmechanismen entworfen, implementiert, konfiguriert und bereitgestellt werden.
Konsolidierte Empfehlungen zur Gewährleistung der Sicherheit von Programmen für die industrielle Automatisierung
Daher müssen Sie sich beim Schreiben solcher Programme an folgenden Grundsätzen orientieren:
- Stellen Sie sich Industrieroboter als Computer und Softwareanwendungen für sie als äußerst kritischen Code vor.
- alle Kommunikationen authentifizieren;
- Richtlinien für die Zugriffskontrolle implementieren;
- Implementieren Sie gegebenenfalls eine Eingabevalidierung.
- Gewährleistung einer kontinuierlichen Desinfektion des Outputs;
- Legen Sie bei der Behandlung von Fehlern keine unnötigen technischen Details offen.
- Erstellen Sie die richtigen Konfigurationen und Bereitstellungsverfahren.
- Implementieren Sie Änderungsmanagementprozesse für industriellen Automatisierungscode.
Alt oder schlau?
Während traditionelle Softwareentwickler jahrzehntelang mit den Folgen unsicherer Programmierung zu kämpfen hatten und verschiedene Techniken entwickelten, um den Sieg zu sichern, war die Welt der industriellen Automatisierung nicht darauf vorbereitet, die Ausnutzung von Schwachstellen zu erkennen und zu verhindern.
Angesichts des Tempos der IT / OT-Konvergenz ist es unerlässlich, sichere Codeentwicklungsmethoden in die industrielle Automatisierungsbranche einzuführen. Andernfalls könnten uns die nächsten Jahre viele Berichte über Vorfälle in der Branche bringen, und die Folgen dieser Vorfälle werden sich nicht nur im Cyberspace, sondern auch in der physischen Welt manifestieren.