CVE-2025-43300: Уязвимость повреждения памяти при обработке DNG-изображений на iOS/macOS
Обзор
CVE-2025-43300 — это критическая уязвимость повреждения памяти в фреймворке обработки изображений Apple, затрагивающая iOS 18.6.1 и системы macOS. Уязвимость находится в коде декомпрессии JPEG Lossless внутри RawCamera.bundle и вызывается несоответствиями между метаданными TIFF и параметрами потока JPEG в файлах DNG.
Детали уязвимости
Корневая причина
Уязвимость возникает из-за несоответствия метаданных и потока в файлах DNG (Digital Negative):
- Метаданные SamplesPerPixel в заголовках TIFF указывают ожидаемые цветовые компоненты
- Количество компонентов SOF3 в потоках JPEG Lossless задаёт фактические компоненты данных
- Когда эти значения различаются, выделение памяти и обработка становятся несогласованными
Поток повреждения памяти
1. Parser reads SamplesPerPixel from TIFF metadata (e.g., 2 components)
2. System allocates buffer: width × height × 2 components
3. JPEG decoder reads SOF3 component count (e.g., 1 component)
4. Decoder writes data based on inconsistent assumptions
5. Buffer overflow occurs when more data is written than allocated
Вектор атаки
- Уязвимость без клика: Не требуется взаимодействие пользователя
- Автоматическая обработка: Вызывается просмотром, импортом или получением файлов DNG
- Кросс-платформенное воздействие: Затрагивает системы iOS и macOS
- Повреждение памяти: Может привести к сбоям приложений или потенциальному выполнению кода
Обзор инструментов
Этот репозиторий содержит два Python-инструмента для анализа и воспроизведения CVE-2025-43300:
1. Анализатор уязвимости DNG (dng_vulnerability_analyzer.py)
Назначение: Анализирует структуру файлов DNG для выявления условий уязвимости
Ключевые возможности:
- Разбирает структуру файлов TIFF/DNG, включая IFD и SubIFD
- Находит теги метаданных SamplesPerPixel
- Определяет маркеры SOF3 JPEG Lossless и количество компонентов
- Обнаруживает несоответствия метаданных/потока
- Сообщает точные смещения байтов для модификации
Использование:
python3 dng_vulnerability_analyzer.py <dng_file>
Вывод:
- Анализ структуры файла
- Расположение и значения тегов метаданных
- Информация о компонентах потока JPEG
- Оценка уязвимости
- Конкретные смещения для создания POC
2. Безопасный модификатор шестнадцатеричных данных (hex_modifier.py)
Назначение: Создаёт proof-of-concept файлы путём безопасного изменения определённых байтов
Ключевые возможности:
- Проверяет ожидаемые значения байтов перед модификацией
- Создаёт хеши SHA256 для отслеживания файлов
- Генерирует отчёты о двоичных различиях
- Реализует проверки безопасности для предотвращения случайного повреждения
- Поддерживает как ручное, так и автоматизированное создание POC
Использование:
# Create POC using known vulnerable offsets
python3 hex_modifier.py create-poc <input.dng>
# Manual byte modification
python3 hex_modifier.py modify <input.dng> <offset> <old_byte> <new_byte> <output.dng>
# Generate diff report
python3 hex_modifier.py diff <original.dng> <modified.dng>
Процесс создания POC
Шаг 1: Анализ целевого файла
python3 dng_vulnerability_analyzer.py IMGP0847.DNG
Это определяет:
- Расположение метаданных SamplesPerPixel
- Расположение количества компонентов SOF3 JPEG
- Текущие значения и предлагаемые модификации
Шаг 2: Создание уязвимого образца
POC требует двух конкретных модификаций байтов:
- Увеличение метаданных SamplesPerPixel (обычно с 1 до 2)
- Уменьшение количества компонентов SOF3 (обычно с 2 до 1)
python3 hex_modifier.py create-poc IMGP0847.DNG
Шаг 3: Проверка POC
python3 dng_vulnerability_analyzer.py vuln_poc_IMGP0847.dng
Подтверждает наличие несоответствия и активацию уязвимости.
Почему POC работает
Технический механизм
-
Фаза выделения памяти:
- Парсер изображения читает SamplesPerPixel = 2
- Выделяет буфер для данных пикселей на 2 компонента
- Размер буфера = ширина_изображения × высота_изображения × 2
-
Фаза обработки:
- Декодер JPEG Lossless встречает SOF3 с 1 компонентом
- Логика парсинга путается между фактическим и ожидаемым размером данных
- Пытается записать данные, основываясь на противоречивых предположениях
-
Повреждение памяти:
- В буфер записывается больше данных, чем было выделено
- Переполнение буфера повреждает соседние области памяти
- Приводит к сбою приложения или потенциальному выполнению кода
Особенности формата файла
Файлы DNG используют контейнерный формат TIFF со встроенными потоками JPEG Lossless:
- Метаданные TIFF описывают свойства изображения и цветовую информацию
- Потоки JPEG содержат сжатые данные пикселей
- Доверительное отношение существует между метаданными и содержимым потока
- Пробел в валидации позволяет несоответствующим значениям достигать кода обработки
Оценка воздействия
Серьёзность: Критическая
- Оценка CVSS: Высокая (без клика, повреждение памяти, широкое воздействие)
- Затронутые системы: iOS 18.6.1, системы macOS с аналогичной обработкой изображений
- Вектор атаки: Сетевая/локальная передача файлов
- Взаимодействие пользователя: Не требуется
- Область: Все устройства, обрабатывающие файлы DNG
Реальные сценарии
- Вложения электронной почты с файлами DNG
- Передачи AirDrop
- Синхронизация фото в облаке
- Загрузки из Интернета примеров фотографов
- Обмен медиафайлами в мессенджерах
Смягчение и исправления
Ответ вендора
- Исправлено в iOS 18.6.2: Apple реализовала правильную проверку метаданных
- Обновления macOS: Аналогичные исправления применены к обработке изображений в macOS
- Корневая причина: Добавлены проверки согласованности между метаданными и параметрами потока
Рекомендуемые меры смягчения
- Обновление систем: Установите iOS 18.6.2 или новее
- Проверка входных данных: Проверяйте согласованность метаданных в собственных парсерах
- Проверка границ: Реализуйте строгую проверку размера буфера
- Фаззинг: Регулярное тестирование парсеров файловых форматов
Структура файла и технические детали
Структура TIFF/DNG
TIFF Header → IFD Chain → SubIFDs → Image Data
├── Metadata Tags (SamplesPerPixel, Compression, etc.)
├── JPEG Lossless Streams (SOF3 markers)
└── Pixel Data (compressed)
Ключевые места уязвимости
- Тег SamplesPerPixel: Тег TIFF 0x0115 в структурах IFD
- Маркеры SOF3: Начало кадра JPEG Lossless (0xFFC3)
- Количество компонентов: Смещение байта +9 от маркера SOF3
- Критическое несоответствие: Когда значение тега ≠ количеству компонентов
Рекомендации по тестированию
Безопасная среда тестирования
- Используйте изолированные системы: Виртуальные машины или выделенные тестовые устройства
- Создавайте снимки: Перед тестированием файлов POC
- Отслеживайте сбои: Проверяйте системные журналы и отчёты о сбоях
- Изоляция сети: Предотвращайте непреднамеренный обмен файлами
Ожидаемое поведение
- Уязвимые системы: Сбой приложения, ошибки повреждения памяти
- Исправленные системы: Корректная обработка ошибок или правильная обработка
- Индикаторы в журналах: Нарушения доступа к памяти, ошибки сегментации
Технические ссылки
Документация по форматам файлов
- Спецификация TIFF 6.0: Структура тегов и формат IFD
- Спецификация DNG: Формат Adobe Digital Negative
- Стандарт JPEG: Сжатие без потерь (ITU-T T.87)
Исследования безопасности
- Техники повреждения памяти: Основы переполнения буфера
- Фаззинг файловых форматов: Автоматическое обнаружение уязвимостей
- Безопасность парсеров: Лучшие практики проверки входных данных
Отказ от ответственности: Данное исследование предоставляется только в образовательных целях и целях защиты. Пользователи несут ответственность за соблюдение применимых законов и этических норм.
ПРИМЕЧАНИЕ
Сбой происходит через 1-3 минуты. Удачи.
А для POC вы можете выполнить open vuln_file.dng, чтобы открыть файл, или просто просмотреть его, и он будет выполнен.