
تجاوز سعة المخزن المؤقت في خادم FreeFloat FTP الإصدار 1.0 يوضح كيف يمكن لمعالج غير آمن واحد أن يولد إدخالات CVE متعددة عبر أوامر مختلفة.
تجاوز سعة المخزن المؤقت في خادم FreeFloat FTP 1.0 يوضح كيف يمكن لمعالج غير آمن واحد أن يولد إدخالات CVE متعددة عبر أوامر مختلفة.
هذا المستودع جزء من المواد التي أستخدمها عند تدريس استغلال تلف الذاكرة (بالإضافة إلى عملي المنتظم، أقوم أيضًا بالتدريس في دورات مختلفة للأمن السيبراني حيث أساعد في تدريب الجيل القادم من مهندسي الهندسة العكسية).
CVE-2025-5548 هي حالة أستخدمها عندما أريد أن أظهر للطلاب أن أبحاث الثغرات هي مهارة يمكن الوصول إليها، وليست شيئًا محجوزًا للباحثين الكبار ذوي الخبرة الطويلة. خادم FreeFloat FTP 1.0 هو تطبيق ويندوز قديم صغير، سهل الإعداد، سهل التشغيل، وسهل التعطل. يتم إثارة التجاوز من خلال أمر FTP قياسي، مسار الاستغلال هو استبدال EIP نظيف، ويمكن إكمال العملية بأكملها من الفازينغ إلى شل عاملة في جلسة واحدة.
ترتبط هذه الحالة أيضًا بشكل مباشر بمحاضرتي "The Path That Leads to Your First CVE"، حيث أشرح أن أحد أكثر نقاط الدخول واقعية لأبحاث الثغرات للمبتدئين هو تحليل البرامج القديمة، وفهم كيفية عملها داخليًا، والبحث عن نوع التحقق المفقود من الطول الذي ينتج بالضبط هذه الفئة من الثغرات. FreeFloat هو أحد الأمثلة التي أستخدمها لأظهر أن العثور على خلل حقيقي وتوثيقه لا يتطلب سنوات من الخبرة، بل يتطلب الفضول، ومصحح الأخطاء، ونهجًا منهجيًا.
ما يجعل هذه الحالة فعالة بشكل خاص للتدريس هو كيف ترتبط بدرس أوسع حول كيفية تعيين CVEs. نفس المعالج غير الآمن للإدخال في FreeFloat ينتج تجاوزات عبر أوامر FTP متعددة، USER و PASS و NOOP وغيرها، كل منها تم الإبلاغ عنه بشكل مستقل وحصل على إدخال CVE خاص به. الطلاب الذين ينظرون إلى قائمة CVEs لهذا البرنامج الثنائي ويرون عشرات الإدخالات يتعلمون بسرعة أن عدد CVEs ليس هو نفسه عدد الثغرات، وأن فهم السبب الجذري أكثر قيمة من فهرسة الأعراض.
بمجرد أن يفهم الطلاب العملية من خلال حالات مثل هذه، أعطيهم مثالًا حقيقيًا لما يأتي بعد ذلك. بعد أسبوعين من ممارسة تجاوزات المخزن المؤقت وتلف الذاكرة، فإن نوع الثغرة التي يستطيعون العثور عليها موجود بالفعل في برامج حقيقية. المستودع التالي يوثق ثغرة وجدتها خصيصًا لأظهر للطلاب الدورة الكاملة، الاكتشاف، التحليل، التوثيق، وطلب CVE، على شيء يمكن الوصول إليه بما يكفي للعثور عليه مبكرًا في مسار التعلم مثل CVE-2025-70330.
هذا المستودع جزء من مجموعة أكبر. إذا كنت ترغب في ممارسة الاستغلال عبر مجموعة واسعة من التقنيات، وأنواع الثغرات، وهياكل الأهداف المستهدفة، ألق نظرة على مستودع Binary-Exploitation، حيث يتم تنظيم كل هذه المواد وصيانتها إلى جانب العديد من CVEs ومنهجيات وتمارين استغلال أخرى.
تؤثر هذه الثغرة على خادم FreeFloat FTP 1.0، وهو خادم FTP ويندوز قديم جدًا تم كتابته بدون ممارسات أمنية حديثة. في عام 2025، أبلغ باحث عن العديد من CVEs تؤثر على نفس البرنامج الثنائي.
أمثلة تشمل:
يشير كل CVE إلى أمر FTP مختلف، ولكن عند عكس البرنامج، يصبح من الواضح أن العديد منهم يصل إلى نفس مسار الكود المعرض للخطر.
هذا يجعل الحالة مثيرة للاهتمام ليس فقط كمثال على تجاوز سعة المخزن المؤقت، ولكن أيضًا كدليل على أن:
عند عكس البرنامج الثنائي، يمكن ملاحظة أن جميع أوامر FTP تتم معالجتها بواسطة نفس دالة الموزع. يتم تخزين سلسلة الأمر داخل هيكل جلسة، وتقوم العديد من معالجات الأوامر بنسخ إدخال المستخدم إلى مخازن مؤقتة ذات حجم ثابت باستخدام وظائف غير آمنة مثل strcpy و strcat و memcpy، دون التحقق من طول البيانات المستلمة.
بسبب هذا، قد تقوم أوامر مختلفة بالكتابة فوق المكدس حتى لو ذكر وصف CVE أمرًا واحدًا محددًا.
على سبيل المثال، يمكن إثارة التعطل باستخدام:
NOOP AAAAA...
USER AAAAA...
PASS AAAAA...
HOST AAAAA...
ANYTHING AAAAA...
الفرق الوحيد هو عدد البايتات المطلوبة للكتابة فوق عنوان الإرجاع. هذا يعني أن العديد من CVEs المبلغ عنها لهذا البرنامج تشترك في نفس السبب الجذري.
يقوم خادم FreeFloat FTP بمعالجة الأوامر المستلمة عبر منفذ TCP 21 ويخزن سلسلة الأمر داخل هيكل جلسة داخلي. في وقت لاحق، يقوم معالج الأمر بنسخ البيانات التي يتحكم فيها المستخدم إلى مخازن مؤقتة محلية في المكدس دون إجراء التحقق المناسب من الطول.
عند عكس البرنامج الثنائي، يمكن ملاحظة أن العديد من معالجات الأوامر تستخدم مخازن مؤقتة ذات حجم ثابت وعمليات نسخ غير آمنة. تبدو نسخة مبسطة من المنطق المعرض للخطر كما يلي:
char buffer[256];
strcpy(buffer, user_input);
نظرًا لأن المخزن المؤقت الوجهة له حجم ثابت ولا يتم التحقق من طول الإدخال، فإن إرسال سلسلة طويلة يتسبب في قيام عملية النسخ بالكتابة بعد نهاية المخزن المؤقت.
مع كتابة المزيد من البيانات، يصبح تخطيط المكدس تالفًا حتى يتم الكتابة فوق عنوان الإرجاع المحفوظ.
عندما تعود الدالة، يقفز التنفيذ إلى قيمة يتحكم فيها المستخدم، مما يؤدي إلى تعطل. تحت مصحح الأخطاء، يمكن رؤية ذلك على أنه مؤشر التعليمات يتم الكتابة فوقه ببيانات يتحكم فيها المهاجم.
يمكن إعادة إنتاج التعطل عن طريق إرسال سلسلة طويلة بعد أمر FTP صالح. مثال باستخدام بايثون:
import socket
ip = "127.0.0.1"
port = 21
payload = b"A" * 500
s = socket.socket()
s.connect((ip, port))
s.recv(1024)
s.send(b"USER anonymous\r\n")
s.recv(1024)
s.send(b"PASS anonymous\r\n")
s.recv(1024)
s.send(b"NOOP " + payload + b"\r\n")
s.close()
عند التنفيذ تحت مصحح الأخطاء، يظهر التعطل:
EIP = 41414141
مما يؤكد أن البيانات التي يتحكم فيها المستخدم تكتب فوق عنوان الإرجاع.
الهدف من هذا المستودع ليس فقط إظهار التعطل، بل أيضًا إظهار العملية الكاملة لاستغلال الثغرة خطوة بخطوة، باستخدام نفس المنهجية المستخدمة عادة عند تطوير استغلالات.
للحفاظ على ملف README الرئيسي نظيفًا، يتم وضع ملاحظات الاستغلال التفصيلية والبرامج النصية وخطوات مصحح الأخطاء داخل مجلد Vulnerability 📂 من هذا المستودع.
ستجد هناك سير العمل الكامل المستخدم لاستغلال CVE هذا، بما في ذلك الفازينغ، واكتشاف الإزاحة، وتحليل الأحرف السيئة، والبحث عن الأدوات، وتنفيذ شل كود.