Skip to main content

Identifique, priorize e corrija vulnerabilidades com Reachable Vulnerabilities para GitHub

Escrito por

28 de janeiro de 2021

0 minutos de leitura

Imagine que você é um programador Java e acabou de decidir usar a análise do Snyk Open Source para encontrar problemas de segurança nas bibliotecas de terceiros que utiliza. Boa escolha!

No entanto, depois de conectar seu repositório ao scanner do Snyk Open Source, você descobre que há dez — ou talvez até 50 — vulnerabilidades nos pacotes dos quais depende. A grande questão é: por onde começar?

Em um mundo ideal, você corrigiria todos os problemas até chegar a zero vulnerabilidades. Sabemos que isso nem sempre é viável. Além disso, talvez você não consiga corrigir todas de uma vez. O melhor é começar pelas vulnerabilidades mais graves que afetam sua aplicação e priorizar a correção delas. Veja como isso funciona.

A aplicação

Criei uma pequena aplicação Java baseada em Maven e a publiquei no GitHub. Ela recebe uma URL e faz uma solicitação GET para esse endereço. O resultado é exibido como texto simples na página de resultados. Pode ser o HTML de uma página da web ou, por exemplo, a resposta de um endpoint REST. Uso o cliente HTTP do Apache e algumas outras dependências para executar as solicitações, como mostra o arquivo pom.

<dependencies>
   <dependency>
       <groupId>org.apache.httpcomponents</groupId>
       <artifactId>httpclient</artifactId>
       <version>4.3.1</version>
   </dependency>
   <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.0.1</version>
       <scope>provided</scope>
   </dependency>
   <dependency>
       <groupId>org.owasp.encoder</groupId>
       <artifactId>encoder</artifactId>
       <version>1.2.2</version>
   </dependency>
   <dependency>
       <groupId>org.yaml</groupId>
       <artifactId>snakeyaml</artifactId>
       <version>1.25</version>
   </dependency>
</dependencies>
Formulário da web com um campo para inserir a URL http://snyk.io e uma página de resposta exibindo o código-fonte HTML do site

Identifique vulnerabilidades de segurança no seu repositório do GitHub

Para identificar vulnerabilidades de segurança nas minhas dependências de código aberto, conectei meu repositório do GitHub ao Snyk. Também ativei o recurso Reachable Vulnerabilities, que está atualmente na versão Beta. Você encontra essa opção em Configurações -> Integração -> Editar configurações do GitHub. Vale lembrar que tudo o que uso aqui faz parte do plano gratuito do Snyk.

Página de configurações da análise de vulnerabilidades alcançáveis, mostrando o recurso ativado, um aviso sobre a clonagem do repositório e um botão para salvar as alterações.

Quando o Snyk termina de analisar meu repositório do GitHub, vejo que minha aplicação tem várias vulnerabilidades herdadas do pacote de código aberto que utilizo. No entanto, o recurso Reachable Vulnerabilities mostra se uma vulnerabilidade pode ser alcançada pelo código, como no exemplo abaixo

Relatório detalhado de vulnerabilidade que mostra um problema de validação de entrada de alta gravidade e explorável no Apache HttpClient, o caminho de correção, a pilha de chamadas e a função vulnerável.

Priorize a correção de vulnerabilidades

A vulnerabilidade de validação inadequada de entrada é um problema de alta gravidade na versão 4.3.1 do httpclient do Apache. A interface do Snyk mostra que a função vulnerável pode ser alcançada pelo método doPost da minha URLServlet. O problema específico é que uma entrada URI não é validada corretamente, o que pode comprometer seu software. Depois de alguns testes, encontrei pelo menos um dos problemas.

A URI pode separar as credenciais do nome do host. Por exemplo, http://bmv:pwd@snyk.io aponta para o domínio snyk.io. Mas, se eu incluir outro sinal de @ na senha das credenciais, posso sair da URL. Resumindo, http://bmv:pwd@foojay.io:80@snyk.io me mostra o resultado do domínio foojay.io, e não de snyk.io.

Página do navegador intitulada “Resultado da solicitação!” que exibe o código-fonte HTML com o título destacado “Informações gratuitas sobre Java e OpenJDK para uso diário de Java | foojay”

O indicador de vulnerabilidade alcançável está disponível na integração com o GitHub da plataforma Snyk para projetos Java Maven. É uma ferramenta essencial para priorizar a correção de vulnerabilidades na sua aplicação. Quando esse indicador aparece, existe um caminho entre seu código e o método vulnerável do pacote importado.

Para calcular a alcançabilidade na integração com o GitHub, o Snyk cria um fork do seu código e o inspeciona. Criamos um grafo de chamadas e o analisamos para identificar se há um caminho até um método com uma vulnerabilidade conhecida. Se houver, a vulnerabilidade recebe o selo “reachable”. Além disso, o fato de uma vulnerabilidade ser alcançável também influencia a pontuação de prioridade exibida no canto superior direito. Essa pontuação combina várias heurísticas para ajudar desenvolvedores a identificar quais vulnerabilidades são mais prejudiciais no contexto da aplicação e, portanto, devem ter maior prioridade durante a correção.

Achado de segurança classificado como Alta gravidade e Alcançável: validação inadequada de entrada, com contagem de 673.

Se eu rolar a tela para baixo na interface do Snyk, vejo outras vulnerabilidades, incluindo um problema de negação de serviço no pacote snakeyaml. Observe que essa vulnerabilidade não tem o indicador de alcançável, pois apenas importo o pacote e não o utilizo no programa de exemplo.

Relatório de vulnerabilidade de negação de serviço de gravidade média para org.yaml:snakeyaml, recomendando a atualização para a versão 1.26

Conclusão

O recurso Reachable Vulnerabilities na integração com o GitHub é poderoso e gratuito. Ele ajuda todos os nossos usuários a decidir por onde começar e quais vulnerabilidades corrigir primeiro.

No entanto, isso não significa que seja seguro ignorar as vulnerabilidades que não têm o indicador de alcançável. Elas ainda fazem parte da sua aplicação e podem ser acionadas de outras formas.

Especialmente em Java, temos recursos como a API de reflexão. Além disso, todas as classes ficam disponíveis pelo classpath. Isso significa que, se for possível executar código arbitrário na sua aplicação, todas as classes disponíveis poderão ser carregadas e exploradas.

O que quero dizer é que vulnerabilidades que não podem ser alcançadas diretamente ainda podem ser exploradas em uma cadeia de eventos. Ainda assim, Reachable Vulnerabilities ajuda você a saber por onde começar para tornar sua aplicação melhor e mais segura! Então, o que está esperando? Crie uma conta gratuita no Snyk e experimente!

A aplicação usada nesta publicação do blog está disponível neste repositório do GitHub.

Comece a jogar Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo à gravação sob demanda do nosso workshop virtual introdutório.

Leia mais

Blog

Modelos de ponta encontraram as vulnerabilidades. Só o atacante encontrou as cadeias.

A análise estática encontrou as falhas, mas só os testes de ataque em aplicações ativas provaram como elas poderiam ser encadeadas para causar invasões. Uma comparação entre Evo COS, Claude Security e Claude Code Security.

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

Blog

Por que agentes de programação com IA continuam criando falhas de controle de acesso

Agentes de programação com IA podem gerar uma lógica de autorização que compila e passa pela revisão, mas permite que um tenant acesse os dados de outro. Saiba por que é difícil detectar falhas de controle de acesso e como evitá-las.