Статья Обход защиты macOS Gatekeeper: техники доставки и запуска пейлоадов при red team-операциях

Ноутбук на тёмном антистатическом коврике с открытым терминалом, где светится команда обхода карантина. Рядом — улика с иконкой образа диска и рука в нитриловой перчатке с кабелем.


На последнем red team-проекте целевой парк оказался на 80% macOS - Sonoma 14.x и Ventura 13.x под MDM. Первый .dmg с дроппером сгорел за секунды: Gatekeeper заблокировал неподписанный код, XProtect опознал сигнатуру. Второй вариант - тоже в корзину. Третий - аналогично. Четвёртый - .app-бандл с Perl-шебангом, доставленный через SMB-шару без атрибута карантина - ушёл на исполнение без единого предупреждения пользователю. Тишина в логах, тишина на экране.

Три итерации впустую, четвёртая - foothold. Разница между провалом и успехом - понимание того, какой именно уровень защиты тебя остановил и где у него зазор. Ниже - разбор каждой техники обхода Gatekeeper, XProtect, нотаризации и AMFI, с ограничениями и привязкой к конкретным версиям macOS и EDR.

Место в kill chain: от доставки пейлоада macOS до foothold​

Обход Gatekeeper - обязательный шаг на стыке initial access и execution. В терминологии MITRE ATT&CK задействованы User Execution: Malicious File (T1204.002, Execution) и Gatekeeper Bypass (T1553.001, Defense Evasion). Нюанс: T1204.002 описана MITRE как кроссплатформенная техника (включая macOS), но публичные тесты Atomic Red Team для неё есть только под Windows. T1553.001, напротив, специфична для macOS и имеет тесты Atomic Red Team только для macOS.

Зачем атакующему foothold на корпоративном Mac: доступ к Keychain (пароли, OAuth-токены), к сессиям корпоративной почты, к VPN-конфигурациям и - в ряде случаев - к внутренним ресурсам через SSO без дополнительной аутентификации. Один Mac с активной сессией Slack - и lateral movement можно даже не начинать, всё уже в чатах.

Полная цепочка на macOS-таргете:
  1. Доставка - spear-phishing, watering hole, физический доступ. Файл попадает на диск
  2. Quarantine check - система проверяет наличие атрибута com.apple.quarantine
  3. Gatekeeper - если атрибут есть, проверяет подпись, нотаризацию, запускает XProtect
  4. XProtect - YARA-сканирование на известные сигнатуры малвари
  5. AMFI - runtime-проверка целостности кода при загрузке бинаря в память
  6. Execution - код исполняется, если все уровни пройдены
  7. Persistence - LaunchAgent, dylib hijacking (T1574.004, Persistence/Defense Evasion)
  8. Post-exploitation - Keychain, VPN-конфигурации, корпоративные сессии Slack/Teams
На внешнем пентесте основной вызов - протащить payload через уровни 2–5. На внутреннем (если есть физический доступ) quarantine снимается вручную через xattr -d com.apple.quarantine /path/to/file, и фокус смещается к evasion от конкретного EDR.

Четыре уровня macOS security bypass: что стоит между payload и выполнением​

Apple выстраивает защиту тремя эшелонами (по их же документации): предотвращение запуска (Gatekeeper + Notarization), блокировка выполнения (XProtect), ремедиация (XProtect Remediator). Звучит солидно. На практике - вертикальная конструкция, где каждый уровень предполагает, что предыдущий отработал. Пробой одного звена обрушивает всё.

File Quarantine. С 2007 года macOS помечает файлы, скачанные из интернета, расширенным атрибутом com.apple.quarantine. Проверить: xattr -p com.apple.quarantine /path/to/file. Удалить: xattr -d com.apple.quarantine /path/to/file - для пользовательских файлов достаточно прав владельца; на SIP-защищённых путях возможны ограничения. Этот атрибут - единственный триггер для Gatekeeper. Файл без него проходит мимо проверки, как будто её не существует. По аналогии с Windows - Mark-of-the-Web. И вот тут самое интересное, на что указывает Unit 42 (Palo Alto Networks): расширенные атрибуты в macOS не имеют системы прав. Любой пользователь или процесс может удалить, добавить или модифицировать любой атрибут без специальных разрешений. Вся безопасность завязана на один атрибут, который может стереть кто угодно.

Gatekeeper. Проверяет подпись разработчика (Developer ID), нотаризационный тикет (stapled или online через CloudKit), запускает XProtect-сканирование. После успешной проверки атрибут карантина снимается, при повторных запусках Gatekeeper не вмешивается. С macOS Sequoia (15.x) Apple усложнила обход через правый клик -> "Открыть": пользователь обязан перейти в "Системные настройки -> Конфиденциальность и безопасность" и явно разрешить запуск.

XProtect. Сигнатурный движок на YARA-правилах. Обновляется автоматически, независимо от обновлений ОС. Параллельно с XProtect, Gatekeeper/syspolicyd выполняет онлайн-проверку нотаризационного тикета через CloudKit - если CDHash отозван Apple, запуск блокируется даже без YARA-совпадения. Эти онлайн-проверки происходят значительно чаще, чем обновления YARA-сигнатур.

AMFI (Apple Mobile File Integrity). Компонент ядра, проверяющий подпись кода при загрузке бинаря в память. На Apple Silicon интегрирован с Secure Boot. Тесты Eclectic Light Company на Sonoma 14.6.1 показали: AMFI блокирует неподписанный код даже при отключённых Gatekeeper и SIP. В логах ядра характерная запись: "AMFI: Unrecoverable CT signature issue, bailing out. AMFI: code signature validation failed". Отключил Gatekeeper - думаешь, всё? AMFI тебя встретит на следующем повороте.

Обход карантина файлов macOS: самое хрупкое звено​

1781274461421.webp

Нет атрибута com.apple.quarantine - нет проверки Gatekeeper. Архитектура, где вся безопасность завязана на одном расширенном атрибуте без системы прав, создаёт предсказуемые зазоры. Три техники ниже эксплуатируют именно этот факт.

Требования к окружению для воспроизведения: macOS Ventura 13.x или Sonoma 14.x (VM через UTM/VMware Fusion или bare metal), минимум 8 ГБ RAM, SMB-сервер атакующего (для SMB-техники - Kali Linux с Impacket или smbclient), C2-фреймворк для генерации payload (Mythic, Sliver).

Загрузка без quarantine: curl, wget и вторичные дропперы​

[Применимо: внутренний пентест, stage 2 - требуется уже имеющееся выполнение кода]

/usr/bin/curl и wget не устанавливают атрибут карантина - они не реализуют протокол LSFileQuarantineEnabled. По данным Unit 42 и Red Canary, семейства Shlayer, CoinTicker, Bundlore использовали curl для скачивания вторичных пейлоадов, полностью минуя Gatekeeper.

curl предустановлен в macOS, wget требует Homebrew. Техника работает на всех версиях вплоть до Sequoia. Но она предполагает, что у атакующего уже есть выполнение кода - хотя бы shell или скрипт. Для initial access через фишинг напрямую не годится.

Когда НЕ работает: CrowdStrike Falcon и SentinelOne мониторят child-процессы от curl/wget и анализируют содержимое скачанных файлов по поведению, игнорируя quarantine-атрибут. На машинах с этими EDR паттерн "curl скачивает бинарь -> бинарь запускается" детектируется. Kaspersky Endpoint Security for Mac менее агрессивен в поведенческом анализе - тут шансы выше, но сигнатурная база может зацепить известный payload.

Монтирование SMB через Finder: запуск вредоносного кода macOS без карантина​

[Применимо: внешний пентест через social engineering, внутренний пентест]

При монтировании SMB-шары через Finder (меню «Подключение к серверу», Cmd+K) файлы на удалённой шаре не получают атрибут com.apple.quarantine. Техника задокументирована Tarlogic на red team-проекте и независимо описана исследователем Karol Mazurek через WebDAV. Примечательно: при использовании команды open smb://... или .inetloc-файлов quarantine проставляется корректно. Разница - только в способе монтирования. Один и тот же файл, два способа открыть - и совершенно разный результат.

Сценарий: атакующий убеждает жертву открыть Finder -> Cmd+K -> ввести адрес SMB-сервера -> запустить .app-файл с шары. Требует значительного user interaction - нужен убедительный pretext. Tarlogic описала рабочий сценарий с приглашением на "тренинг" через Google Calendar, где оператор вёл жертву через шаги под предлогом демонстрации. Не самый элегантный вектор, но работает - люди удивительно послушно выполняют инструкции, если они приходят из "корпоративного" канала.

Когда НЕ работает: firewall блокирует исходящий SMB (порт 445), MDM-политика запрещает монтирование внешних шар, EDR отслеживает события монтирования через Endpoint Security API. Поведение на Sequoia 15.x требует отдельной верификации - Apple могла закрутить гайки.

Сторонние архиваторы: обход Gatekeeper macOS через наследование атрибутов​

[Применимо: внешний пентест через фишинг с вложением]

Apple предполагает, что разработчики архиваторов будут корректно пропагировать com.apple.quarantine от архива к извлечённым файлам. По результатам исследования Unit 42 - не пропагируют:

АрхиваторФорматы без наследования quarantine
iZipZIP, TAR, 7Z
ArchiverARCHIVER, ZIP, TAR, 7Z
BetterZipZIP, TAR, 7Z
WinRARZIP, TAR, 7Z
7z UtilityDMG, ZIP, 7Z

Встроенный Archive Utility от Apple пропагирует атрибут корректно. Apple в ответ на отчёт Unit 42 заявила: "Ответственность за карантинирование лежит на разработчике приложения". Проблема не будет исправлена на уровне ОС. По документам - ответственность разработчика. На практике - дыра в безопасности, которую Apple не собирается закрывать.

Исторические CVE по этому вектору: CVE-2022-22616 (CVSS 5.5, MEDIUM - специально сформированный ZIP обходил проверки Gatekeeper, затронуты macOS Monterey, Big Sur, Catalina) и CVE-2022-32910 (CVSS 7.5, HIGH, CWE-693 Protection Mechanism Failure, вектор AV:N/AC:L/PR:N/UI:N - архив мог обойти Gatekeeper без взаимодействия с пользователем, затронуты macOS Monterey, Big Sur и Catalina). Оба закрыты Apple. CVE-2019-8656 (CVSS 5.5, MEDIUM) - обход через символические ссылки в ZIP на NFS-mount атакующего, исправлен в macOS Mojave 10.14.6.

Когда НЕ работает: если пользователь распаковывает файл стандартным Archive Utility (двойной клик по .zip в Finder), атрибут наследуется корректно. Техника работает только при наличии уязвимого архиватора у жертвы. На корпоративных машинах под MDM сторонние архиваторы встречаются реже - но на личных маках разработчиков BetterZip и 7z Utility стоят через одного.

Конструирование app bundle для доставки пейлоада macOS​

1781274545275.webp

Когда quarantine обойдён, формат payload определяет успех social engineering. Application bundles дают лучший UX: запускаются двойным кликом, иконка и имя кастомизируются для маскировки под PDF или документ.
Код:
Payload.app/
  Contents/
    Info.plist          # CFBundleExecutable -> скрипт в MacOS/
    MacOS/
      executable        # Perl-скрипт с шебангом
    Resources/          # иконка, bundled ZIP с Python
Info.plist содержит ключ CFBundleExecutable, указывающий на файл в Contents/MacOS/. Этот файл может быть скриптом с шебангом вместо скомпилированного Mach-O. И тут начинается самое интересное.

Perl вместо Bash. Tarlogic зафиксировала, что EDR на целевых машинах детектировал запуск Bash-скриптов из app bundle. Замена шебанга на #!/usr/bin/perl обошла детект - Perl штатно поставляется с macOS (хотя Apple убрала системный Python 2.7 начиная с macOS 12.3 Monterey - /usr/bin/python3 присутствует лишь как stub для Command Line Tools - и может поступить аналогично с Perl в будущих релизах).

BYOI (Bring Your Own Interpreter). Внутрь бандла упаковывается ZIP с дистрибутивом Python. Perl-скрипт при запуске распаковывает его в ~/Library/Application Support/ и создаёт LaunchAgent для персистентного запуска лоадера:
XML:
<dict>
  <key>Label</key>
  <string>com.sometool.support.update</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/TARGET_USER/Library/Application Support/python3</string>
    <string>/Users/TARGET_USER/Library/Application Support/loader.py</string>
  </array>
  <key>RunAtLoad</key><true/>
</dict>
Этот plist (обёрнутый в стандартные <plist> теги) сохраняется в ~/Library/LaunchAgents/. Три результата: исполнение агента декаплится от app bundle, Python-бинарь выглядит легитимно, через plist задаются DYLD_FALLBACK_LIBRARY_PATH и другие переменные без модификации системных настроек.

Ограничение: если файл имеет quarantine-атрибут, macOS применяет app translocation - перемещение бандла в случайную read-only директорию. BYOI работает только в связке с обходом quarantine. SentinelOne алертит на создание LaunchAgent plist и нестандартные бинари в ~/Library/Application Support/. CrowdStrike Falcon тоже не дремлет - child-процесс от perl, который распаковывает ZIP и создаёт LaunchAgent, выглядит подозрительно даже для поведенческого движка.

Bypass XProtect macOS и обход нотаризации macOS​

XProtect - сигнатурный движок, и его ограничение фундаментально: он работает только против известных сэмплов и их вариантов. Кастомный payload, собранный под конкретный проект, не попадает под YARA-сигнатуру при двух условиях: не используются публичные фреймворки без модификации (stock Mythic agent, Empire stager) и бинарь не содержит строк-индикаторов, совпадающих с известными IoC.

По результатам тестов Eclectic Light Company на Sonoma 14.6.1: образец Atomic Stealer (AMOS) был обнаружен одновременно двумя механизмами - по YARA-сигнатуре семейства AMOS/SOMA (конкретное имя правила зависит от версии XProtect.yara) и по отозванному CDHash (нотаризационная проверка через CloudKit). Образец XCSSET заблокирован не по YARA (совпадения не найдено), а по отсутствию подписи - Gatekeeper всё равно остановил неподписанный код. Два механизма, два разных триггера - но оба бесполезны против кастомного payload без quarantine-атрибута.

Нотаризация на red team-проекте обходится тривиально: пейлоад не нотаризуется. Если quarantine отсутствует - проверка нотаризации не запускается. Злоупотребление валидными Developer ID-сертификатами ($99/год через Apple Developer Program) теоретически возможно, но на практике рискованно: Apple привязывает сертификат к реальной личности и оперативно отзывает скомпрометированные сертификаты. Не тот случай, когда стоит светить паспортные данные.

AMFI bypass техники на Apple Silicon: обход защиты Apple Silicon​

AMFI - последний рубеж на уровне ядра. Проверяет CMS blob (подпись), целостность code directory, соответствие entitlements. По тестам Eclectic Light Company, AMFI блокирует неподписанный Mach-O бинарь даже при отключённых SIP и Gatekeeper.

И вот тут - ключевой нюанс, ради которого весь раздел: AMFI проверяет Mach-O бинари, не скрипты. Для Perl, Python, Bash проверяется подпись интерпретатора - /usr/bin/perl подписан Apple, проверка проходит. Содержимое скрипта AMFI не анализирует. BYOI-подход со скриптовым payload обходит AMFI без дополнительных манипуляций. Вот почему Perl-шебанг из начала статьи сработал.

Для Mach-O payload варианты ограничены: ad-hoc signing через codesign -s - /path/to/binary (self-signed, AMFI пропустит, но без quarantine bypass Gatekeeper заблокирует) и dylib hijacking (T1574.004) - подгрузка неподписанного dylib через легитимное приложение. Работает, если целевое приложение ищет dylib по предсказуемому пути и не использует hardened runtime.

Уязвимости уровня ядра позволяют обойти все проверки разом. CVE-2021-30869 (CVSS 7.8, HIGH, CWE-843 - type confusion в XNU): malicious application может выполнить произвольный код с привилегиями ядра. Эксплуатировалась in the wild, включена в CISA KEV (дата добавления: 2021-11-03). Вектор CVSS: AV:L/AC:L/PR:N/UI:R - локальный доступ, низкая сложность, но требуется действие пользователя. Затронуты iOS до 12.5.5, iOS/iPadOS до 14.4, macOS Big Sur до 11.2, macOS Catalina и Mojave (до соответствующих Security Updates). Исправлена в iOS 12.5.5, iOS 14.4 и iPadOS 14.4, macOS Big Sur 11.2, Security Update 2021-001 Catalina, Security Update 2021-001 Mojave и Security Update 2021-006 Catalina. Kernel-level - это ядерная опция (каламбур уместен), но на непропатченных системах она снимает вопрос обхода всех уровней разом.

Детектирование и ограничения: macOS endpoint security bypass​

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Kaspersky Endpoint Security for Mac - собственная YARA-база поверх XProtect. Поведенческий анализ менее агрессивен, чем у CrowdStrike - BYOI-сценарии без сигнатурного совпадения проходят чаще. На проектах с Kaspersky SMB-вектор + Perl-бандл работал без дополнительной обфускации.

Общее ограничение: если организация использует allow-listing через MDM (запуск только одобренных приложений) - ни один из описанных векторов не сработает без предварительной компрометации MDM или привилегированного доступа. MDM + EDR - комбинация, закрывающая все описанные зазоры на архитектурном уровне.


Заключение​

Собрал воедино опыт нескольких проектов, где macOS-таргеты были основной целью, и прихожу к одному выводу: Apple строит защиту по модели вертикальной интеграции, где каждый уровень предполагает, что предыдущий отработал. Выглядит непробиваемо - пока не пробьёшь один уровень, и вся конструкция не посыплется.

Quarantine - самое хрупкое звено. Apple делегировала ответственность за простановку атрибута сторонним разработчикам. Unit 42 прямо указала на проблему. Apple ответила: "это ответственность разработчика". Пока Apple не начнёт принудительно пропагировать quarantine на уровне ядра - а не полагаться на добрую волю разработчиков - архитектура останется уязвимой.

На проектах, где macOS-флот управлялся Jamf Pro с жёсткими политиками плюс CrowdStrike Falcon на каждом хосте, ни одна из описанных техник не прошла без отдельной работы по обходу конкретного EDR. А на машинах с дефолтной защитой - без MDM, без стороннего EDR, только штатные Gatekeeper и XProtect - цепочка от SMB-доставки до beacon C2 собиралась за пару часов на Ventura 13.x. Разрыв между этими двумя реальностями и есть главная проблема macOS security: одни организации защищены многослойно, другие полагаются на маркетинговое обещание "Mac не заражаются", которому уже двадцать лет. Проверьте свой парк: xattr -l на любом скачанном файле покажет, есть ли quarantine. Если его нет - у вас та же проблема, что была у нас на четвёртой итерации. Только мы были по ту сторону.
 
Последнее редактирование модератором:
Мы в соцсетях:

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

Похожие темы

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab