Одна из версий этой истории ходит по разборам безопасности, часть из которых теперь генерируется ИИ-ассистентами: фоновый демон индексации macOS, mdworker, якобы загружает удалённые изображения внутри любого скачанного HTML-файла, так что даже никогда не открытый файл может сообщить ваш IP-адрес тому, кто его прислал. Это хорошая история. Это также вид утверждения, которое стоит проверить, прежде чем повторять — поэтому мы его проверили.
С новым файлом происходят три разные вещи
Утверждение смешивает три отдельных механизма. Когда файл появляется на диске, сервер метаданных Spotlight передаёт его плагину-импортёру, запускаемому внутри процесса mdworker_shared, который извлекает текст и атрибуты, чтобы файл стал доступен для поиска (mdimport и mdls — это окна командной строки в этот процесс). Отдельно, когда Finder нужна иконка, Quick Look Thumbnailing рендерит небольшую миниатюру. И только когда вы выбираете файл и нажимаете пробел, Quick Look рендерит полный предпросмотр. Каждый из них может вести себя по-разному, поэтому каждый требует отдельного теста.
Тест
Мы запустили крошечный HTTP-слушатель на loopback-адресе, который логирует каждый запрос вместе с его User-Agent, а затем создали в ~/Downloads два файла, указывающих на него: HTML-страницу с изображением размером в один пиксель и внешней таблицей стилей, и SVG со встроенным внешним изображением. Loopback делает эксперимент самодостаточным; реальный сервер трекинга получил бы те же запросы плюс ваш публичный IP-адрес.
<html><head><title>Q3 Financial Report</title></head><body>
<h1>Financial Summary</h1>
<img src="http://127.0.0.1:8765/html-img.png" width="1" height="1">
<link rel="stylesheet" href="http://127.0.0.1:8765/html-css.css">
</body></html><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100">
<image xlink:href="http://127.0.0.1:8765/svg-image.png" width="100" height="100"/>
</svg>1. Просто скачать: индексация Spotlight
Мы подождали 40 секунд после создания файлов, затем убедились, что Spotlight их проиндексировал. Слушатель не получил ничего.
mdls -name kMDItemContentType ~/Downloads/fireai-lab-test/q3-report.html
kMDItemContentType = "public.html"
# listener log: empty2. Принудительный запуск импортёра Spotlight
Чтобы исключить фактор времени, мы запустили импортёр вручную. Он использовал импортёр RichText от Apple, извлёк 37 атрибутов и не сделал ни одного запроса.
mdimport -t -d1 ~/Downloads/fireai-lab-test/q3-report.html
Imported '…/q3-report.html' of type 'public.html' with plugIn /System/Library/Spotlight/RichText.mdimporter.
37 attributes returned
# listener log: still empty3. Иконка в Finder: миниатюра Quick Look
qlmanage -t -s 256 -o /tmp ~/Downloads/fireai-lab-test/q3-report.html ~/Downloads/fireai-lab-test/badge.svg
* …/q3-report.html produced one thumbnail
Done producing thumbnails
# listener log: still empty4. Нажатие пробела: предпросмотр Quick Look
qlmanage -p открывает ту же панель предпросмотра, что и выбор файла в Finder с нажатием пробела (qlmanage). На этот раз слушатель сразу «загорелся» для обоих файлов:
qlmanage -p ~/Downloads/fireai-lab-test/q3-report.html
13:40:22.408 GET /html-img.png UA=Mozilla/5.0 (Macintosh; …) AppleWebKit/605.1.15 … Safari/605.1.15
13:40:22.408 GET /html-css.css UA=Mozilla/5.0 (Macintosh; …) AppleWebKit/605.1.15 … Safari/605.1.15
qlmanage -p ~/Downloads/fireai-lab-test/badge.svg
13:40:30.035 GET /svg-image.png UA=Mozilla/5.0 (Macintosh; …) AppleWebKit/605.1.15 … Safari/605.1.15| Что сделал пользователь | Механизм | Удалённый запрос? |
|---|---|---|
| Ничего (файл скачан) | Импортёр Spotlight в mdworker_shared | Нет |
| Ничего (принудительный импорт) | mdimport, импортёр RichText | Нет |
| Посмотрел на папку | Миниатюра Quick Look (иконка в Finder) | Нет |
| Выбрал файл, нажал пробел | Предпросмотр Quick Look (WebKit) | Да: изображение, таблица стилей, SVG-изображение |
Что это значит
Версия «без клика» — это не то, что мы измерили: файл, который просто лежит в Downloads, проиндексирован Spotlight и показан как иконка, никуда не обратился. Это важно, потому что защита, построенная на неверной модели, тратит усилия не там, где нужно. Например, блокировка mdworker от сети ничего бы не изменила в этом тесте.
Версия «одна клавиша» реальна. Предпросмотр Quick Look рендерит HTML и SVG через WebKit и загружает их удалённые ресурсы, так что одно нажатие пробела на прикреплённом «отчёте» сообщает отправителю, что файл посмотрели, когда и с какого IP-адреса. Это веб-маяк — тот же приём, что используют трекинг-пиксели в почте и который призвана притупить функция Apple Mail Privacy Protection в Mail; просто она не покрывает случай, когда тот же контент приходит в виде файла. С точки зрения атакующего это разведка, а не компрометация: MITRE ATT&CK T1598 каталогизирует именно такой сбор информации перед реальной атакой.
Ограничения этого теста
- Одна версия macOS (26.7) и один прогон на случай. Поведение может отличаться на других версиях; повторите тест на своей — файлов выше для этого достаточно.
- Мы использовали loopback-адрес. Публичный URL ведёт себя для WebKit так же, но мы это здесь не измеряли.
- Мы тестировали HTML и SVG. Другие типы с удалёнными ссылками (например,
.webarchive, документы Office со связанными изображениями или сторонние расширения Quick Look) не тестировались и могут вести себя иначе в любую сторону. qlmanage -p— это отладочный интерфейс Apple для предпросмотра; предпросмотр по пробелу в Finder использует тот же фреймворк, но сам Finder мы отдельно не инструментировали.
Что делать
- Относитесь к открытию Quick Look для недоверенного HTML- или SVG-файла как к его открытию. Если хотите безопасно изучить файл, прочитайте его как текст:
cat file.html, или откройте в обычном текстовом редакторе. - Проверьте тип файла перед предпросмотром:
mdls -name kMDItemContentType fileпокажет, чем именно Quick Look его отрендерит, независимо от того, что подсказывает иконка. - Следите за тем, какой процесс устанавливает соединение, а не только за тем, произошло ли оно. В нашем случае это был предпросмотр WebKit, действующий от имени Apple — именно поэтому правила, доверяющие или не доверяющие только «установленным вами приложениям», это пропускают.
Более широкий урок касается метода. Драматичная версия этой истории была написана уверенно, и её было бы легко опубликовать. Двадцать минут со слушателем и четыре команды показали, где она была неверна и где на самом деле находится реальный, меньший риск.
Какое место здесь занимают FireAI и HisnLabs
The fetch in this test came from a WebKit preview running on Apple’s behalf, not from an app you installed, which is exactly the kind of connection a per-app firewall exists to show you: FireAI lists the process, the destination and the country, and lets you deny it.
FireAI — это собственный продукт HisnLabs: ИИ-файрвол, работающий прямо на вашем Mac. Он показывает простым языком каждое соединение, которое устанавливают ваши приложения, и позволяет вам решать, что покидает ваш Mac, — его ИИ работает локально, поэтому ваш трафик никогда не отправляется ни нам, ни кому-либо ещё. Команда исследователей безопасности HisnLabs — это те, кто поддерживает точность этих решений: они каталогизируют, какие домены являются обычной телеметрией, а какие — реальным сервисом, отслеживают страну и сеть, стоящие за соединением, и обучают локальную модель (функцию Autopilot) на реальных шаблонах трафика — и ничего из этого не покидает ваш Mac.
Вы можете прочитать о технических решениях, лежащих в его основе, или попробовать FireAI в течение 17 дней на странице FireAI от HisnLabs.
