Как Microsoft paint и photos ставят невидимые метки на ваши локальные изображения
Знаете это чувство, когда рисуешь что-то в Paint, нажимаешь «создать с ИИ» и думаешь, что всё происходит локально, на твоей машине, без отправки данных куда-то?
Автор исследования, Сюшэн Ли, решил проверить, как именно работает генерация изображений в Paint. И нашёл то, что заставляет задуматься.
Локальная модель — и всё равно уникальный идентификатор
Microsoft действительно встроила локальные модели в Windows. Это не один большой файл, а четыре модели в формате ONNX:
МОДЕЛИ ДЛЯ ГЕНЕРАЦИИ ИЗОБРАЖЕНИЙ В PAINT
─────────────────────────────────────────
seg.onnxe 23.1 MB — сегментация
inseg_enc.onnxe 28.0 MB — кодировщик изображения
inseg_dec.onnxe 16.5 MB — декодировщик (маски)
mager.onnxe 302.4 MB — основная модель (Stabe Diffusion)
─────────────────────────────────────────
Расположение: C:\Program Files\WindowsApps\Microsoft.Paint_*\
PaintApp\
Звучит честно: модель на твоём компьютере, изображение генерируется локально. Но есть нюанс.
Что происходит на самом деле
Перед генерацией Paint отправляет текстовый запрос на сервер Microsoft:
https://apsaiservices-a0fqcjc6bzhdcdcd.b02.azurefd.net/
v1/paint-cocreator/moderate-prompt
Сервер проверяет запрос на безопасность и возвращает JSON с тремя GUID’ами:
{
"revisedPrompt": "a cobalt blue circle above a tiny orange square",
"promptGenerationId": "74d9e06b-adea-43ce-85fe-186a26e2e34a",
"watermarkId": "83424621-03cb-40e3-9808-a9fae837156d",
"containsHumanReference": false
}
Вот этот watermarkId — уникальный 16-байтовый идентификатор — и встраивается в итоговое изображение. Причём невидимо.
Механизм невидимой метки
Автор исследования разобрал библиотеку Watermarker.dll и нашёл функцию WmkWriteWatermark. Она делает следующее:
- принимает GUID (16 байт);
- формирует 18-байтовый пакет:
0x4c || GUID[16 байт] || контрольная сумма; - раскладывает каждый бит в пиксели изображения.
ВСТРАИВАНИЕ GUID В ИЗОБРАЖЕНИЕ
──────────────────────────────
Входной GUID: 83424621-03cb-40e3-9808-a9fae837156d
│
▼
┌───────────────────────────────────────┐
│ Формирование 18-байтового пакета │
│ 0x4c + 16 байт GUID + 1 байт CRC │
└───────────────────────────────────────┘
│
▼
┌───────────────────────────────────────┐
│ Разложение в 144 бита │
│ (144 счётчика, по одному на бит) │
└───────────────────────────────────────┘
│
▼
┌───────────────────────────────────────┐
│ Модификация пикселей в блоках 3×5 │
│ ~193 376 изменённых из 262 144 │
│ для изображения 512×512 │
└───────────────────────────────────────┘
│
▼
Выходное изображение с
встроенным невидимым GUID
──────────────────────────────
Чтобы убедиться в работоспособности, автор даже написал тестовый код, который напрямую вызывал эту функцию. На синтетическом изображении 512×512 изменилось примерно 74% пикселей — и это при том, что глаз ничего не замечает.
Отличие от видимого водяного знака
В настройках Paint есть галочка «добавить водяной знак» — маленький логотип Copilot в углу. Это видимый водяной знак. Он контролируется пользователем.
Невидимый GUID — совсем другое. Настройка видимого водяного знака не влияет на встраивание GUID. Даже если отключить видимый логотип, метка всё равно добавится.
ВИДИМЫЙ vs НЕВИДИМЫЙ ВОДЯНОЙ ЗНАК ──────────────────────────────────── ┌─────────────────┐ ┌─────────────────┐ │ Видимый │ │ Невидимый │ │ водяной знак │ │ GUID │ ├─────────────────┤ ├─────────────────┤ │ Логотип Copilot │ │ 18 байт в │ │ в углу фото │ │ пикселях │ │ │ │ │ │ Контроль: │ │ Контроль: │ │ настройки Paint │ │ НЕТ │ │ │ │ │ │ Наличие: │ │ Наличие: │ │ опционально │ │ ВСЕГДА │ └─────────────────┘ └─────────────────┘ ────────────────────────────────────
Почему это важно
GUID — это не метаданные вроде EXIF, которые легко удалить. Это изменённые пиксели, распределённые по всему изображению. Для удаления такой метки нужно либо существенно исказить картинку, либо применять специальные алгоритмы dewatermarking’а.
Что это значит на практике:
- Анонимность под вопросом. Если вы сгенерировали изображение локально и опубликовали его анонимно, Microsoft теоретически может связать GUID с вашим аккаунтом и временем генерации.
- Децентрализация — не панацея. Модель работает локально, но «телеуправление» всё равно присутствует: сервер выдаёт идентификатор до генерации.
- Пользователь не уведомляется. Нет ни всплывающего окна, ни строчки в справке о том, что в изображение встраивается уникальный идентификатор.
Что это значит для меня
Меня зацепило не столько наличие водяного знака, сколько то, как это сделано. SVD-подобное встраивание в пиксели — серьёзная инженерная работа. Это не побочный эффект, а осознанное архитектурное решение.
Для пользователей Windows это означает: даже если вы генерируете картинку в Paint без интернета на Copilot+ PC с локальной моделью, Microsoft всё равно получит ваш запрос и встроит в результат связываемый идентификатор.
Единственный способ избежать этого — использовать другие инструменты. Но это уже совсем другая история.
Выводы
- Paint использует локальные модели, но не работает полностью автономно.
- Перед генерацией запрос уходит на сервер Microsoft для модерации и выдачи GUID.
- Этот GUID встраивается в изображение как невидимый водяной знак.
- Отключение видимого логотипа Copilot не отключает скрытую метку.
- Для приватности это важный сигнал: локальная генерация не всегда означает отсутствие трекинга.
Ссылки
- Оригинальное исследование: MS Paint and Photos Embed Server-Issued GUIDs as Invisible Watermarks — разбор механизма скрытой метки в Paint и Photos
- C2PA Metadata in AI-generated images — документация Microsoft о метаданных в AI-изображениях
- ONNX Runtime — среда выполнения для моделей машинного обучения в формате ONNX
Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.