Понимание 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,

Другие вопросы по тегам