एप्राइपिएट अनधिकृत सामान करने के लिए बस seteuid(2)
पर कॉल करें। seteuid(2)
वास्तविक (या सहेजे गए) उपयोगकर्ता आईडी (जो आपके मामले में SUID प्रोग्राम या root
लॉन्च करता है) के बीच स्विच करने की अनुमति देता है और SUID उपयोगकर्ता आईडी (एक सूड प्रोग्राम से संबंधित है) तो वहां नहीं होना चाहिए बाद में विशेषाधिकार प्राप्त उपयोगकर्ता आईडी प्राप्त करने में समस्या (चूंकि सहेजी गई उपयोगकर्ता आईडी root
है, तो आपको बार-बार स्विच करने के लिए कोई समस्या नहीं है)।
आप setuid(2)
साथ UIDs बदलते हैं तो आपको सभी (प्रभावी, बचाया और वास्तविक UIDs) बदल देंगे और यह केवल जड़ उपयोगकर्ता के लिए अनुमति दी है (या एक कार्यक्रम setuid जड़ है, और कोई रास्ता नहीं है फिर वापस नहीं है)। अगले उदाहरण पर
देखो:
फ़ाइल pru49015.c:
$ pru49015 -i 37
real uid=502; effective uid=0
real uid=502; effective uid=37
real uid=502; effective uid=502
जब एक setuid-रूट कार्यक्रम
रूप में इस्तेमाल किया:
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
int main(int argc, char **argv)
{
int opt, suid = getuid(), /* this is the saved uid */
uid = 0;
while ((opt = getopt(argc, argv, "i:")) != EOF) {
switch (opt) {
case 'i': uid = atoi(optarg); break;
}
}
/* execute this program with root privileges, like setuid root, for example */
printf("real uid=%d; effective uid=%d\n", getuid(), geteuid());
seteuid(uid); /* change to the non-privileged id configured */
printf("real uid=%d; effective uid=%d\n", getuid(), geteuid());
seteuid(suid); /* return back to saved uid */
printf("real uid=%d; effective uid=%d\n", getuid(), geteuid());
}
आप इस तरह एक आउटपुट मिल जाएगा
यदि आप इसे रूट के रूप में उपयोग करते हैं, तो आपको निम्न आउटपुट मिलेगा:
$ sudo pru$$ -i 37
real uid=0; effective uid=0
real uid=0; effective uid=37
real uid=0; effective uid=0
तंत्र है कि आप उपयोगकर्ता के बीच स्विच करने के लिए आप (इसे बचाया प्रयोक्ता आईडी कॉल) कर रहे हैं एक setuid- कार्यक्रम पर अनुमति दी जाती है और उपयोगकर्ता कार्यक्रम (बुलाया प्रभावी उपयोगकर्ता के लिए setuid चलाता है आईडी या suid उपयोगकर्ता) जितनी बार चाहें उतनी बार।
स्रोत
2016-09-01 05:50:37
* डीबीस * को छोड़कर यह एक प्रभावी दृष्टिकोण है। यदि संभव हो तो एक [सॉकेट जोड़ी] (http://man7.org/linux/man-pages/man2/socketpair.2.html) का उपयोग करें, ताकि कनेक्शन तृतीय पक्षों से सुरक्षित हो। (मूल प्रक्रिया में अभी भी मूल विशेषाधिकार हैं, और हम नहीं चाहते हैं कि यह बाढ़ या फिक संदेशों से शोषक हो।) मैंने इसे व्यक्तिगत रूप से कुछ बार इस्तेमाल किया है, लेकिन अधिक महत्वपूर्ण बात यह है कि दूसरों को भी। सबसे व्यापक रूप से उपयोग किए जाने वाले उदाहरण शायद अपाचे [mod_cgid] (https://httpd.apache.org/docs/2.4/mod/mod_cgid.html) और [mod_fcgid] (https://httpd.apache.org/mod_fcgid/) मॉड्यूल हैं । –
काम में मदद के लिए, एक और मशीन का उपयोग क्यों नहीं करते? क्या कोई समाधान है जो आपके से अधिक संसाधनों का उपभोग करता है?'Seteuid (2) 'के लिए एक सरल कॉल को' suid' उपयोगकर्ता आईडी और' असली 'उपयोगकर्ता आईडी के बीच आईडी स्विच करने की अनुमति देनी चाहिए। और यह यूनिक्स v7 से predates। –
यदि एपीआई के बारे में कोई सुरक्षा चिंता है, तो मैं साझा स्मृति के माध्यम से संचार के खिलाफ सलाह दूंगा। साझा मेमोरी क्षेत्र में कचरा डेटा के माध्यम से विशेषाधिकार प्राप्त प्रक्रिया में अपरिभाषित व्यवहार को ट्रिगर करने वाले हमलावर का जोखिम पाइप के माध्यम से भेजे गए संदेश के मुकाबले कहीं अधिक गंभीर है। साझा मेमोरी क्षेत्र के साथ, आपके पास एक पाइप के साथ साझा क्षेत्र में दो प्रक्रियाओं की पूरी तरह से असीमित पहुंच है, आप निश्चित हो सकते हैं कि बच्चे को माता-पिता में प्राप्त होने के बाद डेटा नहीं बदलेगा। इस प्रकार माता-पिता वास्तव में इस पर अभिनय करने से पहले अवकाश पर डेटा को मान्य कर सकते हैं। – cmaster