
Crea análisis estáticos útiles y ligeros utilizando herramientas de código abierto + un poquito de tu propio código
Este repositorio contiene el código del PoC de una charla de ShellCon 2019, «Crea el tuyo propio: Cómo escribir herramientas de análisis estático personalizadas y ligeras» (diapositivas).
En pocas palabras, este repositorio demuestra algunos ejemplos concretos de cómo puedes crear análisis estáticos interesantes utilizando herramientas de código abierto y una pequeña cantidad de código personalizado.
Ejemplos de código en este repositorio:
before_action que utiliza.Cómo funcionan los ejemplos
A grandes rasgos, la implementación de los ejemplos funciona de la siguiente manera:
Este proyecto está diseñado para ejecutarse con Docker.
Para ello, primero necesitarás configurar algunas cosas.
Dado que nuestro Dockerfile se basa en la imagen Docker de semantic, que está alojada en el registro de paquetes de GitHub, tendrás que configurar Docker para usarlo con GitHub Package Registry.
$ docker login docker.pkg.github.com -u USERNAME -p TOKENdocker build -t lightweight_static_analysis .bash dentro del contenedor Docker y luego ejecuta nuestros 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
Una vez que tengas una shell bash en el contenedor Docker (consulta arriba el comando docker run), puedes ejecutar main.py con uno de varios modos posibles.
/lightweight_static_analysis> $ python3 src/main.py <options>
Puedes ver todas las opciones disponibles ejecutando src/main.py sin opciones o consultando la sección parser.add_argument de main.py.
A continuación se muestran algunos comandos que pueden ayudarte a explorar de forma interactiva una base de código Rails.
Primero, clona uno o más repositorios Rails y colócalos en examples/. Si necesitas algunos repositorios de ejemplo, puedes usar el código fuente de rubygems.org, o uno de los repositorios listados en 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 quieres entrar a un REPL de ipdb después de que el análisis haya terminado para poder examinar interactivamente el código Ruby analizado, puedes hacerlo pasando también la opción --repl a los comandos anteriores.
Estos ejemplos se basan en las distintas clases AstNode definidas en ast_node.py, y todo el código específico de Rails está en ruby.py.
exec() de la shell de JSEsta implementación aún no se ha limpiado ni documentado, pero consulta batch_parse_json() en main.py y visit() y los demás métodos que llama en visitor.py.
Estamos encantados de hablar sobre este trabajo con más detalle, no dudes en abrir un issue o contactarnos en Twitter: @clintgibler, @defreez.
Si quieres mantenerte al día con este y otros proyectos en los que trabajamos, echa un vistazo a nuestro boletín de seguridad tl;dr, donde enviamos resúmenes detallados de las mejores charlas de seguridad y enlaces a las mejores herramientas y recursos de seguridad.
Es un boletín de bajo volumen y alto valor, pensado para mantenerte al día con lo último y lo mejor en seguridad, de modo que puedas hacer tu trabajo de manera más eficiente y eficaz y tengas datos útiles que compartir en la máquina de agua de la infosec.