
Prova di concetto dell'exploit per CVE-2025-64720, un overflow del buffer in libpng nella premoltiplicazione della palette. Include generatore di exploit, ambiente di test con ASan/UBSan e analisi tecnica dettagliata della vulnerabilità heap-use-after-free.
Stato: Corretto
Gravità: Alta
ID CVE: CVE-2025-64720
Data di scoperta: 2025-11-XX
Divulgazione pubblica: 2025-11-21
Esiste una vulnerabilità di lettura fuori dai limiti nella funzione png_image_read_composite di libpng durante l'elaborazione di immagini con palette con PNG_FLAG_OPTIMIZE_ALPHA abilitato. Il codice di composizione della palette in png_init_read_transformations applica erroneamente la composizione dello sfondo durante la premoltiplicazione, violando l'invariante component ≤ alpha × 257 richiesto dall'API PNG semplificata, causando corruzione della memoria.
In png_init_read_transformations alla riga ~1336, il codice di espansione della palette esegue:
component += (255-alpha)*png_sRGB_table[outrow[c]];
Questo calcolo produce valori di component fino a 16.776.960 (0x1000800), dove (component >> 15) == 512. La successiva macro PNG_sRGB_FROM_LINEAR in png_image_read_composite esegue un accesso all'array fuori dai limiti:
png_sRGB_base[component>>15] // Accede a png_sRGB_base[512]
png_sRGB_delta[component>>15] // Accede a png_sRGB_delta[512]
// Entrambi gli array hanno indici solo da 0 a 511 (dimensione 512)
Il problema si verifica quando:
PNG_FLAG_OPTIMIZE_ALPHA è abilitato internamentepngread.c, pngtrans.cpng_image_read_composite, png_init_read_transformationsPrevisto: component ≤ alpha × 257
Garantisce che (component >> 15) ≤ 511 (entro i limiti dell'array)
Reale: component = previous_value + (255-alpha) × png_sRGB_table[RGB_value]
Con alpha=0, RGB=255: component può superare i limiti previsti
Risultato: (component >> 15) può essere uguale a 512 (accesso fuori dai limiti)
# Metodo 1: pkg-config
pkg-config --modversion libpng
# Metodo 2: Query diretta alla libreria
libpng-config --version
# Metodo 3: Controllo del binario
strings /usr/lib/libpng*.so* | grep -i "libpng version"
# Metodo 4: Dal sorgente
grep PNG_LIBPNG_VER_STRING png.h
Un attaccante può sfruttare questa vulnerabilità creando un file PNG dannoso con caratteristiche specifiche:
Prerequisiti dell'attacco:
png_image_*)Fasi dell'attacco:
PNG_FLAG_OPTIMIZE_ALPHA viene abilitato internamenteRisultato dell'attacco:
png_sRGB_base o png_sRGB_delta┌─────────────────┐
│ png_sRGB_base │ Indici dell'array: 0-511 (512 voci)
│ [512 voci] │ Accesso valido: (component >> 15) ≤ 511
├─────────────────┤
│ [Accesso OOB] │ Indice 512 ← Accesso vulnerabile quando component ≥ 0x1000000
├─────────────────┤
│ png_sRGB_delta │ Indici dell'array: 0-511 (512 voci)
│ [512 voci] │ Anch'esso vulnerabile allo stesso accesso OOB
├─────────────────┤
│ Memoria adiacente│ Potenziale divulgazione di informazioni
└─────────────────┘
Calcolo che causa overflow:
component = alpha × component + (255-alpha) × png_sRGB_table[palette_RGB]
Quando alpha=0 e palette_RGB=255:
component = 0 + 255 × 65535 = 16.711.425
(component >> 15) = 512 (FUORI DAI LIMITI!)
Condizioni richieste:
png_image_finish_read)Fattori opzionali:
PNG_FORMAT_FLAG_AFIRST aumenta la probabilità di crashCondizioni non attivanti:
# Clona il repository
git clone https://github.com/truediogo/CVE-2025-64720
cd CVE-2025-64720
# Genera le immagini
python3 generate-images.py
# Compila il test
chmod +x build.sh
./build.sh
# Esegui l'exploit (richiede libpng vulnerabile < 1.6.51)
./test_asan exploit_v1.png exploit_v2.png exploit_v3.png exploit_v4.png
generate-images.py)Genera file PNG dannosi che innescano la vulnerabilità.
Utilizzo:
python3 generate_poc.py
Output:
exploit_v1.png - Immagine 8x8, palette bianca uniforme, alpha zeroexploit_v2.png - Immagine 8x8, variazione strategica della paletteexploit_v3.png - Immagine 64x64, grande con schemi ripetutiexploit_v4.png - Immagine 4x4, caso minimo con alpha tutto zeroOpzioni:
# Genera una variante specifica
generate_malicious_png('custom.png', variant=2)
# Varianti:
# 1: Valori RGB massimi con alpha zero (affidabile)
# 2: Palette strategica progettata per overflow massimo
# 3: Immagine più grande con schemi di attivazione ripetuti
# 4: Caso minimo mirato a global-buffer-overflow
test.c)Elabora file PNG utilizzando l'API semplificata e dimostra la vulnerabilità.
Compilazione:
# Con AddressSanitizer (consigliato - miglior rilevamento)
gcc -o test_asan test.c -lpng -fsanitize=address -g -O0 -fno-omit-frame-pointer
# Con UndefinedBehaviorSanitizer
gcc -o test_ubsan test.c -lpng -fsanitize=undefined -g -O0
# Con simboli di debug
gcc -o test_debug test.c -lpng -g -O0
# Per Valgrind
gcc -o test_valgrind test.c -lpng -g -O0 -fno-inline
Caratteristiche:
Su versione vulnerabile (libpng 1.6.36):
libpng version: 1.6.36
PNG_LIBPNG_VER: 10636