Para aqueles sem um histórico de programação de baixo nível, o ASLR pode ser confuso. Para compreendê-lo, você deve primeiro entender a memória virtual.
O que é memória virtual?
A memória virtual é uma técnica de gerenciamento de memória com muitos benefícios, mas foi criada principalmente para facilitar a programação. Imagine que você tenha o Google Chrome, o Microsoft Word e vários outros programas abertos em um computador com 4 GB de RAM. Como um todo, os programas neste computador usam muito mais que 4 GB de RAM. No entanto, nem todos os programas estarão ativos o tempo todo ou precisarão de acesso simultâneo a essa RAM.
O sistema operacional aloca pedaços de memória para programas chamados Páginas. Se não houver RAM suficiente para armazenar todas as páginas de uma vez, as páginas com menor probabilidade de serem necessárias serão armazenadas no disco rígido mais lento (mas mais espaçoso). Quando as páginas armazenadas são necessárias, elas alternam os espaços com menos páginas necessárias atualmente na RAM. Esse processo é chamado de paginação e empresta seu nome ao arquivo pagefile.sys no Windows.
A memória virtual torna mais fácil para os programas gerenciar sua própria memória, além de torná-los mais seguros. Os programas não precisam se preocupar com o local onde outros programas armazenam dados ou com quanta memória RAM resta. Eles podem apenas solicitar ao sistema operacional memória adicional (ou retornar memória não usada) conforme necessário. Tudo o que o programa vê é um único bloco contínuo de endereços de memória para uso exclusivo, chamado de endereços virtuais. O programa não pode examinar a memória de outro programa.
Quando um programa precisa acessar a memória, ele fornece ao sistema operacional um endereço virtual. O sistema operacional entra em contato com a unidade de gerenciamento de memória da CPU (MMU). A MMU traduz entre endereços virtuais e físicos, retornando essas informações ao sistema operacional. Em nenhum momento o programa interage diretamente com a RAM.
O que é o ASLR?
A ASLR (Address Space Layout Randomization) é usada principalmente para proteger contra ataques de estouro de buffer. Em um estouro de buffer, os atacantes alimentam uma função com o máximo de dados indesejados que podem manipular, seguidos por uma carga maliciosa. A carga irá sobrescrever os dados que o programa pretende acessar. Instruções para pular para outro ponto no código são uma carga útil comum. O famoso método JailbreakMe de jailbreak do iOS 4, por exemplo, usou um ataque de estouro de buffer, levando a Apple a adicionar o ASLR ao iOS 4.3.
Os estouros de buffer exigem que um invasor saiba onde cada parte do programa está localizada na memória. Descobrir isso geralmente é um processo difícil de tentativa e erro. Depois de determinar isso, eles devem criar uma carga útil e encontrar um local adequado para injetá-la. Se o atacante não souber onde seu código de destino está localizado, pode ser difícil ou impossível explorá-lo.
O ASLR trabalha em conjunto com o gerenciamento de memória virtual para randomizar os locais de diferentes partes do programa na memória. Toda vez que o programa é executado, componentes (incluindo pilha, heap e bibliotecas) são movidos para um endereço diferente na memória virtual. Os invasores não podem mais saber onde o alvo está por tentativa e erro, porque o endereço será diferente a cada vez. Geralmente, os aplicativos precisam ser compilados com suporte a ASLR, mas isso está se tornando o padrão, e é até mesmo necessário no Android 5.0 e posterior.
Então, o ASLR ainda protege você?
Na última terça-feira, pesquisadores da SUNY Binghamton e da Universidade da Califórnia, em Riverside, apresentaram um artigo chamado Jump Over ASLR: Preditores de Filiais Atacantes para Evitar o ASLR. O documento detalha uma maneira de atacar o Branch Target Buffer (BTB). O BTB é parte do processador que acelera as declarações, prevendo o resultado. Usando o método dos autores, é possível determinar os locais das instruções de ramificação conhecidas em um programa em execução. O ataque em questão foi realizado em uma máquina Linux com processador Intel Haswell (lançado pela primeira vez em 2013), mas provavelmente poderia ser aplicado a qualquer sistema operacional e processador moderno.
Dito isso, você não deve necessariamente se desesperar. O artigo ofereceu algumas maneiras que os desenvolvedores de hardware e sistemas operacionais podem atenuar essa ameaça. Novas técnicas de ASLR de grão fino exigiriam mais esforço do invasor, e aumentar a quantidade de entropia (aleatoriedade) pode inviabilizar o ataque Jump Over. Muito provavelmente, novos sistemas operacionais e processadores estarão imunes a esse ataque.
Então, o que resta para você façam? O desvio do Jump Over é novo e ainda não foi visto na natureza. Quando os invasores exploram, a falha aumenta o dano em potencial que um atacante pode causar em seu dispositivo. Esse nível de acesso não é sem precedentes; A Microsoft e a Apple implementaram apenas o ASLR em seus sistemas operacionais lançados em 2007 e posteriormente. Mesmo que esse estilo de ataque se torne comum, você não ficará pior do que estava nos dias de Windows XP.
Tenha em mente que os invasores ainda precisam obter o código deles no seu dispositivo para causar algum dano. Essa falha não fornece nenhuma maneira adicional de infectar você.Como sempre, você deve seguir as práticas recomendadas de segurança. Use antivírus, fique longe de sites e programas esboçados e mantenha seu software atualizado. Ao seguir estas etapas e manter os agentes maliciosos fora do seu computador, você estará tão seguro quanto nunca esteve.
Crédito de imagem: Steve / Flickr