На red team-операции против macOS-флота одной финтех-компании в начале 2026 года мы получили initial access через credential phishing - и за минуту упёрлись в CrowdStrike Falcon. Он снимал каждый reverse-shell payload до первого callback'а. Перекомпиляция, шифрование шеллкода, обфускация - Falcon ловил по поведению, давая от силы 30 секунд форы. Решение пришло из другого направления: исследователи XM Cyber (Hillel Pinto) показали, что EDR- и MDM-агенты на macOS можно просто выключить. От имени стандартного пользователя, без
sudo, без kernel-эксплойтов. Три примитива - слабая XPC-валидация, инъекция через NIB-файлы и злоупотребление kernel trust cache - позволяют молча деактивировать CrowdStrike Falcon Sensor, Kandji MDM и как минимум ещё один enterprise EDR. Kandji присвоил находке CVE-2026-39118, CrowdStrike выплатил bug bounty. Apple - отказался менять архитектуру. Классика.Бизнес-логика атаки: зачем отключать endpoint security на macOS
По данным CrowdStrike Global Threat Report 2025, 79% атак проходят без malware - через hands-on-keyboard и living off the land. Атакующий с initial access на macOS-хосте хочет:- Закрепиться - поставить persistence без alert'ов
- Собрать credentials - Keychain dump, SSH-ключи, OAuth-токены
- Развить атаку - lateral movement на другие хосты корпоративной сети
[Применимо: внутренний пентест, red team-операция, post-exploitation на macOS 13+ с корпоративным EDR/MDM]
Как macOS EDR работает изнутри: Endpoint Security Framework и XPC-сервисы
macOS даёт вендорам единственный легитимный путь к системной telemetry - Endpoint Security Framework (ES). Через ES агент получает уведомления о событиях:
exec, fork, open, mmap, mount и десятках других. Агент работает как privileged LaunchDaemon с root-правами, а UI-компоненты и вспомогательные процессы крутятся в user space. По данным Outflank (исследование EDR Internals for macOS and GNU/Linux), именно эта архитектура - daemon + user-space helpers - создаёт поверхность атаки, которой нет у Windows-аналогов с kernel-драйверами.И вот тут начинается самое интересное.
XPC-валидация: где ломается доверие между компонентами
Связь между компонентами агента (daemon <-> UI, daemon <-> updater, daemon <-> helper) идёт через XPC - штатный IPC-механизм macOS. Каждый XPC-сервис описывается plist-файлом, коммуникация проходит через Mach-порты. Критический момент - валидация клиента. Когда процесс A подключается к XPC-сервису B, сервис B может проверить:- Code signing identity подключающегося процесса
- Team ID - принадлежит ли бинарь вендору
- Entitlements - есть ли необходимые привилегии
- Audit token - PID, UID, GID вызывающего процесса
Цепочка атаки: от стандартного пользователя до отключения агента
Требования к окружению:- macOS 13 Ventura или новее (Endpoint Security Framework v2+)
- Стандартный пользователь (без admin/sudo)
- EDR/MDM-агент установлен и активен (CrowdStrike Falcon, Kandji, аналог)
- SIP включён (штатная корпоративная конфигурация)
- Для лабораторного анализа XPC: VM с отключённым SIP, Frida 16+ (
pip install frida frida-tools),xpcspy,jtool2
Разведка: fingerprinting EDR и MDM (T1518.001, Discovery)
Определение установленного EDR выполняется без привилегий:
Bash:
launchctl list | grep -iE 'crowd|falcon|kandji|sentinel|carbon'
ps aux | grep -iE 'falcond|kandji|sentineld'
ls /Library/LaunchDaemons/ | grep -iE 'crowd|kandji'
com.crowdstrike.falcon.Agent, Kandji - как io.kandji.KandjiAgent. Помимо launchctl стоит проверить /Library/LaunchDaemons/ и /Library/LaunchAgents/ напрямую - некоторые агенты ставят несколько XPC-сервисов для разных функций (обновление, телеметрия, UI-компонент).Для глубокого fingerprinting XPC-сервисов полезен
xpcspy - утилита на базе Frida, перехватывающая XPC-сообщения в реальном времени. Показывает, какие методы сервис экспортирует. Статический анализ бинарей через jtool2 позволяет извлечь entitlements и code signing requirements без запуска процесса.Ограничение: на macOS с SIP (все корпоративные хосты)
dtrace и часть инструментации Frida ограничены. Fingerprinting через launchctl и ps работает всегда, динамический анализ XPC требует лабораторной среды с отключённым SIP.Эксплуатация XPC и macOS privilege escalation (T1559.003, T1068)
Ключевой примитив - создание процесса, который XPC-сервис агента примет за легитимный компонент. По данным XM Cyber, достигается через client validation gap: агент проверяет подпись клиента, но не верифицирует полную цепочку доверия (Team ID, bundle identifier, entitlements). В терминах MITRE ATT&CK:- T1559.003 (XPC Services, Execution) - использование XPC как канала выполнения привилегированных операций
- T1068 (Exploitation for Privilege Escalation) - эксплуатация программной ошибки для повышения привилегий
Когда техника НЕ работает:
- Агент использует полную проверку audit token с верификацией Team ID и конкретного code signing requirement
- XPC-сервис требует entitlement, которое невозможно получить без подписи вендора
- Агент собран с Hardened Runtime + Library Validation
NIB file injection: payload через Interface Builder
NIB-файлы (NeXT Interface Builder) - сериализованные описания UI-элементов macOS-приложений. При загрузке NIB приложение десериализует объекты, включая привязки к методам (actions) и значениям (outlets). Подмена NIB-файла легитимного приложения приводит к исполнению произвольного кода в его контексте.Звучит как баг? Нет. Это by design - просто никто не думал, что кто-то подменит NIB в контексте EDR.
XM Cyber использует NIB injection как механизм доставки payload'а в контекст процесса, которому XPC-сервис доверяет. Модифицированный NIB содержит вызовы, формирующие XPC-сообщение к привилегированному сервису агента. Это расширение Process Injection (T1055) - вместо инъекции шеллкода в память используется штатный механизм десериализации UI-ресурсов.
Когда техника НЕ работает:
- SIP-защищённые каталоги (
/System/,/usr/) - запись невозможна - MDM-профиль ограничивает права записи в
/Applications/ - Приложение использует Hardened Runtime с Library Validation, блокирующей загрузку модифицированных ресурсов
Trust cache abuse: CDHash и «память» ядра
Третий элемент - злоупотребление kernel code-signing trust cache. Ядро macOS ведёт кеш CDHash'ей - криптографических хешей подписанных бинарей. По данным XM Cyber, CDHash продолжает считаться доверенным даже после модификации бинаря: ядро "помнит" его как проверенный.Последовательность:
- Легитимное подписанное приложение запускается - CDHash попадает в trust cache
- Атакующий модифицирует бинарь (добавляет NIB injection payload)
- Модифицированный бинарь запускается - ядро доверяет ему по кешированному CDHash
Финал: Disable or Modify Tools (T1562.001, Defense Evasion)
Результат цепочки - вызов привилегированной функции агента через скомпрометированный XPC-канал. По данным XM Cyber, удалось:- CrowdStrike Falcon Sensor - silent unload без срабатывания alert'ов
- Kandji MDM Agent - перманентная деактивация
- Третий enterprise EDR (не раскрывается) - аналогичная деактивация
CVE-2026-39118: XPC vulnerability exploitation в Kandji Agent
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Расчёт по формуле CVSS 3.1 для этого вектора даёт base score 7.8 при некоторых интерпретациях параметра PR. NVD публикует 8.4 - расхождение требует уточнения у NVD/CNA, возможно используется CVSS 4.0 или скорректированные параметры.
EPSS: 0.0012, percentile 2%. Percentile 2% означает, что CVE находится в нижних 2% распределения - 98% других CVE имеют более высокий прогноз эксплуатации. Низкий EPSS отражает отсутствие публичных эксплойтов на момент расчёта, а не сложность эксплуатации. На практике - цепочка воспроизводится за минуты.
CISA SSVC Decision: Track (мониторить). Exploitation: none. Automatable: no. Technical Impact: total.
CrowdStrike bypass macOS vs Kandji bypass: вендор-специфика
| Критерий | CrowdStrike Falcon | Kandji MDM | Третий EDR |
|---|---|---|---|
| Результат атаки | Silent unload сенсора | Перманентная деактивация | Деактивация |
| CVE присвоен | Нет (bug bounty) | CVE-2026-39118 | Нет (патч в разработке) |
| Реакция вендора | Bounty + detections | Обновление агента v.4.7.5 | Разработка патча |
| Статус disclosure | Ongoing | Закрыт | Ongoing |
| Детекция попытки | Добавлена | Устранена обновлением | В разработке |
CrowdStrike Falcon: после disclosure добавлены detections, способные обнаружить попытку эксплуатации. На обновлённых версиях Falcon техника генерирует alert, даже если базовая XPC-валидация не усилена. Конкретная минимальная версия Falcon с детекцией на момент написания не раскрывается - disclosure ongoing.
Kandji: полностью закрыл уязвимость обновлением. Проверить версию агента можно через MDM-консоль или
defaults read /Library/Preferences/io.kandji.KandjiAgent.plist (путь может отличаться в зависимости от конфигурации).Apple: не планирует исправлять базовую архитектуру trust cache. Каждый вендор должен сам реализовывать строгую XPC-валидацию. Исследователь Hillel Pinto (XM Cyber) планирует выпуск open-source инструмента XPC Hunter и презентацию на Black Hat USA.
Ограничения техники и macOS endpoint security bypass detection
Когда macOS security bypass НЕ работает
- Обновлённый CrowdStrike Falcon - после добавления detections попытка эксплуатации генерирует alert в консоли Falcon
- Kandji Agent >= 4.7.5 (build 5374) - уязвимость CVE-2026-39118 закрыта
- Hardened Runtime + Library Validation - блокирует загрузку модифицированных NIB-файлов
- MDM-профиль с ограничением записи - NIB injection невозможен без записи в ресурсы целевого приложения
- macOS Lockdown Mode - ограничивает ряд векторов, хотя прямого влияния на XPC-валидацию не оказывает
Детекция для blue team
Ключевые индикаторы:- Unified Log: события
es_notify_execдля процессов, подключающихся к XPC-сервисам EDR из нетипичных путей - File Integrity Monitoring: изменения
.nib/.xibфайлов внутри бандлов приложений из/Applications/и/Library/ - osquery: мониторинг статуса агентов
SQL:
-- osquery: обнаружение остановленного EDR/MDM-агента
SELECT label, path, status FROM launchd
WHERE label IN ('com.crowdstrike.falcon.Agent','io.kandji.KandjiAgent')
AND status != 'running';
- SIEM-правило: корреляция событий "исчезновение heartbeat от агента" + "сетевая активность с хоста продолжается" = потенциальный macOS endpoint security bypass. Если heartbeat пропал, а хост продолжает ходить в сеть - это не "агент упал", это его выключили.
Место в kill chain
| Этап | MITRE ATT&CK | Описание |
|---|---|---|
| 1. Initial Access | T1566 / T1078 | Фишинг или valid credentials |
| 2. Discovery | T1518.001 | Fingerprinting EDR/MDM |
| 3. Privilege Escalation | T1068, T1559.003 | Эксплуатация XPC-валидации |
| 4. Defense Evasion | T1685 | Отключение EDR/MDM агента |
| 5. Credential Access | - | Keychain dump, SSH-ключи (без детекции) |
| 6. Lateral Movement | - | Перемещение по сети от macOS-хоста |
Без шага 4 шаги 5-6 немедленно генерируют alert'ы. С отключённым агентом SOC не видит ничего, пока атакующий не выйдет за пределы macOS-сегмента на хосты с работающими сенсорами.
Смежные техники, применимые в этой цепочке: T1574.004 (Dylib Hijacking) для альтернативной доставки payload'а, T1548.006 (TCC Manipulation) для обхода пользовательских ограничений, T1106 (Native API) для прямого вызова macOS-функций из payload'а.
Эта цепочка вскрывает фундаментальную проблему: trust model macOS не работает как самодостаточная защита enterprise-endpoint. Apple строит безопасность вокруг code signing и SIP, но XPC-коммуникация между компонентами стороннего софта - зона ответственности вендора. И когда вендор экономит на валидации (проверяет подпись, но не Team ID; проверяет путь, но не audit token), появляется CWE-269, которую стандартный пользователь эксплуатирует за минуты.
Третий год наблюдаю одну и ту-же закономерность: macOS-агенты EDR архитектурно отстают от Windows-аналогов. На Windows CrowdStrike Falcon работает через kernel-драйвер с доступом к ETW-TI, и отключить его из user space - задача принципиально другого уровня сложности. На macOS тот же Falcon полагается на Endpoint Security Framework и XPC - оба механизма user-accessible по дизайну. Apple не даёт вендорам того же уровня kernel-интеграции, что Microsoft. Результат: macOS EDR inherently уязвимее к evasion через штатные механизмы ОС. После публикации XPC Hunter и выступления на Black Hat USA количество обнаруженных уязвимых агентов вырастет кратно, а Apple по-прежнему не планирует менять архитектуру trust cache. Если хочешь отработать эту цепочку - на HackerLab (https://hackerlab.pro) есть лаба с этой связкой без EDR в дефолте.
Последнее редактирование модератором: