Нет, ключ к Spectre - это принудительное неверное предсказание непрямых ветвей, потому что они могут перейти на любой адрес. Нетривиально найти последовательность инструкций, которая загружает нужные секретные данные, а затем выполняет другую зависящую от данных загрузку с секретом в качестве индекса массива.
Чтобы атаковать обычную условную ветвь «принято / не принято» (например, в функции сортировки или в этом условном цикле по отсортированному или несортированному массиву), вам нужно найти случай, когда выполняется " неправильная "сторона ветки (возможно, неправильная сторона if / else в источнике) будет делать что-то полезное, когда она работает с" неправильными "значениями в регистрах. Это правдоподобно 1, но маловероятно, поэтому большинство средств защиты от Spectre будут беспокоиться только о непрямых ответвлениях.
Аппаратные исправления для Spectre должны быть более тонкими, чем «отключить прогнозирование ветвления» (т. е. останавливать конвейер при каждом условном переходе). Это, вероятно, снизит производительность на порядок в большом количестве кода. , и слишком высок, чтобы быть приемлемой защитой от локальной утечки информации (которая может привести к эскалации привилегий).
Даже отключение прогнозирования только для непрямых переходов (но не для обычных условных переходов) может оказаться слишком дорогостоящим для большей части кода пользовательского пространства, поскольку каждый вызов общей библиотеки / функции DLL проходит через косвенная ветвь в обычной программной экосистеме в основных операционных системах (Linux, OS X, Windows).
Ядро Linux экспериментирует с ретполином, чтобы победить прогнозирование косвенного перехода для косвенного перехода внутри ядра. Однако я не уверен, что он включен по умолчанию, даже в ядрах, которые включают обходной путь Meltdown (KPTI).
Сноски:
- Иногда неправильный
case
из switch
мог сделать что-то совершенно неуместное (например, в интерпретаторе), и если switch
был скомпилирован с вложенными ветвями, а не с одной косвенной ветвью, вы могли бы атаковать его. (Компиляторы часто используют таблицу целей ветвления для switch
, но когда случаев мало, это не всегда возможно. Например, для case 10
/ case 100
/ case 1000
/ default
потребуется массив из 990 записей только с 3 используемыми значениями.)
person
Peter Cordes
schedule
11.01.2018