"يمكن لأي مستخدم أن يصبح متحكمًا بشكل كامل في أقل من 5 ثوانٍ عند اختباره الثغرة ، بشكل موثوق للغاية! أشياء مخيفة"
Phil Oster
عند مذاكرتي لمنهج الـ CyAs+ مررت بنقطة مهمة جدًا في الفصل الخامس من" Analyzing Vulnerability Scans" للمؤلفين Mike Chapple و David Seidl ، و هي الـ "privilege escalation" او ترجمتها حرفيًا " تصعيد الصلاحيات" : مُصنفة كثغرات أمنية او اخطاء برمجية موجوده في برمجه النظام او في بنيته للحصول على صلاحيات اكبر من تلك التي مُنحت الى المستخدم والتي يفترض ان لا يتجاوزها (عادة الـ local user) و لا يستطيع تنفيذ بعض الامور خارج صلاحياته.
تم ذكر مثال جدًا ملفت للانتباه و هي هجمة البقرة القذرة او الـ "Dirty Cow"!

مسمى غريب لثغرة امنية صحيح؟
مالفت انتباهي ليست الثغرة بحد ذاتها بل سبب التسمية! مالذي دفع مكتشفها لتسميتها بهذا الاسم؟ ماهو الضرر التي احدثته هذه الثغرة لتنال هذا اللقب بجدارة؟!
بعد بحث مطول و قراءة في ورقتين علميتين (يبدو انهما الوحيدتين من أسهبت في هذه الثغرة)، قد يبدو ان المكتشف لديه حس الفكاهة، فمسمى الهجمة لا ترتبط مباشرة بالبقرة و لكن اختصار الثغرة شَكَل كلمة (COW) و التي تعني البقرة، و لأن الناتج منها كان ضرره عالي على الأجهزة المبنية على نظام لينكس فلربما ازعج المكتشف فأسبقها بالـ "dirty".!
ماهي الـ (Dirty Cow) ؟
بشكل مُفصل :

الملف عند فتحه سيكون بوضعية الـ (read only mode)، الـ (root user) هو الوحيد الذي لديه إمكانية الـ كتابة عليه.
الفكرة: نحن المستخدمين العاديين نريد هذا الملف.
fstat(f,&st);
بعدها ننتقل إلى الكود التالي، (mmap) يستخدم لإنشاء مساحة ذاكرة معينة جديدة مخصصة للعملية الحالية. و تهدف انها تعين ملف في الذاكرة و تضع عليه علامة كمقروء فقط مع علامة بشكل علم باللون الأحمر و يرمز بـ "f" للكود التالي.
هُناك علم آخر مهم هو (Map_Private)، يقوم بإنشاء نسخة خاصة عند تعيين الكتابة (COW).
map=mmap(NULL,st.st_size,PROT_READ,MAP_PRIVATE,f,0);
النقطة المهمة التي يجب ملاحظتها، ان الـ(mmap) يُعين ملف الـ (root privileged) في مساحة الذاكرة، و ليس على الملف الأساسي. و يمكنك قراءة الملف او الكتابة على نسخه منه.
يبدأ الـ(COW) بـالـ (two threads) يتم تشغيلهم بشكل متزامن حتى تنشئ (race condition) كما تم توضيحه سابقًا. في الظروف العادية، يحدث تنفيذ معين لتعليمات الـ (threads) بترتيب محدد وفي الوقت المناسب، حيث تكون كل عملية متعارضة.
يتم تقديم الـ (race condition) من خلال الـ (threads) التالية، مما يسمح في النهاية للمستخدم العادي بالحصول على امتيازات الـ (root) ( بالتحديد الإدارية).
c+=madvise(map,100,MADV_DONTNEED);
من خلال الكود التالي، يسعى هذا الاستغلال بشكل متكرر الكتابة على هذا الملف في (loop). يقوم السطر الأول بإجراء بحث الى بداية الملف المرتبط بتعيين الذاكرة، و يقوم السطر الثاني بالكتابة بناء على الـ (the program argument) التي نمررها له.
هذا يقوم بتشغيل (trigger) الـ (Linux kernel) و ينفذ لنا طريقة الـ (Copy On Write) لإنشاء نسخة من هذه الذاكرة و كتابة التغييرات على النسخة و ليس على الملف الأساسي للذاكرة الأساسية.
من خلال تكرار الـ(two threads) في (loop) ، سنرسل رسائل غير مرغوب فيها الـ (madvise thread) (Read) و (proc / self / mem) (write) ، يتم إنشاء الـ (race condition) بحيث تخدع الـ (Linux kernel) التي تتعامل مع التوقيت والتسلسل بين هاذي العمليتين ، مما يتسبب في الكتابة على الملف الفعلي في الـ (hard disk) - وهو كما أسلفنا ملف للقراءة فقط لمستخدم لا يتمتع بامتيازات-.
ستسمح الثغرة في الـ (Linux kernel) بالحصول على الـ (root privilegs) عن طريق استغلالها.
- كيف تم انتشاره وتحديده:
يدعي Oester أن هذا الاستغلال المعين الذي تم تحميله على نظامه قد تم تجميعه مع إصدار GCC 4.8.5 الصادر في 2015/06/23.
- حل المشكلة:
المصادر:
No comments:
Post a Comment