Dependências de software são componentes externos que um projeto utiliza para funcionar, como bibliotecas, frameworks e pacotes. Embora acelerem o desenvolvimento, também introduzem riscos de segurança, pois vulnerabilidades conhecidas podem ser exploradas. Gerenciar essas dependências de forma proativa é essencial para manter a integridade e a segurança do sistema.

Nesta aula, exploraremos quatro pilares fundamentais para a segurança de dependências: a criação e uso de um SBOM (Software Bill of Materials), ferramentas de automação de atualizações (Renovate e Dependabot) e técnicas de varredura de vulnerabilidades. Ao final, você será capaz de implementar um processo contínuo de monitoramento e correção de dependências.

SBOM

O SBOM (Software Bill of Materials) é uma lista detalhada de todos os componentes que compõem um software, incluindo bibliotecas, versões, licenças e relacionamentos. Ele funciona como uma “lista de ingredientes” do software, permitindo que equipes de segurança identifiquem rapidamente quais dependências estão em uso e se alguma delas possui vulnerabilidades conhecidas.

Criar um SBOM é o primeiro passo para gerenciar riscos de supply chain. Formatos comuns incluem SPDX e CycloneDX, que são padrões abertos e legíveis por máquina. Ferramentas como Syft (para gerar SBOMs a partir de containers) e Trivy (que também faz varredura) podem ser usadas. Um exemplo de SBOM em JSON (CycloneDX) seria:

{
  "bomFormat": "CycloneDX",
  "specVersion": "1.4",
  "components": [
    {
      "type": "library",
      "name": "lodash",
      "version": "4.17.21",
      "purl": "pkg:npm/lodash@4.17.21"
    }
  ]
}

Manter o SBOM atualizado é crucial: sempre que uma dependência é adicionada ou atualizada, o SBOM deve refletir a mudança. Isso facilita a resposta a incidentes como o Log4Shell, onde equipes puderam rapidamente identificar se estavam usando a versão vulnerável.

Renovate

Renovate é uma ferramenta de automação de atualização de dependências, mantida pela Mend (antiga WhiteSource). Ela analisa o repositório, detecta dependências desatualizadas e cria pull requests para atualizá-las automaticamente. Suporta múltiplas linguagens (npm, Maven, Docker, etc.) e pode ser configurada via arquivo renovate.json.

Uma das vantagens do Renovate é a flexibilidade: você pode agendar atualizações (por exemplo, semanalmente), agrupar dependências relacionadas e até mesmo definir regras de “pin” para versões específicas. Exemplo de configuração básica:

{
  "extends": ["config:base"],
  "schedule": ["every weekend"],
  "packageRules": [
    {
      "matchUpdateTypes": ["minor", "patch"],
      "automerge": true
    }
  ]
}

Com isso, o Renovate cria PRs apenas nos finais de semana e faz merge automático de atualizações menores. Ele também suporta “Dockerfile” e “GitHub Actions”, tornando-se uma ferramenta completa para manter dependências seguras.

Dependabot

Dependabot é uma ferramenta nativa do GitHub que também automatiza atualizações de dependências. Ele verifica o repositório periodicamente e abre pull requests para versões mais recentes, incluindo correções de segurança. É gratuito para repositórios públicos e privados (dentro dos limites do GitHub).

Configurar o Dependabot é simples: basta criar um arquivo .github/dependabot.yml no repositório. Exemplo:

version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    open-pull-requests-limit: 10
    labels:
      - "dependencies"
      - "security"

O Dependabot também possui um recurso de alertas de segurança: quando uma vulnerabilidade conhecida é identificada em uma dependência, ele notifica os mantenedores e pode criar automaticamente um PR com a correção. Isso reduz o tempo de exposição a riscos.

Vulnerability scanning

Varredura de vulnerabilidades (vulnerability scanning) é o processo de analisar dependências em busca de CVEs (Common Vulnerabilities and Exposures) conhecidas. Ferramentas como Trivy, Snyk, OWASP Dependency-Check e GitHub’s Dependabot alerts realizam essa tarefa, comparando as versões das dependências com bancos de dados de vulnerabilidades.

Integrar a varredura no pipeline de CI/CD é uma boa prática. Por exemplo, usando Trivy em um GitHub Action:

name: Scan dependencies
on: [push]
jobs:
  trivy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Run Trivy vulnerability scanner
        uses: aquasecurity/trivy-action@master
        with:
          scan-type: 'fs'
          scan-ref: '.'
          format: 'table'
          exit-code: '1'

Esse workflow falha se alguma vulnerabilidade for encontrada, impedindo que código inseguro seja mesclado. Além disso, é importante priorizar correções: vulnerabilidades críticas devem ser corrigidas em horas, enquanto as de baixo risco podem esperar o próximo ciclo de atualização.

Boas Práticas e Observações Finais

Nunca confie cegamente em dependências. Sempre verifique a reputação da biblioteca, mantenha um SBOM atualizado e automatize ao máximo as atualizações. Combine ferramentas: use Dependabot ou Renovate para PRs automáticos e uma ferramenta de varredura contínua (Trivy, Snyk) para monitorar vulnerabilidades. Lembre-se de que a segurança de dependências é um processo contínuo, não uma ação pontual.

Referências

Exercícios

  1. Explique o que é um SBOM e cite dois formatos padrão utilizados.

    ✓ Resposta: SBOM (Software Bill of Materials) é uma lista detalhada de todos os componentes de software de um sistema. Dois formatos padrão são SPDX e CycloneDX.
  2. Qual a diferença principal entre Renovate e Dependabot?

    ✓ Resposta: Renovate é uma ferramenta independente (mantida pela Mend) que suporta múltiplos ecossistemas e oferece mais opções de configuração. Dependabot é nativo do GitHub, mais simples de configurar e integrado diretamente com alertas de segurança do GitHub.
  3. Escreva um arquivo YAML de configuração do Dependabot para atualizar dependências npm semanalmente, limitando a 5 PRs abertos.

    ✓ Resposta:
    version: 2
    updates:
      - package-ecosystem: "npm"
        directory: "/"
        schedule:
          interval: "weekly"
        open-pull-requests-limit: 5
  4. O que faz uma ferramenta de varredura de vulnerabilidades como Trivy? Como ela pode ser integrada em um pipeline CI/CD?

    ✓ Resposta: Trivy analisa dependências e contêineres em busca de CVEs conhecidas. Pode ser integrada como uma etapa no CI/CD (ex.: GitHub Action) que falha se vulnerabilidades forem encontradas, impedindo o merge do código.
  5. Cite três boas práticas para gerenciar segurança de dependências em um projeto.

    ✓ Resposta: 1) Manter um SBOM atualizado. 2) Automatizar atualizações com Dependabot ou Renovate. 3) Integrar varredura de vulnerabilidades no pipeline CI/CD.