Rowhammer-атака и код сравнения с нулём

Занимательное программирование. Почему вместо первого фрагмента кода (см. ниже) предлагается писать второй фрагмент (см. ещё ниже)?

Первый фрагмент:

if(matched != 0)
	// passwords match
else
	//passwords don't match

Второй фрагмент:

if(matched == 0x69d61fc8)
	// passwords match
else
	//passwords don't match

Потому что так предлагается защищаться от дефектов аппаратуры, приводящих к переключению битов в результате rowhammer-атак. Примеры взяты из исходной работы, где соответствующие “гаджеты” (то есть, способы сравнения в if) для проверки реквизитов доступа обнаруживаются в OpenSSH, sudo и др. Логика, стоящая за словом 0x69d61fc8, такая: rowhammer позволяет при помощи интенсивных операций с ячейками памяти переключать биты в соседних (физически) ячейках; поэтому, если используется условие “не равно нулю”, то достаточно перещёлкнуть один произвольный бит в нулевом значении переменной, чтобы равенство нарушилось и “пароли совпали” (passwords match); условие же “равно 0x69d61fc8” (или ещё какому-нибудь “перемешанному” значению) перещёлкиванием битов подогнать “несколько сложнее”.

Вообще, с точки зрения “просто программирования”, вариант matched != 0 – верный, работает, его можно использовать, никакой проблемы тут нет. А вот если подойти с точки зрения информатики и потребовать учитывать дефекты аппаратуры, то != 0 вдруг оказывается подвержено проблемам “аппаратурной” оптимизации ничуть не меньше, чем реализации алгоритмов, использующие строго фиксированное количество операций (вне зависимости от значений битов входных данных – constant-time, но не перепутайте с соответствующим классом сложности). Впрочем, в отличие от атак, измеряющих сдвиги времени исполнения, управляемое перещёлкивание произвольных битов – это, конечно, никакая не физическая особенность, а именно аппаратный дефект. Исправлять его, как и многие похожие, предлагается программно, а исправление приводит к не самым очевидным эффектам в коде на языке высокого уровня (ЯВУ) – потому что выбор значений констант для флагов таким образом, чтобы они оказывались далеко друг от друга в смысле rowhammer-метрики, это не очень близко к логике ЯВУ, да и нужно учитывать, что оптимизирующий компилятор может всё переписать на те же нули, но уже в машинном коде.

(Описание на OpenNET.)

Адрес записки: https://dxdt.ru/2023/12/23/11973/

Похожие записки:



Далее - мнения и дискуссии

(Сообщения ниже добавляются читателями сайта, через форму, расположенную в конце страницы.)

Написать комментарий

Ваш комментарий:

Введите ключевое слово "6U3Q9" латиницей СПРАВА НАЛЕВО (<--) без кавычек: (это необходимо для защиты от спама).

Если видите "капчу", то решите её. Это необходимо для отправки комментария ("капча" не применяется для зарегистрированных пользователей). Обычно, комментарии поступают на премодерацию, которая нередко занимает продолжительное время.