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/
Похожие записки:
- Gitea и омоглифы не в ту сторону
- Наложенные сети Google и браузеры в будущем
- Персоны и идентификаторы
- Синхронное время и "тики"
- Пеленгация с разнесением по времени
- Шифр "Кузнечик" на ассемблере arm64/AArch64 со 128-битными инструкциями
- ИИ на модных LLM/VLM и задачи-картинки
- Различительная способность "обезличенных" данных
- LibreSSL и поддержка криптосистем ГОСТ
- Квантовая криптография и криптосистемы электронной подписи
- Реплика: перенос доменных имён и GoDaddy
Написать комментарий