Aikido

Sem um Grafo de Dependência Através de Código, Containers e Cloud, Você Está Cego para Vulnerabilidades Reais

Escrito por
Sooraj Shah

Você sabe que suas aplicações não vivem em uma bolha. Elas são construídas a partir de pacotes open source, Containers, recursos gerenciados na Cloud, VMs, APIs e muito mais. Cada parte possui sua própria superfície de segurança e seu próprio scanner: ferramentas de análise estática de código (SAST) escaneiam por vulnerabilidades no código-fonte, ferramentas de análise de composição de software (SCA) escaneiam por dependências, ferramentas de segurança na Cloud monitoram as configurações, e scanners de Container procuram por exploits conhecidos em imagens.

Então, uma vez que você tem todos esses scanners em funcionamento… você está seguro, certo?

Mais ou menos. Você está definitivamente escaneando cada camada.

Mas a que custo?

Por Que Scanners de Segurança Sobrecarregam Você com Falsos Positivos

Um scanner pode alertar sobre uma função vulnerável em seu código, sem saber que ela está protegida por uma API upstream. Ou pode detectar perigo sobre uma CVE em uma camada base de Container, alheio ao fato de que sua aplicação real nunca alcança aquele caminho de código. Da mesma forma, um scanner de Cloud pode sinalizar uma role IAM que excede suas permissões, sem perceber que ela está ligada apenas a uma workload de staging que não pode acessar dados de produção.

O resultado? Suas equipes são inundadas com uma tonelada de descobertas isoladas. Sim, todas são tecnicamente precisas, mas vêm com pouco contexto para determinar se o problema é realmente perigoso.

Ou como um engenheiro de segurança de uma grande empresa disse recentemente: “Você consegue dizer se uma vulnerabilidade afeta minhas joias da coroa ou o menu de almoço virtual?”

Embora falsos positivos e falsos negativos isoladamente sejam um risco, o maior risco é a falta de cadeias de dependência que determinam se problemas aparentemente inofensivos se combinam em caminhos de exploração reais — ou se muitos problemas aparentemente prejudiciais não são um problema de fato.

E ouvimos isso das equipes o tempo todo:

“Nós não controlamos nossas dependências.”

A razão? É muito desafiador gerenciar a cadeia de suprimentos; pacotes open source trazem consigo dependências indiretas. Mesmo com varredura de Container ou ferramentas cloud-native, a maioria das organizações não consegue determinar com confiança o que realmente importa. Como resultado, elas acabam correndo atrás de vulnerabilidades de forma reativa.

Por Que o Contexto da Vulnerabilidade Importa em Segurança de Aplicações e Segurança na Nuvem

As ferramentas típicas de SAST ou SCA adotam uma visão muito simplista e literal.

Por exemplo, quando ele vê que um pacote está listado em uma CVE, ele o sinalizará como crítico.

Isso parece uma boa prática no papel; é melhor ser avesso ao risco, afinal, você pensaria. Mas, na realidade, isso apenas dispara falsos alarmes porque:

  • Frequentemente, sua aplicação nem sequer está chamando a função vulnerável
  • A função pode estar enterrada dentro de uma dependência transitiva que você nunca tocou diretamente
  • Ou está por trás de um import que é destinado apenas para desenvolvedores, que nunca vai para produção

Assim, as equipes recebem uma lista excessivamente detalhada de problemas “críticos” e precisam gastar horas investigando-os, apenas para perceber que nem são críticos.

Ao mesmo tempo, os caminhos reais que poderiam ser explorados podem passar despercebidos.

Construindo um Grafo de Dependência Completo Através de Código, Containers e Cloud

A razão pela qual muitos scanners fornecem resultados ruidosos ou incompletos é que eles não possuem o contexto adicional necessário para oferecer clareza. Ferramentas tradicionais tratam cada camada - código-fonte, pacotes de código aberto, Containers, recursos de Cloud - como problemas separados, frequentemente gerenciados por produtos distintos.

Isso significa que eles não possuem um grafo de dependência único que os una. Não há visibilidade de dependência cruzada, o que significa que você será notificado sobre problemas não críticos e poderá perder os problemas que realmente importam.

Mas a visibilidade não se trata apenas de contexto; trata-se de consistência. Gerenciadores de pacotes gerenciam vulnerabilidades transitivas de forma diferente.

Por exemplo:

  • npm/yarn em JavaScript oferecem árvores de dependência e permitem que você sobrescreva/fixe pacotes aninhados.
  • Maven em Java pode puxar versões inesperadas de bibliotecas, exigindo configurações extras para manter pacotes transitivos arriscados fora.

Sem um grafo unificado, as equipes acabam adicionando mais ferramentas apenas para ter controle sobre o que foi entregue.

Alguns engenheiros pensam: “se não instalamos diretamente, não pode nos prejudicar”; o que agrava o problema. As vulnerabilidades residem em várias camadas de profundidade. 

Então, o que as equipes deveriam estar fazendo?

Use Reachability Analysis para Eliminar Falsos Alarmes em Dependências

Uma verdadeira Reachability Analysis deveria significar que, em vez de apenas sinalizar “você tem um pacote vulnerável no grafo”, sua plataforma pode descobrir se seu código está:

  • Realmente chamando a função vulnerável, ou
  • Envolvido em uma falha exposta à entrada do usuário, ou
  • Rodando em um Container que é acessível pela internet

Se a resposta para todas essas perguntas for não, então ele ignora. Se sim, ele escalona.

Também é importante filtrar vulnerabilidades transitivas por trás de dependências de desenvolvimento ou pacotes de teste que nunca são enviados para produção. Isso pode reduzir muito o ruído, significando menos falsos positivos e mais tempo para os desenvolvedores focarem na construção de software.

A maioria dos scanners pode verificar se um pacote está listado em um CVE. Mas poucos conseguem rastrear se o seu código real chama a função vulnerável, se ele está empacotado em um Container exposto à internet e se ele executa em um recurso Cloud com IAM de risco — tudo em uma única visualização.

Reachability analysis de dependência para CVE-2021-23343 mostrando o caminho do pacote vulnerável no repositório.

Correlacionando Vulnerabilidades Entre Código, Containers e Configurações de Cloud

Este é o ponto crucial. Compreender o que está acontecendo em todos os lugares é fundamental para economizar muito tempo da sua equipe e reduzir as chances de ser pego de surpresa.

Isso significa estender este grafo de dependência além do nível do pacote para Containers, infraestrutura como código, configurações de Cloud — e sobrepor a reachability entre eles.

Por exemplo, ele poderia perguntar:

  • Essa vulnerabilidade afeta suas dependências? Sim
  • É realmente chamado pelo seu aplicativo? Não
  • Está empacotado em um Container implantado com ingresso público? Não
    → Ignorar
  • Essa vulnerabilidade requer que uma porta específica esteja aberta? Sim
  • A vulnerabilidade está presente em uma máquina virtual Cloud? Sim
  • A porta necessária está aberta na VM? Não
    → Ignorar

remediação automatizada: Corrigindo Vulnerabilidades Reais Mais Rápido

Uma vez confirmada como uma vulnerabilidade real e acessível, o cenário ideal é determinar a atualização mínima segura e corrigi-la automaticamente.

Algumas ferramentas podem:

  • Determinar automaticamente a atualização mínima segura
  • Verificar se não violará suas restrições semver
  • Corrigi-lo automaticamente sem introduzir regressões

Isso significa que não há rastreamento manual de dependências e muito menos noites sem dormir.

Gerenciar Dependências como Parte de uma Estratégia de Segurança Unificada

Ao conectar seu código, containers e configurações de Cloud em um único grafo, você reduz o ruído e vê o que está realmente exposto. Sem falsos alarmes.

E quando há um problema real, ele não é apenas sinalizado — ele é corrigido. Assim, sua equipe gasta menos tempo investigando alertas sem sentido e mais tempo entregando.

Veja como o Aikido verifica as dependências de desenvolvimento em busca de CVEs em nossa documentação. Confira nosso gerenciamento de vulnerabilidades completo, aqui.

Compartilhar:

https://www.aikido.dev/blog/without-dependency-graph-blind-to-vulnerabilities

Assine para receber notícias sobre ameaças.

Comece hoje, gratuitamente.

Comece Gratuitamente
Não é necessário cc

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.