Уязвимости и их эксплуатация
Уязвимости — это недостатки в программном обеспечении, нарушающие его предположения о безопасности; эксплуатация — это искусство превращения такого недостатка в поведение, контролируемое злоумышленником, от утечки данных до полного выполнения кода.
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), предотвращают целые классы ошибок — переполнения буфера, использование после освобождения — во время компиляции или выполнения, устраняя наиболее распространенный источник серьезных уязвимостей, а не просто усложняя эксплуатацию каждой из них.