Изследователи от Университета Вустър представиха нов тип атака Mayhem, която използва метод на изкривяване на битове в динамична оперативна памет Rowhammer за промяна на стойностите на променливите в стека, прилагани в програмата като флагове за вземане на решение относно успешността на аутентификацията и преминаването през проверки за сигурност. Практическите примери за прилагане на атаката са демонстрирани за заобикаляне на аутентификацията в SUDO, OpenSSH и MySQL, както и за промяна на резултатите от проверки, свързани с сигурността, в библиотеката OpenSSL.
Атаката може да бъде приложена към приложения, при които проверките използват сравнение на различията на стойностите от нула. Пример за уязвим код: int auth = 0; … // код за проверка, променящ стойността на auth в случай на успешна аутентификация if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
В контекста на този пример за успешна атака е достатъчно да се постигне изкривяване на произволен бит в паметта, принадлежаща на 32-битовата променлива auth в стека. При изкривяване на произволен бит в променливата, стойността вече няма да бъде равна на нула и условният оператор ще определи успешното преминаване на аутентификацията. Подобни шаблони на проверка са широко разпространени в приложения и се срещат например в SUDO, OpenSSH, MySQL и OpenSSL.

Атаката може да бъде приложена и на сравнения от вида «if(auth == 1)», но в този случай нейното провеждане се усложнява, тъй като трябва да се изкриви не всякакъв бит от 32, а последният бит. Метода може също да се използва за влияние върху стойностите на променливите в регистрите на процесора, тъй като съдържанието на регистрите може временно да бъде записано в стека при превключване на контекста, извикване на функции или задействане на обработчик на сигнали. В периода, в който стойностите на регистрите са в паметта, в тази памет могат да се внесат изкривявания и в регистъра ще бъде възстановена променената стойност.

За изкривяване на битовете се използва една от модификациите на атаката от класа RowHammer. Паметта DRAM представлява двумерен масив от клетки, всяка от които съдържа кондензатор и транзистор. Непрекъснатото четене на една и съща област от паметта води до флуктуации на напрежението и аномалии, предизвикващи малка загуба на заряд в съседни клетки. При висока интензивност на четенето, съседната клетка може да загуби достатъчно голямо количество заряд и следващият цикъл на регенерация няма да успее да възстанови първоначалното й състояние, което ще доведе до промяна на стойността на данните, съхранявани в клетката. За защита от RowHammer производителите на чипове добавиха механизъм TRR (Target Row Refresh), който блокира изкривяването на клетките в индивидуални случаи, но не защитава от всички възможни варианти на атаката.
За защита от атаката Mayhem се препоръчва да се използва не оценка на разликите от нула или съвпадения с единица в сравненията, а проверка на съвпадение, използвайки случайна стойност с ненулеви октети. В този случай, за да се зададе необходимата стойност на променливата, е необходимо точно да се изкривят значителен брой битове, което е нереалистично, в сравнение с изкривяване на един бит. Пример за код, неподвластен на атака: int auth = 0xbe406d1a; … // код за проверка, който задава значението на auth на 0x23ab8701 в случай на успешна автентикация if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
Указаният метод за защита вече е приложен от разработчиците на sudo и влиза в състава на версия 1.9.15 като поправка на уязвимостта CVE-2023-42465. Прототип на кода за извършване на атаката се планира да бъде публикуван след внасянето на поправки в основните уязвими проекти.
Източник: opennet.ru
