Três ferramentas, três trabalhos: o que o bundler-audit checa
O CI deste app, .github/workflows/ci.yml, roda dois jobs cujos nomes soam como "segurança". scan_ruby roda bin/brakeman --no-pager, e scan_js roda bin/importmap audit. São duas ferramentas com dois alvos diferentes. O Brakeman lê o código-fonte Ruby e ERB deste app, procurando padrões de vulnerabilidade que reconhece: uma string SQL crua montada a partir de input do usuário, uma chamada render alimentada com dado não sanitizado, mass assignment sem strong parameters. O bin/importmap audit lê os pacotes JavaScript fixados em config/importmap.rb e consulta o endpoint de advisories do registro npm sobre cada versão.
Nenhum dos dois responde a esta pergunta: a versão exata de rails, ou pg, ou de qualquer uma das outras 163 gems do Gemfile.lock deste app, tem alguma vulnerabilidade publicamente conhecida? O Brakeman abre o Gemfile.lock, mas só para saber a versão do Rails e de algumas gems. Ele usa essas versões num conjunto fixo de checagens escritas para CVEs específicos do Rails, além de avisos de fim de suporte. Ele não compara cada gem travada com um banco de advisories. Hoje nada no Gemfile, no Gemfile.lock ou no CI deste app faz isso.
A ferramenta feita para essa pergunta
O bundler-audit é uma gem Ruby mantida de forma independente (versão 0.9.3, licença GPL-3.0-or-later) com uma única função. Ela cruza cada gem e versão travada no Gemfile.lock com o ruby-advisory-db, um banco separado, mantido pela comunidade, de vulnerabilidades conhecidas em gems Ruby. gem install bundler-audit instala a ferramenta. Adotá-la não muda nenhum código deste app, porque ela só lê o Gemfile.lock.
Este app não tem nenhum sinal dela. Um grep no Gemfile e no Gemfile.lock por bundler-audit, bundle-audit e bundle_audit não retorna nada. Compare com o Brakeman, que este app adotou. Este é o bloco compartilhado group :development, :test do ... end do Gemfile, completo:
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem "debug", platforms: %i[ mri windows ], require: "debug/prelude"
# Static analysis for security vulnerabilities [https://brakemanscanner.org/]
gem "brakeman", require: false
# Omakase Ruby styling [https://github.com/rails/rubocop-rails-omakase/]
gem "rubocop-rails-omakase", require: false
# Testing framework
gem "rspec-rails"
gem "factory_bot_rails"
gem "shoulda-matchers"
end
O Brakeman está ali com require: false, como as outras ferramentas só de CI ao redor, e o scan_ruby o roda. O bundler-audit não tem uma linha equivalente. Este curso não acrescenta essa linha. Ele ensina a ferramenta do jeito que um time a adotaria e aponta a peça que falta em cada etapa.
O que este curso cobre
Sete aulas, conferidas com o código instalado do bundler-audit 0.9.3 e com o Gemfile e a configuração de CI deste app. A aula 2 trata dos comandos da CLI e do que eles exigem. A aula 3 lê o que um único registro de vulnerabilidade (um Advisory) guarda. A aula 4 percorre o formato do relatório, campo por campo. A aula 5 esboça um job de CI que acrescentaria a checagem ao pipeline deste app. A aula 6 mostra como bundler-audit, Brakeman e bin/importmap audit dividem o trabalho. A aula 7 junta os números de novo, com um desafio montado a partir da lógica de classificação do bundler-audit.
Continue com a aula 2
A CLI do bundle-audit: comandos, flags e o ferramental deste app
Apresenta os comandos e flags do bundle-audit, a origem dos dados de advisories e os requisitos do ferramental.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.