
Análise técnica detalhada da CVE-2025-43300, uma vulnerabilidade de estouro de buffer no processamento de arquivos DNG que permite execução remota de código. Explica a inconsistência de metadados TIFF/JPEG, os mecanismos de corrupção de memória e o fluxo de exploração.
A CVE-2025-43300 é uma vulnerabilidade de buffer overflow no processamento de arquivos DNG (Digital Negative) que ocorre devido a uma inconsistência entre metadados TIFF e dados JPEG, permitindo execução remota de código (RCE).
DNG File
├── TIFF Container (metadados)
│ ├── Header
│ ├── IFD (Image File Directory)
│ │ ├── Tag 277: SamplesPerPixel (declara quantos componentes)
│ │ ├── Tag 513: JpegOffset (onde começa o JPEG)
│ │ └── Tag 514: JpegLength (tamanho do JPEG)
│ └── Outros metadados
└── JPEG Data (dados reais da imagem)
├── SOI (Start of Image)
├── SOF0 (Frame Header)
│ └── Components: número real de componentes
└── Compressed Data
// PROBLEMA FUNDAMENTAL:
TIFF declara: "Esta imagem tem 2 componentes" (SamplesPerPixel = 2)
JPEG contém: "Na verdade tenho 3 componentes" (SOF0 Components = 3)
// Código vulnerável (simplificado)
int samples = read_tiff_tag(277); // Lê 2
buffer = malloc(samples * sizeof(component)); // Aloca para 2
// Mas processa baseado no JPEG
int components = read_jpeg_sof0(); // Lê 3
for (int i = 0; i < components; i++) { // Loop 3 vezes!
buffer[i] = process_component(i); // OVERFLOW no i=2!
}
[1] ABERTURA DO ARQUIVO
↓
[2] PARSER TIFF
├─→ Lê Header TIFF
├─→ Localiza IFD
├─→ Lê Tag 277 (SamplesPerPixel = 2)
└─→ Aloca buffer para 2 componentes
[3] LOCALIZAÇÃO DO JPEG
├─→ Lê Tag 513 (offset do JPEG)
└─→ Navega até posição no arquivo
[4] PARSER JPEG
├─→ Lê marcador SOF0 (0xFFC0)
├─→ Extrai número de componentes (3)
└─→ NÃO VALIDA contra TIFF!
[5] PROCESSAMENTO
├─→ Loop para processar 3 componentes
├─→ Buffer só tem espaço para 2
└─→ 3º componente escreve FORA do buffer
[6] BUFFER OVERFLOW
├─→ Sobrescreve dados adjacentes
├─→ Pode sobrescrever endereço de retorno
└─→ Possibilita controle de execução
[7] EXECUÇÃO DE CÓDIGO
└─→ Atacante controla fluxo do programa
Stack Layout:
+----------------+ ← Topo
| Buffer (2 comp)| [Componente 0]
| | [Componente 1]
+----------------+
| Dados locais |
+----------------+
| Frame Pointer |
+----------------+
| Return Address | ← Endereço para retornar
+----------------+
Stack Layout:
+----------------+
| Buffer (2 comp)| [Componente 0]
| | [Componente 1]
+----------------+
| Dados locais | [Componente 2] ← OVERFLOW!
+----------------+
| Frame Pointer | [Sobrescrito]
+----------------+
| Return Address | [Controlado pelo atacante]
+----------------+