
ثغرة تجاوز سعة المخزن المؤقت لـ ICMP في FreeBSD، PoC لتجاوز سعة المخزن المؤقت في FreeBSD
الـ shellcode المستخدم افتراضيًا هو FreeBSD/x86-64 - execve - 28 bytes from Gitsnik؛ غيّره واستخدم خاصتك للبدء.
أداة ping، المستخدمة لطلب استجابة ICMP ECHO_RESPONSE من مضيف أو بوابة، يتم استدعاؤها مع هدف IPv4، سواء كان مضيف IPv4 أو مجموعة بث متعدد IPv4، عبر مخطط بيانات ECHO_REQUEST الإلزامي لبروتوكول ICMP. يتكون مخطط بيانات ECHO_REQUEST من ترويسة IP وترويسة ICMP، متبوعة بـ "struct timeval" وعدد متغير من بايتات "pad" لملء الحزمة.
وفقًا للنشرة الأمنية لمشروع FreeBSD، تسترجع أداة ping حزم IP الخام من الشبكة لمعالجة الاستجابات داخل دالة pr_pack(). وأثناء معالجة الاستجابة، يعيد ping بناء ترويسة IP وترويسة ICMP، وإذا وُجدت، "حزمة مقتبسة" تمثل الحزمة التي سببت خطأ ICMP. تتضمن الحزمة المقتبسة أيضًا ترويسة IP وترويسة ICMP.
تنسخ دالة pr_pack() ترويسات IP وICMP المستلمة إلى مخازن مؤقتة في المكدس لمزيد من المعالجة. ومع ذلك، فهي لا تراعي احتمال وجود ترويسات خيارات IP بعد ترويسة IP في الاستجابة أو في الحزمة المقتبسة. وفي وجود خيارات IP، تتسبب pr_pack() في تجاوز سعة المخزن المؤقت الهدف بما يصل إلى 40 بايتًا.
تعمل أداة ping في مساحة المستخدم، وعند استدعاء أمر ping، يتم تنفيذ الثنائي الموجود في /sbin/ping. الكود المصدري للأداة متاح للعموم في مصدر FreeBSD. الدالة المعرضة للثغرة، pr_pack()، تطبع معلومات استجابة حزمة ICMP إلى stdout بصيغة نصية، مثل "64 bytes from 1.3.3.7: icmp_seq=1 ttl=55 time=13.7 ms."

تتكون حزمة ICMP، في كل من الطلب والاستجابة، من ترويسات IP مع حقل خيارات اختياري، كما هو موضح في الرسم البياني أعلاه. في هجوم ضار، يتم تمكين خيارات IP هذه وملؤها ببايتات غير صفرية.
إذا كانت حزمة ICMP مشوهة أو تم العبث بها عمدًا في الطريق إلى المضيف الهدف، وكانت خيارات IP مفعّلة في طلب الصدى الأصلي، فإن دالة pr_pack() تفشل في تخصيص مساحة كافية على المكدس لاستيعاب وجود خيارات IP، مما يؤدي إلى تجاوز سعة المكدس.
في حالات الخطأ هذه، قد تتضمن الاستجابة من المضيف الهدف أيضًا "حزمة مقتبسة" في قسم البيانات، تحدد الحزمة المحددة التي سببت خطأ ICMP. وتحدث تجاوز سعة المكدس في دالة pr_pack() عندما تتضمن الحزمة المقتبسة ترويسات ICMP.