Exemplo de uso do exploit "Spectre" revelado de 2 de janeiro de 2018 (CVE-2017-5753 e CVE-2017-5715)
Spectre quebra o isolamento entre diferentes aplicativos. Ele permite que um invasor engane programas livres de erros, que seguem as melhores práticas, para que vazem seus segredos. Na verdade, as verificações de segurança dessas práticas recomendadas aumentam a superfície de ataque e podem tornar os aplicativos mais suscetíveis ao Spectre.
C, usa bibliotecas:
Estamos colocando o texto "As palavras mágicas são Squeamish Ossifrage". na memória e então tentamos lê-lo usando exploit. Se o sistema estiver vulnerável, você verá o mesmo texto na saída, lido da memória.
Neste código, se as instruções compiladas em victim_function()
fossem executadas em ordem estrita do programa, a função leria apenas array1[0..15]
já que array1 size = 16. No entanto, quando executada especulativamente, leituras fora dos limites são possíveis. A função readMemoryByte()
faz várias chamadas de treinamento para victim_function()
para fazer o preditor de ramificação esperar valores válidos para x e, em seguida, chama com um x fora dos limites. A ramificação condicional faz uma previsão errada e a execução especulativa que se segue lê um byte secreto usando o x fora dos limites. O código especulativo então lê array2[array1[x] * 512]
, vazando o valor de array1[x]
para o estado de cache. Para completar o ataque, um simples flush+probe é usado para identificar qual linha de cache no array2
foi carregada, revelando o conteúdo da memória. O ataque é repetido várias vezes, portanto, mesmo que o byte alvo tenha sido inicialmente removido do cache, a primeira iteração o trará para o cache.
O código não otimizado lê aproximadamente 10 KB/segundo em um i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
ou make
Crie um novo projeto vazio e adicione Source.c e clique em Build.
.spectre.out
sem parâmetros.
.spectre.out {address} {length}
com parâmetros: