
Экстрактор артефактов журналов уязвимости Airborne в iOS из LogArchive CVE-2025-24252
Этот скрипт предназначен для помощи в выявлении потенциальных следов набора уязвимостей "Airborne" (в первую очередь затрагивающих протокол AirPlay от Apple) путем анализа системных журналов iOS из пакета .logarchive. Он автоматизирует выполнение нескольких команд log show, настроенных на поиск аномалий, которые могут быть связаны с этими уязвимостями.
Отказ от ответственности: Этот инструмент предназначен только для информационных и исследовательских целей. Наличие записей журнала, соответствующих этим запросам, не является окончательным подтверждением компрометации. Записи журнала должны анализироваться в контексте. Отсутствие результатов не гарантирует безопасность устройства. Всегда убеждайтесь, что ваши устройства обновлены до последних версий ОС.
Этот скрипт разработан Антоном Шустиковым ([email protected], сейчас — генеральный директор CakesCats) в рамках проекта CakesCats.
CakesCats — это инициатива, направленная на:
Антон Шустиков — консультант по информационной безопасности и финтеху с большим опытом создания систем безопасности. Он является основателем некоммерческого образовательного проекта CakesCats и публикует статьи в таких изданиях, как Forbes и журнал «Хакер». Его работа часто связана с исследованием цифровых угроз и продвижением цифровой гигиены.
"Airborne" — это название, данное набору уязвимостей (обнаруженных Oligo Security в ходе их оригинального исследования), затрагивающих протокол AirPlay от Apple и комплект разработки программного обеспечения (SDK) AirPlay. Эти уязвимости могут затронуть широкий спектр устройств Apple (iPhone, iPad, Mac, Apple TV и т.д.), а также сторонние устройства, использующие AirPlay SDK (например, умные колонки, ресиверы).
Ключевые аспекты уязвимостей типа "Airborne":
rapportd, который отвечает за связь между устройствами.Этот скрипт выполняет серию команд log show, используя тщательно составленные предикаты. Эти предикаты предназначены для фильтрации огромного объема информации в системных журналах iOS с целью выявления потенциальных индикаторов компрометации или аномальной активности, которая может быть связана с уязвимостями типа "Airborne".
Скрипт ищет:
mediaserverd, AirPlayXPCHelper, rapportd, mDNSResponder).Результат каждого запроса сохраняется в отдельный текстовый файл с описательным именем в каталоге результатов с отметкой времени, что позволяет проводить целенаправленный анализ различных типов потенциальных артефактов.
log show и этот скрипт предназначены для запуска на macOS..logarchive): Вам понадобится архив системных журналов iOS (пакет, который технически является каталогом) с устройства, которое вы собираетесь анализировать. Обычно его можно получить через:
sysdiagnose: Запустите sysdiagnose на iPhone (обычно одновременным нажатием кнопок увеличения громкости + уменьшения громкости + боковой кнопки, но комбинации могут различаться в зависимости от модели и версии iOS). После того как sysdiagnose будет создан (это может занять несколько минут), его можно отправить через AirDrop на Mac или получить при синхронизации iPhone с Mac (часто находится в Finder в месте синхронизации iPhone внутри файла .tar.gz). .logarchive будет находиться в извлеченном содержимом sysdiagnose.bash.Сохраните скрипт:
Сохраните код скрипта (приведенный выше) как airborne_artifact_extractor.sh (или под любым другим именем с расширением .sh).
Сделайте его исполняемым: Откройте приложение Terminal, перейдите в каталог, где вы сохранили скрипт, и выполните следующую команду:
chmod +x airborne_artifact_extractor.sh
Проверьте атрибут карантина macOS (важно для загруженных скриптов): Если вы загрузили этот скрипт из интернета, macOS может поместить его в карантин, что может помешать его корректной работе или запуску вообще.
xattr airborne_artifact_extractor.sh
com.apple.quarantine, удалите этот атрибут, выполнив:
xattr -d com.apple.quarantine airborne_artifact_extractor.sh
Если у вас по-прежнему возникают проблемы с запуском скрипта, особенно если он находится в таком каталоге, как ~/Downloads, убедитесь, что ваше приложение Terminal имеет необходимые разрешения (например, "Полный доступ к диску" в System Settings -> Privacy & Security) для доступа к расположению скрипта и архиву журналов.
^M (например, /bin/bash^M: bad interpreter: No such file or directory)Если при попытке выполнить скрипт вы столкнулись с ошибкой вида bash: ./your_script_name.sh: /bin/bash^M: bad interpreter: No such file or directory, /usr/bin/env: ‘bash\r’: No such file or directory или аналогичными сообщениями, содержащими символы \r или ^M, скорее всего, это связано с переводами строк в стиле Windows (CRLF — Carriage Return Line Feed) вместо переводов строк в стиле Unix (LF — Line Feed).
Это обычно происходит, если файл скрипта был создан или отредактирован в системе Windows, а затем перенесен на macOS или Linux без преобразования переводов строк. Системы Unix ожидают только LF в качестве завершителя строк, и лишний символ CR (\r или ^M) интерпретируется как часть пути к интерпретатору или командам.
Решение: преобразование переводов строк с помощью dos2unix
Самый простой способ исправить это — использовать утилиту dos2unix.
Установите dos2unix:
На macOS (с помощью Homebrew): Если у вас нет Homebrew, сначала установите его с brew.sh. Затем выполните:
brew install dos2unix
В дистрибутивах Linux на основе Debian/Ubuntu:
sudo apt update
sudo apt install dos2unix
В дистрибутивах Linux на основе Fedora/RHEL:
sudo dnf install dos2unix # (или yum для более старых версий)
Преобразуйте файл скрипта:
Перейдите в каталог, содержащий airborne_artifact_extractor.sh, и выполните:
dos2unix airborne_artifact_extractor.sh
Эта команда преобразует переводы строк на месте.
Альтернативные решения (если dos2unix недоступен/нежелателен):
С помощью sed:
sed -i.bak 's/\r$//' airborne_artifact_extractor.sh
(Эта команда изменяет файл на месте и создает резервную копию airborne_artifact_extractor.sh.bak. В некоторых версиях sed, особенно на macOS, параметр -i требует указания расширения для резервной копии, например -i '.bak' или -i '' для создания резервной копии без расширения, если это поддерживается. Для macOS может потребоваться sed -i '' 's/\r//g' airborne_artifact_extractor.sh)
С помощью tr:
tr -d '\r' < airborne_artifact_extractor.sh > airborne_artifact_extractor_unix.sh
chmod +x airborne_artifact_extractor_unix.sh
# Затем используйте airborne_artifact_extractor_unix.sh
Текстовые редакторы: Большинство современных текстовых редакторов (таких как VS Code, Sublime Text, Atom, Notepad++) позволяют изменять переводы строк. Откройте файл скрипта, найдите настройку перевода строк (обычно в строке состояния или в меню File/Edit) и измените ее с "CRLF" или "Windows" на "LF" или "Unix". Затем сохраните файл заново.
После преобразования переводов строк попробуйте запустить скрипт снова. Не забудьте также убедиться, что у него есть права на выполнение (chmod +x airborne_artifact_extractor.sh).
Запустите скрипт из терминала, указав путь к пакету .logarchive и необязательные параметры временного диапазона:
./airborne_artifact_extractor.sh /path/to/your/iphone_logs.logarchive [time_range_parameters]
Аргументы:
R1 (обязательный): Полный или относительный путь к файлу/пакету .logarchive.
[time_range_parameters] (необязательный): Стандартные параметры временного диапазона log show. Если они не указаны, скрипт по умолчанию будет анализировать журналы за --last 7d (последние 7 дней).
Примеры:
--last 24h (за последние 24 часа)
--last 3d (за последние 3 дня)
--start "ГГГГ-ММ-ДД ЧЧ:ММ:СС" --end "ГГГГ-ММ-ДД ЧЧ:ММ:СС" (для конкретного временного диапазона). Важно: строка даты и времени должна быть заключена в кавычки.
Настройка часового пояса: Скрипт включает настройки часового пояса в верхней части, которые вы можете изменить:
TZ_SETTING: Определяет часовой пояс, используемый для интерпретации передаваемых вами аргументов --start и --end. Например, если задано значение "Etc/GMT-7" (что соответствует UTC+7), и вы используете --start "2025-04-10 00:00:00", это будет рассматриваться как полночь 10 апреля в часовом поясе UTC+7. Если вы хотите, чтобы скрипт использовал текущий локальный часовой пояс вашего Mac для этих аргументов, вы можете задать TZ_SETTING="" или закомментировать эту строку.
TIMEZONE_DISPLAY: Указывает часовой пояс для форматирования временных меток в выходных файлах журналов с помощью опции log show --timezone. Пример: "Asia/Bangkok" для UTC+7. Выберите имя часового пояса, распознаваемое вашей системой.
Примеры команд:
Анализ журналов за последние 7 дней (поведение по умолчанию):
Bash
./airborne_artifact_extractor.sh /Volumes/ExternalHD/iOS_Logs/iPhone13_archive.logarchive
Анализ журналов за последние 48 часов: Bash
./airborne_artifact_extractor.sh ./My_iPhone_Sysdiagnose.logarchive --last 48h
Анализ журналов за конкретный диапазон дат и времени (время будет интерпретироваться в соответствии с TZ_SETTING): Bash
./airborne_artifact_extractor.sh ../Log_Archives/device_XYZ.logarchive --start "2025-04-05 00:00:00" --end "2025-04-06 23:59:59"
Выходные файлы
Скрипт создаст новый каталог с именем airborne_traces_YYYYMMDD_HHMMSS (где YYYYMMDD_HHMMSS — текущие дата и время) в том же каталоге, где находится скрипт (или в вашем текущем рабочем каталоге, если каталог скрипта недоступен для записи). Внутри этой папки вы найдете несколько файлов .txt, каждый из которых содержит результат выполнения конкретного запроса. Имена файлов имеют числовые префиксы для упорядочивания:
01_critical_process_errors.txt: Сбои и ошибки критически важных процессов.
02_process_termination_exceptions.txt: Неожиданные завершения или исключения в ключевых процессах.
03_kernel_panics.txt: События паники ядра.
04_airplay_subsystem_errors.txt: Ошибки и сбои в подсистеме AirPlay.
05_mdns_errors.txt: Ошибки и сбои в mDNSResponder (Bonjour).
06_airplay_pairing_auth_failures.txt: Проблемы с сопряжением, аутентификацией или подключениями AirPlay/rapportd.
07_network_connection_errors.txt: Ошибки сетевых подключений в соответствующих процессах.
08_networkd_errors.txt: Ошибки в системной службе networkd.
09_sandbox_violations.txt: Сообщения, связанные с нарушениями песочницы (sandbox).
10_profile_activity.txt: Активность, связанная с профилями конфигурации.
Интерпретация результатов
Пустые файлы — это нормально: Пустой выходной файл означает, что ни одна запись журнала не соответствовала критериям данного конкретного запроса за указанный временной диапазон. Во многих случаях это хороший признак, указывающий на отсутствие этих конкретных подозрительных индикаторов.
Сосредоточьтесь на закономерностях и корреляциях: Единичное изолированное сообщение об ошибке часто не является признаком компрометации. Ищите скопления ошибок, подозрительные последовательности событий в разных файлах журналов или ошибки, коррелирующие со временем, когда вы наблюдали необычное поведение устройства или использовали потенциально уязвимые службы, такие как AirPlay.
ECONNRESET в журналах rapportd (часто в 06_... или 07_...): Указывают на внезапное завершение TCP-соединений. Хотя они могут быть вызваны безобидными проблемами сети (плохой Wi-Fi, проблемы с маршрутизатором), в контексте расследования уязвимостей "Airborne" они заслуживают более пристального внимания. Они могут указывать на нестабильность, вызванную попыткой эксплойта на вашем устройстве или устройстве собеседника, или на сетевые помехи.
Сбои (типы fault или panic) в mediaserverd, AirPlayXPCHelper (часто в 01_..., 02_...) или паника ядра (03_...) обычно являются сильными индикаторами нестабильности системы, которая может быть связана с эксплойтом, если они происходят неожиданно или во время сетевых взаимодействий, на которые нацелен "Airborne".
Контекст имеет решающее значение: Всегда анализируйте результаты журналов с учетом ваших знаний о том, как устройство использовалось в то время, в какой сетевой среде оно находилось, и любых фактических симптомов, которые вы наблюдали.
Вклад в проект
Не стесняйтесь форкать этот репозиторий, предлагать улучшения, сообщать о проблемах или добавлять более конкретные запросы, которые могут быть полезны для выявления следов подобных уязвимостей.