Глубокие погружения

Метаданные EXIF: технический разбор утечки приватности в ваших фотографиях

koboshiCo-founder
·9 мин чтения
Метаданные EXIF: технический разбор утечки приватности в ваших фотографиях
Кратко

Каждое фото с телефона или камеры несёт внутри второй файл: настройки съёмки, метки времени, серийные номера и часто GPS-координаты. Разбираем байтовую структуру EXIF, как её просмотреть, как она вас выдаёт и как конвертация формата её стирает.

Сделайте фото на iPhone и откройте JPEG в шестнадцатеричном редакторе. Через несколько сотен байтов после начального маркера FF D8 вы наткнётесь на это:

FF E1 1C 24 45 78 69 66 00 00 4D 4D 00 2A 00 00 00 08

FF E1 — маркер сегмента APP1. Следующие два байта — длина сегмента. Затем шесть байтов читаются как Exif\0\0, а сразу за ними идёт TIFF-заголовок (4D 4D 00 2A означает big-endian). Ваш JPEG несёт внутри второй, меньший файл, который часто рассказывает о вас больше, чем само изображение.

Что такое EXIF на самом деле

EXIF расшифровывается как Exchangeable Image File Format. JEIDA (Japan Electronic Industry Development Association) опубликовала версию 1.0 в 1995 году. Сегодня стандарт поддерживают JEITA и CIPA; EXIF 3.0 вышел в 2023-м.

Структурно EXIF — это TIFF. После заголовка Exif\0\0 идёт маркер порядка байтов, затем цепочка каталогов Image File Directory (IFD). Каждая запись IFD занимает двенадцать байтов:

Bytes 0-1:   ID тега (напр. 0x010F = Make)
Bytes 2-3:   Тип данных (ASCII, rational, short, long)
Bytes 4-7:   Количество значений
Bytes 8-11:  Встроенное значение или смещение до него

Для приватности важны два подкаталога. EXIF SubIFD (на него указывает тег 0x8769) хранит настройки камеры, серийные номера и метки времени. GPS IFD (тег 0x8825) хранит широту и долготу — каждую в виде трёх рациональных чисел: градусы, минуты, секунды.

В IFD1 обычно хранится и миниатюра — небольшой JPEG, встроенный прямо в метаданные. Запомните это: к миниатюре мы ещё вернёмся.

Какие контейнеры несут EXIF:

ФорматГде хранится EXIFПримечания
JPEGСегмент APP1Здесь EXIF и начался
HEICЭлемент Exif в боксе metaФормат камеры iPhone по умолчанию с iOS 11
WebPЧанк EXIF внутри VP8XОпционально, часто отсутствует
PNGЧанк eXIfДобавлен в спецификацию в 2017
TIFFСам файл и есть TIFFРодительский формат EXIF
BMP/ICOНе поддерживаетсяСтруктуры метаданных нет вообще

Зачем камеры начали записывать EXIF

Проблема середины 90-х была будничной и практичной. Цифровые камеры выдавали файлы без всякого контекста. У плёночных фотографов были негативы, конверты из фотолаборатории с датами проявки и заметки. У цифровых — каталог, полный файлов DSC_0042.JPG, и больше ничего.

EXIF решал три конкретные задачи:

  • Запись экспозиции. Диафрагма, выдержка, ISO и фокусное расстояние — чтобы фотограф мог разобрать, почему кадр удался, и повторить его.
  • Заказ печати. DPOF (Digital Print Order Format) позволял отметить фото на камере и позже распечатать их в киоске, используя поля EXIF вроде поворота.
  • Ориентация и предпросмотр. Тег Orientation держит портретные кадры вертикально, а встроенная миниатюра делала просмотр на ЖК-экране камеры быстрым.

Заметьте допущение в основе всего этого: фотографии остаются у владельца. EXIF проектировался для мира, где снимок перемещался с CF-карты на жёсткий диск и в печатный киоск. Никто в JEIDA в 1995 году не планировал мир, где вы каждый день заливаете десяток фотографий на публичные серверы.

Что на самом деле внутри

Откройте любое фото с телефона в просмотрщике метаданных — список тегов окажется длинным. Поля, важные для приватности:

ТегПример значенияЧто раскрывает
Make / ModelApple, iPhone 15 ProВаше железо
BodySerialNumber / LensSerialNumberУникален для устройстваОтпечаток вашей камеры
DateTimeOriginal + OffsetTime2026:06:30 18:42:11 +09:00Когда, с точностью до секунды
GPSLatitude / GPSLongitude37°46'29" N, 122°25'10" WГде, с точностью до метров
GPSAltitude14.2 mКакой этаж, примерно
SoftwareInstagram, Photoshop 26.1Что трогало файл
Artist / CopyrightСвободный текстИногда настоящее имя
Миниатюра IFD1Второй JPEGКопия неотредактированного кадра

Вывод exiftool для реального фото с iPhone, сокращённый для краткости:

$ exiftool IMG_4021.HEIC
Make                            : Apple
Camera Model Name               : iPhone 15 Pro
Serial Number                   : F2LX8A1BCD
Date/Time Original              : 2026:06:30 18:42:11
GPS Latitude                    : 37 deg 46' 29.28" N
GPS Longitude                   : 122 deg 25' 10.41" W
GPS Altitude                    : 14.2 m Above Sea Level

Тридцать секунд чтения — и посторонний знает, на что вы снимаете, когда вы были там и где это «там» находится, с точностью до нескольких метров.

Как прочитать EXIF на своём компьютере

Windows

Кликните по файлу правой кнопкой, откройте «Свойства», перейдите на вкладку «Подробно». Производитель, модель, даты и GPS-координаты — всё перечислено там. Внизу той же вкладки есть ссылка «Удаление свойств и личной информации», открывающая простой диалог очистки.

Для доступа к сырым данным через PowerShell:

Add-Type -AssemblyName System.Drawing
$img = [System.Drawing.Image]::FromFile("C:\photos\IMG_4021.jpg")
$img.PropertyItems | ForEach-Object {
    $text = [System.Text.Encoding]::ASCII.GetString($_.Value).Trim([char]0)
    "Tag 0x{0:X4} (len {1}): {2}" -f $_.Id, $_.Len, $text
}
$img.Dispose()

Числовые поля выводятся сырыми байтами, а ASCII-теги вроде Make и Software — в читаемом виде.

macOS

Откройте изображение в «Просмотре», затем «Инструменты» → «Показать инспектор» и загляните на вкладки EXIF и GPS. Вкладка GPS даже рисует метку на карте.

Из терминала mdls выводит всё, что проиндексировал Spotlight:

mdls IMG_4021.jpg | grep -iE "gps|latitude|longitude|model"

Или установите ExifTool командой brew install exiftool, чтобы получить полный список тегов.

Linux

ExifTool — стандарт:

exiftool IMG_4021.jpg

Более лёгкие альтернативы: exiv2 IMG_4021.jpg или identify -verbose IMG_4021.jpg | grep -i exif из ImageMagick.

Из браузера: двадцать строк TypeScript

Чтобы найти сегмент APP1 самостоятельно, нужен цикл по цепочке маркеров JPEG:

async function findExifSegment(file: File): Promise<number> {
  const bytes = new Uint8Array(await file.slice(0, 128 * 1024).arrayBuffer())
  if (bytes[0] !== 0xff || bytes[1] !== 0xd8) return -1 // не JPEG

  let offset = 2
  while (offset < bytes.length - 12) {
    if (bytes[offset] !== 0xff) break
    const marker = bytes[offset + 1]
    const length = (bytes[offset + 2] << 8) | bytes[offset + 3]
    if (
      marker === 0xe1 &&
      String.fromCharCode(...bytes.slice(offset + 4, offset + 10)) ===
        "Exif\0\0"
    ) {
      return offset
    }
    offset += 2 + length
  }
  return -1
}

Как EXIF сливает вашу приватность

GPS-координаты выдают ваше местоположение

Телефоны записывают GPS всякий раз, когда у приложения камеры есть разрешение на доступ к геолокации. Большинство один раз не глядя подтверждает его и забывает. Выложите фото балкона, рабочего стола или школьного проекта ребёнка на форум или в объявление на маркетплейсе — и вы опубликовали свой адрес с точностью до метров.

Самый известный случай — Джон Макафи. В декабре 2012 года он был в бегах и скрывался в Гватемале. Vice опубликовал его фотографию, снятую на iPhone 4S, и в EXIF-данных лежали полные GPS-координаты. Любой желающий мог прочитать, где именно в Гватемале он находится. Через несколько дней он оказался под стражей в Гватемале.

Серийные номера связывают ваши аккаунты

BodySerialNumber и LensSerialNumber уникальны для каждого устройства. Два анонимных аккаунта, публикующих фото, снятые одной камерой, можно связать почти наверняка. Исследователи обходили фотосайты краулерами и группировали снимки по серийному номеру камеры именно по этой причине. Вы можете разделять свои личности в сети. Ваша камера — нет.

Метки времени обрисовывают ваш распорядок

DateTimeOriginal плюс смещение часового пояса. Сама по себе одна метка говорит немного, но год загрузок показывает, когда вы просыпаетесь, когда уходите из дома и когда путешествуете.

Миниатюра вас выдаёт

Миниатюра IFD1 — отдельный JPEG внутри метаданных. Вырежьте лицо или документ из основного изображения — и множество редакторов оставит исходную миниатюру нетронутой. Кто бы её ни извлёк, получит необрезанное фото. В 2003 году ведущая TechTV выложила свои обрезанные фотографии, а читатели восстановили полные кадры из EXIF-миниатюр. Урок актуален до сих пор, потому что инструменты повторяют ту же ошибку.

Где EXIF выживает при загрузке

Крупные соцплатформы (Facebook, Instagram, X) срезают EXIF при загрузке. Почти всё остальное — нет: вложения в почте, загрузки на форумы, объявления на маркетплейсах, ссылки на облачные диски, AirDrop и любой мессенджер, настроенный на отправку в исходном качестве. Если файл покидает устройство неизменным, метаданные уходят вместе с ним.

Что происходит при конвертации форматов

Конвертация фото не означает автоматической очистки. Конвертеры бывают двух видов:

  1. Копировщики метаданных. Инструменты, которые перекодируют, но намеренно переносят теги: ExifTool, ffmpeg и большинство GUI-конвертеров с настройкой «сохранять метаданные» по умолчанию. Прогоните JPEG в WebP через копировщик — и ваши GPS-координаты нетронутыми переедут в чанк EXIF внутри WebP.
  2. Перекодировщики пикселей. Инструменты, которые декодируют файл в сырые пиксели и кодируют из них совершенно новый файл. На выходе — только данные изображения, потому что метаданные никогда не были частью пикселей.

Очистка вручную — одна команда в любом случае:

# ExifTool: стереть все теги, изображение оставить
exiftool -all= -overwrite_original photo.jpg

# ImageMagick 7: перекодировать без метаданных
magick photo.jpg -strip photo-clean.jpg

Один момент здесь требует внимания: ориентация. EXIF Orientation (тег 0x0112) говорит программам просмотра повернуть изображение, часто на 90 градусов. Сотрите теги, не запечатав этот поворот в пиксели, — и каждое портретное фото ляжет набок. Правильный порядок такой: сначала декодировать с применённой ориентацией, затем отбросить метаданные. Инструмент, который чистит без поворота, хуже, чем отсутствие очистки вообще.

Что наши конвертеры делают с EXIF

Каждый конвертер на этом сайте — перекодировщик пикселей. Конвейер одинаков для всех:

  1. Декодировать исходный файл в сырые пиксели прямо в браузере (WebAssembly-сборка libheif для HEIC, нативный декодер браузера для остальных).
  2. Отрисовать пиксели на canvas с ориентацией EXIF, уже применённой при декодировании.
  3. Закодировать canvas в целевой формат.

Итоговый файл содержит сжатые пиксели и ничего больше. Ни сегмента APP1, ни чанка EXIF или eXIf, ни GPS IFD, ни серийных номеров, ни встроенной миниатюры. В коде нет пути, который копировал бы метаданные, потому что в памяти просто нет метаданных для копирования. А поскольку всё работает на стороне клиента, файл никогда не покидает устройство — и ни один сервер не видит оригинал.

Выбирайте исходный формат:

Перетащите файл, скачайте конвертированную копию и делитесь именно ей. Пиксели идентичны, а метаданные исчезли.

Короткая версия

  • Прежде чем делиться фото там, где EXIF выживает (почта, форумы, маркетплейсы, прямые ссылки), сначала проверьте его. «Свойства» в Windows, «Инспектор» в macOS, exiftool в Linux.
  • Если в файле есть GPS-данные, а вам бы этого не хотелось, конвертируйте его. Каждый инструмент из списка выше выдаёт только пиксели.
  • Если вы публикуете под разными личностями, серийные номера камеры могут их связать. Очистка решает и эту задачу.
  • Храните оригиналы нетронутыми. В собственном архиве EXIF действительно полезен. Чистыми должны быть те копии, которые вы публикуете.

Ещё посты в блоге