Análise de vulnerabilidades com Trivy e Grype no pipeline de CI

1. Introdução à segurança em pipelines de CI

A segurança em pipelines de integração contínua (CI) deixou de ser opcional para se tornar um requisito fundamental em qualquer estratégia de desenvolvimento moderno. Com a crescente adoção de containers e dependências de código aberto, a superfície de ataque se expande a cada commit. A análise de vulnerabilidades em artefatos e dependências permite detectar falhas conhecidas antes que cheguem ao ambiente de produção, reduzindo o custo e o impacto de possíveis incidentes.

Trivy e Grype são duas ferramentas open source amplamente utilizadas para varredura de vulnerabilidades. O Trivy, mantido pela Aqua Security, destaca-se por sua velocidade e suporte a múltiplos formatos (imagens Docker, sistemas de arquivos, repositórios Git). Já o Grype, da Anchore, oferece integração profunda com SBOMs (Software Bill of Materials) e bases de dados atualizadas constantemente. Enquanto o Trivy prioriza performance e simplicidade, o Grype foca em precisão e rastreabilidade.

Um cenário típico envolve a execução dessas ferramentas em pipelines de CI para impedir que imagens ou artefatos com vulnerabilidades críticas avancem nos estágios de deploy. A detecção precoce evita retrabalho e reforça a postura de segurança da equipe.

2. Configuração do ambiente de CI para análise

Para iniciar, é necessário instalar o Trivy e o Grype no ambiente de CI. Ambos podem ser executados via containers Docker, scripts de instalação ou ações específicas de plataformas como GitHub Actions.

Instalação via script (Linux):

curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh

Variáveis de ambiente recomendadas:

export TRIVY_SEVERITY=CRITICAL,HIGH
export GRYPE_FAIL_ON_SEVERITY=critical
export GRYPE_CHECK_FOR_APP_UPDATE=false

A estrutura de diretórios típica inclui as imagens Docker a serem varridas, sistemas de arquivos com dependências (Node.js, Python, Java) e SBOMs gerados previamente. Exemplo:

./artifacts/
  docker-images/
    app.tar
  sboms/
    app-sbom.json
  dependencies/
    package-lock.json
    requirements.txt

3. Varredura de vulnerabilidades com Trivy

O Trivy oferece comandos intuitivos para diferentes alvos. Para varrer uma imagem Docker local:

trivy image --severity CRITICAL,HIGH --format json --output trivy-report.json nginx:1.25

Para sistemas de arquivos (diretório local com dependências):

trivy fs --severity CRITICAL --format sarif --output trivy-fs-report.sarif ./app/

Para repositórios Git remotos:

trivy repo --severity HIGH https://github.com/user/repo.git

A saída em JSON ou SARIF permite integração direta com ferramentas de CI como GitHub Advanced Security ou GitLab Security Dashboard. Para filtrar por CVE específico:

trivy image --severity CRITICAL --ignorefile .trivyignore nginx:1.25

O arquivo .trivyignore pode conter CVEs conhecidos como falsos positivos:

# Falsos positivos conhecidos
CVE-2024-0001
CVE-2024-0002

4. Varredura de vulnerabilidades com Grype

O Grype segue abordagem similar, mas com foco em SBOMs e dependências diretas. Para varrer uma imagem Docker:

grype nginx:1.25 --fail-on critical --output json > grype-report.json

Para varrer um diretório local:

grype dir:./app/ --fail-on high --output table

Uma das vantagens do Grype é a capacidade de trabalhar com SBOMs gerados por ferramentas como Syft ou o próprio Trivy. Exemplo:

# Gerar SBOM com Syft
syft nginx:1.25 -o json > nginx-sbom.json

# Varrer SBOM com Grype
grype sbom:./nginx-sbom.json --fail-on critical

Comparativamente, o Trivy tende a ser mais rápido em imagens grandes, enquanto o Grype oferece maior cobertura de bases de dados como a National Vulnerability Database (NVD) e a GitHub Advisory Database. Em testes práticos, o Grype frequentemente detecta CVEs que o Trivy não cobre, e vice-versa.

5. Integração no pipeline de CI (GitHub Actions, GitLab CI, Jenkins)

Exemplo no GitHub Actions:

name: Segurança CI

on: [push]

jobs:
  vulnerability-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Executar Trivy
        uses: aquasecurity/trivy-action@master
        with:
          image-ref: 'nginx:1.25'
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL,HIGH'

      - name: Executar Grype
        uses: anchore/grype-action@v2
        with:
          image: 'nginx:1.25'
          fail-build: true
          severity-cutoff: 'critical'

      - name: Upload relatório SARIF
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: 'trivy-results.sarif'

Para quebrar o pipeline com base em limites de severidade, utiliza-se a flag --fail-on no Grype ou --exit-code 1 no Trivy. Notificações podem ser enviadas via Slack ou e-mail usando ações complementares.

6. Estratégias de mitigação e correção

A simples detecção não é suficiente. É necessário implementar políticas automatizadas. Uma abordagem comum é criar uma allowlist de CVEs aceitos temporariamente e uma blocklist para vulnerabilidades críticas sem correção.

Exemplo de política em YAML:

policies:
  - severity: CRITICAL
    action: block
  - severity: HIGH
    action: warn
  - cve: CVE-2024-0001
    action: allow
    reason: "Falso positivo confirmado pela equipe de segurança"

A atualização de dependências deve ser automatizada com ferramentas como Dependabot ou Renovate. Após a correção, as imagens devem ser rebuildadas e varridas novamente. O uso de SBOMs permite rastrear vulnerabilidades mesmo após o deploy, facilitando auditorias contínuas.

7. Boas práticas e limitações

A frequência das varreduras depende do contexto. Para projetos críticos, recomenda-se varredura em cada commit. Para projetos menos sensíveis, varreduras diárias ou semanais podem ser suficientes.

Limitações comuns:
- Falsos positivos: CVEs que não afetam o código devido à configuração específica.
- Dependências não rastreáveis: Pacotes compilados ou binários sem metadados.
- Performance: Varreduras completas em imagens grandes podem levar minutos.

A combinação de Trivy e Grype oferece cobertura complementar. Use Trivy para varreduras rápidas de imagens e Grype para análise detalhada de SBOMs e dependências. Essa estratégia reduz a chance de vulnerabilidades passarem despercebidas.

8. Conclusão e próximos passos

Implementar análise de vulnerabilidades com Trivy e Grype no pipeline de CI é uma etapa essencial para fortalecer a segurança do ciclo de desenvolvimento. O checklist a seguir ajuda na implantação inicial:

  1. Instalar Trivy e Grype no ambiente de CI.
  2. Definir limites de severidade (CRITICAL e HIGH).
  3. Configurar varreduras para imagens Docker e dependências.
  4. Integrar relatórios SARIF com o repositório.
  5. Implementar políticas de allowlist/blocklist.
  6. Automatizar notificações para a equipe.

Tendências futuras incluem a integração com ferramentas de observabilidade (como Prometheus e Grafana) e plataformas de compliance (como OpenSCAP e OPA). A geração contínua de SBOMs e a correlação com CVEs em tempo real serão diferenciais competitivos.

Referências