لماذا أحتاج setuid (0) ضمن برنامج C setuid الجذر الذي يدعو إلى برنامج إداري مع النظام ()؟

StackOverflow https://stackoverflow.com/questions/1051370

سؤال

وكان علي أن أفعل لينكس القذرة الإختراق لشخص ما حتى يتمكنوا من البدء في طابعة مع الأمر قذيفة 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) بك التحايل تلك الحماية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top