Corrija automaticamente vulnerabilidades de código com IA
14 de outubro de 2024
0 minutos de leituraEntre os workshops de SecRel da biblioteca da Snyk para clientes, um deles é o Breaking AI. Neste workshop, abordamos como assistentes baseados em IA generativos, como o Copilot e o Codium, podem ajudar desenvolvedores a acelerar a criação de código. A grande constatação do workshop é que assistentes baseados em IA são como desenvolvedores juniores recém-saídos de seus cursos de codificação: superansiosos e prestativos, mas você realmente precisa revisar o código produzido por eles (sem desmerecer os desenvolvedores juniores, precisamos deles e eles são incríveis!). No workshop, mostramos como a combinação de assistentes baseados em IA e Snyk concede a você um superpoder: escrever código com rapidez e segurança.
Para citar um chef famoso, a Snyk agora “elevou o nível” com os recursos do Deep Code AI Fix. O Snyk Code sempre ofereceu ótimas orientações de correção quando encontrava uma vulnerabilidade de segurança. Ele até mostrava três boas referências de outros projetos de código aberto com a mesma vulnerabilidade e como ela havia sido corrigida nesses projetos. Agora, com dados cuidadosamente selecionados pela equipe de pesquisa de segurança da Snyk, um modelo de IA híbrido que combina o poder das IAs generativa e simbólica, bem como modelos de machine learning, a Snyk pode corrigir automaticamente muitas vulnerabilidades de segurança comuns diretamente no conforto do seu IDE favorito.
Neste blog, vou demonstrar a melhor forma de aproveitar o Deep Code AI Fix (DCAIF) em um exemplo de projeto em Java que usamos em nossos workshops. O código-fonte está aqui. OBSERVAÇÃO: este projeto é intencionalmente vulnerável de várias maneiras e não é adequado para uso em nenhum ambiente de produção.
Diversão com um aplicativo de agendamento de conferências
Se você já participou ou foi palestrante de uma conferência de tecnologia, sabe que um dos aspectos mais desafiadores é criar e apresentar a programação do evento.
O aplicativo de referência é uma versão terrível disso (eu NÃO sou um bom desenvolvedor front-end!), mas é útil para mostrar como o código pode funcionar tecnicamente e ser inseguro ao mesmo tempo.
É um aplicativo Spring Boot que usa o mecanismo de modelos Thymeleaf. Na inicialização, gera palestrantes aleatórios, títulos de palestras e dados de descrição de palestras usando a popular biblioteca faker. Os títulos e as descrições das palestras são todos do texto do livro O Guia do Mochileiro das Galáxias. OBSERVAÇÃO: os títulos e as descrições podem não ser 100% adequados para o trabalho. Você foi avisado!
Cada palestrante gerado para o evento também tem uma página dedicada onde você pode ver a lista de suas palestras na conferência. Vamos nos concentrar nesta parte do aplicativo.
Para compilar e executar o aplicativo, execute:
mvn clean install
mvn spring-boot:run
Quando executar o aplicativo, além do banner usual do Spring Boot e outras saídas na tela, você verá algo assim:
Access talks for heath.davis at: http://localhost:8081/talks?username=heath.davis
Access talks for russell.bernier at: http://localhost:8081/talks?username=russell.bernier
Access talks for kenyetta.jones at: http://localhost:8081/talks?username=kenyetta.jones
Access talks for howard.bailey at: http://localhost:8081/talks?username=howard.bailey
Access talks for buddy.jast at: http://localhost:8081/talks?username=buddy.jast
Access talks for jeanice.kertzmann at: http://localhost:8081/talks?username=jeanice.kertzmann
Access talks for deborah.hamill at: http://localhost:8081/talks?username=deborah.hamill
Access talks for horacio.renner at: http://localhost:8081/talks?username=horacio.renner
Access talks for winfred.schuster at: http://localhost:8081/talks?username=winfred.schuster
Access talks for tommie.hane at: http://localhost:8081/talks?username=tommie.hane
Access talks for micah at: http://localhost:8081/talks?username=micah
OBSERVAÇÃO: não será exatamente assim, pois os palestrantes e suas palestras são gerados aleatoriamente a cada vez que você inicia o aplicativo.
Se você clicar ou copiar/colar um dos links, verá uma página do palestrante com a lista de suas palestras:

Vamos brincar: encontre a vulnerabilidade
Dê uma olhada em TalkController.java
. É assim que a página de um palestrante é renderizada. Você consegue identificar a vulnerabilidade?
Não queremos que você dependa apenas da sua visão. Queremos que os desenvolvedores sejam rápidos E escrevam código seguro.
Eu uso o IntelliJ Idea para codificar aplicativos Java. E também uso a extensão de IDE da Snyk. A boa notícia é que existem extensões de IDE da Snyk para todos os IDEs populares, apoiando uma grande variedade de linguagens de programação.
Se você quiser acompanhar, mas não tiver uma conta na Snyk, pode criar uma gratuitamente aqui.
Já falei que esse aplicativo tem muitas vulnerabilidades? É por isso que o usamos em nossos workshops. A vulnerabilidade que quero destacar está em TalkController.java
:

Mostra que foi encontrada uma vulnerabilidade de script entre sites (XSS).
Exibe um diff de um dos três projetos de código aberto com a mesma vulnerabilidade. Isso mostra como ela foi corrigida (a parte verde).
A linha ondulada vermelha indica onde está a vulnerabilidade no código.
Todas essas informações são muito úteis para resolver o problema. No entanto, observe o pequeno ícone de raio (⚡️) à esquerda da vulnerabilidade no item 1. Isso indica que essa vulnerabilidade pode ser corrigida automaticamente.
Se você passar o mouse sobre a linha ondulada vermelha, verá a opção Corrigir esse problema:

Antes de analisarmos o resultado do Deep Code AI Fix, vamos ver o que o Copilot faria nesse caso.
Este é o prompt que passei ao Copilot na linha 42 e o código que ele injeta:
// guard against XSS
username = username.replaceAll("<", "<").replaceAll(">", ">");
Isso pode funcionar contra ataques simples, será que funciona contra todos os tipos de ataques de XSS? Não tenho tanta certeza. Na verdade, quando executo novamente a verificação do Snyk, a vulnerabilidade de XSS continua lá.
Vamos analisar a correção da Snyk:
String usernameStr = "<h1>" + HtmlUtils.htmlEscape(username) + "'s talks<h1>";
Agora sim. Ela usa uma abordagem idiomática e esperada com uma biblioteca integrada do Spring Boot: HtmlUtils
. Tenho certeza de que isso sanitizará completamente a entrada: username
. Uma nova verificação do Snyk mostra que a vulnerabilidade não existe mais.

Excelente! A correção automática do Snyk não apenas resolveu a vulnerabilidade, mas fez isso de uma forma adequada à estrutura em uso (neste caso, Spring Boot).
O DCAIF não atrapalha você
Nesta postagem, mostrei como o Deep Code AI Fix da Snyk vai além de apenas sugerir correções e pode fazer a correção por você. Você também pode confirmar o benefício da correção verificando que a vulnerabilidade de segurança original não existe mais.
Na Snyk, adoramos os assistentes baseados em IA, mas a segurança não é ponto forte deles. Nossa pesquisa mostra que as GenAIs por aí tendem a gerar código inseguro aproximadamente na mesma taxa que os humanos: cerca de 40% das vezes. Isso faz sentido, pois as soluções puras de GenAI, como o Copilot, treinam seus modelos principalmente usando o código existente. A abordagem híbrida da Snyk, que inclui IA simbólica, GenAI, machine learning e treinamento selecionado pela nossa equipe de segurança, usa uma abordagem com foco em segurança para gerar resultados.
Comece a proteger o código gerado por IA
Crie sua conta gratuita da Snyk para começar a proteger o código gerado por IA em questão de minutos. Ou agende uma demonstração com um especialista para ver como a Snyk se adapta a seus casos de uso de segurança de desenvolvedores.