What's new
Runion

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Mayhem - атака, искажающая биты в памяти для обхода аутентификации в sudo и OpenSSH

INC.

Midle Weight
Депозит
$0
int auth = 0;
... // код проверки, меняющий значение auth в случае успешной аутентификации
if(auth != 0)
return AUTH_SUCCESS;
else
return AUTH_FAILURE;
int auth = 0xbe406d1a;
... // код проверки, выставляющий значение auth в 0x23ab8701 в случае успешной аутентификации
if(auth == 0x23ab8701)
return AUTH_SUCCESS;
else
return AUTH_FAILURE;
Исследователи из Вустерского политехнического института (США) представили новый тип атаки Mayhem, использующий метод искажения битов в динамической оперативной памяти Rowhammer для изменения значений переменных в стеке, применяемых в программе в качестве флагов для принятия решения об успешности аутентификации и прохождения проверок безопасности. Практические примеры применения атаки продемонстрированы для обхода аутентификации в SUDO, OpenSSH и MySQL, а также для изменения результата проверок, связанных с безопасностью, в библиотеке OpenSSL.

Атака может быть применена к приложениям, в которых при проверках используется сравнение отличий значений от нуля. Пример уязвимого кода:



В контексте данного примера для успешной атаки достаточно добиться искажения любого бита в памяти, приходящейся на 32-разрядную переменную auth в стеке. При искажении любого бита в переменной значение уже не будет равно нулю и условный оператор определит успешное прохождение аутентификации. Подобные шаблоны проверки достаточно распространены в приложениях и встречаются, например, в SUDO, OpenSSH, MySQL и OpenSSL.


Атака может быть применена и на сравнения вида "if(auth == 1)", но в этом случае её проведение усложняется, так как нужно исказить не любой бит из 32, а последний бит. Метод также может использоваться для влияния на значения переменных в процессорных регистрах, так как содержимое регистров может быть на время сброшено в стек при переключении контекста, вызове функций или срабатывании обработчика сигнала. В промежуток времени, пока регистровые значения находятся в памяти, в эту память можно внести искажения и в регистр будет восстановлено изменённое значение.


Для искажения битов применяется одна из модификаций атаки класса RowHammer. Так как память DRAM представляет собой двухмерный массив ячеек, каждая из которых состоит из конденсатора и транзистора, выполнение непрерывного чтения одной и той же области памяти приводит к флуктуации напряжения и аномалиям, вызывающим небольшую потерю заряда соседних ячеек. Если интенсивность чтения большая, то соседняя ячейка может потерять достаточно большой объём заряда и очередной цикл регенерации не успеет восстановить её первоначальное состояние, что приведёт к изменению значения сохранённых в ячейке данных. Для защиты от RowHammer производители чипов добавили механизм TRR (Target Row Refresh), который блокирует искажение ячеек в частных случаях, но не защищает о всех возможных вариатов атаки.

Для защиты от атаки Mayhem рекомендуется использовать в сравнениях не оценку отличий от нуля или совпадения с единицей, а проверку совпадений, используя случайное значение затравки c ненулевыми октетами. В этом случае для выставления нужного значения переменной необходимо точно исказить существенное число битов, что нереалистично, в отличие от искажения одного бита. Пример не подверженного атаке кода:



Указанный метод защиты уже применён разработчиками sudo и вошёл в состав выпуска 1.9.15 как исправление уязвимости CVE-2023-42465. Прототип кода для совершения атаки планируют опубликовать после внесения исправлений в основные уязвимые проекты.
 
Top