
Créez des analyses statiques utiles et légères à l'aide d'outils open source + un peu de votre code
Ce dépôt contient le code de preuve de concept (PoC) d'une présentation à ShellCon 2019, « Rolling Your Own: How to Write Custom, Lightweight Static Analysis Tools » (diapositives).
En résumé, ce dépôt démontre quelques exemples concrets de la manière dont vous pouvez construire des analyses statiques intéressantes à l'aide d'outils open source et d'une petite quantité de code personnalisé.
Exemples de code dans ce dépôt :
before_actions qu'elle utilise.Comment fonctionnent les exemples
À un niveau élevé, l'implémentation des exemples fonctionne comme suit :
Ce projet est conçu pour être exécuté avec Docker.
Pour ce faire, vous devrez d'abord configurer quelques éléments.
Étant donné que notre Dockerfile est basé sur l'image Docker semantic, qui est hébergée sur le registre de paquets de GitHub, vous devrez configurer Docker pour utiliser GitHub Package Registry.
$ docker login docker.pkg.github.com -u USERNAME -p TOKENdocker build -t lightweight_static_analysis .bash dans le conteneur Docker, puis exécutez nos scripts.# 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
Une fois que vous disposez d'un shell bash dans le conteneur Docker (voir plus haut pour la commande docker run), vous pouvez exécuter main.py avec l'un des plusieurs modes possibles.
/lightweight_static_analysis> $ python3 src/main.py <options>
Vous pouvez voir toutes les options disponibles en exécutant src/main.py sans options ou en consultant la section parser.add_argument de main.py.
Voici quelques commandes qui peuvent vous aider à explorer de manière interactive une base de code Rails.
Tout d'abord, clonez un ou plusieurs dépôts Rails et placez-les dans examples/. Si vous avez besoin de dépôts d'exemple, vous pouvez utiliser le code source de rubygems.org, ou l'un des dépôts listés sur Open Source Rails.
# 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>
Si vous souhaitez basculer dans un REPL ipdb une fois l'analyse terminée, afin d'examiner interactivement le code Ruby analysé, vous pouvez le faire en passant également l'option --repl aux commandes ci-dessus.
Ces exemples reposent sur les différentes classes AstNode définies dans ast_node.py, et tout le code spécifique à Rails se trouve dans ruby.py.
exec() du shell JSCette implémentation n'a pas encore été nettoyée ni documentée, mais voir batch_parse_json() dans main.py et visit() ainsi que les autres méthodes qu'elle appelle dans visitor.py.
Nous serons ravis d'échanger plus en détail sur ce travail ; n'hésitez pas à ouvrir une issue ou à nous contacter sur Twitter : @clintgibler, @defreez.
Si vous souhaitez suivre ce projet ainsi que les autres projets sur lesquels nous travaillons, consultez notre newsletter tl;dr sec, où nous envoyons des résumés détaillés des principales conférences de sécurité et des liens vers les meilleurs outils et ressources de sécurité.
C'est une newsletter à faible volume mais à forte valeur ajoutée, destinée à vous tenir au courant des dernières nouveautés en matière de sécurité afin que vous puissiez faire votre travail de manière plus efficace et efficiente, et avoir des anecdotes utiles à partager à la fontaine à eau de l'infosec.