Введение
4 марта 2026 года компании Google и iVerify опубликовали отчеты о технически сложном наборе эксплойтов для компрометации устройств Apple iPhone. По данным Google, этот инструментарий впервые был замечен в целевых атаках, организованных клиентом неназванного поставщика шпионского ПО. Позднее набор использовался другими злоумышленниками в атаках типа watering hole в Украине, а также в финансово мотивированных кампаниях в Китае. Кроме того, исследователи обнаружили отладочную версию набора, анализ которой выявил внутренние имена эксплойтов и авторское название фреймворка — Coruna. В результате исследования выяснилось, что фреймворк эксплуатирует ряд ранее исправленных уязвимостей, в том числе CVE-2023-32434 и CVE-2023-38606. Эти две уязвимости заслуживают особого внимания, так как изначально они использовались в качестве уязвимостей нулевого дня в «Операции Триангуляция».
«Операция Триангуляция» — это сложная APT-кампания, направленная на мобильные устройства на базе iOS. Мы обнаружили ее в ходе мониторинга сетевого трафика в нашей собственной корпоративной сети Wi-Fi, когда заметили подозрительную активность, исходящую от iOS-смартфонов. В процессе расследования выяснилось, что в этой кампании был задействован сложный шпионский имплант и множество эксплойтов нулевого дня. Расследование заняло более полугода, в течение которого мы публиковали наши находки, связанные с этой атакой. Эксперты GReAT «Лаборатории Касперского» также представили результаты своего расследования на 37-й конференции Chaos Communication Congress (37C3).
Полное описание уязвимостей CVE-2023-32434 и CVE-2023-38606 уже давно стало достоянием общественности, благодаря чему сторонние исследователи смогли разработать собственные эксплойты, не имея доступа к исходному коду «Операции Триангуляция». Несмотря на это, мы решили провести тщательный анализ эксплойтов из состава фреймворка Coruna. Так как некоторые ссылки для распространения набора эксплойтов, упомянутые в отчете Google, оставались активными на момент его публикации, нам удалось собрать, расшифровать и изучить все компоненты Coruna.
В ходе анализа мы обнаружили, что эксплойт для уязвимостей ядра CVE-2023-32434 и CVE-2023-38606, входящий в состав Coruna, фактически является обновленной версией того же самого эксплойта, который применялся в «Операции Триангуляция». Ниже представлены высокоуровневые схемы обеих цепочек атак. Эксплойт, о котором идет речь, выделен красной рамкой.
Более того, в составе Coruna мы нашли еще четыре дополнительных эксплойта уровня ядра, отсутствовавшие в «Операции Триангуляция» — причем два из них были разработаны уже после обнаружения этой кампании. Все упомянутые эксплойты построены на базе единого фреймворка и содержат общий код. Сходства в коде эксплойтов уровня ядра также прослеживаются и в других компонентах Coruna. Такие находки позволяют заключить, что этот набор эксплойтов был не составлен из разрозненных частей, а спроектирован единым образом. Мы предполагаем, что перед нами обновленная версия того же фреймворка, который — как минимум частично — применялся в «Операции Триангуляция».
Техническая информация
Мы продолжаем исследовать все эксплойты и уязвимости, используемые в Coruna, а пока представляем обобщенный обзор этого набора эксплойтов и цепочки атаки.
Safari
Эксплуатация начинается со стейджера, который собирает цифровой отпечаток браузера, после чего выбирает и запускает соответствующие эксплойты для удаленного выполнения кода (RCE) и обхода механизма проверки указателей (PAC) в зависимости от версии браузера. Он также содержит URL-адрес зашифрованного файла с данными обо всех доступных пакетах эксплойтов и других компонентов. Кроме того, в стейджер включен 256-битный ключ для расшифровки этого файла. Эти URL и ключ передаются вредоносной нагрузке, встроенной в эксплойты PAC.
Вредоносная нагрузка
Вредоносная нагрузка отвечает за инициализацию эксплуатации ядра. После инициализации она загружает файл с информацией о других доступных компонентах. Для извлечения этих данных вредоносная нагрузка выполняет многоэтапную обработку нескольких форматов файлов.
Сначала загруженный файл расшифровывается с помощью потокового шифра ChaCha20. На выходе получается контейнер с магическим числом 0xBEDF00D, содержащий сжатые при помощи LZMA данные.
Формат файла для хранения сжатых данных, используемый набором эксплойтов
| Смещение | Поле |
| 0x00 | Магическое число (0xBEDF00D) |
| 0x04 | Размер распакованных данных |
| 0x08 | Сжатые данные LZMA |
Распакованные данные представляют собой очередной контейнер с магическим числом 0xF00DBEEF. Этот формат используется набором эксплойтов для хранения и получения файлов по их идентификаторам.
Формат хранения файлов, используемый набором эксплойтов
| Смещение | Поле |
| 0x00 | Магическое число (0xF00DBEEF) |
| 0x04 | Количество записей |
| 0x08 | Запись[0].Идентификатор файла |
| 0x0C | Запись[0].Статус |
| 0x10 | Запись[0].Смещение файла |
| 0x14 | Запись[0].Размер файла |
Описание всех возможных значений идентификаторов файлов представлено ниже. На этапе сбора вредоносной нагрузкой сведений обо всех доступных пакетах в этом контейнере находится только один объект с идентификатором 0x70000.
Это и есть файл с данными обо всех доступных пакетах, который начинается с магического значения 0x12345678. Набор эксплойтов использует этот формат для получения URL-адресов и ключей расшифровки для дополнительных загружаемых компонентов.
Формат хранения сведений о пакетах, используемый набором эксплойтов
| Смещение | Поле |
| 0x00 | Магическое число (0x12345678) |
| 0x04 | Флаги |
| 0x08 | Путь к директории |
| 0x108 | Количество записей |
| 0x10C | Запись[0].Идентификатор пакета |
| 0x110 | Запись[0].Ключ ChaCha20 |
| 0x130 | Запись[0].Имя файла |
Компоненты, необходимые для компрометации целевого устройства, выбираются на основании идентификатора пакета. Его старший байт определяет тип пакета и совместимое оборудование. Нам встречались следующие типы пакетов:
- 0xF2 — эксплойт для ARM64;
- 0xF3 — эксплойт для ARM64E;
- 0xA2 — загрузчик Mach-O для ARM64;
- 0xA3 — загрузчик Mach-O для ARM64E;
- 2 — имплант для ARM64;
- 0xE2 — имплант для ARM64E.
Код вредоносной нагрузки также поддерживает дополнительные типы пакетов, например 0xF1 — эксплойт для устаревших устройств ARM, не поддерживающих 64-битную архитектуру. Примечательно, что сами файлы этих эксплойтов отсутствуют.
Остальные байты идентификатора пакета указывают на поддерживаемую версию прошивки и поколение процессора.
Некоторые обнаруженные идентификаторы пакетов (с уникальным содержимым)
| Идентификатор пакета | Описание |
| 0xF3300000 | Эксплойт ядра (iOS < 14.0 beta 7) и другие компоненты |
| 0xF3400000 | Эксплойт ядра (iOS < 14.7) и другие компоненты |
| 0xF3700000 | Эксплойт ядра (iOS < 16.5 beta 4) и другие компоненты |
| 0xF3800000 | Эксплойт ядра (iOS < 16.6 beta 5) и другие компоненты |
| 0xF3900000 | Эксплойт ядра (iOS < 17.2) и другие компоненты |
| 0xA3030000 | Загрузчик Mach-O (iOS 16.X) (A13 — A16) |
| 0xA3050000 | Загрузчик Mach-O (iOS 16.0 — 16.4) |
Файлы внутри этих пакетов также представлены в зашифрованных и сжатых контейнерах 0xF00DBEEF, однако в данном случае сжатие не является обязательным: его наличие определяется вторым битом в поле флагов. Разные пакеты содержат разные наборы файлов. Описание всех возможных идентификаторов файлов приведено в таблице ниже.
Обнаруженные идентификаторы файлов
| Идентификатор файла | Описание |
| 0x10000 | Имплант |
| 0x50000 | Загрузчик Mach-O (используется по умолчанию) |
| 0x70000 | Список дополнительных компонентов |
| 0x70005 | Конфигурация модуля запуска |
| 0x80000 | Модуль запуска в пакетах 0xF2/0xF3 либо загрузчик Mach-O в пакетах 0xA2/0xA3 |
| 0x90000 | Эксплойт уровня ядра |
| 0x90001 | Эксплойт уровня ядра (для загрузчика Mach-O) |
| 0xA0000 | Утилита очистки логов |
| 0xA0001 | Компонент загрузчика Mach-O |
| 0xA0002 | Компонент загрузчика Mach-O |
| 0xF0000 | Стейджер RPC |
После загрузки необходимых компонентов вредоносная нагрузка инициирует выполнение эксплойтов уровня ядра, загрузчиков Mach-O и модуля запуска вредоносного ПО. Подходящий загрузчик Mach-O выбирается на основе версии прошивки, модели процессора и наличия разрешения iokit-open-service.
Эксплойты уровня ядра
Мы проанализировали все пять эксплойтов уровня ядра из этого набора и установили, что один из них является обновленной версией эксплойта, обнаруженного в «Операции Триангуляция». В нем зафиксировано множество точечных изменений, наиболее значимыми из которых являются следующие.
- Код учитывает большее количество значений из строк версии XNU, что повысило точность определения версии.
- Добавлена проверка для iOS 17.2. Мы предполагаем, что это была самая актуальная версия системы на момент разработки эксплойта (выпущена в декабре 2023 года).
- Добавлены проверки для более новых процессоров Apple: A17, M3, M3 Pro и M3 Max (выпущены осенью 2023 года).
- Добавлена проверка для iOS 16.5 beta 4. В этой версии появилось исправление эксплойта, выпущенное Apple после нашего обращения.
Зачем эксплойт проверяет наличие iOS 17.2 и более новых процессоров, если целевые уязвимости были исправлены еще в версии iOS 16.5 beta 4? Ответ кроется в структуре других эксплойтов. Все они основаны на едином исходном коде — разница лишь в эксплуатируемых уязвимостях. Следовательно, эти проверки были внедрены для обеспечения совместимости с более новыми эксплойтами и появились в старой версии в результате рекомпиляции.
Модуль запуска
Модуль запуска управляет всеми операциями на этапе пост-эксплуатации. Он задействует эксплойт уровня ядра и предоставляемый им интерфейс. Поскольку в процессе работы эксплойт создает специальные объекты ядра, через которые можно считывать память ядра и записывать в нее, модуль запуска повторно использует эти объекты без повторной инициализации всего цикла эксплуатации уязвимостей. Модуль запуска очищает артефакты эксплойтов, извлекает имя процесса для инъекции из файла конфигурации с магическим числом 0xDEADD00F, внедряет стейджер в целевой процесс, использует его для самозапуска, а затем активирует имплант.
Выводы
Описанный случай в очередной раз наглядно продемонстрировал риски, сопряженные с массовым применением подобных вредоносных инструментов. Изначально этот инструментарий разрабатывался в целях кибершпионажа, однако теперь фреймворк оказался в распоряжении других киберпреступников, что ставит под угрозу миллионы пользователей, чьи устройства не имеют актуальных исправлений. Учитывая особенности модульной архитектуры и простоту повторного использования компонентов, мы ожидаем, что и другие злоумышленники начнут применять этот фреймворк в своих атаках. Мы настоятельно рекомендуем пользователям установить все доступные обновления безопасности при первой же возможности, если это еще не было сделано.





Coruna: фреймворк из «Операции Триангуляция»