
تحليل تقني مفصل لـ CVE-2025-43300، وهو ثغرة تجاوز سعة المخزن المؤقت في معالجة ملفات DNG تتيح تنفيذ التعليمات البرمجية عن بُعد. يشرح عدم تطابق بيانات TIFF/JPEG الوصفية، وآليات تلف الذاكرة، وسير الاستغلال.
CVE-2025-43300 هي ثغرة تجاوز سعة المخزن المؤقت في معالجة ملفات DNG (السلبية الرقمية) والتي تحدث بسبب عدم اتساق بين بيانات 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]
+----------------+