Понимание Spectre и адресации памяти
Сначала отказ от ответственности: я не собираюсь никого взламывать, я просто хотел бы увидеть эксплойт в действии на моей собственной машине.
Я скомпилировал пример Spectre в VS2017 на 64-разрядной Windows 10.
Пример работает при чтении из собственной памяти процесса, но если я пытаюсь читать из моего тестового приложения, я получаю только строку нулей или другие подобные символы.
тестовое приложение:
#include "stdafx.h"
#include <string>
#include <iostream>
const char *gotroot = "The Magic Words are Squeamish Ossifrage.";
using namespace std;
int main()
{
printf("%p",gotroot);
string endd;
cin >> endd;
printf("%s", gotroot);
return 0;
}
Я запускаю приложение и копирую адрес в командную строку Spectre, но не получаю строку.
Я не мог понять, была ли Windows 10 уже исправлена?
Но я также пробовал в Ubuntu 17.04, которая не обновлялась некоторое время, с тем же результатом.
Что-то не так с моим подходом?
1 ответ
Призрак - это уязвимость. Я предполагаю, что эта "командная строка призрака", которую вы упоминаете, является каким-то конкретным инструментом реализации / тестирования? Какую целевую ветку он использует? Предположительно, это косвенная ветвь в ядре, в противном случае вы можете дать ему адреса только в виртуальном адресном пространстве любой целевой программы, на которую оно атакует.
Таким образом, вам понадобится адрес ядра физической памяти, которую использует целевой процесс, в части виртуального адресного пространства ядра, которая отображает всю физическую память. (Или что бы Windows ни делала, я забываю. Но она, очевидно, отличается от простой карты "всё в памяти" в Linux с дизайном огромных страниц 1G). Но оба используют верхнюю половину виртуального адресного пространства для адресов ядра. Документ Meltdown объясняет, как / почему ядра отображают всю память (и оставляет ее отображенной глобально, защищенной битом user / supervisor в таблицах страниц, если им не нужно обходить Meltdown на процессорах Intel. Meltdown побеждает этот бит разрешения.) Но ядро будет отображать его каждый раз, когда выполняет собственный код, и, таким образом, Spectre может воспользоваться этим отображением. Обходной путь Meltdown - отключить отображение страниц ядра при запуске кода из пользовательского пространства. Spectre обманывает процессор, заставляя его умело выполнять некоторые команды ядра в режиме ядра.
Во всяком случае, это отличается от char*
значение, которое ваш процесс использует в своем собственном виртуальном адресном пространстве. Та же страница физической памяти глобально отображается на высокий адрес, как часть области отображения всего ядра, и (когда ваш процесс выполняется) также на низкий адрес для использования кодом пользовательского пространства. Это последний адрес, который вы видите с %p
,