Влияние исправления Spectre на производительность сортировки

Один из самых известных stackoverflow questions, почему сортировка отсортированного массива выполняется так быстро; и ответ - из-за предсказания ветвления.

Сможет ли применение исправлений Intel и Microsoft Spectre полностью аннулировать ответ, данный в этом вопросе о затронутых процессорах (процессоры Intel более старого поколения, AMD Ryzen и ARM)?


person Phillip Ngan    schedule 11.01.2018    source источник


Ответы (1)


Нет, ключ к Spectre - это принудительное неверное предсказание непрямых ветвей, потому что они могут перейти на любой адрес. Нетривиально найти последовательность инструкций, которая загружает нужные секретные данные, а затем выполняет другую зависящую от данных загрузку с секретом в качестве индекса массива.

Чтобы атаковать обычную условную ветвь «принято / не принято» (например, в функции сортировки или в этом условном цикле по отсортированному или несортированному массиву), вам нужно найти случай, когда выполняется " неправильная "сторона ветки (возможно, неправильная сторона if / else в источнике) будет делать что-то полезное, когда она работает с" неправильными "значениями в регистрах. Это правдоподобно 1, но маловероятно, поэтому большинство средств защиты от Spectre будут беспокоиться только о непрямых ответвлениях.


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

Даже отключение прогнозирования только для непрямых переходов (но не для обычных условных переходов) может оказаться слишком дорогостоящим для большей части кода пользовательского пространства, поскольку каждый вызов общей библиотеки / функции DLL проходит через косвенная ветвь в обычной программной экосистеме в основных операционных системах (Linux, OS X, Windows).

Ядро Linux экспериментирует с ретполином, чтобы победить прогнозирование косвенного перехода для косвенного перехода внутри ядра. Однако я не уверен, что он включен по умолчанию, даже в ядрах, которые включают обходной путь Meltdown (KPTI).


Сноски:

  1. Иногда неправильный case из switch мог сделать что-то совершенно неуместное (например, в интерпретаторе), и если switch был скомпилирован с вложенными ветвями, а не с одной косвенной ветвью, вы могли бы атаковать его. (Компиляторы часто используют таблицу целей ветвления для switch, но когда случаев мало, это не всегда возможно. Например, для case 10 / case 100 / case 1000 / default потребуется массив из 990 записей только с 3 используемыми значениями.)
person Peter Cordes    schedule 11.01.2018
comment
Исправление: одна из разновидностей specter - против условных переходов. Получение проверки границ кода, который использует индекс, может спекулятивно читать память и, таким образом, может в конечном итоге сделать что-то полезное для злоумышленника. - person Peter Cordes; 14.04.2021