Артефакты macOS

plist, Unified Logs, FSEvents, Spotlight и Keychain — где macOS хранит конфигурацию, события и следы активности.

plist (property list) — стандартный для Apple формат хранения настроек и метаданных в виде структуры ключ-значение; бывает в XML- и в бинарном виде.

macOS оставляет богатый набор артефактов, но раскиданы они иначе, чем в Linux. Эта карта помогает следователю при законном анализе — своего Mac или разрешённого образа. Полнодисковое шифрование FileVault и защита SIP означают, что доступ к данным обычно требует пароля/ключа владельца; обход чужой защиты недопустим и наказуем.

Зачем это знать защитнику

Корпоративный парк всё чаще — это Mac, и инциденты на них реальны. Знание, что plist хранит автозапуск, Unified Logs — поток системных событий, а FSEvents — историю изменений каталогов, позволяет восстановить действия вредоноса и понять масштаб компрометации. Без этой карты аналитик упускает следы, которые на macOS просто лежат в других местах, чем привычные /var/log.

plist: конфигурация и настройки

Файлы .plist — это «реестр» macOS, рассыпанный по файловой системе. Системные настройки лежат в /Library/Preferences/, пользовательские — в ~/Library/Preferences/. Для следователя ценны: списки недавних документов, настройки приложений, привязанные устройства, а главное — элементы автозапуска (о них в следующем уроке). Многие plist бинарные, поэтому их конвертируют или читают штатной утилитой:

# Прочитать бинарный plist в человекочитаемом виде
plutil -p ~/Library/Preferences/com.apple.dock.plist

# Конвертировать бинарный plist в XML
plutil -convert xml1 -o - com.apple.example.plist

Unified Logs — поток системных событий

Начиная с macOS 10.12, текстовые логи заменены Unified Logging — высокопроизводительной бинарной системой. Данные хранятся в /var/db/diagnostics/ (файлы .tracev3) и читаются командой log. Это аналог journald: запуски процессов, сетевые события, аутентификация. Тонкость — многие чувствительные значения помечены как <private> и по умолчанию скрыты, что важно учитывать при разборе.

# Показать события за последний час
log show --last 1h

# Отфильтровать по процессу и уровню
log show --predicate 'process == "sshd"' --info --last 1d

Из образа диска файлы .tracev3 копируют и разбирают офлайн специализированными парсерами — это даёт детальный таймлайн без обращения к живой системе. После разбора одна строка журнала выглядит примерно так:

2026-06-20 14:31:07.512  com.apple.securityd  process <installer> signature check: not notarized
2026-06-20 14:31:08.004  kernel  AMFI: code signature invalid for /tmp/.cache/helper

Принципиально понимать модель Unified Logging: это потоковая система с кольцевым буфером и собственной политикой хранения. Часть событий держится в памяти и сбрасывается на диск пачками, отладочные сообщения по умолчанию не сохраняются. Значит, у журнала ограниченная глубина — на загруженном хосте старые события вытесняются за часы или дни. Для следователя отсюда два вывода: образ снимают как можно раньше, а отсутствие ожидаемого события не всегда означает, что его не было, — оно могло просто выйти за окно хранения.

FSEvents — история изменений файловой системы

macOS ведёт журнал изменений каталогов в скрытом каталоге /.fseventsd/ на каждом томе. FSEvents не хранит имена отдельных файлов и содержимое, но фиксирует, что в таком-то каталоге что-то создавалось, менялось или удалялось, с порядковыми идентификаторами событий. Для следователя это золото: даже если файл удалён и затёрт, FSEvents может подтвердить сам факт его появления и удаления в определённом каталоге.

# Логическая запись FSEvents (после разбора парсером)
id=0x1A2B3C  path=Users/anna/Downloads  flags=Created,Removed,IsFile

Spotlight: метаданные файлов

Поисковый индекс Spotlight хранит расширенные метаданные о файлах в служебной базе .Spotlight-V100 на томе. Через них следователь узнаёт о файле даже больше, чем из самой ФС: дату использования, источник загрузки, автора документа. Ключевой атрибут — kMDItemWhereFroms: для скачанного файла он содержит URL и страницу-источник.

# Все метаданные Spotlight по файлу
mdls ~/Downloads/installer.dmg

# Откуда файл был загружен
mdls -name kMDItemWhereFroms ~/Downloads/installer.dmg

Keychain: где хранятся секреты

Keychain — защищённое зашифрованное хранилище паролей, токенов и ключей. Пользовательский keychain лежит в ~/Library/Keychains/, системный — в /Library/Keychains/. Принципиально: данные внутри зашифрованы и доступны только при наличии пароля владельца; криминалистическая ценность keychain — в самом факте наличия учётных данных и метаданных (когда создан элемент, к какому сервису). Извлечение содержимого чужого keychain без законных оснований недопустимо. Метаданные элемента (без секрета) можно перечислить штатной утилитой на своей системе:

# Перечислить элементы keychain (метаданные, не сами секреты)
security dump-keychain ~/Library/Keychains/login.keychain-db | head

Прочие следы активности приложений

Помимо системных хранилищ macOS, следователь проверяет следы конкретных программ в каталоге ~/Library/. Особенно информативны: ~/Library/Containers/ и ~/Library/Application Support/ (рабочие данные приложений, в том числе мессенджеров и браузеров), кэши недавних документов в ~/Library/Application Support/com.apple.sharedfilelist/, а также артефакты браузеров — история и загрузки. Например, Safari хранит историю в SQLite-базе ~/Library/Safari/History.db, а список загрузок — в Downloads.plist; это связывает «откуда пришёл файл» с «когда он был скачан». Поскольку многое здесь лежит в SQLite, базы копируют из образа и читают офлайн запросами SELECT, не запуская приложения.

Как это работает под капотом

Общая логика Apple — бинарные структурированные хранилища вместо текстовых файлов: plist, tracev3, базы Spotlight, FSEvents. Это быстро и компактно, но требует специализированных парсеров и аккуратной работы с образом. Поэтому метод тот же, что и в Linux: создать образ, проверить хэш, монтировать только для чтения и разбирать копии артефактов офлайн, не запуская команды на потенциально скомпрометированном Mac.

Как защититься

  • Включите FileVault. Полнодисковое шифрование защищает все эти артефакты от извлечения при краже устройства.
  • Собирайте Unified Logs централизованно. Пересылка логов с парка Mac в SIEM сохраняет следы, даже если локальный журнал ротировался или был очищен.
  • Мониторьте kMDItemWhereFroms и Downloads. Источник загрузки помогает быстро отследить, откуда пришёл подозрительный установщик.
  • Не отключайте SIP без причины. System Integrity Protection ограничивает изменение системных областей и затрудняет закрепление вредоноса.

Итоги

  • plist — «реестр» macOS: настройки и автозапуск; бинарные plist читают через plutil.
  • Unified Logs (tracev3) заменили текстовые логи; читаются командой log, часть данных скрыта как <private>.
  • FSEvents фиксирует факт изменений в каталогах (без имён файлов) и подтверждает появление/удаление данных.
  • Spotlight хранит метаданные, включая источник загрузки (kMDItemWhereFroms); Keychain — зашифрованные секреты, доступные лишь по паролю владельца.
  • Все хранилища бинарные — анализируют образ read-only офлайн; защита строится на FileVault, централизации логов и SIP.
Проверьте себя
1. Что в macOS пришло на смену текстовым системным логам и где физически хранится?
Aобычные текстовые файлы в /var/log
BUnified Logging — бинарные файлы .tracev3 в /var/db/diagnostics, читаемые командой log
Cтолько записи в plist-файлах настроек
Dбаза данных Spotlight
2. Чем полезен артефакт FSEvents следователю?
Aон хранит полное содержимое всех изменённых файлов
Bон фиксирует сам факт создания/изменения/удаления в каталогах (без имён файлов), что подтверждает появление и удаление данных
Cон содержит пароли пользователя
Dон заменяет файловую систему
3. Какой атрибут метаданных Spotlight показывает, откуда был загружен файл?
AkMDItemFSName
BkMDItemWhereFroms
CkMDItemPixelHeight
DkMDItemKind