Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
dtls-fuzzer — dtls-fuzzer ist ein Protokoll-Zustands-Fuzzer für DTLS-Server-Implementierungen. | Kitploit
Tools/GitLabGitLab/pfg666/dtls-fuzzer
FuzzingNetzwerksicherheit
GitLabpfg666/dtls-fuzzer

dtls-fuzzer

dtls-fuzzer ist ein Protokoll-Zustands-Fuzzer für DTLS-Server-Implementierungen.

Repository anzeigen
49vor 5 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

dtls-fuzzer ist ein Java-Tool, das Protokollzustands-Fuzzing von DTLS-Servern durchführt. Konkret unterstützt es die folgenden Funktionen:

  1. Gegeben ein Alphabet kann es automatisch ein Modell einer lokalen DTLS-Serverimplementierung generieren;
  2. Gegeben einen Test (Eingabensequenz) und ein Alphabet kann es den Test auf einer DTLS-Serverimplementierung ausführen;
  3. Es kann eine Batch-Lernaufgabe mit mehreren Lernläufen durchführen.

dtls-fuzzer verwendet TLS-Attacker, um DTLS-Nachrichten zu generieren/zu parsen sowie den Zustand zu verwalten. Zu diesem Zweck wurde TLS-Attacker um Unterstützung für DTLS erweitert. dtls-fuzzer verwendet Version 3.0b von TLS-Attacker, einer Version, die die DTLS-Erweiterung implementiert.

Inhalt des Artefakts

Das Artefakt enthält:

  1. eine Beschreibung der Dateistruktur von dtls-fuzzer, einschließlich Quellcode und experimenteller Daten, die mit den im Papier dargestellten übereinstimmen;
  2. eine Schritt-für-Schritt-Anleitung zur Evaluierung von dtls-fuzzer auf einer ausgewählten SUT (System Under Test)/DTLS-Serverimplementierung.

Dateistruktur von dtls-fuzzer

Die wichtigsten Ordner im Stammverzeichnis von dtls-fuzzer sind:

  1. 'src', Verzeichnis mit dem Java-Quellcode von dtls-fuzzer;
  2. 'examples', Verzeichnis mit Beispielen für Alphabete, Tests, Spezifikationen (d.h. Modelle) und Argumentdateien, die dtls-fuzzer zum Starten von Lernversuchen bereitgestellt werden können. Dateien in diesem Verzeichnis werden als Eingaben für Lernversuche verwendet;
  3. 'experiments', Verzeichnis mit Daten zu Experimenten. Einige dieser Daten dienen auch als Eingabe für Lernversuche. Die wichtigsten Ordner sind:
    1. 'suts', mit Binärdateien für Java-SUTs. Diese SUTs sind maßgeschneiderte DTLS-Serverprogramme, deren Quellcode öffentlich verfügbar ist;
    2. 'patches', Patches, die auf einige SUTs (insbesondere auf Hilfsprogramme) angewendet wurden, bevor der Quellcode kompiliert wurde. Der Hauptzweck dieser Patches war es, zeitgesteuertes Verhalten während des Lernens zu verhindern, Funktionen in der SUT zu aktivieren/deaktivieren und Parameter wie den vorab geteilten Schlüssel zu konfigurieren;
    3. 'keystore', Schlüsselmaterial (z.B. öffentlich-private Schlüsselpaare, Java-Keystores), das beim Lernen verwendet wird;
    4. 'results', experimentelle Ergebnisse.

Experimentelle Ergebnisse

'experiments/results' enthält experimentelle Ergebnisse, die die Hauptausgabe der Arbeit darstellen. Im Einzelnen

  • 'all_ciphers' enthält Ausgabeordner für alle durchgeführten Experimente;
    • 'mapper' enthält experimentelle Ergebnisse, die einige der getroffenen Mapper-Entscheidungen rechtfertigen (siehe Abschnitt 5.2)
  • 'included' enthält Ausgabeordner für konvergierende Experimente (Konvergenz bedeutet, dass das Lernen erfolgreich ein Modell generiert).
    • Beachten Sie, dass nicht alle Experimente in 'all_ciphers' erfolgreich waren/mit einem endgültigen Modell abgeschlossen wurden (wir sagen in solchen Fällen, dass das Lernen nicht konvergiert ist).

Ausgabeordner

Ausgabeordner werden basierend auf der Experimentkonfiguration benannt, d.h.:

  • die getestete SUT/Implementierung;
  • das verwendete Alphabet, bezogen auf die abgedeckten Schlüsselaustauschalgorithmen, wobei 'all' anzeigt, dass alle 4 Schlüsselaustauschalgorithmen verwendet wurden;
  • wo zutreffend, ob eine Client-Zertifizierung erforderlich (req), optional (nreq) oder deaktiviert (none) war;
  • der Testalgorithmus: Random Walk (rwalk) oder eine Anpassung davon (stests);
    • Experimente mit der Anpassung wurden nicht in das Papier aufgenommen
  • optional, ob Wiederholungen in den Ausgaben enthalten sind oder nicht (incl oder excl).
    • Wiederholungen waren standardmäßig enthalten

Als Beispiel: Der Ordnername 'jsse-12_rsa_cert_none_rwalk_incl' zeigt ein Experiment mit der JSSE 12-Implementierung von DTLS an, wobei ein Alphabet verwendet wird, das Eingaben zur Durchführung von RSA-Handshakes enthält, die Client-Zertifikatsauthentifizierung deaktiviert ist, der Testalgorithmus Random Walk ist und Wiederholungen enthalten sind.

Ein Ausgabeordner enthält:

  • 'alphabet.xml', das Eingabealphabet;
  • 'command.args', die verwendete Argumentdatei, die verschiedene Experimentparameter enthält, insbesondere:
    • queries, die Grenze für die Anzahl der Random-Walk-Tests, die bestanden werden müssen, damit eine Hypothese als endgültig angesehen wird
    • equivalenceAlgorithms, modellbasierte Testalgorithmen, die eingesetzt werden
    • runWait und timeout, die Start- bzw. Antwort-Timeout (wir werden später darauf eingehen)
  • 'sul.config', SUT-abhängige Konfiguration für TLS-Attacker; dieselbe Konfiguration kann verwendet werden, um Workflow-Traces auf der SUT mit TLS-Attacker allein auszuführen;
  • 'hyp[0-9]+.dot', Zwischenhypothesen;
  • 'statistics.txt', Experimentstatistiken wie die Gesamtzahl der Tests, Lernzeit;
    • Tabelle 4 zeigt diese Daten
  • 'nondet.log', Logs von aufgetretenem nicht-deterministischem Verhalten;
  • 'learnedModel.dot', falls das Lernen konvergiert ist, das gelernte Modell (d.h. die endgültige Hypothese);
  • 'error.msg', eine Fehlermeldung, die generiert wird, falls das Experiment fehlgeschlagen/das Lernen gestoppt wurde und daher nicht zu einem endgültigen Modell konvergiert ist.
    • der Hauptgrund ist zeitbezogener Nichtdeterminismus (gleiche Eingaben führen zu unterschiedlichen Ergebnissen).

Der Evaluator kann (beispielsweise) überprüfen, ob experimentelle Ergebnisse in 'included' mit denen in Tabelle 4 übereinstimmen, oder ob Konfigurationen, die in Tabelle 2 getestet wurden, auch in 'all_ciphers' vorkommen. Beachten Sie, dass Modelle, die im Papier erscheinen, das Ergebnis eines erheblichen Pruning/Trimmens waren, während die Modelle in den Ausgabeordnern unverändert sind.

Evaluierungsschritte für dtls-fuzzer

Zum Zweck der Evaluierung von dtls-fuzzer müssen die folgenden Schritte durchgeführt werden:

  1. Sicherstellen, dass die Voraussetzungen erfüllt sind
  2. dtls-fuzzer installieren
  3. SUT einrichten
  4. dtls-fuzzer verwenden, um Modelle für die SUT zu generieren
  5. Ergebnisse analysieren

Auf diesen Evaluierungsabschnitt folgt ein Leitfaden zur Verwendung von dtls-fuzzer, der seine Hauptanwendungsfälle vorstellt.

Sicherstellen der Voraussetzungen

dtls-fuzzer wurde auf Ubuntu 18.04 und Debian 9-Distributionen von Linux getestet. Es sollte auf jeder aktuellen Linux-Distribution funktionieren. Unterstützung für andere Plattformen wurde nicht getestet. Diese Anleitung geht von einer Debian-basierten Distribution aus (die 'apt-get' hat).

Eine Java 8 JDK (Java Development Kit) Virtual Machine (VM) wird benötigt. Die Version, die zum Ausführen der Experimente verwendet wurde, ist 1.8.0_222, obwohl spätere Java 8-Versionen ebenfalls funktionieren sollten. Beachten Sie, dass das Tool nicht auf Java 9 oder später gebaut werden kann. Wir verwenden auch Maven (das 'mvn'-Dienstprogramm) für das Abhängigkeitsmanagement/die Bereitstellung.

Wir empfehlen die Verwendung eines ausreichend leistungsfähigen Rechners, da sonst empfindliche Zeitparameter wie die Wartezeit auf Antwort zu niedrig werden könnten, was zu anderen Ausgaben als den im Papier erhaltenen führt. Schlimmer noch, sie können dazu führen, dass Lernversuche fehlschlagen. Die ursprünglichen Experimente wurden auf einem Server mit vielen Kernen durchgeführt, wir erwarten jedoch (obwohl nicht gründlich getestet), dass Lernen auf einem Desktop mit einem i7-Prozessor möglich sein sollte. Lernen ist auch auf schwächeren Systemen möglich, wenn die Zeitparameter entsprechend angepasst werden. Schließlich erfordert das Visualisieren von .dot-Modellen durch Exportieren als .pdf die Installation der graphviz-Bibliothek. Es wird davon ausgegangen, dass das von graphviz bereitgestellte 'dot'-Dienstprogramm im System-PATH liegt.

Kurz gesagt, die empfohlenen Voraussetzungen sind:

  • aktuelle Linux-Distribution, vorzugsweise Debian-basiert
  • Desktop/Server-Rechner für die Reproduktion von Experimenten/zuverlässiges Lernen
  • (>=) 4 GB RAM
  • Java 8 JDK
  • maven
  • graphviz

Einrichten der Umgebung

Java 8 JDK

dtls-fuzzer benötigt Java 8 JDK (Java Development Kit). Wenn Java nicht installiert ist, installieren wir die OpenJDK-Implementierung (über 'apt-get' auf Ubuntu) und können den Rest dieses Unterabschnitts überspringen.

root@kitploit:~
> sudo apt-get install openjdk-8-jdk

Wenn eine Version von Java installiert ist, können wir überprüfen, welche Version es ist, indem wir ausführen:

root@kitploit:~
> java -version

Der Versionscode sollte mit 1.8 beginnen (z.B. 1.8.0_242), und die Virtual Machine sollte "Server VM" sein (was anzeigt, dass das vollständige JDK installiert ist, nicht nur die Laufzeitumgebung). Wenn das der Fall ist, sind wir mit Java fertig. Wenn nicht, können wir prüfen, ob Java 8 JDK auf unserer Plattform installiert, aber derzeit nicht ausgewählt ist, indem wir die installierten Java-VMs auflisten über:

root@kitploit:~
> update-java-alternatives --list

Wenn Java 8 JDK erscheint, können wir denselben Befehl verwenden, um das Java 8 JDK als Standard-Java-Implementierung zu konfigurieren.

root@kitploit:~
> sudo update-java-alternatives --set java-1.8.0-openjdk-amd64

Andernfalls müssen wir die vollständige Installation wie am Anfang gezeigt durchführen. Leider ist 'update-java-alternatives' manchmal nicht erfolgreich, was durch "error"-Meldungen angezeigt wird. Falls ein solcher Fall eintritt, können wir 'update-alternatives' verwenden, um interaktiv zu konfigurieren, welche Java-VM von 'java' (Interpreter) und 'javac' (Compiler) ausgewählt wird.

root@kitploit:~
> sudo update-alternatives --config java
> sudo update-alternatives --config javac

Andere

Mit Java 8 eingerichtet, fahren wir mit der Installation der anderen Abhängigkeiten fort, maven, graphviz plus einige häufige SUT-Abhängigkeiten. Dann klonen wir das Repository von dtls-fuzzer in einen Ordner unserer Wahl und checken den Artifact-Branch aus. Zum Schluss machen wir diesen Ordner zu unserem aktuellen Verzeichnis.

root@kitploit:~
> sudo apt-get install maven graphviz autotools-dev automake libtool
> git clone  -b usenix20-artifact https://github.com/assist-project/dtls-fuzzer.git ~/dtls-fuzzer
> cd ~/dtls-fuzzer

Installieren von dtls-fuzzer

Wir führen zunächst das Skript 'prepare.sh' aus, das Bibliotheken installiert, von denen dtls-fuzzer abhängt, nämlich zwei lokale .jars und TLS-Attacker 3.0b. Dann installieren wir das Tool selbst. Die resultierenden Befehle auf einem POSIX-System sind:

root@kitploit:~
> bash prepare.sh
> mvn clean install

Nach diesen Schritten sollte ein Verzeichnis namens 'target' erstellt worden sein, das 'dtls-fuzzer.jar' enthält. Dies ist unsere ausführbare Bibliothek. Von diesem Punkt an wird angenommen, dass Befehle aus dem Stammverzeichnis von dtls-fuzzer ausgeführt werden.

Schnellstart

Angenommen, wir möchten ein Modell für OpenSSL 1.1.1b nur mit PSK (Pre-Shared Keys) generieren. Ein Schnellstart von dtls-fuzzer läuft wie folgt ab.

Zuerst richten wir die SUT ein, was automatisch durch ein 'setup_sut.sh'-Skript erfolgt.

root@kitploit:~
> bash setup_sut.sh openssl-1.1.1b

Dann wählen wir eine Argumentdatei aus dem Ordner 'args/openssl-1.1.1b'. Wir sehen, dass es mehrere Argumentdateien zur Auswahl gibt, nämlich:

root@kitploit:~
learn_openssl-1.1.1b_all_cert_none_rwalk_incl  
learn_openssl-1.1.1b_all_cert_nreq_rwalk_incl  
learn_openssl-1.1.1b_all_cert_req_rwalk_incl  
learn_openssl-1.1.1b_psk_rwalk_incl

Die relevante Argumentdatei ist 'learn_openssl-1.1.1b_psk_rwalk_incl', da ihr Dateiname auf PSK hinweist. Wir wählen sie also aus und führen den Fuzzer darauf aus. Zusätzlich begrenzen wir die Anzahl der Tests auf 200, um die Lernzeit zu verkürzen. Schließlich muss für OpenSSL LD_LIBRARY_PATH auf das Implementierungsverzeichnis ('suts/openssl-1.1.1b/') gesetzt werden. Bevor wir mit dem Lernen beginnen, möchten wir vielleicht einen einfachen Test ausführen, um zu überprüfen, ob unser Setup funktioniert. Ein guter Test ist einfach das Abschließen eines Handshakes. Wir liefern die Argumentdatei zusammen mit einem entsprechenden Test aus 'examples/tests' als Parameter. Wir erhalten:

root@kitploit:~
>  LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -test examples/tests/psk

Wenn alles gut geht, sollte der Server "This is a hello message" ausgegeben haben, eine Nachricht, die wir nach Abschluss des Handshakes senden. Da wir wissen, dass unser Setup funktioniert, können wir nun mit dem Lernen beginnen, indem wir ausführen:

root@kitploit:~
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_psk_rwalk_incl -queries 200

Wir bemerken, dass ein Ausgabeverzeichnis 'output/openssl-1.1.1b_psk_rwalk_incl/' für das Experiment erstellt wurde. Wir können mit 'ls' den aktuellen Status des Experiments überprüfen (Anzahl der generierten Hypothesen...).

root@kitploit:~
> ls output/openssl-1.1.1b_psk_rwalk_incl/

Wenn alles richtig läuft

Wenn alles gut geht, sollte das Ausgabeverzeichnis nach 20-30 Minuten eine Datei 'learnedModel.dot' enthalten. Wir können die Datei mit dem graphviz 'dot'-Dienstprogramm visualisieren, indem wir sie als .pdf exportieren und die .pdf mit unserem bevorzugten .pdf-Betrachter öffnen.

root@kitploit:~
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.pdf

Schließlich können wir 'trim_model.sh' verwenden, um eine bessere/getrimmte Version des Modells zu generieren. Dies kann wie folgt erfolgen:

root@kitploit:~
> bash trim_model.sh --output output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot output/openssl-1.1.1b_psk_rwalk_incl/learnedModel.dot 
> dot -Tpdf output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.dot > output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf
> evince output/openssl-1.1.1b_psk_rwalk_incl/nicerLearnedModel.pdf

Wir können nun die Konformität des Systems bestimmen, indem wir das Modell mit der Spezifikation vergleichen...

Wenn etwas schief geht

Wenn wir das Ausgabeverzeichnis mit 'ls' inspizieren, könnten wir 'error.msg' finden. Das ist ein Zeichen dafür, dass das Experiment fehlgeschlagen ist und das Lernen abrupt beendet wurde. In solchen Fällen zeigt das Anzeigen des Inhalts den Grund für den Fehler auf.

root@kitploit:~
> cat output/openssl-1.1.1b_psk_rwalk_incl/error.msg

Beachten Sie, dass die Konformitätsprüfung dennoch auf der letzten generierten Hypothese durchgeführt werden kann, solange potenzielle Erkenntnisse gegen das System validiert werden (wie sie es ohnehin sollten).

Einrichten der SUT

Wir stellen ein Skript zum Einrichten der SUT bereit. Dieses Skript lädt die Quelldateien herunter, installiert einige Abhängigkeiten (jvm) und baut die SUT. Um SUTs anzuzeigen, für die eine automatische Einrichtung bereitgestellt wird, führen Sie aus:

root@kitploit:~
> bash setup_sut.sh

Um beispielsweise Contiki-NGs tinydtls-Implementierung einzurichten, führen Sie aus:

root@kitploit:~
> bash setup_sut.sh ctinydtls

Das Skript erzeugt zwei Ordner im Stammverzeichnis von dtls-fuzzer.

  • 'suts', wo die SUT-Binärdateien bereitgestellt werden
  • 'modules', wo alle Abhängigkeiten bereitgestellt werden

Leider ist die Automatisierung der SUT-Einrichtung ein komplizierter Prozess, daher nehmen wir die folgenden Abkürzungen. Für Java-SUTs (JSSE, Scandium) bauen wir die Implementierungen nicht, sondern verwenden die kompilierten .jars aus dem Verzeichnis 'experiments/suts'. Beachten Sie, dass der Quellcode dieser Java-SUTs (Serveranwendungen) öffentlich online verfügbar ist, siehe Scandium und JSSE, was auch für PionDTLS der Fall ist. Das automatische Installieren von Abhängigkeiten kann 'sudo'-Zugriff erfordern. Dies tritt bei GnuTLS auf, das auf externen Bibliotheken wie nettle basiert, und bei Eclipses TinyDTLS, das auf autoconf basiert. Schließlich stellen wir keine automatische Einrichtung/Argumentdateien für NSS und PionDTLS bereit, da die Einrichtung für diese Systeme zu kompliziert ist.

Fehlerbehebung

Wenn während des Einrichtungsprozesses etwas nicht funktioniert, kann das Löschen des 'suts'-Ordners (oder des 'suts/SUT'-Ordners spezifisch für die SUT) und das erneute Ausführen des Einrichtungsskripts das Problem lösen. Auch wenn der Build fehlschlägt, sollte der Quellcode der Implementierung dennoch in das Verzeichnis 'suts' heruntergeladen worden sein. Eine Problemumgehung besteht darin, die Implementierung manuell zu bauen. Solange die Implementierung gebaut ist, sollte unser Setup funktionieren.

Wir geben hiermit einen unvollständigen Abhängigkeitsbaum der verschiedenen SUTs an. Diejenigen in Kursivschrift sind Abhängigkeiten, die 'setup_sut.sh' mit 'sudo'-Zugriff zu installieren versucht.

  • GnuTLS:
    • m4
    • pkg-config
    • nettle
  • Eclipse's TinyDTLS
    • m4
    • autoconf
  • WolfSSL
    • m4
    • autoconf
    • libtool
  • nettle
    • m4
    • pkg-config
  • autoconf
    • aclocal
      • automake
      • autotools-dev

Lernen einer SUT-Konfiguration

Wir sind nun bereit, eine SUT-Konfiguration zu lernen. Argumentdateien für verschiedene SUT-Konfigurationen sind im Verzeichnis 'args' im Home-Verzeichnis von dtls-fuzzer vorhanden. Jeder Argumentdateiname beschreibt den Experimentaufbau (SUT, Alphabet, Authentifizierung), wie durch die Ausgabeordnernamen in 'experiments/results/' beschrieben. Um das Lernen für eine SUT mit einer Argumentdatei zu starten, führen Sie aus:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file

Der Ausgabeordner wird in einem generierten 'output'-Verzeichnis gespeichert.

Parameteranpassungen

Testgrenze

Im Vergleich zu den Experimenten im Papier haben wir das Antwort-Timeout für mehrere SUTs als Anpassung an weniger leistungsfähige Hardware erhöht. Um die Lernzeit zu verkürzen, empfehlen wir, die Testgrenze des Random-Walk-Algorithmus von 20000 auf 5000 zu reduzieren. Dies kann erfolgen durch:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -queries 5000

Dies überschreibt die Grenzeneinstellung in der Argumentdatei. Abgesehen von GnuTLS, PionDTLS und JSSE erwarten wir, dass das Lernen bei dieser niedrigeren Grenze dieselben Modelle produziert.

Timing-Parameter

Timing kann ein Problem darstellen, was zu Nichtdeterminismus führt, gefolgt von einem abrupten Ende mit einer informativen 'error.msg'-Datei. In solchen Fällen gibt es zwei Stellschrauben, die angepasst werden können:

  1. das Antwort-Timeout (Zeit, die auf jede Antwort gewartet wird, bevor geschlossen wird, dass der Server still ist);
  2. das Start-Timeout (Zeit, die auf den Start des Servers gewartet wird).

Diese Parameter können durch Überschreiben (wahrscheinlich mit einem höheren Wert) der entsprechenden Einstellungen in der Argumentdatei angepasst werden:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -timeout new_response_timeout -runWait new_start_timeout

Um Probleme mit dem Timing zu vermeiden, empfehlen wir, Experimente auf einem ausreichend leistungsfähigen Rechner durchzuführen. Die Hauptursache für Nichtdeterminismus ist, dass die SUT zu lange zum Starten oder zum Generieren einer Antwort braucht. Diese Wahrscheinlichkeit sinkt, je mehr Rechenleistung zur Verfügung steht.

Lernzeit

Wir möchten Experimente möglicherweise automatisch nach einem bestimmten Zeitraum beenden, insbesondere Experimente, von denen nicht erwartet wird, dass sie jemals enden. Das Festlegen dieses Zeitraums ist über den Parameter time limit möglich, dem die maximale Dauer zugewiesen wird, die das Experiment laufen darf. Diese Dauer wird im ISO 8601-Format angegeben. Um die Ausführungszeit eines Experiments auf 60 Minuten zu begrenzen, würden wir ausführen:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/sut_name/arg_file -timeLimit "PT60M"

Gleichzeitige Experimente und Portkollisionen

Es ist möglich, mehrere Experimente gleichzeitig auszuführen, sofern die Server so konfiguriert sind, dass sie auf verschiedenen Ports lauschen. Wir können jedes Experiment in einem separaten Terminal starten. Alternativ können wir Experimente in einem einzigen Terminal mit dem 'disown'-Dienstprogramm starten:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk 1>/dev/null 2>&1 & disown

Das Ausführen von mehr als ein paar (>2) Experimenten stellt jedoch eine zusätzliche Belastung für den Rechner dar. Es erhöht auch die Wahrscheinlichkeit eines Lernfehlers aufgrund einer versehentlichen Portkollision. In den meisten Konfigurationen sind die Server so konfiguriert, dass sie auf einem fest codierten Port über localhost lauschen; die in 'args' bereitgestellten Konfigurationen verwenden unterschiedliche fest codierte Ports. Bei JSSE- und Scandium-Konfigurationen ist das Setup anders. Bei jedem Test startet die SUT einen Server, der auf einem dynamisch gewählten Port lauscht, und teilt den Port über TCP-Sockets dtls-fuzzer mit. Dies hat den Vorteil, dass dtls-fuzzer benachrichtigt wird, wenn der Server bereit ist, Pakete zu empfangen (ohne dies müsste dtls-fuzzer blind eine willkürliche Zeit auf den Serverstart warten). Der Nachteil ist, dass der zugewiesene Port derselbe sein könnte wie ein fest codierter Port eines anderen Experiments, bei dem ein Server-Thread kürzlich gestoppt wurde und ein neuer Thread noch nicht gestartet wurde (was bedeutet, dass der fest codierte Port bei der dynamischen Zuweisung verwendet werden könnte). Um diese Art von Kollision zu vermeiden, empfehlen wir, Scandium- und JSSE-Experimente getrennt von allen anderen durchzuführen.

Vorgeschlagene Konfigurationen

Wir schlagen die folgenden Konfigurationen vor, bei denen der automatisierte Build zuverlässig ist, das Lernen schneller ist oder interessante Fehler gefunden wurden. Stellen Sie sicher, dass Sie die SUT eingerichtet haben, bevor Sie den angegebenen Befehl ausführen. Sie werden feststellen, dass wir uns wo möglich auf PSK-Konfigurationen konzentrieren. Der Grund dafür ist, dass PSK mit kleinen Passwörtern deutlich weniger Rechenzeit erfordert als jeder andere Verschlüsselungsmechanismus.### OpenSSL 1.1.1b Jede OpenSSL-1.1.1b-Konfiguration (z. B. 'args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl') kann ausprobiert werden. Experimente enden schnell (weniger als ein Tag) und üben alle Schlüsselaustausch-Algorithmen aus. Befehl für eine Konfiguration mit benötigtem Client-Zertifikat unter Verwendung aller (PSK, RSA, ECDH, DH) Schlüsselaustausch-Algorithmen:

root@kitploit:~
> LD_LIBRARY_PATH=suts/openssl-1.1.1b/ java -jar target/dtls-fuzzer.jar @args/openssl-1.1.1b/learn_openssl-1.1.1b_all_cert_req_rwalk_incl -queries 5000

Hinweis: Beim Lernen von OpenSSL muss die Variable LD_LIBRARY_PATH auf das Installationsverzeichnis gesetzt werden.

MbedTLS 2.16.1

Jede mbedtls-2.16.1-Konfiguration kann aus denselben Gründen wie bei OpenSSL verwendet werden. Experimente dauern länger, da das SUT langsamer ist. Befehl für eine Konfiguration mit deaktivierter Client-Zertifikatsauthentifizierung unter Verwendung aller Schlüsselaustausch-Algorithmen:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/mbedtls-2.16.1/learn_mbedtls_all_cert_none_rwalk_incl -queries 5000

Contiki-NG TinyDTLS mit PSK

Eine redigierte Version des für diese Konfiguration erhaltenen Modells ist im Anhang enthalten. Wir können eine niedrige Testgrenze von 2000 verwenden, da das Eingabealphabet klein ist, was das Testen erleichtert.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/ctinydtls/learn_ctinydtls_psk_rwalk -queries 2000

WolfSSL 4.0.0 mit PSK

Für WolfSSL stellen wir eine PSK-Konfiguration bereit, bei der das Lernen relativ schnell abgeschlossen sein sollte.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/wolfssl-4.0.0/learn_wolfssl-4.0.0_psk_rwalk -queries 2000

GnuTLS 3.6.7 mit deaktivierter Client-Authentifizierung

Die neueren von uns analysierten GnuTLS-Versionen lieferten schöne kompakte Modelle. Leider führte die Aktivierung der Client-Authentifizierung zu einem starken Anstieg der erforderlichen Tests. Wir schlagen eine Konfiguration vor, die sie deaktiviert, um die Lernzeit zu verkürzen:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/gnutls-3.6.7/learn_gnutls-3.6.7_all_cert_none_rwalk_incl -queries 2000

Scandium PSK (vor Fehlerbehebungen)

Eine redigierte Version des für diese Konfiguration erhaltenen Modells ist im Paper enthalten. Das Modell deckt wichtige Fehler auf, leider ist das Experiment zeitaufwändig. Das Experiment sollte nicht parallel zu Experimenten durchgeführt werden, die nicht Scandium oder JSSE betreffen. Befehl:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/scandium-2.0.0/learn_scandium-2.0.0_psk_rwalk -queries 2000

JSSE 12.0.2 mit erforderlicher Authentifizierung

Eine redigierte Version des für diese Konfiguration erhaltenen Modells ist im Paper enthalten. Das Modell deckt wichtige Fehler auf. Das Experiment sollte nicht parallel zu Experimenten durchgeführt werden, die nicht Scandium oder JSSE betreffen. Beachten Sie, dass das Lernen für JSSE nicht abschließt/konvergiert, sondern Hypothesen mit immer mehr Zuständen erstellt werden. Wir haben daher JSSE-Experimente so konfiguriert, dass sie automatisch nach einem Tag (im Paper zwei Tage) beendet werden. Befehl für RSA-Schlüsselaustausch:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl 

Statt des mühsamen Lernens möchten wir möglicherweise einfach testen, ob in dieser Umgebung ein Handshake abgeschlossen werden kann, ohne Zertifikatsnachrichten zu senden. Dies kann durch Ausführen von:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @args/jsse-12/learn_jsse-12_rsa_cert_req_rwalk_incl -test examples/tests/rsa

Analyse der Ergebnisse

Sobald das Lernen abgeschlossen ist, sind im Ausgabeverzeichnis folgende Dinge zu analysieren:

  • 'statistics.txt', Experimentstatistiken wie die Gesamtzahl der Tests, Lernzeit;
  • 'nondet.log', Protokolle von aufgetretenem nichtdeterministischem Verhalten; wenn alles gut gelaufen ist, sollte dies leer sein;
  • 'learnedModel.dot', das gelernte Modell (oder die endgültige Hypothese), das bei erfolgreicher Beendigung erstellt wurde;
  • 'hyp[0-9]+.dot', Zwischenhypothesen;
  • 'error.msg', falls etwas Schlimmes passiert ist, das den Lernvorgang gestoppt hat. Wird auch erstellt, wenn das Lern-Experiment zeitlich ausläuft.

Visualisieren des Modells

Das gelernte Modell im .dot-Format kann mit der graphviz-Bibliothek durch Konvertierung in .pdf visualisiert werden:

root@kitploit:~
> dot -Tpdf learnedModel.dot  > learnedModel.pdf

Leider werden die mit dieser Methode erstellten .pdfs mit zunehmender Modellgröße immer schwieriger zu lesen. Daher haben wir Bereinigungsskripte entwickelt/verwendet/importiert, die über 'trim_model.sh' aufgerufen werden. Das Skript gibt Nutzungsinformationen durch Ausführen von:

root@kitploit:~
> bash trim_model.sh

Wir empfehlen die Verwendung des Skripts in seiner einfachsten Form:

root@kitploit:~
> bash trim_model.sh learnedModel.dot 

Das Skript:

  1. Verdichtet Zustands- und Eingabe-/Ausgabelabels
  2. Färbt Pfade, die zum Handshake-Abschluss führen
    • Der Benutzer sollte dann feststellen, ob die Handshakes angesichts der Konfiguration legal sind.
  3. Fasst Gruppen von 3 oder mehr Transitionen, die dieselben Zustände verbinden und dieselben Ausgaben, aber unterschiedliche Eingaben haben, unter der Eingabe 'Other' zusammen
  4. (optional) Entfernt Zustände, von denen aus ein Handshake nicht mehr abgeschlossen werden kann (besonders nützlich für JSSE)
  5. (optional) Positioniert Transitionen, die dieselben Zustände verbinden, auf einer einzelnen Kante

(5) erfordert die Installation der benutzerdefinierten Python 3-Bibliothek mypydot, die sich in 'experiments\scripts' befindet. Alle anderen Schritte verwenden einfaches 'sed' plus die dot-trimmer Java-Bibliothek. Ein .jar für diese Bibliothek ist in 'experiments\scripts' enthalten.

Allgemeiner dtls-fuzzer-Durchlauf

Hilfeseite anzeigen

Ausführen:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -help

Lernen von DTLS-Implementierungen

Die Anzahl der Optionen mag überwältigend sein. Um eine DTLS-Server-Implementierung zu lernen, muss man nur wenige Optionen angeben, nämlich: "-connect ip_address:port", die Adresse, auf der der laufende DTLS-Server horcht. Alle anderen Optionen sind auf Standardwerte gesetzt, einschließlich des Alphabets.

Einzelner Lernlauf

Um einen Lernlauf für eine existierende, sagen wir lokale Serverimplementierung zu starten, die auf Port 20000 horcht, führen Sie aus:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000

Es wird wahrscheinlich Probleme mit dieser Art des Lernens geben. Das Lernen erfordert, dass man den Server nach jedem Test zurücksetzen kann. Manche Server behalten einen Zustand von einem Test zum nächsten bei. Dies kann zu Nichtdeterminismus während des Lernens führen, daher ist ein besserer Ansatz, bei jedem Test einen neuen Server-Thread mit einem bereitgestellten Befehl zu starten. Der Server-Thread wird beendet, sobald der Test durchgeführt ist, was ein ordnungsgemäßes Zurücksetzen gewährleistet. Beispiel für OpenSSL:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -cmd "openssl s_server -accept 20000 -dtls1_2"

Bei so vielen Parametern können Befehle sehr lang werden. dtls-fuzzer verwendet JCommander zum Parsen von Argumenten, die auch Parameter aus einer Datei lesen kann. Gehen Sie zu 'experiments/args' für Beispiele von Argumenten. Um eine Argumentdatei an dtls-fuzzer zu übergeben, geben Sie sie als Parameter mit vorangestelltem "@" an. Sie können auch andere explizite Argumente zu Befehlen hinzufügen (die die in der Argumentdatei überschreiben):

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @arg_file ...überschreibende Parameter...

Batch-Lernen

Um eine Reihe von Lernläufen zu starten, kann das Skript 'launcher.py' in 'experiments/scripts' verwendet werden. Wenn ein Verzeichnis mit Argumentdateien bereitgestellt wird, startet das Tool für jede Argumentdatei einen Lernprozess.

root@kitploit:~
> python3 experiments/scripts/launcher.py --jar target/dtls-fuzzer.jar --args args_folder

Ausführen einer Testsuite

Bevor Sie Lern-Experimente starten, ist es hilfreich zu überprüfen, ob die Argumente richtig gesetzt sind, insbesondere die Timing-Parameter. Zu diesem Zweck kann dtls-fuzzer eine benutzerdefinierte Testsuite (Sammlung von Tests) auf dem SUT ausführen und eine Zusammenfassung der Ausgaben liefern. Diese Funktionalität kann auch verwendet werden, um fehlgeschlagene Lern-Experimente zu diagnostizieren, d.h. herauszufinden, was schiefgelaufen ist.

Um die Testsuite auf einem Server mit dem Standardalphabet auszuführen, können Sie Folgendes ausführen:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file

Beispiele für Testdateien finden Sie unter 'examples/tests'. Eine Testdatei besteht aus einer durch Zeilenumbrüche getrennten Liste von Eingaben. Tests werden durch leere Zeilen getrennt. Das Ende jedes Tests ist entweder das Ende der Datei oder eine leere Zeile. "#" wird verwendet, um eine Zeile auszukommentieren.

Wenn Sie ein Modell/eine Spezifikation haben, können Sie auch die Testsuite ausführen und die Ausgabe mit der in einer Spezifikation vergleichen.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -specification model

Die Anzahl der Testausführungen ist über den Parameter '-times' konfigurierbar, der standardmäßig auf 1 gesetzt ist. Ein hoher Wert hilft, Nichtdeterminismus in Lernkonfigurationen zu erkennen, indem die Ausgabe jedes Tests verglichen wird.

root@kitploit:~
> java -jar target/dtls-fuzzer.jar -connect localhost:20000 -test test_file -times 10

Wenn Sie schließlich die Argumentdatei für ein Lern-Experiment haben, können Sie diese verwenden, um Tests auf dem beteiligten SUT durchzuführen, indem Sie einfach die erforderlichen Test-Argumente hinzufügen:

root@kitploit:~
> java -jar target/dtls-fuzzer.jar @learning_arg_file -test test_file
Tool herunterladen