Статья EDR bypass macOS: цепочка XPC + NIB injection для отключения CrowdStrike и Kandji

Разобранная материнская плата MacBook на тёмном рабочем столе с подключённым диагностическим зондом. Монитор отображает код уязвимости в монохромном свечении.


На 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 на другие хосты корпоративной сети
Каждый шаг генерирует telemetry, которую EDR-агент отправляет в SOC/SIEM. Если агент молчит - SOC-команда слепа. Одновременное отключение CrowdStrike (detection) и Kandji (compliance/MDM) - полная потеря visibility на endpoint. Для macOS-флота из 200–500 хостов это несколько часов беспрепятственной работы, пока сетевые средства не заметят аномалию.

[Применимо: внутренний пентест, red team-операция, post-exploitation на macOS 13+ с корпоративным EDR/MDM]

Как macOS EDR работает изнутри: Endpoint Security Framework и XPC-сервисы​

1782716548416.webp

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 может проверить:
  1. Code signing identity подключающегося процесса
  2. Team ID - принадлежит ли бинарь вендору
  3. Entitlements - есть ли необходимые привилегии
  4. Audit token - PID, UID, GID вызывающего процесса
Проблема, которую нашла команда XM Cyber: ряд EDR- и MDM-агентов выполняют эту валидацию недостаточно строго. Одни проверяют наличие валидной подписи Apple, но не верифицируют Team ID. Другие полагаются на path-based validation, которую можно обойти через symlink. По сути - Security Misconfiguration (категория A06 по OWASP) на уровне IPC десктопного приложения. Именно этот gap становится первым звеном цепочки (T1559.003, Execution).

Цепочка атаки: от стандартного пользователя до отключения агента​

Требования к окружению:
  • 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
Полная цепочка: Recon -> XPC exploitation -> NIB injection -> Trust cache abuse -> Agent disable

Разведка: 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'
CrowdStrike Falcon регистрирует daemon как 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) - эксплуатация программной ошибки для повышения привилегий
Атакующий формирует XPC-сообщение, вызывающее привилегированную функцию агента (управление состоянием сенсора: start/stop/unload). Стандартный пользователь не должен иметь доступ к таким методам, но слабая валидация позволяет обойти ограничение.

Когда техника НЕ работает:
  • Агент использует полную проверку 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 продолжает считаться доверенным даже после модификации бинаря: ядро "помнит" его как проверенный.

Последовательность:
  1. Легитимное подписанное приложение запускается - CDHash попадает в trust cache
  2. Атакующий модифицирует бинарь (добавляет NIB injection payload)
  3. Модифицированный бинарь запускается - ядро доверяет ему по кешированному CDHash
Apple, по данным XM Cyber, не планирует исправлять это поведение. Вендорам софта предлагается самостоятельно реализовывать защиту. То есть Apple говорит: "ваши проблемы - ваши решения".

Финал: Disable or Modify Tools (T1562.001, Defense Evasion)​

Результат цепочки - вызов привилегированной функции агента через скомпрометированный XPC-канал. По данным XM Cyber, удалось:
  • CrowdStrike Falcon Sensor - silent unload без срабатывания alert'ов
  • Kandji MDM Agent - перманентная деактивация
  • Третий enterprise EDR (не раскрывается) - аналогичная деактивация
Все три продукта отключены без единого уведомления в SOC. Прямое применение Disable or Modify Tools (T1685, Defense Evasion). Три агента, три вендора, один и тот же архитектурный промах.

CVE-2026-39118: XPC vulnerability exploitation в Kandji Agent​

1782716610387.webp

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом 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 FalconKandji MDMТретий EDR
Результат атакиSilent unload сенсораПерманентная деактивацияДеактивация
CVE присвоенНет (bug bounty)CVE-2026-39118Нет (патч в разработке)
Реакция вендораBounty + detectionsОбновление агента v.4.7.5Разработка патча
Статус disclosureOngoingЗакрыт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 AccessT1566 / T1078Фишинг или valid credentials
2. DiscoveryT1518.001Fingerprinting EDR/MDM
3. Privilege EscalationT1068, T1559.003Эксплуатация XPC-валидации
4. Defense EvasionT1685Отключение 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 в дефолте.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🧭 Навигатор · ИБ 2026
Не знаешь, какой трек твой?
5 направлений ИБ, реальные зарплаты и точка входа для каждого — в одном треде.
JuniorSenior+
100K → 600K+ ₽ /мес
Открыть навигатор →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab