Wir schlagen ein Tool vor, um den JavaScript -Code statisch zu analysieren. Zu diesem Zweck erstellen wir den AST (abstrakten Syntaxbaum) einer Eingabe -JavaScript -Datei. Um die Bedingungen zu begründen, die für einen bestimmten Ausführungspfad eingehalten werden müssen, fügen wir anschließend Kontrollflusskanten zum AST hinzu. Wir bezeichnen das resultierende Diagramm als CFG (Kontrollflussdiagramm). Als nächstes fügen wir zur Vernunft über variable Abhängigkeiten Datenflusskanten zur CFG hinzu. Um die Variablenwerte zu berechnen, führen wir schließlich eine Zeigeranalyse durch. Wir bezeichnen das resultierende Diagramm als PDG (Programmabhängigkeitsgrafik).
Bitte beachten Sie, dass der Code in seinem aktuellen Zustand ein POC ist und keine vollwertige Produktions-fertige API.
Wir verwenden eine Definition des CFG, die sich leicht von Allen unterscheidet, wenn wir unseren AST mit Kontrollflusskanten verbessern. Auf diese Weise erstellen wir eine gemeinsame Struktur, die Steuerflussinformationen mit den feinkörnigen AST-Knoten und -kanten kombiniert. Unser PDG unterscheidet sich auch geringfügig von der Definition von Ferrante et al. Als wir uns entschieden haben, Datenflusskanten zu unserem CFG hinzuzufügen. Auf diese Weise behalten wir Informationen zur Anweisungsreihenfolge bei und haben eine feinkörnige Darstellung der Datenflüsse direkt auf variabler Ebene (während wir die CFG auf dem AST erstellen).
Weitere Details finden Sie in meiner Dissertation.
Dieser Code wurde verwendet, um die Browserverlängerungen statisch zu analysieren. Siehe Doublex Paper & Code.
Vorläufige Versionen dieses Codes wurden auch verwendet, um böswillige JavaScript -Beispiele zu erkennen: Hidenoseek Paper & Code und JStap Paper & Code.
Und um JavaScript -Code -Transformationstechniken zu untersuchen: Papier & Code.
install python3 # (tested with 3.7.3 and 3.7.4)
install nodejs
install npm
cd src
npm install esprima # (tested with 4.0.1)
npm install escodegen # (tested with 1.14.2 and 2.0.0)
So installieren Sie Graphviz (nur zum Zeichnen von Diagrammen, noch nicht dokumentiert, öffnen Sie bitte ein Problem bei Interesse).
pip3 install graphviz
On MacOS: install brew and then brew install graphviz
On Linux: sudo apt-get install graphviz
Starten Sie die folgenden Python3 -Befehle aus dem src -Ordnerort, um die PDG einer bestimmten *.js -Datei zu generieren:
>>> from build_pdg import get_data_flow
>>> pdg = get_data_flow('INPUT_FILE', benchmarks=dict())
Pro Standard wird die entsprechende PDG nicht gespeichert. Um es in einem vorhandenen PDG_Path -Ordner zu speichern, rufen Sie an:
$ python3 -c "from build_pdg import get_data_flow; get_data_flow('INPUT_FILE', benchmarks=dict(), store_pdgs='PDG_PATH')"
Beachten Sie, dass wir eine Zeitüberschreitung von 10 Minuten für die Datenfluss-/Zeigeranalyse (vgl. Zeile 149 von src/build_pdg.py ) und eine Speichergrenze von 20 GB (vgl. Zeile 115 von src/build_pdg.py ) hinzugefügt haben.
Betrachten wir ein Verzeichnis DIR mehrere JavaScript -Dateien enthält, die analysiert werden. Starten Sie den folgenden Shell -Befehl über den src -Ordner, um die PDGs (= ASTS, die mit Steuer- und Datenfluss sowie Zeigeranalyse) aller dieser Dateien erweitert wurde, vom SRC -Ordner zu:
$ python3 -c "from build_pdg import store_pdg_folder; store_pdg_folder('DIR')"
Die entsprechenden PDGs werden in DIR/PDG gespeichert.
Derzeit verwenden wir 1 CPU src/utility_df.py
Dieses Projekt ist gemäß den Bestimmungen der AGPL3 -Lizenz lizenziert, die Sie in LICENSE finden können.