Use-After-Free (UAF)

Use-After-Free (UAF) - это уязвимость памяти, возникающая в программах с ручным управлением памятью (например, на C или C++), когда программа продолжает использовать указатель после того, как область памяти, на которую он ссылается, была освобождена . Такой указатель называется "висячим" (dangling pointer). Если злоумышленнику удастся управлять повторным выделением этой памяти, он может подменить данные и заставить программу выполнить произвольный код или вызвать сбой .

Механизм возникновения UAF обычно выглядит следующим образом: программа выделяет память под объект и сохраняет указатель на него. Затем по какой-то причине она освобождает эту память, но не обнуляет сам указатель. Если позже программа попытается использовать этот указатель, считая, что он по-прежнему указывает на валидный объект, произойдёт обращение к уже освобождённому участку. В этот момент злоумышленник может попытаться «подсунуть» свои данные в этот участок памяти, например, инициировав выделение памяти под свой объект, который, вероятно, займёт только что освобождённое место. Если ему это удаётся, то при использовании висячего указателя программа начнёт работать с данными атакующего.

Эксплуатация UAF часто требует техники «распыления кучи» (heap spraying), когда злоумышленник многократно выделяет память со своим кодом, чтобы повысить шансы заполнить нужную область. После успешной подмены возможны различные негативные последствия: от порчи пользовательских данных до полного захвата управления системой. Например, если объект содержал указатель на функцию, то, подменив его, атакующий может перенаправить выполнение на свой код.

Примеры из реальной практики включают уязвимости в популярном программном обеспечении. Так, в Microsoft 365 Word была обнаружена ошибка (CVE-2025-47170), позволяющая выполнить код при открытии специально подготовленного документа. В ядре Linux находили UAF в сетевых драйверах, вызванную проблемами синхронизации при отмене отложенных задач. Даже в операционных системах для интернета вещей, например в Apache NuttX RTOS, встречались подобные уязвимости (CVE-2025-48769), которые могли позволить удалённому аутентифицированному пользователю повредить память через файловые операции.

Для защиты от UAF применяется комплекс мер. Разработчикам рекомендуется сразу после освобождения памяти обнулять соответствующие указатели, чтобы исключить их повторное использование. Полезно также применять специальные инструменты проверки кода, такие как AddressSanitizer, которые выявляют ошибки работы с памятью на этапе тестирования. На уровне операционных систем и компиляторов внедряются методы отложенного повторного использования освобождённых блоков или автоматическое обнуление всех ссылок на удаляемый объект. Пользователям же следует своевременно устанавливать обновления программ, так как патчи часто закрывают именно такие уязвимости, а также проявлять осторожность при открытии файлов из ненадёжных источников.