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.
Проверьте себя
1. Чем LaunchDaemon в /Library/LaunchDaemons отличается от LaunchAgent при анализе персистентности?
ALaunchDaemon запускается при загрузке системы в фоне и часто с правами root, тогда как агент — при входе пользователя
Bэто одно и то же, просто разные каталоги
CLaunchDaemon работает только когда пользователь явно его открывает
DLaunchDaemon не использует plist
2. О чём говорит отсутствие атрибута com.apple.quarantine у файла, который явно был скачан из интернета?
Aфайл создан самой системой и безопасен
Bатрибут могли намеренно снять (xattr -d), чтобы обойти предупреждение Gatekeeper — типичный приём ручной установки вредоноса
CmacOS никогда не ставит такой атрибут
Dфайл был зашифрован FileVault
3. Что хранит база TCC и почему она важна следователю?
Aисторию команд терминала
Bрешения о доступе приложений к приватным ресурсам (камера, экран, полный диск) — доступ неизвестной программы к экрану или диску является сигналом заражения
Cпароли пользователя в открытом виде
Dсписок установленных шрифтов