Техническое исследование уязвимости CVE-2025-5548
В данной работе анализируется уязвимость CVE-2025-5548, связанная с переполнением буфера в стеке в FreeFloat FTP Server v1.0. Основная цель лабораторной работы — понять, как ведёт себя уязвимое приложение при обработке поддельных входных данных, и наглядно увидеть в контролируемой среде, как ошибка валидации может повлиять на поток выполнения программы.
Разработка репозитория не ограничивается демонстрацией конечного результата, а охватывает весь процесс исследования: подготовку среды, выбор инструментов, наблюдение за сбоем, анализ памяти и проверку реального воздействия уязвимости.
Работа построена на двух основных блоках.
В этом разделе объясняется, как было настроено практическое окружение, какая операционная система использовалась, какое уязвимое приложение было выбрано и какие инструменты понадобились для проведения анализа.
Вторая часть посвящена практической работе. Здесь описывается процесс обнаружения ошибки, подтверждения повреждения памяти, изучения перезаписи регистров и проверки того, как можно использовать уязвимость.
Практическая работа проводилась на виртуальной машине с Windows 11 Pro 25H2 (Build 26200.6584). В качестве уязвимого ПО был выбран FreeFloat FTP Server v1.0 — старое приложение, подходящее для таких упражнений из-за отсутствия многих защит, характерных для современных программ.
Сеть виртуальной машины была настроена в режиме NAT, что обеспечило доступ в Интернет для установки зависимостей, загрузки инструментов и поддержания базового сетевого взаимодействия лаборатории.
Для охвата всех фаз анализа потребовалось несколько утилит. Одни использовались для подготовки среды, другие — для анализа бинарного файла, третьи — для наблюдения за поведением процесса при сбое.
Использовался для загрузки репозиториев, упорядочивания определённых ресурсов и упрощения управления материалами, применяемыми в ходе исследования.
Применялся как вспомогательное средство для проверки связности, идентификации открытого сервиса и подтверждения того, что целевая система правильно отвечает на ожидаемом порту.
Был установлен для получения библиотек, заголовочных файлов и инструментов, полезных при отладке и низкоуровневом анализе в среде Windows.
Использовался для быстрого редактирования, просмотра скриптов и несложных манипуляций со строками или тестовыми данными.
Послужил удобной средой для написания скриптов, тестирования автоматизации и работы с кодом в более упорядоченном виде.
Был особенно полезен при необходимости проверять более длинные скрипты или отлаживать логику, связанную с формированием полезной нагрузки.
Рассматривались две версии:
Потребовался для запуска Ghidra, поскольку этот инструмент написан на Java.
Использовался для наблюдения за состоянием программы во время выполнения, проверки регистров, просмотра памяти и анализа точного момента возникновения сбоя.
Применялся на этапе статического анализа для изучения бинарного файла и поиска функций, подозрительных с точки зрения безопасности.
Использовался как дополнительное средство для декомпиляции и лучшего понимания внутренней логики уязвимой программы.
Этот плагин упростил такие задачи, как создание шаблонов, расчёт смещения и идентификация проблемных символов в полезной нагрузке.
Основным компонентом лаборатории был FreeFloat FTP Server v1.0, который выступает в роли целевой системы в рамках доказательства концепции. Его ценность заключается в наличии классической уязвимости переполнения буфера в стеке, что делает его очень подходящим случаем для учебного анализа.
Хотя существуют готовые виртуальные машины для такого рода упражнений, в данном случае было решено задокументировать среду и обосновать используемые инструменты. Это позволяет лучше понять, почему каждое приложение входит в лабораторию и какую роль оно играет в ходе анализа.
Первым шагом было убедиться, что FTP-сервис доступен и работает корректно. После подтверждения связности был изучен бинарный файл с помощью инструментов статического анализа для поиска возможных слабых мест, связанных с обработкой строк.
В ходе этой проверки были обнаружены небезопасные функции, такие как strcpy и strcat, что усилило подозрение, что сервис может быть уязвим к чрезмерно длинным входным данным. Также были рассмотрены несколько команд протокола FTP, способных принимать данные, контролируемые пользователем, и одна из них была выбрана в качестве основного кандидата для тестов.
На основе этого процесс был загружен в отладчик для наблюдения за его поведением во время выполнения.
Следующая фаза заключалась в отправке всё более длинных строк, чтобы проверить, перестаёт ли программа правильно отвечать. Эта процедура позволила убедиться, что после определённого размера сервис даёт сбой и в итоге приводит к повреждению памяти.
Такое поведение подтвердило, что это не просто поверхностная ошибка валидации, а реальное повреждение, влияющее на поток выполнения процесса.
После вызова сбоя необходимо было точно рассчитать, сколько байт требуется для достижения адреса возврата. Для этого использовалась неповторяющаяся последовательность, чтобы значение, отображаемое в EIP в момент краха, можно было сопоставить с точной позицией внутри отправленных данных.
Благодаря этой процедуре было получено конкретное смещение, необходимое для перезаписи управляющего регистра.
Имея известное смещение, был подготовлен новый тест, в котором адрес возврата был заменён на легко распознаваемое значение. Цель состояла в том, чтобы проверить, позволяет ли программа контролируемо изменять EIP.
Тест прошёл успешно: отладчик показал, что регистр содержит именно введённое значение. Это доказывало, что можно изменить поток выполнения и перенаправить его на выбранный адрес.
После достижения этой точки было проанализировано, какие байты могут мешать полезной нагрузке. В такого рода уязвимостях некоторые символы часто вызывают обрезание, неожиданные изменения или преждевременное завершение строки.
Путём последовательных сравнений в памяти были выявлены несколько bad characters, среди которых:
\x00\x0a\x0dИх обнаружение было важно для создания окончательной стабильной полезной нагрузки, совместимой с поведением уязвимой программы.
Следующий шаг заключался в поиске подходящего адреса, который позволил бы перенаправить выполнение в область памяти, где будет размещена полезная нагрузка. Этот анализ проводился с учётом операционной системы и активных защитных механизмов, поскольку некоторые адреса нестабильны между запусками.
В рамках лаборатории была найдена валидная ссылка, позволяющая связать перезапись потока с входными данными, контролируемыми атакующим.