
La CVE-2025-43300 es una vulnerabilidad de desbordamiento de búfer en el procesamiento de archivos DNG (Digital Negative) que ocurre debido a una inconsistencia entre los metadatos TIFF y los datos JPEG, permitiendo la ejecución remota de código (RCE).
DNG File
├── TIFF Container (metadatos)
│ ├── Header
│ ├── IFD (Image File Directory)
│ │ ├── Tag 277: SamplesPerPixel (declara cuántos componentes)
│ │ ├── Tag 513: JpegOffset (dónde comienza el JPEG)
│ │ └── Tag 514: JpegLength (tamaño del JPEG)
│ └── Otros metadatos
└── JPEG Data (datos reales de la imagen)
├── SOI (Start of Image)
├── SOF0 (Frame Header)
│ └── Components: número real de componentes
└── Compressed Data
// PROBLEMA FUNDAMENTAL:
TIFF declara: "Esta imagen tiene 2 componentes" (SamplesPerPixel = 2)
JPEG contiene: "En realidad tengo 3 componentes" (SOF0 Components = 3)
// Código vulnerable (simplificado)
int samples = read_tiff_tag(277); // Lee 2
buffer = malloc(samples * sizeof(component)); // Asigna para 2
// Pero procesa basado en el JPEG
int components = read_jpeg_sof0(); // Lee 3
for (int i = 0; i < components; i++) { // ¡Bucle 3 veces!
buffer[i] = process_component(i); // ¡OVERFLOW en i=2!
}
[1] APERTURA DEL ARCHIVO
↓
[2] PARSER TIFF
├─→ Lee Header TIFF
├─→ Localiza IFD
├─→ Lee Tag 277 (SamplesPerPixel = 2)
└─→ Asigna búfer para 2 componentes
[3] LOCALIZACIÓN DEL JPEG
├─→ Lee Tag 513 (offset del JPEG)
└─→ Navega hasta la posición en el archivo
[4] PARSER JPEG
├─→ Lee marcador SOF0 (0xFFC0)
├─→ Extrae número de componentes (3)
└─→ ¡NO VALIDA contra TIFF!
[5] PROCESAMIENTO
├─→ Bucle para procesar 3 componentes
├─→ El búfer solo tiene espacio para 2
└─→ El 3er componente escribe FUERA del búfer
[6] DESBORDAMIENTO DE BÚFER
├─→ Sobrescribe datos adyacentes
├─→ Puede sobrescribir la dirección de retorno
└─→ Permite el control de la ejecución
[7] EJECUCIÓN DE CÓDIGO
└─→ El atacante controla el flujo del programa
Stack Layout:
+----------------+ ← Topo
| Buffer (2 comp)| [Componente 0]
| | [Componente 1]
+----------------+
| Datos locales |
+----------------+
| Frame Pointer |
+----------------+
| Return Address | ← Dirección para retornar
+----------------+
Stack Layout:
+----------------+
| Buffer (2 comp)| [Componente 0]
| | [Componente 1]
+----------------+
| Datos locales | [Componente 2] ← ¡OVERFLOW!
+----------------+
| Frame Pointer | [Sobrescrito]
+----------------+
| Return Address | [Controlado por el atacante]
+----------------+