Badacze z Worcester Polytechnic Institute (USA) zaprezentowali nowy typ ataku Mayhem, wykorzystującego metodę zniekształcania bitów w dynamicznej pamięci operacyjnej Rowhammer, aby zmienić wartości zmiennych na stosie, które są używane w programie jako flagi do podejmowania decyzji o sukcesie uwierzytelnienia i przechodzeniu testów bezpieczeństwa. Praktyczne przykłady zastosowania ataku pokazano w celu obejścia uwierzytelnienia w SUDO, OpenSSH i MySQL, a także do zmiany wyników testów związanych z bezpieczeństwem w bibliotece OpenSSL.
Atak można zastosować w aplikacjach, w których podczas weryfikacji używa się porównania różnic od zera. Przykład podatnego kodu: int auth = 0; … // kod weryfikacji, zmieniający wartość auth w przypadku udanego uwierzytelnienia if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
W kontekście tego przykładu, aby atak był udany, wystarczy doprowadzić do zniekształcenia dowolnego bitu w pamięci, który dotyczy 32-bitowej zmiennej auth na stosie. Przy zniekształceniu dowolnego bitu w zmiennej, jej wartość już nie będzie równa zero, a operator warunkowy zdefiniuje udane przejście uwierzytelnienia. Podobne schematy weryfikacji są dość powszechne w aplikacjach i występują na przykład w SUDO, OpenSSH, MySQL i OpenSSL.

Atak można również zastosować na porównania typu „if(auth == 1)”, ale w tym przypadku jego przeprowadzenie komplikuje się, ponieważ trzeba zniekształcić nie dowolny bit z 32, a ostatni bit. Metoda ta może być również używana do wpływania na wartości zmiennych w rejestrach procesora, ponieważ zawartość rejestrów może być na czas zrzucana na stos podczas przełączania kontekstu, wywoływania funkcji lub uruchamiania obsługi sygnałów. W czasie, gdy wartości rejestrów znajdują się w pamięci, można wprowadzać w tej pamięci zniekształcenia, co pozwoli na przywrócenie zmienionej wartości do rejestru.

Do zniekształcenia bitów stosuje się jedną z modyfikacji ataku klasy RowHammer. Ponieważ pamięć DRAM jest dwuwymiarową tablicą komórek, z których każda składa się z kondensatora i tranzystora, wykonywanie ciągłego odczytu tej samej części pamięci prowadzi do wahań napięcia i anomalii, powodujących niewielką utratę ładunku w sąsiednich komórkach. Jeśli intensywność odczytu jest duża, sąsiednia komórka może stracić wystarczająco dużą ilość ładunku, a kolejny cykl regeneracji nie zdąży przywrócić jej pierwotnego stanu, co prowadzi do zmiany wartości przechowywanych w komórce danych. Aby chronić przed RowHammer, producenci chipów dodali mechanizm TRR (Target Row Refresh), który blokuje zniekształcenie komórek w szczególnych przypadkach, ale nie chroni przed wszystkimi możliwymi wariantami ataku.
Aby chronić przed atakiem Mayhem, zaleca się stosowanie w porównaniach nie oceny różnic od zera lub zgodności z jedynką, ale sprawdzanie zgodności z użyciem losowej wartości z niezerowymi oktetami. W tym przypadku, aby ustawić pożądaną wartość zmiennej, należy dokładnie zniekształcić znaczną liczbę bitów, co jest nierealistyczne, w przeciwieństwie do zniekształcenia jednego bitu. Przykład kodu odpornego na atak: int auth = 0xbe406d1a; … // kod weryfikacji, ustawiający wartość auth na 0x23ab8701 w przypadku udanej autoryzacji if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
Wskazana metoda ochrony została już zaimplementowana przez twórców sudo i weszła w skład wydania 1.9.15 jako poprawka dla podatności CVE-2023-42465. Prototyp kodu do przeprowadzenia ataku planuje się opublikować po wprowadzeniu poprawek w głównych podatnych projektach.
Źródło: opennet.ru
