
Exemplo de uso do exploit "Spectre" revelado (CVE-2017-5753 e CVE-2017-5715)
Exemplo de uso do exploit "Spectre" revelado em 2 de janeiro de 2018 (CVE-2017-5753 e CVE-2017-5715)
O Spectre quebra o isolamento entre diferentes aplicações. Ele permite que um atacante engane programas livres de erros, que seguem as melhores práticas, fazendo-os vazar seus segredos. Na verdade, as verificações de segurança dessas melhores práticas aumentam a superfície de ataque e podem tornar as aplicações mais suscetíveis ao Spectre.
C, usa as bibliotecas:
Colocamos o texto "The Magic Words are Squeamish Ossifrage." na memória e então tentamos lê-lo usando o exploit. Se o sistema for 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 de programa, a função leria apenas de array1[0..15], pois o tamanho de array1 é 16. No entanto, quando executada especulativamente, leituras fora dos limites são possíveis. A função readMemoryByte() faz várias chamadas de treinamento a victim_function() para fazer o preditor de desvios esperar valores válidos para x, e então faz uma chamada com um x fora dos limites. O desvio condicional é previsto incorretamente, e a execução especulativa resultante lê um byte secreto usando o x fora dos limites. O código especulativo então lê de array2[array1[x] * 512], vazando o valor de array1[x] para o estado do cache. Para completar o ataque, um simples flush+probe é usado para identificar qual linha de cache em array2 foi carregada, revelando o conteúdo da memória. O ataque é repetido várias vezes, de modo que, mesmo que o byte alvo não estivesse inicialmente no cache, a primeira iteração o trará para o cache.
O código não otimizado lê aproximadamente 10KB/segundo em um i7 Surface Pro 3.
gcc -std=c99 Source.c -o spectre.out
ou
make
Crie um novo projeto vazio, adicione Source.c e clique em Build.
.\spectre.out sem parâmetros.
.\spectre.out {address} {length} com parâmetros: