Inteligência Artificial na Mitigação e correção de Vulnerabilidades

Esta publicação tem como objetivo propor idéias e divagar métodos de melhorias para a análise e correção de vulnerabilidades

Introdução

Como analista de segurança um dos meus principais papéis diários é o de analisar códigos dos desenvolvedores. Uma das preocupações que temos é o de que o código não tenha vulnerabilidades. Para isso, utilizamos ferramentas de análise estática de código, como o Veracode. Porém um dos principais problemas que tenho com ferramentas de SAST atuais é a quantidade de Falso Positivos que elas geram pois não analisam o código por contexto mas sim por parâmetros. Por exemplo, se uma função faz uma query no banco de dados por um método totalmente seguro que recebe um string ele irá identificar aquele método como vulnerável, mesmo que ele não seja. Isso é um problema pois esta análise simples consome um tempo do analista de segurança e dúvidas com os desenvolvedores, que podem ficar confusos com a análise.

O que é IA?

A inteligência artificial é um ramo da ciência da computação que visa criar máquinas que possam realizar tarefas que normalmente seriam realizadas por humanos. Apesar de existirem vários ramos vou focar neste artigo no NLP (Natural Language Processing) que é o ramo da IA que se preocupa com a análise de linguagem natural.

A NLP existe para ajudar a resolver problemas que envolvem a linguagem humana. Um exemplo é o de tradução de textos, onde a máquina consegue entender o que está sendo dito e traduzir para outra língua. Outro exemplo é o de análise de sentimentos, onde a máquina consegue entender o que está sendo dito e identificar se a pessoa está feliz, triste, etc.

Como a IA pode ajudar?

Como utiliza-la para melhorar as ferramentas de análise estáticas atuais?

A IA pode ajudar a resolver o problema de Falso Positivo pois ela consegue entender o contexto do código e não apenas os parâmetros. Por exemplo, se uma função faz uma query no banco de dados por um método totalmente seguro que recebe um string ele irá identificar aquele método como seguro o pois a função daquele método é a de fazer queries que não sejam passíveis de SQL Injection.

Código Vulnerável:

@app.route("/login")
def login():
  username = request.values.get('username')
  password = request.values.get('password')

db = pymysql.connect("localhost")
cursor = db.cursor()

cursor.execute(f"SELECT admin FROM users WHERE username = {username} AND password = {password})

Está query é vulnerável pois o usuário pode passar um username e password que contenha um SQL Injection. Por exemplo, se o usuário passar o username admin' OR '1'='1 e o password 123 a query irá retornar todos os usuários pois o OR é um operador lógico que sempre retorna verdadeiro.

Porém se a função que faz a query for a seguinte:

from psycopg2 import sql

def query_for_login(username: str, password: str) -> int:
    with connection.cursor() as cursor:
        stmt = sql.SQL("""
            SELECT admin FROM users WHERE username = {sql.Identifier(username)} AND password = {sql.Identifier(password)})
        """)
        
        cursor.execute(stmt)
        return cursor.fetchone()


query_for_login(user, password)

Este método é seguro pois é uma query parametrizada, e este método irá fazer a sanitização dos dados para uma possível tentativa de SQL Injection. Porém se uma ferramenta de SAST analisar este código ela irá identificar como vulnerável pois ela não consegue entender o contexto do código.

A palavra "query_for_login" será apontada como uma vulnerabilidade pois teoricamente ele está fazendo uma query e passando 2 argumentos que podem ser SQL Injection. Porém, a função está fazendo a sanitização dos dados e não há vulnerabilidade!

Como implementar as melhorias?

Atualmente já existem várias ferramentas de IA que geram texto/código, o Copilot, por exemplo, me ajudou a escrever todo esse artigo inteiro!

De início você deve pensar que precisará de conhecimento profundo em matemática e estatística ( o que se certa forma não seria ruim ), mas a comunidade open source não falhou antes e não vai falhar conosco agora, existem ferramentas que treinam modelos baseados em informações que damos a ele, uma que estou de olho a um tempo é a autoTRAIN da HuggingFace:

image

Esta ferramenta permite treinarmos modelos existentes (ou novos) com informações que enviamos para eles, e consultarmos tudo isso por uma api, bem molezinha!

A minha idéia seria ter uma vasta gama de snippets de códigos vulneráveis para que o modelo da GPT2, por exemplo, conseguisse identificar facilmente códigos que são vulneráveis, fazendo uma pós validação nas ferramentas SAST atuais

Opa, eae JJunqueira. Ótimo texto, de fato temos até poucas ferramentas de análise de código que leva em consideração todo o contexto, e acredito que a implantação de inteligência artificial nessa área ainda está, de certa forma, engatinhando.

A utilização do ChatGPT (que seria um GPT-3.5) ou do GPT-3 podem ser uma boa ideia, apesar de que seriam caros por serem fechados, e provavelmente poderiam cair em alguma política da OpenAI sobre má utilização. A mesma coisa pode acontecer com o AutoTrain da HuggingFace, que nem sequer possui precificação. A facilidade tem seu preço.

Hoje em dia com a comunidade open-source cada vez mais aberta, não creio que uma pessoa precise passar por todas as cadeiras para fazer um modelo desse nível do zero, entretanto se faz necessário um conhecimento acerca dos modelos já existentes, e como eles funcionam.

Em relação a modelos open source, de relevantes temos o GPT-NeoX e o GPT-J, ambos da Eleuther.ai. Você também pode utilizar o BigScience Bloom, que possui um modelo gigantesco já pronto.

Obviamente qualquer modelo que tu for se basear para fazer uma solução desta vai precisar de um fine tuning para seu caso de uso, geralmente repassando um JSON ou CSV contendo o seu conteúdo e a resposta que tu espera. No seu caso, um monte de snippet e respostas feitas de maneira manual.

Entretanto, se levar em consideração que você vai utilizar um modelo já pronto, você pode utilizar o que se é chamado de few-shot learning, que, na prática, você utiliza um modelo já pronto e adiciona algumas coisinhas a mais para ele entender o que você tá querendo dizer. Considerando que ele já tem um treinamento prévio, o modelo entende mais fácil, mesmo se você passar menos dados.

Utilizando um modelo como o GPT-NeoX é possível fazer o que tu quer, ainda mais se você utilizar um serviço hospedado por terceiros, como o NLP Cloud, que permite também o fine tuning de modelos.

Espero que as informações que eu passei acima te ajudem no seu projeto. Sucesso!

Perfeito, agregou demais! O texto foi escrito tem 2 semanas e desde então eu já obtive certo progresso! Uma empresa até propôs ajudar!