A aprendizagem de máquina na luta contra os malwares

Peter Kováč 25 jun 2018

A evolução do Avast Evo-Gen: o uso da aprendizagem de máquina e da inteligência artificial para proteger centenas de milhões de usuários.

Introdução

Como uma das principais empresas em segurança de computadores, trabalhamos duro todos os dias para oferecer o maior nível de proteção a todos os nossos usuários. Isso exige de nós, a exploração de novas maneiras para derrotar os malwares, frequentemente experimentando tecnologia de ponta ou abordagens que nunca foram tentadas antes em nosso ambiente: ideias emprestadas da campos como a biologia ou física.

Muitos desses experimentos não trazem um resultado substancial, mas, às vezes, os resultados ultrapassam até nossas expectativas mais otimistas. Por isso, eu gostaria de falar sobre um experimento desse tipo. Começamos há seis anos e ele evoluiu para um sistema que rapidamente se tornou um dos mecanismos mais poderosos para detecção de malwares que usamos hoje na Avast.

O sistema é chamado de Evo-Gen e, caso seja um leitor assíduo do nosso blog, você pode ter ouvido falar nele em uma publicação de blog do nosso CTO, Ondřej Vlček. Em 2012, estávamos pela primeira vez no processo de implantação desse sistema para todos os usuários do Avast. Embora ele não fosse mais assunto do nosso blog, trabalhamos duro nos últimos meses, monitorando e melhorando permanentemente o sistema. Se essa é a primeira vez que você ouve falar no Evo-Gen ou simplesmente você não se lembra mais dele, vou descrevê-lo brevemente:

Evo-Gen é um sistema de aprendizagem de máquina usado para classificar amostras desconhecidas em tempo real. Para amostras reconhecidas como malignas, ele cria rapidamente uma definição que é transmitida de imediato a todos os usuários do Avast para que eles fiquem protegidos contra essa nova ameaça.

As definições que ele cria (chamadas de “evogens”) são muito pequenas e simples, o que significa que são avaliadas muito facilmente. Além disso, em geral, cada evogen protege contra mais de uma ameaça. Essas definições são criadas para serem tão genéricas que cobrem mais de uma variante de uma determinada ameaça.

Evo-Gen em números

Desde sua implantação em escala no início de 2013, o Evo-Gen criou mais de 1,2 milhão de definições dessa natureza que identificaram quase 500 milhões de amostras únicas de malware. Se você fez as contas, isso significa que, todos os dias, 600 evogens são criados e cada um deles identifica mais de 400 amostras, em média! Os conjuntos de dados que ele usa para cada decisão cresceram consideravelmente, de alguns milhões para mais de cem milhões de amostras únicas e isso não leva em consideração as centenas de milhões a mais que usamos para análise offline e inteligência de ameaças. O maior crescimento ocorreu graças à aquisição da AVG, que enriqueceu os conjuntos de dados com dezenas de milhões de novas amostras.

O sistema é totalmente automatizado e nenhuma interação humana é necessária. Ele está trabalhando 24/7 para analisar as amostras que são recebidas e compará-las com a imensa coleção de amostras reunidas ao longo dos anos. Todas as definições que ele produz são enviadas quase instantaneamente a todos os usuários do Avast, usando nossa tecnologia de atualizações streaming, oferecendo assim uma proteção de alta qualidade em tempo hábil.

Em casos raros, há um erro e a definição emitida que precisa ser desativada. Quando isso acontece, o sistema aprende com isso e não comete novamente o mesmo erro. De todos os evogens criados até o momento, mais de 40% ainda estão ativos e são usados todos os dias. Alguns desses são verdadeiros recordistas, por identificar não centenas, mas milhões de amostras únicas.

Evolução do Evo-Gen

Como mencionei no início dessa publicação, todo o sistema passou por muitas mudanças desde a sua implantação no início de 2013. Ele evoluiu de uma pequena prova de conceito com definições de vida breve até um mecanismo de detecção de malware estável e de alta qualidade. Isso é ainda mais evidente no gráfico totalizado abaixo onde você pode ver que, no passado, precisávamos desativar muito mais evogens que hoje em dia:

Avast Machine Learning: The Evo-Gen

Você pode notar o pico no número de definições criadas no verão de 2013. Naquela época, queríamos que o Evo-Gen produzisse definições mais genéricas para cobrir uma variedade maior de ameaças. Por isso, aumentamos sua capacidade de ser aleatório e gerar mais definições. No entanto, alguns meses depois, essa alteração precisou ser revertida, pois constatamos que era muito agressiva, e voltamos a uma abordagem mais determinística. Foi interessante ver como em nossos testes internos, não enfrentamos nenhum problema ao adicionar mais aleatoriedade, mas a incrível variedade de amostras no mundo externo fez com que nosso sistema produzisse definições demais, além de falsos positivos em casos extremos. Descobrir esse problema em um ambiente de laboratório não era possível e foi preciso aprender essa lição na prática.

Durante 2014, focamos principalmente em estabilizar o sistema com a correção de bugs e cuidando dos casos extremos ocasionais. Depois, em 2015, começamos a pensar em uma grande reforma no algoritmo do gerador. Até agora, nossa abordagem ainda não aproveita realmente todas as capacidades do sistema de banco de dados subjacente, especificamente a pesquisa de similaridade que foi usada de maneira muito ingênua para executar uma pesquisa k-NN com algumas restrições específicas de domínio e regras de conhecimento especializadas.

Depois de algumas pesquisas, concluímos que usar o HDBSCAN (uma variante do https://en.wikipedia.org/wiki/DBSCAN ) era o mais adequado e nossos testes preliminares foram promissores. No entanto, desenvolver uma variante que tivesse um bom desempenho sob as restrições de tempo que tínhamos (lembre-se de que o sistema deveria criar uma definição em tempo real) se mostrou muito desafiador, por isso, levou mais de um ano para implantá-la em ambiente de produção. Isso aconteceu no final de 2016 e foi um sucesso absoluto. Apenas alguns meses depois do desenvolvimento, vimos uma redução drástica no número de evogens desativados, devido a falsos positivos internos e externos. Em 2017, fizemos alguns pequenos ajustes ao algoritmo e melhoramos o desempenho dos bancos de dados subjacentes, o que aumentou ainda mais o seu desempenho.

O gráfico abaixo compara o gerador de definições novo com o antigo, com relação à cobertura de amostras de definição (a quantidade de amostras únicas que cada definição é capaz de identificar). Você pode ver que a versão antiga gerou evogens com menor cobertura do que a nova. Vimos um aumento considerável nas amostras detectadas, além de taxa muito menor de evogens desativados. O Evo-Gen se tornou um dos mecanismos mais fortes de detecção, superando sistemas antigos em qualidade e velocidade.

Avast Machine Learning: The Evo-Gen samples

Mais melhorias

Mas, não vamos parar por aqui. Vamos primeiro examinar o que torna o Evo-Gen tão poderoso:

  • Evogens são rápidos: leva segundos para gerar uma definição de uma nova ameaça e entregá-la a nossos usuários

  • Evogens são baratos: devido a otimizações extremas, executar o sistema Evo-Gen exige apenas alguns servidores e nenhuma interação humana, em qualquer etapa do processo

  • Evogens são seguros: graças à maneira como eles funcionam (e os enormes bancos de dados que utilizam), grandes falsos positivos são muito improváveis (tivemos apenas 2 ou 3 grandes falsos positivos e nenhum crítico em toda a história do Evo-Gen)

As características acima são o que tornam a aprendizagem de máquina tão útil. É também muito mais fácil de dimensionar que uma equipe com pessoas, pois você pode comprar facilmente mais alguns servidores. Contratar vários analistas de malware qualificados é muito difícil.

No entanto, há uma desvantagem. Como as ameaças precisam ser neutralizadas muito antes de serem compreendidas e mapeadas completamente, evogens individuais não podem ser ajustados à perfeição, pois precisam ser lançados assim que possível. Isso leva à criação de vários evogens para uma única família de malware e, em alguns casos, até centenas deles. O gráfico abaixo ilustra bem como a redundância acontece:

avast-blog-evogen-flow

Na primeira imagem acima, vemos três círculos amarelos que representam poucas variantes (amostras) de uma família de malware. Eles estão contidos dentro de um anel cinza que representa uma definição (evogen A), que é capaz de identificá-las. No entanto, mais tarde, mais variantes (vermelho) emergem e, embora ainda algumas sejam identificadas pelo evogen A, outras não são. Assim, o evogen B é criado para lidar com elas. Isso se repete na terceira image, com variantes azuis e o evogen C. A última imagem mostra a situação ideal onde uma definição (evogen D) é capaz de cuidar de todas as variantes.

Se alguém já tivesse todas as amostras, seria certamente possível criar apenas um ou poucos evogens que cobririam tudo isso. Isso facilitaria o escaneamento de ameaças: quanto menos definições, menos tempo o processo consome e as atualizações podem ser menores. Infelizmente, isso não é possível na prática, pois exige uma espera por mais amostras, o que permite que as primeiras se espalhem. E isso não é aceitável para nós. Felizmente, essa redundância pode ser resolvida posteriormente, com a resolução de um problema bem conhecido, chamado de “problema de cobertura por conjuntos”. Nesse problema, alguém definiu os elementos (em nosso caso as amostras de malware) e a coleção de conjuntos (evogens), cuja união é igual a todos os elementos. A meta é identificar o menor subconjunto de conjuntos (evogens) cuja união ainda seja igual a todos os elementos. Esse é um problema NP-completo, mas, felizmente para nós, não precisamos de uma solução perfeita, basta a melhor possível. Criamos uma ferramenta que faz exatamente isso e, após alimentá-la com os dados (mais de meio milhão de evogens e quase 500 milhões de ameaças), fomos recompensados com o resultado a seguir:

avast-evogens-full

Quase 60% dos evogens foram marcados como redundantes, o que significa que podemos removê-los com segurança e obter uma enorme otimização. Claro, na prática, para estarmos seguros seremos um pouco mais conservadores, mas isso mostra que nós podemos reduzir o número de definições significativamente sem afetar em nada a nossa capacidade de proteção. Menos definições significa escaneamentos mas rápidos e atualizações menores, por isso, o usuário também ganha.

Uma coisa que pode ser notada é que, recentemente, a redundância parece estar voltando, mas isso é apenas uma verdade parcial. A redundância sempre existiu, mas, anteriormente, tínhamos mais evogens ruins. Assim, muitos evogens redundantes já tinham sido desativados e estavam “ocultos” (parte da barra vermelha). Além disso, o novo algoritmo implantado no final de 2016 é muito melhor para prever o grupo de ameaças real, mas se parece com a ameaça de vários pontos de vista (dependendo da amostra específica que ele analisa), o que leva a uma sobreposição de evogens corretos. O algoritmo mais antigo não tinha esse recurso, pois era muito aleatório ou muito determinístico.

Conclusão

Na Avast, nosso compromisso é manter nossos usuários seguros online e sempre procuramos por maneiras de protegê-los. O Evo-Gengen é um bom exemplo de uma tecnologia que levou tempo para ser desenvolvida, mas que definitivamente compensou, ajudando-nos a aumentar o nível de proteção que podemos oferecer a nossos usuários.  Nós estamos sempre investigando e procurando novas oportunidades para manter a Avast e nossos usuários protegidos no mundo sempre em transformação das ameaças de malware.

--> -->