
Erstelle nützliche, leichtgewichtige statische Analysen mit Open-Source-Tools + ein winziges bisschen deines Codes.
Dieses Repo enthält den PoC-Code für einen Vortrag auf der ShellCon 2019, „Rolling Your Own: How to Write Custom, Lightweight Static Analysis Tools“ (Folien).
Kurz gesagt zeigt dieses Repo ein paar konkrete Beispiele, wie du interessante statische Analysen mit Open-Source-Tools und einer kleinen Menge benutzerdefinierten Codes erstellen kannst.
Codebeispiele in diesem Repo:
before_actions, die sie verwendet.So funktionieren die Beispiele
Auf hoher Ebene funktioniert die Implementierung der Beispiele wie folgt:
Dieses Projekt ist dafür ausgelegt, mit Docker ausgeführt zu werden.
Dazu musst du zunächst ein paar Dinge einrichten.
Da unser Dockerfile auf dem
semantic-Docker-Image basiert, das in der
GitHub-Paketregistrierung gehostet wird, musst du Docker für die Verwendung mit GitHub
Package
Registry konfigurieren.
$ docker login docker.pkg.github.com -u USERNAME -p TOKENdocker build -t lightweight_static_analysis .bash-Shell im Docker-Container und führe dann unsere Skripte aus.# Run this
# (Make sure to run this from a terminal in this repo's project root)
$ docker run -it --rm --entrypoint /bin/bash -v $PWD:/lightweight_static_analysis lightweight_static_analysis
# cd into this project's source code within the
# running container
$ cd /lightweight_static_analysis
# Run main.py with different config options, described further below
Sobald du eine bash-Shell im Docker-Container hast (siehe oben für den docker run-Befehl), kannst du main.py in einem von mehreren möglichen Modi ausführen.
/lightweight_static_analysis> $ python3 src/main.py <options>
Du kannst alle verfügbaren Optionen sehen, indem du src/main.py ohne
Optionen ausführst oder den Abschnitt parser.add_argument von main.py ansiehst.
Hier sind ein paar Befehle, die dir helfen, interaktiv eine Rails-Codebasis zu erkunden.
Zuerst solltest du ein oder mehrere Rails-Repos klonen und sie in examples/ ablegen. Wenn du Beispiel-Repos benötigst, kannst du den Quellcode von rubygems.org verwenden oder eines der Repos, die auf Open Source Rails aufgeführt sind.
# Print out the class, super class, defined methods, and before actions
# for all controllers
$ python3 src/main.py --rails-summarize-controllers examples/<repo_name>
# Print out every controller name, grouped by super class
#
# This can find examples where security protections defined in a parent class
# (e.g. ApplicationController or Api::BaseController) aren't applied because
# the vulnerable controller didn't subclass the appropriate class.
$ python3 src/main.py --rails-controllers-by-superclass examples/<repo_name>
# For every before_action used by any controller, list the controllers that
# use that before_action and the routes that it is and isn't applied to
# (e.g. handle the 'except' and 'only" keywords)
#
# This can:
# * Give you quick insight the various before_actions the application defines,
# yielding some intuition as to the code's flow and organization.
# * `verify_with_otp` - Hm, that sounds interesting, I probably want to
# review how that filter is implemented.
# * Show you where a given before_action is and isn't applied across an entire
# code base, potentially leading to bugs where it is inconsistently used
#
# For example
# * Is there a before_action that's used to protect all state0-changing API
# routes except for 1 model? That's strange.
# * Is there an authentication or authorization before_action applied to every
# action in a controller except one? Why?
$ python3 src/main.py --rails-controllers-by-before_action examples/<repo_name>
Wenn du nach Abschluss des Parsings in eine ipdb-REPL wechseln möchtest,
um den geparsten Ruby-Code interaktiv zu untersuchen, kannst du dies tun, indem
du den obigen Befehlen das Flag --repl hinzufügst.
Diese Beispiele verwenden die verschiedenen AstNode-Klassen aus ast_node.py,
und der gesamte Rails-spezifische Code befindet sich in ruby.py.
exec()sDiese Implementierung wurde noch nicht bereinigt und dokumentiert, aber siehe batch_parse_json() in main.py und visit() sowie die anderen Methoden, die sie in visitor.py aufruft.
Wir freuen uns, ausführlicher über diese Arbeit zu sprechen. Erstelle gerne ein Issue oder kontaktiere uns auf Twitter: @clintgibler, @defreez.
Wenn du über dieses und andere Projekte, an denen wir arbeiten, auf dem Laufenden bleiben möchtest, schau dir unseren tl;dr sec Newsletter an, in dem wir detaillierte Zusammenfassungen der wichtigsten Security-Vorträge und Links zu den besten Security-Tools und -Ressourcen senden.
Es ist ein Newsletter mit geringem Umfang, aber hoher Informationsdichte, der dich über die neuesten Entwicklungen in der Sicherheit auf dem Laufenden halten soll, damit du deine Arbeit effizienter und effektiver erledigen kannst und nützliche Kleinigkeiten für deinen Infosec-Wasserkühler hast.