Это очень специфический тип эксплойта, который поражает все виды программного обеспечения.
Use-After-Free (UAF) — это примитивная уязвимость, приводящая к повреждению памяти, которая продолжает представлять серьезную угрозу для всех типов программного обеспечения, от операционных систем до прикладного программного обеспечения. Этот критический недостаток безопасности возникает, когда компонент приложения пытается получить доступ к данным в адресе памяти, который уже был освобожден, отсюда и название — use-after-free.
Уязвимости UAF могут привести к потенциальной эксплуатации программного обеспечения или даже к компрометации системы. Вот что такое уязвимость UAF, почему это происходит и как вы можете защитить свое программное обеспечение от уязвимости UAF.
Что такое уязвимость Use-After-Free (UAF)?
Прежде чем углубиться в уязвимость Use-After-Free, давайте сделаем шаг назад и разберемся с некоторыми основами управления памятью. Когда программа выполняется, ее данные и код загружаются в память.
Управление памятью — это процесс управления хранением (так называемое выделение памяти) и удалением (так называемое освобождение памяти) данных и кода в памяти оптимальным образом. Два основных сегмента памяти, в которых хранятся данные программы, стек и куча.
Программам можно выделять память статически в стеке и динамически в куче. Уязвимость использования после освобождения возникает, когда программисты не управляют должным образом динамическим выделением и освобождением памяти в своих программах. Это означает, что класс уязвимостей UAF — это тип эксплуатации кучи. Чтобы лучше понять эту уязвимость, полезно хорошо понимать как работают указатели в программировании.
Use-After-Free (UAF), как следует из названия, представляет собой тип примитивной уязвимости, приводящей к повреждению памяти, которая возникает, когда объект, который уже был доступ к освобожденной памяти снова приводит к сбоям или непредвиденным последствиям, таким как утечка памяти, эскалация привилегий (EOP) или произвольный код исполнение. Давайте узнаем, как это состояние возникает в первую очередь и как его используют.
Как используется Use-After-Free (UAF)?
Use-After-Free (UAF), как следует из названия, представляет собой примитивную уязвимость, приводящую к повреждению памяти, которая возникает, когда программа продолжает обращаться к освобожденным участкам памяти. Давайте посмотрим на пример кода:
#включать <стдио.час>
#включать <стандартная библиотека.час>
интосновной(){
инт *MUO = malloc (размер(инт));
*МУО = 69420;
printf("Значение: %d\n", *МУО);
бесплатно (МУО);
printf("Значение?: %d\n", *МУО);
возвращаться0;
}
Может обнаружить уязвимость? Как видите, в этом коде МУО указатель освобождается из памяти с помощью бесплатно() функция, но она снова вызывается в следующей строке с использованием printf() функция. Это приводит к неожиданному поведению программы, и в зависимости от того, где в программном обеспечении присутствует уязвимость, она может быть использована для повышения привилегий и утечек памяти.
Как смягчить использование после освобождения?
UAF возникает из-за ошибок в программировании приложения. Есть несколько мер предосторожности, которые вы можете предпринять, чтобы избежать использования уязвимостей Use-After-Free в вашем программном обеспечении.
Вот несколько рекомендаций, которые вы можете применить, чтобы свести к минимуму уязвимости вашего программного обеспечения, связанные с повреждением памяти:
- Использование безопасных для памяти языков программирования, таких как Rust, со встроенными механизмами для предотвращения примитивных уязвимостей повреждения памяти, таких как UAF, переполнение буфера и т. д. Если вы используете такие языки программирования, как C/C++, вы, скорее всего, внесете в свой код ошибки памяти. По той же причине даже такие операционные системы, как Windows и Linux, медленно переходят на Rust. Вы также должны рассмотреть изучаю ржавчину если вы создаете низкоуровневые программы.
- Помимо использования языка, безопасного для памяти, рекомендуется следовать передовым методам, таким как установка указателя в значение NULL после его освобождения, чтобы избежать появления уязвимости Use-After-Free.
- Вы также можете реализовать такие методы, как One Time Allocation (OTA), которые предотвращают доступ злоумышленников к освобожденной памяти. объекты и строгую политику жизненного цикла объектов, которая помогает отслеживать каждый объект памяти, который выделяется и освобожден. Имейте в виду, однако, что эти реализации могут увеличить нагрузку на память и производительность.
Реальные примеры уязвимости Use-After-Free (UAF)
Уязвимость Use-After-Free (UAF) была обнаружена и использовалась в различных реальных сценариях — от веб-браузеров до ядра Android и повседневных приложений. Это говорит о необходимости принятия упреждающих мер безопасности. Некоторые реальные примеры UAF включают в себя:
- Интернет-браузеры: уязвимости UAF в веб-браузерах использовались для выполнения произвольного кода, нарушения конфиденциальности пользователей и выполнения атак с удаленным выполнением кода. Недавним примером может служить CVE-2021-38008, которая использовала уязвимость UAF в Google Chrome, позволяя злоумышленникам удаленно выполнять произвольный код на компьютере-жертве.
- Операционные системы: уязвимости UAF, обнаруженные в ядрах Windows/Linux/Android, позволили злоумышленникам получить повышенные привилегии, обойти механизмы безопасности и добиться устойчивости. Существует множество уязвимостей UAF, которые были обнаружены и до сих пор обнаруживаются в ядрах операционных систем. На момент написания этой статьи была опубликована CVE-2023-3269, еще одна уязвимость UAF в ядре Linux, ведущая к повышению привилегий. CVE-2022-23270 — пример уязвимости UAF в ядре Windows.
- Программные приложения: уязвимости UAF в программных приложениях использовались для манипулирования программами. поведение, ведущее к раскрытию информации, выполнению произвольного кода, сбою программы и, в худшем случае, к привилегии эскалация. Многие программные приложения были и остаются уязвимыми для атак UAF. Это программное обеспечение в основном представляет собой программы на C/C++, которые были разработаны с использованием неэффективных и небезопасных подходов к управлению памятью.
Чтобы узнать больше об уязвимостях Use-After-Free в реальных приложениях, вы можете проверить официальный MITRE CVE страницу со списком и отсортировать по ключевому слову Use-After-Free.
Эффективное распределение памяти помогает сделать программное обеспечение безопасным
Оптимальное и продуманное распределение памяти имеет большое значение для защиты ваших приложений от распространенных уязвимостей примитивного повреждения памяти.
UAF наряду с временем проверки времени использования (TOCTOU), условиями гонки и переполнением буфера (BOF) являются одними из наиболее часто используемых уязвимостей памяти. Всего этого можно избежать, изучив, как память вашей программы управляется платформой, на которой она работает. Это дает вам четкое представление о том, как операционная система размещает вашу программу в памяти, и предоставляет вам инструменты для разработки программного обеспечения для обеспечения оптимальной производительности и безопасности.
Если вы еще этого не сделали, вы можете начать с понимания того, как осуществляется управление памятью в Linux, наиболее часто используемой серверной операционной системе в мире.