DOMTRESAT (DTS) ist ein statisches Analysesystem, das den Quellcode als Eingabe nimmt und automatisch Pfaderfragenberichte für Pfade erstellt, die aus einer erstellten Dominator -Baumstruktur gesammelt wurden. Es erhält eine maximale Codeabdeckung mit minimaler menschlicher Intervention. Domtresat erstellt einen Dominatorbaum von benutzergesteuerten Variablen und gibt dann Einschränkungen und Operationen aus, die ihren Werten für einen Erfrischungslöser versetzt werden. Dies schafft potenzielle Punkte von Interesse am Programm für die Entdeckung von Schwachstellen.
Die Hauptverwendung dieses Tools besteht darin, die Erreichbarkeit der kontrollierbaren Eingaben in ein Ziel im Programm sowie die erforderlichen Eingaben zu bestimmen, um dorthin zu gelangen. Das Ziel wird automatisch als der am meisten dominierte Pfad des Baumes eingestellt. Dies hilft einem Auditor, einen Pfad zu schutzbedürftigem Code durch eine Reihe von Schecks wie das folgende Diagramm zu identifizieren. In solchen Programmen ist es der am meisten dominierte Weg, für den wir die Verwendungskette einbinden und analysieren möchten.
INPUT
CHECK
/ |
FAIL CHECK
/ |
FAIL CHECK
/ |
FAIL VULNERABILITY
In diesem Tool werden zuerst die am meisten dominierten Pfade analysiert. Diese Pfade können als solche mit Variablen beschrieben werden, die am meisten reagiert werden. Dies kann basierend auf den Bedürfnissen geändert werden, und es ist ein schnelles Neukompilationsskript vorhanden, um veränderte Bibliotheken zu generieren.
Verwendungsketten (Use-Def) sind eine Datenstruktur, die aus einer Verwendung einer Variablen besteht, und alle Definitionen dieser Variablen, die ohne andere intervenierende Definitionen verwendet werden können.
Dieses Tool beruht darauf, diese Datenstrukturen aus dem am meisten dominierten Pfad zu ziehen, der durch den erstellten Dominatorbaum gefunden wird. Die grundlegende Idee ist, dass wir bei einer gezielten Verwendung, dh der Verwendung einer Variablen, um entweder an Schwachstellen zu gelangen oder eine Anfälligkeit zu verursachen, diese Variable durch alle ihre (Re-) Definitionen nachverfolgen und a) a), wenn sie benutzerregelbar ist, und b) welche Vorgänge bei dieser Eingabe durchgeführt werden, bevor sie in der Schwachbarkeit verwendet werden (diese werden zu unseren Einschränkungen werden).
Domtresat wurde auf LLVM 3.7.1 getestet.
brew install z3$./quick_setup.sh um Tests zu erstellen und auszuführen$./partial_build.sh um nach Änderung der Analysemethoden einen inkrementellen Umbau durchzuführen In diesem Abschnitt wird beschrieben, wie man Tests ausführt und dem SAT -Solver füttert.
Tests zur Verfolgung der Definitionen von Variablen (deren Anwendungs-Def-Ketten) über den am meisten dominierten Pfad
$./test_base_case.sh
Um diesen Test mit Z3 auszuführen, um Eingaben zu generieren, um den Zielpfad zu erfüllen:
$./complete_test_base_case.sh
Tests für die Verfolgung der Definitionen von Variablen (deren Anwendungs-Def-Ketten) über den am häufigsten dominierten Pfad, wobei die Nutzungs-Def-Kette jetzt Neudefinitionen enthält, nachdem Additionsvorgänge auf die Variable angewendet wurden.
$./test_addition.sh
Pass und Z3 zum Erstellen von Eingaben zur Befriedigung des Zielpfads:
$./complete_test_addition.sh
Tests für die Verfolgung der Definitionen von Variablen (ihre Verwendungs-Def-Ketten) über den am häufigsten dominierten Pfad, wobei die Verwendungskette nun Neudefinitionen enthält, nachdem die Subtraktionsvorgänge auf die Variable angewendet wurden.
$./test_subtraction.sh
Pass und Z3 zum Erstellen von Eingaben zur Befriedigung des Zielpfads:
$./complete_test_subtraction.sh
Tests zur Verfolgung der Definitionen von Variablen (deren Anwendungs-Def-Ketten) über den am häufigsten dominierten Pfad, wobei die Nutzungs-Def-Kette jetzt Neudefinitionen enthält, nachdem XOR-Operationen auf die Variable angewendet wurden.
$./test_xor.sh
Pass und Z3 zum Erstellen von Eingaben zur Befriedigung des Zielpfads:
$./complete_test_xor.sh
$./complete_test_base_case.sh
...Starting LLVM to Z3 Solver...
[+] Starting Base Case Test
[ CLANG COMPILING TEST APP SOURCES ]
[ RUNNING DOMINATOR TREE PASS ]
<-- Starting analysis from main() -->
[+] Tracing first path of DominatorTree
[ COMPARE FOUND ]
Comparison Operator: IS EQUAL (==)
[+] VALUE TWO:
==> Found Constant Operand: Integer :: 69
[+] VALUE ONE:
Reovering variable operations and starting value....
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
.... Potential find. Store took value from :: argv
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[ COMPARE FOUND ]
Comparison Operator: IS EQUAL (==)
[+] VALUE TWO:
==> Found Constant Operand: Integer :: 68
[+] VALUE ONE:
Reovering variable operations and starting value....
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
.... Potential find. Store took value from :: argv
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[ COMPARE FOUND ]
Comparison Operator: IS EQUAL (==)
[+] VALUE TWO:
==> Found Constant Operand: Integer :: 67
[+] VALUE ONE:
Reovering variable operations and starting value....
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
.... Potential find. Store took value from :: argv
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[ COMPARE FOUND ]
Comparison Operator: IS EQUAL (==)
[+] VALUE TWO:
==> Found Constant Operand: Integer :: 66
[+] VALUE ONE:
Reovering variable operations and starting value....
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[!] FOUND TERMINATING ALLOCATION
[-] RECURSING THROUGH OPERATION
[ TRACING BACK HISTORY OF OPERAND VALUE ]
[+] Found StoreInst to trace
.... Potential find. Store took value from :: argv
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
[-] RECURSING THROUGH OPERATION
Breaking at end of first path with # of children
[ CHECK ]: 0 == 0
<-- Successfully Traversed Dominator Tree -->
[+] The below arguments are operated upon, then this redefinition must finally be equal to the comparisons shown below.
argv[0];== 69
argv[1];== 68
argv[2];== 67
argv[3];== 66
[ FINISHED ]
[ LLVM Ported to Z3 ]
['argv[0]', '== 69']
[ BUILDING EQUATION ]
x == 69
[+] Added all conditions to z3
[+] Checking Satisfiability
sat
argv[0]: 69
['argv[1]', '== 68']
[ BUILDING EQUATION ]
x == 68
[+] Added all conditions to z3
[+] Checking Satisfiability
sat
argv[1]: 68
['argv[2]', '== 67']
[ BUILDING EQUATION ]
x == 67
[+] Added all conditions to z3
[+] Checking Satisfiability
sat
argv[2]: 67
['argv[3]', '== 66']
[ BUILDING EQUATION ]
x == 66
[+] Added all conditions to z3
[+] Checking Satisfiability
sat
argv[3]: 66
[ KEY FOUND ]
EDCB
...Solver Finished...