
Crea utili e leggere analisi statiche utilizzando strumenti open source + un pizzico del tuo codice
Questa repo contiene il codice PoC per un talk di ShellCon 2019, "Rolling Your Own: How to Write Custom, Lightweight Static Analysis Tools" (slides).
In sintesi, questa repo dimostra alcuni esempi concreti di come puoi costruire interessanti analisi statiche usando strumenti open source e una piccola quantità di codice personalizzato.
Esempi di codice in questa repo:
before_action che utilizza.Come funzionano gli esempi
A livello generale, l'implementazione degli esempi funziona come segue:
Questo progetto è pensato per essere eseguito usando Docker.
Per farlo, dovrai prima configurare alcune cose.
Poiché il nostro Dockerfile si basa sull'immagine Docker di
semantic, ospitata nel registro pacchetti di
GitHub, dovrai configurare Docker per l'uso con GitHub Package
Registry.
$ docker login docker.pkg.github.com -u USERNAME -p TOKENdocker build -t lightweight_static_analysis .bash all'interno del container Docker e poi esegui i nostri script.# 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
Dopo aver ottenuto una shell bash nel container Docker (vedi sopra per il comando
docker run), puoi eseguire main.py con una delle varie modalità disponibili.
/lightweight_static_analysis> $ python3 src/main.py <options>
Puoi vedere tutte le opzioni disponibili eseguendo src/main.py senza
opzioni oppure visionando la sezione parser.add_argument di main.py.
Ecco alcuni comandi che possono aiutarti a esplorare in modo interattivo una codebase Rails.
Prima di tutto, clona una o più repo Rails e mettile in examples/. Se ti servono repo di esempio, puoi usare il codice sorgente per rubygems.org, oppure una delle repo elencate su 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>
Se vuoi entrare in una REPL ipdb dopo che
l'analisi è stata completata per esaminare in modo interattivo il codice Ruby
analizzato, puoi farlo passando anche il flag --repl ai comandi precedenti.
Questi esempi si basano sulle varie classi AstNode definite in ast_node.py,
e tutto il codice specifico per Rails è in ruby.py.
exec() della shell JSQuesta implementazione non è stata ancora ripulita e documentata, ma vedi batch_parse_json() in main.py e visit() e gli altri metodi che chiama in visitor.py.
Siamo felici di parlare di questo lavoro in maggior dettaglio, sentiti libero di aprire una issue o contattarci su Twitter: @clintgibler, @defreez.
Se vuoi tenerti aggiornato su questo e altri progetti a cui lavoriamo, dai un'occhiata alla nostra tl;dr sec newsletter, dove inviamo riassunti dettagliati dei migliori talk sulla sicurezza e link ai migliori strumenti e risorse di sicurezza.
È una newsletter a basso volume e alto segnale, pensata per tenerti aggiornato sulle ultime novità in ambito security, così da svolgere il tuo lavoro in modo più efficiente ed efficace e avere spunti utili da condividere con i colleghi dell'infosec.