Voltar ao blog
supply chainSBOMdependênciasSCACI/CDSLSAsegurança de software

Segurança na cadeia de suprimentos de software: dependências, SBOM e builds confiáveis

2026-07-20
Segurança na cadeia de suprimentos de software: dependências, SBOM e builds confiáveis

Nenhum software moderno é escrito do zero. Uma aplicação típica é montada sobre centenas, às vezes milhares, de dependências de terceiros: bibliotecas de código aberto, pacotes de gerenciadores como npm, PyPI e Maven, imagens de contêiner base e ferramentas de build. Essa reutilização é o motor da produtividade da engenharia moderna. Também é uma das maiores superfícies de ataque que existem.

Quando você instala um pacote, você confia não só no autor dele, mas em todos os autores de todas as dependências dele, de forma transitiva, muitas vezes sem saber que existem. Essa árvore de confiança implícita é o alvo dos ataques de cadeia de suprimentos de software. E, ao contrário de uma falha na sua própria aplicação, um comprometimento aqui pode atingir milhares de organizações de uma só vez, como os incidentes de grande escala dos últimos anos deixaram claro. Este guia mostra como reduzir esse risco de forma prática.

Por que a cadeia de suprimentos virou o alvo preferido

A lógica do atacante é econômica. Invadir uma empresa de cada vez dá trabalho. Comprometer uma biblioteca popular, da qual milhares de empresas dependem, entrega todas elas de uma vez. É o ataque de maior alavancagem que existe: um ponto de entrada, milhares de vítimas rio abaixo.

Os vetores mais comuns se dividem em algumas famílias:

  • Comprometimento de pacote legítimo: o atacante rouba as credenciais de um mantenedor e publica uma versão maliciosa de uma biblioteca real e confiável.
  • Typosquatting: publica-se um pacote com nome quase idêntico ao de um popular (por exemplo, trocando uma letra), esperando que alguém digite errado e o instale.
  • Dependency confusion: o atacante publica, em um repositório público, um pacote com o mesmo nome de um pacote interno privado da empresa. Se o gerenciador buscar no público por engano, baixa o malicioso.
  • Comprometimento do pipeline: em vez do pacote, o alvo é a esteira de build (CI/CD), onde o código é compilado. Injetar código ali contamina o artefato final sem tocar no código-fonte.

O denominador comum é a confiança automática. O ataque explora o fato de que a maioria dos times instala e atualiza dependências sem inspecionar nada.

Conheça o que você usa: o SBOM

Você não pode proteger o que não sabe que tem. O primeiro passo da defesa é o inventário, e o instrumento moderno para isso é o SBOM (Software Bill of Materials), a "lista de ingredientes" do seu software.

Um SBOM é um documento legível por máquina que lista todos os componentes que compõem uma aplicação: cada biblioteca, sua versão exata, sua licença e sua origem. Os formatos padrão de mercado são o CycloneDX e o SPDX. Com um SBOM atualizado, três perguntas críticas ganham resposta imediata:

  • Quando uma nova vulnerabilidade grave é divulgada, "nós usamos esse componente vulnerável, e onde?"
  • "Quais licenças de código aberto estão embutidas no nosso produto?"
  • "Alguma dependência entrou sem passar por revisão?"

Sem SBOM, responder à primeira pergunta durante uma crise vira uma caça manual e demorada, exatamente quando cada minuto conta. Gerar o SBOM automaticamente no build e armazená-lo junto do artefato transforma essa caçada em uma consulta.

Gestão de vulnerabilidades em dependências: o SCA

Ter a lista de ingredientes é o começo. O passo seguinte é cruzá-la continuamente com as bases de vulnerabilidades conhecidas. Essa prática se chama SCA (Software Composition Analysis).

Ferramentas de SCA (como as integradas a repositórios, além de opções dedicadas de mercado) monitoram suas dependências e alertam quando uma delas passa a ter uma CVE conhecida. As boas práticas de uso:

  • Rode SCA no pipeline, a cada build, e não uma vez por trimestre.
  • Priorize por contexto: nem toda vulnerabilidade é explorável no seu uso. Uma falha em um caminho de código que você nunca chama tem risco menor que uma exposta na borda. Ferramentas modernas ajudam a distinguir alcançável de teórico.
  • Automatize atualizações de baixo risco: bots de atualização de dependências mantêm a base em dia com menos esforço humano, reduzindo a janela em que você fica exposto a falhas já corrigidas.

Vale a distinção clássica: manter dependências atualizadas resolve o A06 do OWASP Top 10 (componentes vulneráveis e desatualizados). SCA é a automação que torna isso viável em escala.

Blindar o build: pipeline e artefatos confiáveis

Se o atacante mira a esteira, a esteira precisa de defesa própria. Alguns controles de alto impacto:

  • Fixe versões (lockfiles): use arquivos de trava (package-lock.json, poetry.lock, go.sum) para garantir que o build de hoje instale exatamente os mesmos componentes de ontem, sem substituições silenciosas.
  • Repositório proxy interno: em vez de puxar direto da internet pública, use um repositório interno que aprova e cacheia pacotes. Isso mitiga dependency confusion e dá um ponto único de controle.
  • Menor privilégio no CI/CD: a esteira costuma ter credenciais poderosas. Restrinja-as, use segredos de curta duração e isole os runners para que um build comprometido não contamine os demais.
  • Builds reproduzíveis e assinatura de artefatos: assinar digitalmente o artefato final (com projetos como o Sigstore) e verificar a assinatura antes do deploy garante que o que roda em produção é exatamente o que saiu do build confiável, sem adulteração no caminho.

Para quem quer um norte de maturidade, o framework SLSA (Supply-chain Levels for Software Artifacts) descreve níveis progressivos de garantia de integridade do build, do básico ao altamente resistente a adulteração. Ele funciona como um mapa: onde estamos e qual o próximo passo concreto.

Um comparativo dos controles por objetivo

Objetivo Prática Ferramenta/padrão
Saber o que uso Inventário de componentes SBOM (CycloneDX, SPDX)
Achar dependência vulnerável Análise de composição SCA no pipeline
Evitar substituição silenciosa Travar versões Lockfiles
Evitar dependency confusion Repositório proxy interno Registry privado
Garantir integridade do build Assinatura e verificação Sigstore, SLSA
Reduzir raio de dano Menor privilégio no CI Segredos efêmeros, runners isolados

Cultura: revisar antes de adicionar

Ferramentas resolvem escala, mas o primeiro filtro é humano e cultural. Antes de adicionar uma nova dependência, pergunte: ela é mantida ativamente? Tem uma comunidade saudável e histórico de correções? Você realmente precisa dela, ou está trazendo mil linhas para usar uma função de dez? Cada dependência é um relacionamento de confiança de longo prazo, não um detalhe de conveniência. Menos dependências, bem escolhidas, é uma superfície de ataque menor por definição.

Confiança que se verifica, não que se presume

A cadeia de suprimentos de software é feita de confiança, e confiança sem verificação é o que os atacantes exploram. A boa notícia é que quase todo o risco pode ser gerenciado com práticas que também melhoram a qualidade da engenharia: saber o que você usa (SBOM), vigiar o que envelhece (SCA), travar o que instala (lockfiles), blindar onde compila (pipeline) e comprovar o que entrega (assinatura). Nenhuma delas é exótica. O que falta, quase sempre, é torná-las parte automática do fluxo, e não uma tarefa que alguém lembra de fazer depois.

Na ConstructorTI, ajudamos times a fechar a cadeia de suprimentos como parte da engenharia: geração de SBOM e SCA no pipeline, hardening de CI/CD, mitigação de dependency confusion com registries internos e assinatura de artefatos rumo aos níveis do SLSA. Se você entrega software em produção e quer saber quais dependências e qual etapa do seu build hoje são o elo fraco, converse com o nosso time de CyberSecurity.