ثغرات سلاسل التنسيق
استغل سلاسل تنسيق printf لقراءة الذاكرة عشوائيًا والكتابة إلى عناوين عشوائية.
ثغرات سلاسل التنسيق درس مجاني في Cyber Security Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cyber Security Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cyber Security Academy 4 دروس في المجموع.
ما المقصود بثغرة سلسلة التنسيق؟
تحدث ثغرة سلسلة التنسيق عندما يُمرر إدخال المستخدم مباشرةً باعتباره وسيط سلسلة التنسيق إلى printf() أو إلى دوال مشابهة. ويمكن للمهاجم قراءة الذاكرة، وتسريب عناوين المكدس، وكتابة قيم عشوائية.
النمط المعرّض للخطر
النسخة المعرّضة للخطر مقابل النسخة الآمنة:
// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);
// SAFE - user input is a data argument:
printf("%s", user_input);قراءة الذاكرة باستخدام %x و%p
تقرأ محددات التنسيق التي لا تقابلها وسائط قيمًا من المكدس:
# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!تجاوز ASLR باستخدام تسريبات سلاسل التنسيق
غالبًا ما يحتوي المكدس على مؤشرات إلى libc والمكدس والملف الثنائي. ومن خلال تسريب هذه المؤشرات باستخدام محددات %p أو %lx، يستطيع المهاجم حساب العناوين الأساسية والتغلب على ASLR — حتى من دون وجود أي ثغرة أخرى.
قراءة ذاكرة عشوائية باستخدام %s
يتعامل %s مع قيمة المكدس باعتبارها مؤشرًا ويطبع السلسلة الموجودة عند ذلك العنوان. ومن خلال وضع العنوان المستهدف في موضع المكدس الصحيح واستخدام الوصول إلى المعلمات (%7$s)، يستطيع المهاجم قراءة مواقع ذاكرة عشوائية.
# Direct parameter access:
printf("%7$s") # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memoryكتابة الذاكرة باستخدام %n
يكتب %n عدد الأحرف التي طُبعت حتى الآن إلى العنوان الذي يشير إليه الوسيط المقابل. ويسمح ذلك بكتابة قيم يتحكم بها المهاجم إلى عناوين عشوائية، وقد يؤدي إلى استبدال مؤشرات الدوال أو عناوين العودة.
تقنية الكتابة العملية
لكتابة قيمة محددة باستخدام %n:
- التحكم في مؤشر على المكدس يشير إلى العنوان المستهدف
- استخدام
%Xc%N$nلكتابة X من الأحرف، ثم كتابة العدد إلى المعلمة رقم N (العنوان المستهدف)
تعمل أدوات مثل pwntools على أتمتة إنشاء استغلالات سلاسل التنسيق.
العثور على أخطاء سلاسل التنسيق
اختبار ثغرات سلاسل التنسيق:
# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)
# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vulnالدفاع: إصلاح الشيفرة
الإصلاح بسيط للغاية: مرر دائمًا إدخال المستخدم باعتباره وسيط بيانات، ولا تمرره أبدًا باعتباره سلسلة التنسيق.
// WRONG:
printf(buffer);
// RIGHT:
printf("%s", buffer);
// Compiler warning:
// gcc -Wformat-security will flag thisسلسلة التنسيق في اللغات الأخرى
تحدث ثغرات سلاسل التنسيق في لغات كثيرة:
- C:
printf(input) - Python: ليست الحالة نفسها — لكن تنسيق
%مع إدخال من نوع dict قد يكشف المتغيرات - Java:
String.format(input)— أقل خطورة، ولا يتيح الوصول إلى الذاكرة
أمثلة من العالم الحقيقي
أثرت أخطاء سلاسل التنسيق في:
- ProFTPD — أتاحت تنفيذًا عن بُعد للشيفرة عبر أوامر FTP
- WU-FTPD — استغلالًا عن بُعد بصلاحيات root عبر سلاسل التنسيق
- خدمات Linux المختلفة قبل عقد الألفين
تساعد المصرّفات الحديثة وFORTIFY_SOURCE، لكنها لا تقضي على هذه الفئة بالكامل.
تحقق سريع: سلاسل التنسيق
ما محدد التنسيق الذي يمكن استخدامه للكتابة إلى عنوان ذاكرة عشوائي في هجوم على سلسلة تنسيق؟
مراجعة الدرس
تحدث ثغرات سلاسل التنسيق عندما يُستخدم إدخال المستخدم مباشرةً كسلسلة تنسيق لـ printf. ويسرّب %p/%x ذاكرة المكدس، ويقرأ %s عناوين عشوائية، ويكتب %n إلى عناوين عشوائية. والإصلاح يتطلب حرفًا واحدًا: printf("%s", input). فعّل -Wformat-security ضمن خيارات المصرّف لاكتشاف هذه الأخطاء.
الأسئلة الشائعة
هل درس «ثغرات سلاسل التنسيق» مجاني؟
نعم — نص درس «ثغرات سلاسل التنسيق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cyber Security Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Cyber Security Academy 4 دروس في المجموع.
ماذا ستتعلم في «ثغرات سلاسل التنسيق»؟
استغل سلاسل تنسيق printf لقراءة الذاكرة عشوائيًا والكتابة إلى عناوين عشوائية. تتمرن على Cyber Security Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Cyber Security Academy؟
لا تُشترط خبرة سابقة. Cyber Security Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «ثغرات سلاسل التنسيق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Cyber Security Academy هذا؟
نعم. كل درس في Cyber Security Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تجاوزات مخزن المكدس
- البرمجة الموجهة نحو الإرجاع (ROP)
- ثغرات سلاسل التنسيق
- استغلال الكومة: Use-After-Free وHeap Spraying