Вопрос:

Как атака Spectre считывает кэш, который он обманул для загрузки ЦП?

security cpu cpu-architecture spectre side-channel-attacks

1274 просмотра

2 ответа

7898 Репутация автора

Я понимаю ту часть статьи, где они обманывают процессор, чтобы спекулятивно загрузить часть памяти жертвы в кэш процессора. Часть я не понимаю, как они получают его из кэша.

Автор: NoSenseEtAl Источник Размещён: 05.01.2018 06:50

Ответы (2)


9 плюса

22447 Репутация автора

Они не извлекают его напрямую (за пределами считанных байтов процессор «не удаляется» и не может быть замечен атакующим при атаке).

Вектор атаки состоит в том, чтобы делать «поиск» поочередно. После того, как кэш ЦП был подготовлен (очищает кэш там, где он должен быть) и «научен», что ветвь if проходит, пока условие полагается на не кэшированные данные, ЦП умозрительно выполняет пару строк из если область действия, включая доступ за пределы допустимого диапазона (предоставление байта B), а затем немедленно получить доступ к некоторому авторизованному некэшируемому массиву по индексу, который зависитна один бит секрета B (B никогда не будет виден атакующему напрямую). Наконец, злоумышленник извлекает тот же самый массив разрешенных данных, скажем, из индекса, рассчитанного с помощью бита B, скажем, с нуля: если извлечение этого байта ok выполняется быстро, данные все еще находятся в кэше, то есть бит B равен нулю. Если поиск (относительно) медленный, ЦП должен был загрузить в свой кеш данные, которые подтвердили данные, что означало, что раньше это не происходило, то есть бит B был равен единице.

Например, Condвсе, что ValidArrayне кэшировано, LargeEnoughдостаточно велико, чтобы гарантировать, что процессор не загрузит оба ValidArray[ valid-index + 0 ]и ValidArray[ valid-index + LargeEnough ]в своем кэше за один раз

if ( Cond ) {
   // the next 2 lines are only speculatively executed
   V = SomeArray[ out-of-bounds-attacked-index ]
   Dummy = ValidArray [ valid-index + ( V & bit ) * LargeEnough ]
}

// the next code is always retired (executed, not only speculatively)

t1 = get_cpu_precise_time()
Dummy2 = ValidArray [ valid-index ]
diff = get_cpu_precise_time() - t1

if (diff > SOME_CALCULATED_VALUE) {
   // bit was its value (1, or 2, or 4, or ... 128) 
}
else {
   // bit was 0
}

где bitпытался последовательно быть первым 0x01, потом 0x02... до 0x80. Измеряя «время» (число циклов ЦП), который «следующий» код берет для каждого бита, выявляется значение V:

  • если ValidArray[ valid-index + 0 ]есть в кеше, V & bitесть0
  • в противном случае V & bitэтоbit

Это занимает время, каждый бит требует подготовки кэш-памяти L1 ЦП, пытается несколько раз один и тот же бит, чтобы минимизировать ошибки синхронизации и т. Д ...

Тогда правильная атака "смещение" должна быть определена, чтобы прочитать интересную область.

Умная атака, но не так просто реализовать.

Автор: Ring Ø Размещён: 07.01.2018 08:05

4 плюса

5126 Репутация автора

как они извлекают его из кеша

По сути, секрет, полученный спекулятивно, сразу же используется как индекс для чтения из другого вызываемого массива side_effects. Все, что нам нужно, это «прикоснуться» к индексу в side_effectsмассиве, чтобы соответствующий элемент попал из памяти в кеш процессора:

secret = base_array[huge_index_to_a_secret];
tmp = side_effects[secret * PAGE_SIZE];

Затем side_effectsизмеряется задержка доступа к каждому элементу в массиве и сравнивается с временем доступа к памяти:

for (i = 0; i < 256; i++) {
    start = time();
    tmp = side_effects[i * PAGE_SIZE];
    latency = time() - start;
    if (latency < MIN_MEMORY_ACCESS_TIME)
        return i; // so, thas was the secret!
}

Если время ожидания меньше минимального времени доступа к памяти, элемент находится в кеше, поэтому секрет был текущим индексом. Если задержка высока, элемент не находится в кеше, поэтому мы продолжаем наши измерения.

Таким образом, в основном мы не получаем какую-либо информацию напрямую, скорее, мы касаемся некоторой памяти во время спекулятивного выполнения и затем наблюдаем побочные эффекты.

Вот основанное на Призраке доказательство концепции Meltdown в 99 строках кода, которое вам может быть легче понять, чем другие PoC: https://github.com/berestovskyy/spectre-meltdown

В целом, эта техника называется атакой по боковому каналу, и дополнительную информацию можно найти в Википедии: https://en.wikipedia.org/wiki/Side-channel_attack.

Автор: Andriy Berestovskyy Размещён: 03.02.2018 11:44
Вопросы из категории :
32x32