CVE-2025-43300: Corrupción de memoria en el procesamiento de imágenes DNG de iOS/macOS
Descripción general
CVE-2025-43300 es una vulnerabilidad crítica de corrupción de memoria en el marco de procesamiento de imágenes de Apple que afecta a iOS 18.6.1 y sistemas macOS. La vulnerabilidad existe en el código de descompresión JPEG Lossless dentro de RawCamera.bundle, desencadenada por inconsistencias entre los metadatos TIFF y los parámetros del flujo JPEG en archivos DNG.
Detalles de la vulnerabilidad
Causa raíz
La vulnerabilidad se origina en una inconsistencia entre metadatos y flujo en archivos DNG (Digital Negative):
- SamplesPerPixel en los metadatos TIFF indica los componentes de color esperados
- El conteo de componentes SOF3 en los flujos JPEG Lossless especifica los componentes de datos reales
- Cuando estos valores difieren, la asignación y el procesamiento se desalinean
Flujo de corrupción de memoria
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
Vector de ataque
- Vulnerabilidad de cero clics: No se requiere interacción del usuario
- Procesamiento automático: Se activa al ver, importar o recibir archivos DNG
- Impacto multiplataforma: Afecta tanto a sistemas iOS como macOS
- Corrupción de memoria: Puede provocar fallos en la aplicación o posible ejecución de código
Descripción general de las herramientas
Este repositorio contiene dos herramientas Python para analizar y reproducir CVE-2025-43300:
1. Analizador de vulnerabilidades DNG (dng_vulnerability_analyzer.py)
Propósito: Analiza la estructura del archivo DNG para identificar condiciones de vulnerabilidad
Características principales:
- Analiza la estructura del archivo TIFF/DNG, incluyendo IFDs y SubIFDs
- Localiza etiquetas de metadatos SamplesPerPixel
- Identifica marcadores SOF3 JPEG Lossless y conteos de componentes
- Detecta inconsistencias entre metadatos y flujo
- Informa desplazamientos exactos de bytes para modificación
Uso:
python3 dng_vulnerability_analyzer.py <dng_file>
Salida:
- Análisis de estructura del archivo
- Ubicaciones y valores de etiquetas de metadatos
- Información de componentes del flujo JPEG
- Evaluación de vulnerabilidad
- Desplazamientos específicos para creación de PoC
2. Modificador hexadecimal seguro (hex_modifier.py)
Propósito: Crea archivos de prueba de concepto modificando bytes específicos de forma segura
Características principales:
- Verifica los valores de bytes esperados antes de modificar
- Crea hashes SHA256 para seguimiento de archivos
- Genera informes de diferencias binarias
- Implementa comprobaciones de seguridad para evitar corrupción accidental
- Soporta creación manual y automatizada de PoC
Uso:
# Crear PoC usando desplazamientos vulnerables conocidos
python3 hex_modifier.py create-poc <input.dng>
# Modificación manual de bytes
python3 hex_modifier.py modify <input.dng> <offset> <old_byte> <new_byte> <output.dng>
# Generar informe de diferencias
python3 hex_modifier.py diff <original.dng> <modified.dng>
Proceso de creación de PoC
Paso 1: Analizar el archivo objetivo
python3 dng_vulnerability_analyzer.py IMGP0847.DNG
Esto identifica:
- Ubicación de metadatos SamplesPerPixel
- Ubicaciones de conteo de componentes SOF3 JPEG
- Valores actuales y modificaciones sugeridas
Paso 2: Crear una muestra vulnerable
El PoC requiere dos modificaciones de bytes específicas:
- Aumentar metadatos SamplesPerPixel (normalmente de 1 a 2)
- Disminuir el conteo de componentes SOF3 (normalmente de 2 a 1)
python3 hex_modifier.py create-poc IMGP0847.DNG
Paso 3: Verificar el PoC
python3 dng_vulnerability_analyzer.py vuln_poc_IMGP0847.dng
Confirma que la inconsistencia existe y se activa la vulnerabilidad.
Por qué funciona el PoC
Mecanismo técnico
-
Fase de asignación:
- El analizador de imágenes lee SamplesPerPixel = 2
- Asigna un búfer para 2 componentes de datos de píxel
- Tamaño del búfer = image_width × image_height × 2
-
Fase de procesamiento:
- El decodificador JPEG Lossless encuentra SOF3 con 1 componente
- La lógica de análisis se confunde sobre el tamaño real vs esperado de los datos
- Intenta escribir datos basándose en suposiciones inconsistentes
-
Corrupción de memoria:
- Se escriben más datos en el búfer de los asignados originalmente
- El desbordamiento del búfer corrompe regiones de memoria adyacentes
- Resulta en un fallo de la aplicación o posible ejecución de código
Los archivos DNG utilizan el formato contenedor TIFF con flujos JPEG Lossless incrustados:
- Metadatos TIFF describen las propiedades de la imagen e información de color
- Flujos JPEG contienen datos de píxel comprimidos
- Relación de confianza existe entre los metadatos y el contenido del flujo
- Brecha de validación permite que valores inconsistentes lleguen al código de procesamiento
Evaluación del impacto
Gravedad: Crítica
- Puntuación CVSS: Alta (cero clics, corrupción de memoria, amplio impacto)
- Sistemas afectados: iOS 18.6.1, sistemas macOS con procesamiento de imágenes similar
- Vector de ataque: Transferencia de archivos por red/local
- Interacción del usuario: Ninguna requerida
- Alcance: Todos los dispositivos que procesan archivos DNG
Escenarios del mundo real
- Archivos adjuntos de correo electrónico con archivos DNG
- Transferencias AirDrop
- Sincronización de fotos en la nube
- Descargas web de muestras de fotógrafos
- Compartición de medios en aplicaciones de mensajería
Mitigación y parches
Respuesta del proveedor
- Corregido en iOS 18.6.2: Apple implementó una validación adecuada de metadatos
- Actualizaciones de macOS: Se aplicaron correcciones similares al procesamiento de imágenes de macOS
- Causa raíz: Se agregaron comprobaciones de consistencia entre metadatos y parámetros de flujo
Mitigaciones recomendadas
- Actualizar sistemas: Instalar iOS 18.6.2 o posterior
- Validación de entrada: Verificar consistencia de metadatos en analizadores personalizados
- Comprobación de límites: Implementar validación estricta del tamaño del búfer
- Fuzzing: Pruebas regulares de analizadores de formato de archivo
Estructura del archivo y detalles técnicos
Estructura TIFF/DNG
TIFF Header → IFD Chain → SubIFDs → Image Data
├── Metadata Tags (SamplesPerPixel, Compression, etc.)
├── JPEG Lossless Streams (SOF3 markers)
└── Pixel Data (compressed)
Ubicaciones clave de la vulnerabilidad
- Etiqueta SamplesPerPixel: Etiqueta TIFF 0x0115 en estructuras IFD
- Marcadores SOF3: Inicio de trama JPEG Lossless (0xFFC3)
- Conteo de componentes: Desplazamiento de bytes +9 desde el marcador SOF3
- Desajuste crítico: Cuando el valor de la etiqueta ≠ conteo de componentes
Directrices de prueba
Entorno de prueba seguro
- Usar sistemas aislados: Máquinas virtuales o dispositivos de prueba dedicados
- Crear instantáneas: Antes de probar archivos PoC
- Monitorear fallos: Revisar registros del sistema e informes de fallos
- Aislamiento de red: Evitar compartir archivos no intencionado
Comportamiento esperado
- Sistemas vulnerables: Fallo de la aplicación, errores de corrupción de memoria
- Sistemas parcheados: Manejo de errores correcto o procesamiento adecuado
- Indicadores de registro: Violaciones de acceso a memoria, fallos de segmentación
Referencias técnicas
- Especificación TIFF 6.0: Estructura de etiquetas y formato IFD
- Especificación DNG: Formato Adobe Digital Negative
- Estándar JPEG: Compresión sin pérdida (ITU-T T.87)
Investigación en seguridad
- Técnicas de corrupción de memoria: Fundamentos de desbordamiento de búfer
- Fuzzing de formatos de archivo: Descubrimiento automatizado de vulnerabilidades
- Seguridad de analizadores: Mejores prácticas de validación de entrada
Aviso legal: Esta investigación se proporciona únicamente con fines educativos y de seguridad defensiva. Los usuarios son responsables del cumplimiento de las leyes aplicables y las pautas éticas.
NOTA
El crash tarda entre 1 y 3 minutos en activarse. Diviértete. Y para el PoC, puedes ejecutar open vuln_file.dng para abrir el archivo o simplemente previsualizarlo y se ejecutará.