UAF (Use-After-Free) — уязвимость, связанная с некорректным использованием динамической памяти в процессе работы программы: при освобождении ячейки памяти указатель на нее не обнуляется, что позволяет хакерам воспользоваться ею в своих целях.
Как возникает уязвимость Use After Free
Существование уязвимости UAF обусловлено принципами работы динамической памяти. Эта память, которую также называют «куча» (heap), в отличие от стека (stack), предназначена для хранения больших объемов данных. В ней могут выделяться блоки произвольного размера, которые впоследствии можно изменять или освобождать и возвращать в кучу, чтобы затем использовать их же для другой задачи в рамках той же программы.
Поскольку динамическая память неоднократно перераспределяется, программе нужно постоянно проверять, какие участки кучи свободны, а какие заняты. Этот контроль осуществляется при помощи служебных заголовков для выделенных участков памяти, содержащих адрес начала блока. Ошибка в управлении заголовками и приводит к появлению уязвимости UAF.
Ее суть в следующем. Предположим, в динамической памяти был некий набор данных и на него существовал указатель. Если этот набор данных удаляется из динамической памяти или перемещается в другой блок, а указатель не обнуляется, продолжая ссылаться на уже освобожденный участок памяти, то он становится висячим (dangling pointer). Если впоследствии программа выделит тот же участок памяти под другой объект (например, введенные злоумышленником данные), висячий указатель сработает снова, вызвав уже новый набор данных. Соответственно, получается, что уязвимость вида UAF позволяет подменять один код другим.
Возможные последствия эксплуатации Use-After-Free включают:
- разрушение данных;
- сбои в работе программы;
- выполнение произвольного кода.
Эксплуатация уязвимости UAF
Если злоумышленник решает эксплуатировать уязвимость use-after-free, то он может передать программе произвольный код или ссылку на него и через висячий указатель перейти в начало этого кода. Таким образом, вредоносный код будет исполнен, что может позволить киберперступнику получить контроль над системой жертвы.
Например, для эксплуатации UAF-уязвимости checkm8 в некоторых устройствах на iOS достаточно инициировать обновление прошивки устройства через USB, но вместо образа прошивки передать устройству команду выхода из режима восстановления DFU (Device Firmware Update). Когда система попытается снова запуститься в этом режиме, чтобы завершить прерванную сессию, злоумышленник получит возможность передать на устройство и выполнить произвольный код по адресу буфера, который был выделен еще до момента выхода и указатель на который не был обнулен.