Beruflich Dokumente
Kultur Dokumente
net/publication/371166725
CITATIONS READS
0 16
3 authors, including:
Some of the authors of this publication are also working on these related projects:
Hybrid AI Intrusion Prevention for Industrial Control Systems (BMBF HAIP) View project
All content following this page was uploaded by Felix Specht on 31 May 2023.
1
Fraunhofer IOSB-INA, 32657 Lemgo, {jens.otto; felix.specht}@iosb-ina.fraun-
hofer.de
2
Phoenix Contact Electronics GmbH, 31812 Bad Pyrmont, bwaldeck@phoe-
nixcontact.com
Abstract: Security ist eine Voraussetzung für moderne Industriekomponenten, welche zunehmend
nach den Vorgaben der internationalen Normenreihe IEC 62443 entwickelt und zertifiziert werden.
Diese Normenreihe definiert Anforderungen für das kontinuierliche Testen aller Kommunikations-
schnittstellen einer Industriekomponente, wozu insbesondere das Fuzzing-Testing gehört. Eine Fuz-
zing-Bibliothek wurde vom Fraunhofer IOSB-INA entwickelt, welche für die Zertifizierung von
Komponenten nach IEC 62443 eingesetzt werden kann. Die Lösung verfügt über die Möglichkeit
die für das Fuzzing-Testing notwendige Datenstrukturen aus aufgezeichnetem Netzwerkverkehr zu
extrahieren, wodurch sich die Lösung einfach an Protokolle oder spezifische Komponenten anpas-
sen lässt.
Keywords: Security-Tests, Fuzzing-Testing, IEC 62443
1 Einleitung
Testfälle
Softwaredienste
HTTP
Testfälle Steuerung
REST
OPC UA
Profinet
(1) Fuzzing-
Standard Python
Softwarebibliothek
(2) Automatisierte Erstellung von Testfällen (3) Automatisierte Durchführung von Testfällen
Das Ziel des Fuzzing-Testing ist das Aufdecken von Fehlern in Softwarediensten, z.B.
Webserver, OPC UA-Server, REST-Schnittstelle oder Profinet-Stack. Techniken des Fuz-
zing-Testing werden in der Literatur auf unterschiedliche Arten klassifiziert [Ma19,
Su07]. Es wird zwischen Black-, White-, oder Grey-Box Ansätzen unterschieden.
Black-Box Ansätze testen auf Basis der externen Kommunikationsschnittstellen und ohne
Expertenwissen. Viele etablierte Softwarewerkzeuge erzeugen Testeingaben nach dem
Zufallsprinzip, z.B. LibFuzzer3, CERT Basic Fuzzing Framework4 oder SPIKE5. Moder-
nere Black-Box Ansätze, wie Peach6 oder funfuzz7, berücksichtigen zusätzlich strukturelle
Informationen, um Eingaben zu erzeugen. [Ch10] beschreiben einen Black-Box Ansatz
mit „Adaptive Random Testing“, eine Erweiterung des zufallsbasierten Testens. Dabei
wird eine zufällig generierte Eingabe systematisch modifiziert und erneut eingespielt.
White-Box Ansätze testen Dienste auf Basis des Quellcodes und mit Expertenwissen über
den Programmablauf. Der White-Box Ansatz von [Go08] erzeugt Testfälle basierend auf
einer Analyse mit symbolischer Programmausführung. [Ga09] beschreiben einen White-
Box-Ansatz mittels “Taint-Tracing”. Dabei werden potentielle Angriffspunkte identifi-
ziert, indem die Wechselwirkung zwischen Eingabebytes und den beeinflussten Werten
im Programm analysiert wird.
Grey-Box Ansätze testen ebenfalls auf Basis der Kommunikationsschnittstellen, die Tests
werden jedoch mit Expertenwissen angereichert. Erste Grey-Box Ansätze, z.B. Sidewin-
der8, basieren auf der Erfassung und Analyse der „Code Coverage“-Metrik bei der Test-
ausführung. Die Analyseergebnisse dienen als Eingabe für einen evolutionären Algorith-
mus, der neue Tests generiert [De07]. AFL9 und VUzzer sind Beispiele für moderne Grey-
Box Ansätze, die evolutionäre Algorithmen mit anwendungsspezifischem Wissen kombi-
nieren. Dabei werden Kontroll- und Datenflussmerkmale durch statische und dynamische
Softwareanalyse erhoben [Ra17]
Unterschieden wird außerdem zwischen Ansätzen, die Testeingaben unstrukturiert oder
strukturiert generieren. Unstrukturierte Ansätze setzen kein Expertenwissen über die zu
3
„LibFuzzer“, 2015. [Online] (https://llvm.org/docs/LibFuzzer.html Stand 19.08.2022)
4
CERT, „Basic fuzzing framework“, 2010. [Online] (https://www.cert.org/vulnerability-analysis/tools/bff.cfm
Stand 19.08.2022)
5
D. Aitel, “An introduction to SPIKE, the fuzzer creation kit,” in Proc. Black Hat USA, 2002.
6
M. Eddington, “Peach fuzzing platform”, 2014. [Online] (https://peachtech.gitlab.io/peach-fuzzer-community
Stand 19.08.2022)
7
M. Security, “funfuzz”, 2016. [Online] (https://github. com/MozillaSecurity/funfuzz Stand 19.08.2022)
8
S. Embleton, S. Sparks, and R. Cunningham, ““sidewinder”: An evolutionary guid-ance system for malicious
input crafting,” in Proc. Black Hat USA, 2006.
9
M. Zalewski, “American Fuzzy Lop,” 2014. [Online] (http://lcamtuf.coredump.cx/afl/ Stand 19.08.2022)
testende Schnittstelle voraus, können jedoch nicht gezielt testen. Strukturierte Ansätze be-
nötigen zunächst Informationen über die erwartete Datenstruktur einer Schnittstelle, kön-
nen dann gezielt nach Fehlern suchen.
Es werden generierende und mutierende Ansätze unterschieden, je nachdem, ob die Ein-
gaben von Grund auf neu generiert oder bestehende Eingaben verändert werden [Su07].
Die Softwarewerkzeuge Peach, PROTOS und Sulley sind Beispiele für generierende An-
sätze [Ka01, Am12]. AFL, SymFuzz und honggfuzz10 fallen hingegen in die Kategorie
der mutierenden Ansätze [Ch15].
Ansätze können in protokoll- oder anwendungsspezifisch unterteilt werden. Protokollspe-
zifische Ansätze testen die Implementierung eines Kommunikationsprotokolls, z.B. Pro-
finet. Anwendungsspezifische Ansätze testen hingegen die Anwendung, die auf einem
Kommunikationsprotokoll aufsetzt, z.B. eine IEC 61131-3 Laufzeitumgebung. Fuzzing-
Testing ist in der klassischen IT-Security ein Thema mit einer Vielzahl von Veröffentli-
chungen in den o.g. Kategorien. Für IT-Systeme sind entsprechende Open Source und
proprietäre Lösungen verfügbar.
Im Bereich der OT-Security existieren hingegen nur wenige Ansätze, welche insbesondere
auf das Fuzzing-Testen von proprietären Industrieprotokollen abzielen. PropFuzz verwen-
det statistische Analyse zur Identifikation von testrelevanten Bytes in Netzwerkpaketen
[Ni17]. Ein weiterer Ansatz ist eine Erweiterung für die Fuzzing-Software Peach um die
Industrieprotokolle Modbus und DNP3 [Zh20]. Der Ansatz ICPFuzzer verwendet maschi-
nelle Lernverfahren, um zunächst Muster in proprietären Industrieprotokollen zu identifi-
zieren und anschließend zu testen [Pe21]. ISuTest ist ein Ansatz für ein modulares Test-
Framework für Industriekomponenten, welches diverse Module zum Security-Testing
verwendet [Pf17, Pf19, Pfb19]. ISuTest inkludiert ebenfalls bestehende Fuzzing-Ansätze
als Module [Pf18].
Basierend auf den Vorarbeiten von [Pf18], gibt es folgende Anforderungen für eine Fuz-
zer-Implementierung im Bereich der Automatisierungstechnik, siehe Tabelle 1.
Tabelle 1: Anforderungen an eine Fuzzer-Implementierung nach [Pf18].
ID Beschreibung:
FR2 Eingaben vor und während der Laufzeit sollen generiert werden können.
10
R. Swiecki and F. Gröbert, “honggfuzz,” 2010. [Online] (https://github.com/google/honggfuzz Stand
19.08.2022)
FR5 Die Antworten des Testgeräts sollen überwacht werden.
3 Lösungsansatz
In diesem Kapitel werden die folgenden Lösungskonzepte vorgestellt: (1) Eine Software-
bibliothek für das Fuzzing-Testing von Softwarediensten für Industriekomponenten, (2)
ein Konzept für die automatisierte Erstellung von Testfällen und (3) ein Konzept für die
automatisierte Durchführung von Testfällen. Auf die beschriebenen Anforderungen aus
dem Stand der Technik wird verwiesen (siehe Tabelle 1).
Das Ziel der Softwarebibliothek für das Fuzzing-Testing ist die Kapselung aller notwen-
digen Funktionalitäten und Algorithmen, um einen Testingenieur zu befähigen Testfälle
mit Fuzzing-Algorithmen zu erstellen. Testfälle werden häufig in der Programmiersprache
Python geschrieben, daher sind die Fuzzing-Algorithmen und notwendigen Funktionalitä-
ten in Python implementiert. Die erstellten Testfälle können dann verwendet werden, um
Softwaredienste, z.B. Webserver, OPC UA-Server, Profinet, etc., einer Industriekompo-
nente zu überprüfen.
Abbildung 2 zeigt die Lösungselemente und den Aufbau der Softwarebibliothek für das
Fuzzing-Testing. Die Softwarebibliothek besteht aus sieben Modulen: (1) Fuzzing, (2)
Decoder, (3) Encoder, (4) Datenbank, (5) Reporting, (6) maschinelles Lernen und (7) ei-
nem Codegenerator.
Fuzzing-Softwarebibliothek
Codegenerator
Datenbank Fuzzing
Reporting
Die manuelle Erstellung von Testfällen durch einen Testingenieur ist zeitaufwändig. Um
diese Aufwände zu reduzieren, beschreibt dieser Abschnitt ein Konzept zur automatisier-
ten Erstellung von Testfällen.
Um Testfälle automatisch generieren zu können, werden strukturelle Informationen aus
aufgezeichneten Netzwerkdaten benötigt. Um Kommunikationsdaten aufzuzeichnen ist
eine Interaktion mit den Softwarediensten notwendig. Eine Interaktion kann z.B. das Aus-
führen einer Weboberfläche oder das Auslesen eines OPC UA Servers durch einen OPC
UA Client sein. Abbildung 3 zeigt wie Kommunikationsdaten mittels Wireshark11 aufge-
zeichnet werden können.
Web Browser Wireshark
Aufzeichnen
Export Extraktion
11
https://www.wireshark.org/
Die automatisierte Erstellung von Fuzzing-Testfällen ist eine Option, die durch die Soft-
warebibliothek ermöglicht wird. Abbildung 5 zeigt exemplarisch den generierten Test-
fall:
(1) Import der Softwarebibliothek in ein Python-Script
(2) Initialisierung eines Eingabegenerators (z.B. Wordlist oder Random-Generator)
(3) Definition der zu testenden Funktion (hier 'AddUser' Funktion der Weboberflä-
che)
(4) Erzeugung und Zuweisung der generierten Eingabe als Benutzername und Pass-
wort
(5) Versandt des Netzwerkpakets und Aktualisierung des Reporting Moduls
Abbildung 5: Beispiel für einen generierten Testfall anhand der 'AddUser' Funktion in der Web-
oberfläche einer Industriesteuerung.
Die manuelle Durchführung von Testfällen durch einen Testingenieur ist zeitaufwändig.
Um diese Aufwände zu reduzieren, beschreibt dieser Abschnitt ein Konzept zur automa-
tisierten Durchführung von Testfällen.
Eine Testumgebung besteht aus der zu testenden Industriekomponente und einem Test-
PC, siehe Abbildung 6. Der Test-PC und die Industriekomponente kommunizieren unter-
einander über eine Netzwerkverbindung. Im abgebildeten Beispiel wird eine Testeingabe
an den OPC UA Softwaredienst der zu testenden Komponente geschickt. Anschließend
wird der Zustand von der Industriekomponente abgefragt (Monitoring), um ausgelöste
Fehler (z.B. Absturz des OPC UA Diensts, Speicherüberlauf, etc.) festzustellen.
Ein Report kann parallel zur Testausführung ausgewertet werden. Dies ist bei langen Aus-
führzeiten von Testfällen hilfreich. Der generierte Report enthält die folgenden Informa-
tionen: Zeitstempel des verschickten Netzwerkpakets, generierte Testeingabe, den freien
Arbeitsspeicher der Industriekomponente, die CPU-Auslastung, beendete Prozesse und
Alarmsignale.
Logischer Testaufbau Report
Physischer Testaufbau
Netzwerkverbindung
Test-PC Industriekomponente