لماذا أحتاج setuid (0) ضمن برنامج C setuid الجذر الذي يدعو إلى برنامج إداري مع النظام ()؟
-
20-08-2019 - |
سؤال
وكان علي أن أفعل لينكس القذرة الإختراق لشخص ما حتى يتمكنوا من البدء في طابعة مع الأمر قذيفة cupsenable printername
في حين يجري مستخدم غير الجذر. لم أكن أريد لها أن تكون قادرة على استخدام مجمل بناء الجملة cupsenable
كجذر، لذلك أنا كتبت للتو المجمع C أن يعقم مساهمة في argv[1]
ويدعو system("cupsenable sanitizedprintername")
.
وأنا جعلت جذر setuid البرنامج، ولكن على الرغم من ذلك، فشل cupsenable
مع "تم رفض الإذن". ثم تم إدراج مكالمة setuid(0)
قبل system()
و، وها، أنه يعمل.
وتجاهل قضية يجري هناك طريقة أفضل لإعطاء تحكم مستخدمي الطابعة. الارجح هناك طريقة أفضل. ما يهمني في لتعقيدات chmod u+s
مقابل setuid(0)
مقابل system()
. فلماذا تتصرف بهذه الطريقة؟
المحلول
ومن man system
:
لا تستخدم system()
من البرنامج مع مجموعة المستخدم معرف أو وضعها مجموعة-ID امتيازات، لأن قيم غريبة لبعض متغيرات البيئة يمكن استخدامها لتخريب سلامة النظام. استخدام الأسرة exec(3)
من الوظائف بدلا من ذلك، ولكن ليس execlp(3)
أو execvp(3)
. system()
لن، في الواقع، تعمل بشكل صحيح من البرامج مع مجموعة المستخدم-ID أو الامتيازات المنصوص-مجموعة-ID على الأنظمة التي /bin/sh
غير باش الإصدار 2، منذ باش 2 قطرات الامتيازات عند بدء التشغيل.
ومن man bash
:
إذا تم بدء تشغيل قذيفة مع المستخدم الفعلي (المجموعة) معرف لا تساوي المستخدم الحقيقي (المجموعة) الهوية، وليس يتم توفيره خيار -p
، وقراءة أية ملفات بدء التشغيل، لا يتم توريث الوظائف قذيفة من البيئة، المتغير SHELLOPTS
، إذا كان يبدو في البيئة، ويتم تجاهل، ويتم تعيين هوية المستخدم الفعلي للهوية المستخدم الحقيقي.
ويبدو دعوة setuid(0)
بك التحايل تلك الحماية.