
CVE-2022-23093 FreeBSD تجاوز سعة المكدس
⚠️ شيل كود المستخدم افتراضيًا هو FreeBSD/x86-64 - execve - 28 bytes from Gitsnik غيّره وضع الكود الخاص بك للبدء ⚠️
أداة ping، المستخدمة لطلب ICMP ECHO_RESPONSE من مضيف أو بوابة، تُستدعى بهدف IPv4، سواء كان مضيف IPv4 أو مجموعة بث متعددة IPv4-mcast-group، عبر مخطط بيانات 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 مع حقل خيارات Options اختياري، كما هو موضح في الرسم البياني أعلاه. في الهجوم الخبيث، يتم تمكين خيارات IP هذه وملؤها ببايتات غير صفرية. ✔️
إذا كانت حزمة ICMP تالفة أو تم العبث بها عمدًا في الطريق إلى المضيف الوجهة، وتم تمكين خيارات IP في طلب الصدى الأصلي، تفشل الدالة pr_pack() في تخصيص مساحة كافية على المكدس لاستيعاب وجود خيارات IP، مما يؤدي إلى تجاوز سعة المكدس.
🤝 في حالات الخطأ هذه، قد تتضمن الاستجابة من المضيف الوجهة أيضًا "حزمة مقتبسة" في قسم البيانات، تحدد الحزمة التي سببت خطأ ICMP. تفيض الدالة pr_pack() على المكدس عندما تتضمن الحزمة المقتبسة ترويسات ICMP. 🤝