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:
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