macOS: автозапуск и следы выполнения
Где macOS закрепляет автозапуск, как атрибут quarantine и база TCC помогают отследить происхождение и поведение программ.
Персистентность — механизмы, которыми программа обеспечивает себе повторный запуск после перезагрузки или входа пользователя; для вредоноса это способ выжить, для следователя — место поиска улик.
Большинство атак на macOS закрепляются через штатные механизмы автозапуска. Знание этих мест позволяет защитнику быстро находить постороннее ПО при законном анализе своего парка или разрешённого образа. Несанкционированная установка вредоносных программ на чужие устройства преследуется по закону (в РФ — ст. 273 УК РФ).
Зачем это знать защитнику
Когда на Mac появляется неизвестный процесс, первый вопрос — как он переживает перезагрузку и откуда взялся. LaunchAgents/Daemons отвечают «как закрепился», quarantine — «откуда скачан и был ли проверен Gatekeeper», TCC — «к каким приватным ресурсам (камера, диск, экран) программа получила доступ». Вместе эти артефакты дают полную картину постороннего ПО и помогают отличить легитимный софт от вредоноса.
LaunchAgents и LaunchDaemons
Главная подсистема запуска в macOS — launchd. Она читает plist-описания заданий из строго определённых каталогов, и именно туда чаще всего прописывается персистентность:
| Каталог | Тип | Когда запускается |
~/Library/LaunchAgents/ | агент пользователя | при входе данного пользователя |
/Library/LaunchAgents/ | агент (для всех) | при входе любого пользователя |
/Library/LaunchDaemons/ | системный демон | при загрузке, в фоне, часто с правами root |
Следователь просматривает эти каталоги и читает в каждом plist ключи Label, ProgramArguments (что и с какими аргументами запускается), RunAtLoad/KeepAlive. Тревожные признаки: запуск исполняемого файла из /tmp, /Users/Shared или скрытого каталога; случайное имя метки; недавняя дата создания plist.
Полезно понимать роль launchd в системе: это процесс с PID 1, родитель всех остальных служб. Он не просто запускает задание один раз — при ключе KeepAlive он перезапускает упавший процесс, что вредонос использует для устойчивости (убитый процесс мгновенно поднимается заново). Поэтому при разборе важно не только найти подозрительный plist, но и выгрузить задание корректно, а сам анализ вести на образе, а не на работающем Mac, где launchd будет сопротивляться остановке.
# Перечислить элементы автозапуска (на образе/системе)
ls -la ~/Library/LaunchAgents/ /Library/LaunchAgents/ /Library/LaunchDaemons/
# Что именно запускает подозрительный агент
plutil -p /Library/LaunchDaemons/com.suspicious.helper.plist
# Подозрительный ProgramArguments: бинарь из /tmp
Label = com.update.helper
ProgramArguments = [ "/tmp/.cache/helper", "--silent" ]
RunAtLoad = true
quarantine: откуда пришёл файл
Когда файл скачан из интернета, macOS навешивает на него расширенный атрибут com.apple.quarantine. Именно он заставляет Gatekeeper показать предупреждение «приложение загружено из интернета» при первом запуске. Для следователя этот атрибут — ценный след выполнения и происхождения: он содержит идентификатор приложения-загрузчика, дату и иногда источник.
# Показать расширенные атрибуты файла
xattr -l ~/Downloads/installer.app
# Конкретно карантинный атрибут
xattr -p com.apple.quarantine ~/Downloads/installer.app
Важная улика «от обратного»: если исполняемый файл, который явно был скачан, лишён атрибута quarantine, это может означать, что его намеренно сняли (командой xattr -d), чтобы обойти предупреждение Gatekeeper, — типичный приём при ручной установке вредоноса.
TCC: к каким ресурсам был доступ
Подсистема TCC (Transparency, Consent, and Control) хранит решения пользователя о доступе приложений к приватным ресурсам: камере, микрофону, контактам, экрану, полному диску. Решения лежат в базах SQLite: пользовательская — ~/Library/Application Support/com.apple.TCC/TCC.db, системная — в /Library/Application Support/com.apple.TCC/. Следователь смотрит, какие приложения получили чувствительные разрешения и когда.
# Прочитать выданные разрешения из базы TCC (на образе, read-only)
sqlite3 TCC.db "SELECT client, service, auth_value FROM access;"
Если в TCC значится неизвестная программа с доступом к записи экрана или полному диску — это серьёзный сигнал. Шпионское ПО стремится получить именно такие разрешения, поэтому записи TCC помогают и обнаружить заражение, и оценить, какие данные могли утечь.
Другие места закрепления
LaunchAgents/Daemons — самый частый, но не единственный механизм. Следователь проверяет также: Login Items (приложения, стартующие при входе; современные хранятся в ~/Library/Application Support/com.apple.backgroundtaskmanagementagent/), конфигурационные профили (.mobileconfig и /Library/Managed Preferences/) — легальный инструмент MDM, которым злоупотребляют для скрытного управления, и cron, унаследованный из Unix (crontab -l). Реже встречаются более экзотические приёмы — подмена обработчиков событий или плагинов; но в учебной практике достаточно уверенно проверять перечисленные штатные места, потому что именно туда прописывается подавляющее большинство реального вредоносного ПО под macOS.
# Унаследованный планировщик cron на macOS
crontab -l
# Установленные конфигурационные профили (на живой системе)
profiles list -all
Как это работает под капотом: обнаружение постороннего ПО
Сведение артефактов вместе даёт метод обнаружения. Следователь строит цепочку: launchd-задание указывает на исполняемый файл → у файла проверяют атрибут quarantine (откуда взялся, проходил ли Gatekeeper) → по базе TCC смотрят, какие приватные доступы он получил → по Unified Logs и меткам времени восстанавливают, когда он запускался. Несоответствия (бинарь без подписи в нестандартном каталоге, снятый карантин, доступ к экрану у «утилиты обновления») складываются в обоснованный вывод. Всё это делается на образе только для чтения — запуск подозрительного бинаря на живой системе недопустим.
Как защититься
- Регулярно инвентаризируйте автозапуск. Сверяйте содержимое LaunchAgents/LaunchDaemons с эталоном; новые plist, запускающие код из /tmp, — повод для разбора.
- Не снимайте quarantine вручную. Обход предупреждения Gatekeeper лишает систему важной проверки; доверяйте только подписанным и нотаризованным приложениям.
- Контролируйте разрешения TCC. Периодически проверяйте, у каких приложений есть доступ к экрану, диску и камере, и отзывайте лишнее.
- Применяйте MDM и EDR. В корпоративной среде управление политиками и поведенческий мониторинг быстро выявляют закрепление постороннего ПО.
Итоги
- launchd запускает задания из LaunchAgents (при входе) и LaunchDaemons (при загрузке, часто как root) — это главные точки персистентности.
- Атрибут
com.apple.quarantineпоказывает происхождение скачанного файла; его отсутствие у явно загруженного бинаря — признак обхода Gatekeeper. - База TCC хранит выданные разрешения на приватные ресурсы; доступ неизвестной программы к экрану или полному диску — серьёзный сигнал.
- Обнаружение постороннего ПО — это связывание артефактов (launchd → quarantine → TCC → логи) на образе read-only.