Skip to main content

Como usar IA no desenvolvimento de software e na cibersegurança

Escrito por
blog feature ai pink

30 de agosto de 2023

0 minutos de leitura

Vimos a tecnologia evoluir em ritmo acelerado, e a IA surgiu como uma força revolucionária e um enigma fascinante. Seja você uma pessoa desenvolvedora experiente que quer ampliar seu repertório ou alguém apaixonado por segurança em busca de respostas sobre IA, desvendar esse campo dinâmico pode ser uma jornada empolgante e, ao mesmo tempo, desafiadora.

Este post é seu ponto de partida para explorar o labirinto da IA. Ele foi criado para oferecer a pessoas desenvolvedoras e profissionais de segurança as ferramentas necessárias não só para entender os conceitos fundamentais, mas também para iniciar conversas relevantes e abrir caminho para explorações mais aprofundadas. Vamos abordar o tema de cima para baixo: primeiro, vamos destacar as áreas de IA que merecem nossa atenção, decifrar a terminologia e mostrar caminhos que valem a pena explorar.

Categorias de IA no desenvolvimento

Depois de conversar com muitas pessoas sobre IA, descobri que uma boa maneira de organizar as ideias sobre recursos ou tecnologias de IA é dividi-las em três categorias:

  1. Desenvolvimento assistido por IA - Desenvolvimento com IA generativa para ajudar a escrever, revisar e documentar código.

  2. Aplicações com recursos de IA - Recursos de IA incorporados a uma aplicação, como um chatbot.

  3. Ferramentas com recursos de IA - Ferramentas que usam IA integrada para torná-las — e aos processos em que são usadas — mais eficazes.

Neste post, vamos nos concentrar no desenvolvimento assistido por IA, mas em breve também vamos falar sobre as outras categorias em posts futuros. Fique de olho!

Outros termos que você precisa conhecer

Vamos definir mais alguns termos!

Conceitos fundamentais de IA

  • Inteligência artificial (IA) - Simulação de processos da inteligência humana por máquinas, permitindo que elas aprendam com experiências, se adaptem a novas informações e realizem tarefas que normalmente exigem inteligência humana.

  • Processamento de linguagem natural (PLN) - Área da IA dedicada a permitir que computadores compreendam, interpretem e gerem a linguagem humana.

  • Aprendizado de máquina (ML) - Um subconjunto da IA que permite que sistemas melhorem o desempenho em uma tarefa específica com base na exposição a dados, sem serem programados explicitamente para isso.

  • Redes neurais - Modelos computacionais inspirados na estrutura e no funcionamento do cérebro humano, capazes de aprender padrões e relações nos dados.

Compreensão de linguagem e texto:

  • LLM (modelo de linguagem de grande porte) - Tipo de rede neural artificial treinada com uma enorme quantidade de dados textuais, que permite gerar textos semelhantes aos escritos por pessoas e compreender a linguagem até certo ponto.

  • Transformer pré-treinado generativo (GPT) - Arquitetura avançada de rede neural usada para gerar textos coerentes, semelhantes aos escritos por pessoas, com base em um treinamento extensivo de linguagem.

  • Chatbot - Software com tecnologia de IA que conversa automaticamente com usuários e usa processamento de linguagem natural para compreender e responder a mensagens de texto ou comandos de voz.

Desenvolvimento assistido por IA

Este post aborda o desenvolvimento assistido por IA: como a IA nos ajuda a escrever e empacotar código com mais produtividade e eficiência. Vamos começar pela escrita de código e depois falar sobre testes, revisão e documentação.

Escrita de código

A aplicação mais conhecida e comentada do uso de IA durante o desenvolvimento é a sugestão de código. Algumas ferramentas, como o ChatGPT, podem fornecer exemplos de código com base em solicitações específicas. Você pode pedir, em uma conversa, um código que execute determinada tarefa, por exemplo:

Conversa no ChatGPT mostrando uma solicitação de um método Java para extrair um ZipFile para um diretório de destino e uma resposta introdutória.

Vamos conferir o código que ela gera.

public class ZipExtractor {

    public static void extract(ZipFile zip, String dest) throws I0Exception
        File dir = new File(dest);
        if (!dir.exists ()) {
            dir.mkdirs ();
        }

        Enumeration<? extends ZipEntry> entries = zip.entries();

        while (entries.hasMoreElements ()) {
            ZipEntry entry = entries. nextElement();
            File destFile = new File(dir, entry. getName());

            if (entry.isDirectory()) {
                destFile.mkdirs ();
            } else {
                destFile.getParentFile().mkdirs();

                try (InputStream in = zip.getInputStream (entry);
                    OutputStream out = new FileOutputStream(destFile)) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = in. read (buffer)) > 0) {
                        out. write (buffer, O, len);
                    }
                }
            }
        }
    }

Outras ferramentas, como GitHub Copilot, Amazon CodeWhisperer e Tabnine, para citar três opções populares, oferecem funcionalidades semelhantes diretamente no IDE que você usa. Assim, enquanto escreve código — por exemplo, na definição de um método ou em um comentário —, os plugins do IDE sugerem trechos que você pode aceitar ou rejeitar.

Uma revelação antecipada: o código gerado acima contém uma vulnerabilidade crítica de alta gravidade. Pois é, os LLMs aprendem com código da comunidade, repleto de vulnerabilidades, e por isso o código sugerido também pode ter vulnerabilidades. É fundamental continuar testando o código com as ferramentas de sempre para garantir a segurança tanto do código gerado quanto daquele que escrevemos. Dê mais uma olhada no código e veja se consegue identificar a vulnerabilidade. Continue lendo até a próxima seção, Testes de código, para descobrir os detalhes da falha e como corrigi-la!

Outra ferramenta interessante é o AI Query, que usa IA para gerar consultas SQL a partir de instruções em linguagem natural. Ela é especialmente útil quando você quer separar o LLM dos seus dados por motivos de segurança. Assim, você pode validar se as consultas geradas não apresentam riscos e se são apropriadas para o nível de autorização do usuário final. 

Testes de código

Você chegou até aqui porque encontrou a vulnerabilidade? Ou nem tentou e veio direto buscar a resposta? De qualquer forma, vamos dar uma pista :) A vulnerabilidade é um exemplo de problema de segurança Zip Slip. Ela combina traversal de diretório e sobrescrita arbitrária de arquivos, podendo até levar à execução arbitrária de código. Esta é a linha que causa a vulnerabilidade:

File destFile = new File(dir, entry.getName());

Vamos primeiro mostrar o conteúdo de um arquivo compactado malicioso. Assim, provavelmente ficará claro por que o código acima é vulnerável. O formato de arquivo ZIP permite a inclusão do seguinte arquivo, de acordo com as especificações:

5 Fri Aug 18  11:04:29 BST 2023 good.sh 20 Fri Aug 18 11:04:42 BST 2023 ../../../../../../../../tmp/evil.sh

Como você provavelmente já percebeu, ao concatenar esse nome de arquivo compactado ao diretório de destino, a cópia resultante provavelmente será feita no diretório temporário do sistema, e não no diretório de destino. Esse pode ser um vetor de ataque bastante perigoso, mas é comum que ferramentas de geração de código produzam resultados como esse.

Para corrigir o problema, basta obter o nome canônico do arquivo após a concatenação e verificar se ele está dentro do diretório de destino, desta forma:

File destFile = new File(dir, entry.getName());
    String canonicalDestinationFile =  destinationfile.getCanonicalPath();
    if (!canonicalDestinationFile.startsWith(canonicalDestinationDirPath + File.separator)) { 
        throw new  ArchiverException("Entry is outside of the target dir: " + e.getName()); 
   }

Vou abrir esse arquivo no navegador do IntelliJ, onde já tenho o Snyk instalado. O Snyk vai analisar o código-fonte e, com seus recursos de IA simbólica, entender os fluxos de dados e de código da aplicação. Como você pode ver na captura de tela abaixo, ele identificou o problema no novo código (1), apresentou uma descrição completa da falha (2) e até sugeriu exemplos de correção, semelhantes ao que mostramos acima (3).

O IntelliJ IDEA exibe código Java junto com descobertas do Snyk que destacam uma vulnerabilidade de travessia de caminho de gravidade média.

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.

Mencionamos a IA simbólica, um dos tipos de IA usados pelo Snyk. Há outros tipos de IA, cada um com vantagens e desvantagens que dependem dos seus objetivos. Para saber mais, leia nosso guia sobre o uso de diferentes modelos de IA. A onda de IAs popularizadas pelo ChatGPT usa:

  • IA de aprendizado de máquina - Abordagem de IA que permite que sistemas aprendam com dados e melhorem o desempenho em uma tarefa específica sem serem programados explicitamente para isso. Inclui subtipos como aprendizado supervisionado, não supervisionado e por reforço.

  • IA de redes neurais - Área do aprendizado de máquina que usa redes neurais artificiais, inspiradas no cérebro humano, para reconhecer padrões, características e relações nos dados.

  • IA simbólica (ou raciocínio simbólico) - Tipo de IA que representa conhecimento por meio de símbolos, regras e lógica para executar tarefas, muitas vezes usando expressões compreensíveis por pessoas e raciocínio formal.

  • IA evolutiva (ou algoritmos genéticos) - Abordagem de IA que imita a seleção natural para desenvolver e otimizar soluções para problemas, geralmente aplicada a tarefas de otimização e design.

  • Sistemas especialistas com IA - Tipo de IA que reproduz o conhecimento especializado de uma pessoa em um domínio específico, usando uma base de fatos e regras para tomar decisões ou fazer recomendações.

Outra ferramenta que vale a pena conhecer é o Codium, uma ferramenta baseada em IA que analisa seu código, explica o que ele faz, cria um plano de testes e até gera testes que você pode copiar e usar nas suas suítes de testes unitários.

Revisão de código

Para analisar código que já foi escrito, como em uma pull request, vale a pena conhecer o What the Diff. Essa ferramenta baseada em Git resume as alterações feitas na PR, ajuda a escrever um resumo e também pode auxiliar na refatoração do código.

Falamos sobre muita coisa: escrever, testar e revisar código… Pronto para começar?  

  1. Garanta que as alterações no seu código não causem regressões nem introduzam problemas de segurança. Eles podem afetar a qualidade ou, como vimos acima, a segurança.

  2. Continue usando as ferramentas de sempre em todas as etapas da revisão e do SDLC. O uso de IA generativa não deve substituir essas ferramentas; pelo contrário, você deve contar ainda mais com elas, já que provavelmente vai desenvolver e entregar mais código e funcionalidades no mesmo intervalo de tempo.

  3. Confira nosso guia rápido de boas práticas para usar IA no SDLC. As integrações do Snyk ao SDLC, incluindo as integrações com PRs em repositórios Git, ajudam nas revisões de código como parte do seu fluxo de trabalho habitual, para evitar a introdução de vulnerabilidades de primeira ou terceiros, contêineres vulneráveis ou problemas de segurança ou configurações incorretas de IaC.

Assuma o controle da segurança de IA com a Snyk

Descubra como a Snyk ajuda a proteger o código gerado por IA pelas suas equipes de desenvolvimento, enquanto oferece às equipes de segurança visibilidade e controle completos.

Publicado em:

Leia mais

blog feature snyk container custom base recommendations
Blog

Conheça o Evo Agentic AppSec: segurança que acompanha o ritmo do desenvolvimento com IA

O desenvolvimento impulsionado por IA está avançando mais rápido do que os fluxos de trabalho de segurança tradicionais. O AppSec agentivo da Snyk usa agentes de segurança para encontrar, corrigir e verificar vulnerabilidades continuamente, enquanto as pessoas definem os critérios.

blog feature ai violet
Blog

VulnBump: agentes de IA conseguem corrigir dependências vulneráveis sem quebrar o build?

O VulnBump testa agentes de IA em 307 atualizações reais de dependências. Uma correção só é considerada válida se eliminar a vulnerabilidade e mantiver o build e os testes funcionando.

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.