Archie ist ein QEMU-basierter Rahmen für die architekturunabhängige Bewertung von Fehlern. Damit kann der Benutzer Fehlerkampagnen mithilfe einer JSON -Konfigurationsdatei definieren und die gesamte Kampagne automatisch ohne zusätzliche Benutzereingaben ausführen. Archie kann dauerhafte und vorübergehende Fehler in Anweisungen, Speicher und Registern simulieren. Verhaltensdaten des Ziels werden zur späteren Analyse in einer HDF5 -Protokolldatei gesammelt und gespeichert.
Um dieses Python -Programm zu verwenden, wird QEMU mit dem Fehler -Plugin benötigt (QEMU kann in QEMU gefunden werden. Das Fehler -Plugin befindet sich im Fehler mit dem Fehlerplugin).
Ein Beispielprojekt, das Fehler in eine eingebettete Tinyaes-Firmware injiziert, findet sich nicht https://github.com/tibersam/archie-aes-example
[[ TOC ]]
Für den Toolchain QEMU und das Fehler -Plugin müssen zusammengestellt werden. Dies kann automatisch durchgeführt werden, indem das Skript Build.sh -Skript ausgeführt wird. Bitte stellen Sie sicher, dass die erforderlichen Bibliotheken für QEMU und die Python -Bibliotheken für Archie installiert sind. Für Ubuntu kann das Build -Skript die fehlenden Abhängigkeiten für Qemu und Python installieren. Sie werden gefragt, ob es die Abhängigkeiten installieren soll.
./build.sh
Alternativ werden die Build -Anweisungen in den folgenden Abschnitten bereitgestellt.
Archie wurde mit QEMU 6.0 getestet, das in Archie-Qemu erhältlich ist. Stellen Sie zunächst sicher, dass die grundlegenden Anforderungen für QEMU installiert sind. Siehe das Wiki für erforderliche Bibliotheken (https://wiki.qemu.org/hosts/linux). Auf Ubuntu -Systemen können Sie die minimalen erforderlichen Pakete installieren mit:
sudo apt install git build-essential ninja-build libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
Checkout Git Submodule QEMU, das TCG_PLUGIN_DEV des Git überprüft. Siehe Codesegment unten.
git submodule update --init
mkdir -p qemu/build/debug
cd qemu/build/debug
./../../configure --target-list=arm-softmmu --enable-debug --enable-plugins --disable-sdl --disable-gtk --disable-curses --disable-vnc
make -j {CPUCORENUMBER}
cd ../../../faultplugin/
make
Damit wird Archie-Qemu in QEMU/ Build/ Debug/ und das Plugin in faustplugin/ Wenn Sie das Build-Verzeichnis für Archie-Qemu ändern, ändern Sie den Pfad im Makefile im Fehlerplugin/ Ordner zum Erstellen des Plugins.
Für das Python3 -Programm werden die folgenden Bibliotheken benötigt
pandas (tested 0.25.3)
tables (tested 3.6.1)
python-prctl (tested 1.6.1)
numpy (tested 1.17.4)
json (tested 2.0.9), or json5 (tested 0.9.6)
Diese Python3-Bibliotheken können entweder mit der Installationsmethode Ihrer Linux-Verteilung oder mithilfe von PIP3 installiert werden. JSON5 wird nachdrücklich empfohlen, da Ganzzahlen als Hexadezimalzahlen dargestellt werden können.
Für PIP3 kann die Anforderungen.txt verwendet werden. Wenn Sie PIP3 verwenden, sollten Sie libcap-dev installieren. Es ist für Python-PRCTL erforderlich. Siehe auch https://pythonhosted.org/python-prctl/#downloading-and-in-in-in-installing
Um das Python3 -Programm (Controller.py) zu verwenden, sind zwei Konfigurationsdateien erforderlich. Diese Dateien sind im JSON -Format. Weitere Informationen finden Sie unter https://www.json.org/json-en.html.
Qemuconf.json enthält ein Objekt mit dem Pfad zur ausführbaren Datei QEMU, der Plugin -Bibliothek, des BIOS und des Kernels, das von QEMU ausgeführt werden sollte. Zusätzliche Argumente, die an QEMU übergeben werden sollten, können mit additional_qemu_args angegeben werden. Eine gültige JSON -Datei mit Pfaden finden Sie "Qemuconf.json". Bitte passen Sie die Pfade an Ihr jeweiliges System an. Der Ordner Miniblink enthält ein Demo -Binär für das erste Experimentieren. Um es zu testen, ändern Sie den Kernel -Pfad zu "kernel" : "miniblink/miniblink.bin . Wenn eine andere Architektur verwendet werden sollte, ändern Sie die Zeile "machine" : "stm32f0discovery" , indem Sie STM32F0Discovery durch den zugeordneten Namen in Qemu ersetzen -M ?
Fehler.json enthält die Beschreibung der Fehler. Es enthält ein Objekt, das das Startpunktobjekt, das Endpunktobjekt, das Memdump -Objekt und ein Array von Fehlern enthält. Bitte beachten Sie die Beschreibungen in der Verwerfungs-Readme.md, um zu sehen, wie Sie dieses JSON-Objekt erstellen. Ein Beispiel -Setup für mehrere Experimente finden Sie in fault.json
Die Programmausgabe wird in einer HDF5 -Datei gespeichert. Eine Beschreibung, wie Sie den Dateiinhalt interpretieren, siehe HDF5-readme.md .
Um das Python3 -Programm auszuführen, type:
python3 controller.py --debug --fault fault.json --qemu qemuconf.json output.hdf5
Ersetzen Sie Fehler.json und Qemuconf.json durch die entsprechenden Dateien.
Das Flag -Debug erstellt für jedes Experiment eine Protokolldatei. Der Name der Protokolldatei hat das folgende Format: log_experiment-id.txt , z. B. log_4.txt für das Experiment mit ID 4.
Geben Sie ein, um weitere Informationen zu den Eingabeparametern zu erhalten:
python3 controller.py --help
Es ist möglich, eine Verbindung zu einer laufenden QEMU -Instanz mit GDB herzustellen. Um diese Funktion im Framework zu verwenden und eingeführte Fehler zu beobachten, kann das GDB -Flag eingestellt werden. Archie startet den internen QEMU -Prozess mit aktiviertem GDB und hält beim Start des simulierten Systems an. Um eine Verbindung zu QEMU von GDB zu verbinden, verwenden Sie Port 1234. Es zwingt auch das Framework, nur einen Arbeiter zu erzeugen, und tritt alle in Fehler.json konfigurierten Fehler durch. Wenn ein spezifischer Fehler erforderlich ist, muss die JSON -Datei bearbeitet werden, um diesen spezifischen Fehler nur zu enthalten.
python3 controller.py --gdb --fault fault.json --qemu qemuconf.json output.hdf5
Um eine Verbindung von GDB mit der Verwendung der QEMU -Sitzung herzustellen
targ rem:localhost:1234
QEMU wird auf die GDB -Sitzung warten. Der Debugging -Modus ist nur für die Analyse einer geringen Anzahl von Fehlern geeignet. Eine große Menge an Fehlern zu durchtreten ist mühsam. Dies sollte bei der Anpassung der JSON -Dateien berücksichtigt werden.