
CVE-2025-43300에 대한 상세 기술 분석: DNG 파일 처리 과정에서 발생하는 버퍼 오버플로우 취약점으로 원격 코드 실행이 가능합니다. TIFF/JPEG 메타데이터 불일치, 메모리 손상 메커니즘 및 익스플로잇 흐름을 설명합니다.
CVE-2025-43300은 DNG(Digital Negative) 파일 처리 과정에서 TIFF 메타데이터와 JPEG 데이터 간의 불일치로 인해 발생하는 버퍼 오버플로 취약점으로, 원격 코드 실행(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]
+----------------+