
ثغرة تجاوز سعة المخزن المؤقت الكلاسيكية المبنية على المكدس في خادم الويب Savant الإصدار 3.1 تُظهر تلف الذاكرة عن بُعد من أوائل العقد الأول من القرن الحادي والعشرين من خلال طلب HTTP مُصنّع.
تجاوز سعة مخزن مؤقت قائم على المكدس في خادم الويب Savant 3.1 يوضح تلف الذاكرة عن بعد من أوائل العقد الأول من القرن الحادي والعشرين من خلال طلب HTTP مصمم (ثغرة أمنية من عام 2002 تتطلب من المبتدئين أكثر من معظم ثغرات تجاوز سعة المخزن المؤقت من عام 2025).
هذا المستودع هو جزء من المواد التي أستخدمها عند تدريس استغلال تلف الذاكرة (بالإضافة إلى عملي المعتاد، أقوم أيضًا بالتدريس في دورات مختلفة في الأمن السيبراني حيث أساعد في تدريب الجيل القادم من مهندسي الهندسة العكسية). عندما أتناول تجاوزات سعة المخزن المؤقت القائمة على المكدس في الصف، أعمل على حالات حقيقية بدلاً من الأمثلة التمهيدية، وهذه الثغرة (CVE) هي واحدة أعود إليها تحديدًا عندما أريد تحدي الطلاب الذين لديهم بالفعل بعض الخبرة في الكتابة فوق EIP الأساسية.
السبب هو أن السنة في معرف CVE لا تخبرك بشيء عن مدى صعوبة الاستغلال. معظم الطلاب يفترضون أن الثغرات القديمة يجب أن تكون أبسط، تجاوز سعة مباشر، JMP ESP، انتهى. هذه تثبت عكس ذلك. بعض ثغرات CVE التي أدرسها من عام 2025 هي بشكل أساسي أكثر أساسية من هذه، لأن فئة الثغرة أبسط أو القيود أقل. CVE-2002-1120 تتطلب فهم أشياء لا تتطلبها بعض الاستغلالات الحديثة: لماذا لا يمكن استخدام بعض opcodes في أجزاء معينة من الطلب، وكيفية صياغة قفزة شرطية تعمل دائمًا عندما تكون القفزة غير الشرطية محظورة، وكيفية تسليم شيلكود عندما لا يتسع في المكان الذي تضعه فيه عادةً، وكيف يحل Egghunter مشكلة مساحة كانت ستجعل الاستغلال مستحيلًا.
إنها ثغرة CVE التي أعينها عندما أريد أن أرى ما إذا كان شخص ما يفهم حقًا ما يفعله.
تؤثر هذه الثغرة على Savant 3.1، وهو خادم HTTP لنظام Windows مجاني من عام 2002. ما يجعلها جديرة بالدراسة في عام 2025 ليس العمر بل مجموعة القيود التي تقدمها والتقنيات المطلوبة للالتفاف حولها:
كل واحد من هذه القيود هو درس بحد ذاته.
Savant هو خادم HTTP مفتوح المصدر لنظام Windows كان مصممًا أصلاً لتحويل أي كمبيوتر مكتبي إلى خادم ويب. يستمع على منفذ TCP 80 ويعالج طلبات HTTP GET القياسية. يحدث التجاوز في المعالج الذي ينسخ مسار URI إلى مخزن مؤقت ثابت الحجم على المكدس دون التحقق من طوله.
التفاصيل التقنية الرئيسية:
يعالج Savant طلبات HTTP GET الواردة وينسخ مسار URI إلى مخزن مؤقت ثابت الحجم على المكدس دون التحقق من طوله. تبدو النسخة المبسطة من المنطق الضعيف هكذا:
char uri_buffer[270];
strcpy(uri_buffer, uri_path);
إرسال طلب GET مع URI بحوالي 271 بايت يكتب فوق عنوان العودة المحفوظ على المكدس. التجاوز مقيد، إرسال أكثر من ذلك بشكل ملحوظ يتسبب في انهيار بحيث لا يتم التحكم في EIP بعد الآن، لذا فإن النافذة القابلة للاستخدام ضيقة.
الاستغلال أكثر تعقيدًا من الكتابة فوق EIP القياسية بسبب خاصيتين إضافيتين للخادم: حقل أسلوب HTTP يتم نسخه أيضًا إلى الذاكرة وتنفيذه، ويتم تخزين نص طلب HTTP في منطقة كومة منفصلة بدلاً من المكدس (كلتا الخاصيتين تصبحان جزءًا أساسيًا من سلسلة الاستغلال).
يمكن إعادة إنتاج الانهيار عن طريق إرسال طلب GET مع URI طويل بما فيه الكفاية. لا يلزم المصادقة. مثال باستخدام Python:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 271
request = (
b"GET /" + payload + b" HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Connection: close\r\n"
b"\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
عند التنفيذ تحت مصحح الأخطاء، يظهر الانهيار أن EIP قد تم الكتابة فوقه ببيانات يتحكم بها المستخدم:
EIP = 41414141
مؤكدًا أن عنوان العودة المحفوظ قد تم إتلافه بسبب التجاوز.
الهدف من هذا المستودع ليس فقط توضيح الانهيار، بل السير خلال عملية الاستغلال الكاملة خطوة بخطوة، بما في ذلك كل قيد يجعل هذه الحالة أصعب من الكتابة فوق EIP القياسية وكل قرار تم اتخاذه للالتفاف حولها.
للحفاظ على نظافة ملف README الرئيسي، تم وضع ملاحظات الاستغلال التفصيلية، والبرامج النصية، وخطوات مصحح الأخطاء داخل مجلد الثغرة 📂 في هذا المستودع.
هناك ستجد سير العمل الكامل المستخدم لاستغلال هذه الثغرة، بما في ذلك: