
Crie análises estáticas úteis e leves usando ferramentas de código aberto + um pouquinho do seu código
Este repositório contém o código de PoC para uma palestra da ShellCon 2019, "Fazendo Você Mesmo: Como Escrever Ferramentas Personalizadas e Leves de Análise Estática" (slides).
Em resumo, este repositório demonstra alguns exemplos concretos de como você pode criar análises estáticas interessantes usando ferramentas de código aberto e uma pequena quantidade de código personalizado.
Exemplos de código neste repositório:
before_actions que ela usa.Como os exemplos funcionam
Em um nível alto, a implementação dos exemplos funciona da seguinte forma:
Este projeto foi feito para ser executado usando Docker.
Para isso, você precisará configurar algumas coisas primeiro.
Como nosso Dockerfile é baseado na imagem Docker do semantic, que está hospedada no registro de pacotes do GitHub, você precisará configurar o Docker para usar o Registro de Pacotes do GitHub.
$ docker login docker.pkg.github.com -u USERNAME -p TOKENdocker build -t lightweight_static_analysis .bash dentro do container Docker e então execute nossos 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
Depois de ter um shell bash no container Docker (veja acima o comando docker run), você pode executar main.py com um dos vários modos possíveis.
/lightweight_static_analysis> $ python3 src/main.py <options>
Você pode ver todas as opções disponíveis executando src/main.py sem opções ou visualizando a seção parser.add_argument do main.py.
Aqui estão alguns comandos que podem ajudar você a explorar interativamente uma base de código Rails.
Primeiro, você vai querer clonar um ou mais repositórios Rails e colocá-los em examples/. Se você precisar de alguns repositórios de exemplo, pode usar o código-fonte do rubygems.org, ou um dos repositórios listados no 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 você quiser entrar em um REPL ipdb depois que o parsing for concluído, para examinar interativamente o código Ruby analisado, você pode fazer isso passando também a flag --repl aos comandos acima.
Esses exemplos dependem das várias classes AstNode definidas em ast_node.py, e todo o código específico de Rails está em ruby.py.
exec()s do shell JSEsta implementação ainda não foi organizada e documentada, mas veja batch_parse_json() em main.py e visit() e os outros métodos que ela chama em visitor.py.
Ficamos felizes em conversar sobre este trabalho em mais detalhes; sinta-se à vontade para abrir uma issue ou entrar em contato no Twitter: @clintgibler, @defreez.
Se você quiser acompanhar este e outros projetos em que trabalhamos, confira nossa newsletter de segurança tl;dr, onde enviamos resumos detalhados das principais palestras de segurança e links para as melhores ferramentas e recursos de segurança.
É uma newsletter de baixo volume e alto sinal, voltada para mantê-lo atualizado com o que há de mais novo e melhor em segurança, para que você faça seu trabalho de forma mais eficiente e eficaz e tenha dicas úteis para compartilhar no "watercooler" da infosec.