No evento de segurança BlueHat IL 2019, o engenheiro da Microsoft Matt Miller descreveu como o cenário de vulnerabilidades de software evoluiu nos últimos 20 anos, e a abordagem que a Microsoft vem adotando para lidar com ameaças.
Curiosamente, entre os principais culpados pelos bugs de segurança, diz Miller, estão os problemas de segurança de memória, que representam 70% do total de falhas de segurança corrigidas pela Microsoft.
A análise das causas-raiz de vulnerabilidades de segurança é o primeiro passo a ser dado para definir uma abordagem eficaz de mitigação de riscos, de acordo com Miller:
Em geral, desde o início de 2006, problemas de segurança de memória continuam sendo o tipo mais comum na categoria de vulnerabilidades que estamos observando. Cerca de 70% das vulnerabilidades abordadas por meio de uma atualização de segurança a cada ano estão relacionadas a um problema de segurança da memória.
A segurança de memória é uma categoria ampla, incluindo vários tipos de problemas, de corrupção de pilha e de heap para uso após desalocação, acesso de memória não inicializado etc. Analisando a evolução dessas subcategorias, Miller aponta que corrupções de pilha passaram de uma proporção importante de vulnerabilidades a quase nada.
Da mesma forma, o uso após a desalocação representava mais de 50% das vulnerabilidades em 2013-2015 devido a erros do navegador web, porém diminuiu significativamente graças ao uso da coleta de lixo. Por outro lado, aumentaram nos últimos anos a leitura fora do limite do heap (heap out-of-bounds read), além da confusão de tipos e acessos não-inicializados.
Passando de vulnerabilidades descobertas para vulnerabilidades realmente exploradas por hackers, Miller apresenta uma visão diferente, onde o acesso à memória depois de liberação e a corrupção do heap são os tipos de vulnerabilidade mais explorados.
Segundo Miller, saber onde surgem problemas de segurança e quais tipo de vulnerabilidade os hackers preferem não contribui ativamente para reduzir vulnerabilidades de um sistema. Vários desafios devem ser superados: "ainda vemos muitos erros iguais aos cometidos há 10 anos".
Há vários motivos, incluindo complexidades ao lidar com comportamentos indefinidos em linguagens como C e C++; a falta de ferramentas ou de treinamento; ou mesmo o fato de que sistemas são cada vez mais desenvolvidos por diferentes grupos seguindo políticas e padrões de segurança diferentes.
Outra área de melhorias é encontrar formas de quebrar técnicas de exploração (exploit) por invasores. Essas explorações tendem a usar o mesmo padrão geral: usar uma vulnerabilidade para ler ou gravar num local de memória arbitrário e descobrir detalhes sobre o programa, como quais DLLs são usadas etc. De posse dessas informações, é montado um pacote malicioso para tentar controlar o fluxo do programa, corrompendo um ponteiro de função ou um ponteiro de tabela virtual etc.
Em resumo, segundo Miller, a abordagem mais promissora para reduzir vulnerabilidades envolve mudanças mais radicais:
- Tornar o código mais seguro, eliminando categorias comuns de vulnerabilidades de segurança de memória;
- Usar linguagens mais seguras como C# ou Rust, ou melhorar as linguagens existentes, como C++.
- Aprimorar o processo de desenvolvimento e as ferramentas, incluindo "autofix" do compilador e técnicas similares.
Há muito mais na palestra de Miller; não deixe de assistir a o vídeo da apresentação para conhecer outros detalhes.