ScholarGate
Ассистент

Уязвимости и их эксплуатация

Уязвимости — это недостатки в программном обеспечении, нарушающие его предположения о безопасности; эксплуатация — это искусство превращения такого недостатка в поведение, контролируемое злоумышленником, от утечки данных до полного выполнения кода.

Найти тему в PaperMindСкороFind papers & topics
Tools & resources
Скачать слайды
Learn & explore
ВидеоСкоро

Definition

Уязвимость — это слабость в системе, которую злоумышленник может использовать для нарушения ее политики безопасности; эксплойт — это метод или программа, использующая конкретную уязвимость для достижения несанкционированных эффектов.

Scope

Эта тема охватывает основные классы уязвимостей — ошибки повреждения памяти (переполнение буфера, использование после освобождения), инъекции, целочисленные ошибки и логические ошибки — а также методы их эксплуатации, включая перехват потока управления и возвратно-ориентированное программирование. Она также рассматривает меры по снижению рисков, которые повышают стоимость эксплуатации (ASLR, DEP/NX, защитные метки стека, целостность потока управления). Исключаются практики безопасной разработки и специфические для веба уязвимости, которые рассматриваются в смежных темах.

Core questions

  • Какие категории программных ошибок создают эксплуатируемые уязвимости?
  • Как ошибка повреждения памяти превращается в контроль над программой?
  • Что такое возвратно-ориентированное программирование и почему оно обходит простые средства защиты?
  • Как меры по снижению рисков, такие как ASLR, DEP и защитные метки стека, повышают сложность эксплуатации?
  • Почему сохраняется «гонка вооружений» между эксплуатацией и мерами по снижению рисков?

Key concepts

  • переполнение буфера
  • использование после освобождения
  • переполнение целого числа
  • инъекция
  • перехват потока управления
  • возвратно-ориентированное программирование
  • шелл-код
  • ASLR, DEP/NX, защитные метки стека
  • целостность потока управления

Key theories

Перехват потока управления
Многие эксплойты повреждают указатель кода (например, адрес возврата или указатель функции), чтобы перенаправить выполнение на код, выбранный злоумышленником; каноническим примером является переполнение буфера стека, которое перезаписывает сохраненный адрес возврата.
Меры по снижению рисков и гонка вооружений в эксплуатации
Защитные механизмы, такие как неисполняемая память, рандомизация адресного пространства, защитные метки стека и целостность потока управления, блокируют каждый класс методов, что приводит к появлению новых атак (возвратно-ориентированное программирование, утечки информации) в условиях продолжающейся эскалации.

Mechanisms

Классическое переполнение стека выходит за границы буфера, перезаписывая сохраненный адрес возврата, так что при возврате функции выполнение переходит к шелл-коду, предоставленному злоумышленником. Меры по снижению рисков нарушили это: неисполняемая память (DEP/NX) прекратила выполнение внедренного кода, что привело к возвратно-ориентированному программированию, связывающему существующие фрагменты кода; рандомизация адресного пространства скрыла целевые адреса, что привело к появлению примитивов утечки информации для ее обхода. Целостность потока управления и языки, безопасные для памяти, направлены на полное устранение этих классов.

Clinical relevance

Эксплуатируемые уязвимости являются исходным материалом для реальных атак: ошибки безопасности памяти составляют большинство критических уязвимостей в основных браузерах и операционных системах, эксплойты нулевого дня покупаются, продаются и используются в шпионаже и преступности, а эта дисциплина стимулирует защитное проектирование, ответственное раскрытие информации, программы вознаграждения за обнаружение ошибок и переход к языкам, безопасным для памяти, таким как Rust.

Evidence & guidelines

Классы уязвимостей каталогизированы в CWE MITRE и отслеживаются индивидуально как CVE с оценками серьезности CVSS. Исследования крупных поставщиков (Microsoft, Google) сообщают, что около 70% серьезных уязвимостей проистекают из небезопасности памяти, что мотивирует рекомендации по использованию языков, безопасных для памяти, и развертывание мер по снижению рисков (ASLR, CFI) по умолчанию в современных платформах.

History

Эксплуатация привлекла внимание общественности с переполнением буфера червя Морриса в 1988 году и была систематизирована в работе Алефа Одина «Smashing the Stack for Fun and Profit» 1996 года. Каждая защита вызывала ответ: DEP привела к return-into-libc и возвратно-ориентированному программированию Шахама (2007); ASLR привела к обходам на основе утечек. Обзор «Вечная война в памяти» 2013 года обозначил продолжающуюся гонку вооружений, которая продолжает стимулировать как новые меры по снижению рисков, так и внедрение языков, безопасных для памяти.

Key figures

  • Elias Levy (Aleph One)
  • Hovav Shacham
  • Dawn Song
  • Ross Anderson
  • Halvar Flake

Related topics

Seminal works

  • aleph1996
  • szekeres2013
  • anderson2020

Frequently asked questions

Что такое уязвимость нулевого дня?
Уязвимость нулевого дня — это уязвимость, неизвестная защитникам программного обеспечения (и неисправленная) на момент ее эксплуатации, что дает им ноль дней на подготовку. Такие недостатки особенно ценны для злоумышленников, потому что исправления или сигнатуры еще не существует.
Почему языки, безопасные для памяти, продвигаются как решение?
Языки, безопасные для памяти (например, Rust), предотвращают целые классы ошибок — переполнения буфера, использование после освобождения — во время компиляции или выполнения, устраняя наиболее распространенный источник серьезных уязвимостей, а не просто усложняя эксплуатацию каждой из них.

Methods for this concept

Related concepts