मेरे पास एक सेतु जड़ बाइनरी है, with_sudo.bin
जो निम्न स्रोत कोड के साथ है:
/* with_sudo.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
system("/usr/bin/sudo cat /root/key.txt");
return 0;
}
akshay@bluebox ~ $ ls -l with_sudo.bin
-rwsr-sr-x 1 root root 8684 Feb 1 22:09 with_sudo.bin
भले ही यह एक setuid रूट बाइनरी है, लेकिन sudo पासवर्ड पूछा जा रहा है।
akshay@bluebox ~ $ ./with_sudo.bin
ruid : 1000 euid : 0
[sudo] password for akshay:
जब मैं बिना किसी अन्य बाइनरी चलाने sudo
में system()
, यह सुपर उपयोगकर्ता विशेषाधिकारों के साथ चलाता है।
/* without_sudo.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
system("cat /root/key.txt");
return 0;
}
akshay@bluebox ~ $ ls -l without_sudo.bin
-rwsr-sr-x 1 root root 8677 Feb 1 22:09 without_sudo.bin
अक्षय @ ब्लूबॉक्स ~ $ ./without_sudo.bin
बर्बाद: 1000 यूरोप: 0
::: this_is_a_secret_key :::
जब उपयोग के साथ-साथ Real UID
बनाया गया था , तो बाइनरी सुपरसुसर विशेषाधिकारों के साथ भाग गया था बिना सूडो पासवर्ड के लिए संकेत दिए बिना, हालांकि इसका उपयोग किया गया था।0
Effective UID
setreuid(geteuid(), 0);
sudo
/* with_sudo_ruid_elevated.c */
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main() {
setreuid(0, geteuid());
printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid());
system("/usr/bin/sudo cat /root/key.txt");
return 0;
}
मैंने पढ़ा है कि EUID
किसी विशेष कार्य को करने के लिए प्रक्रिया के विशेषाधिकारों का मूल्यांकन करने के लिए उपयोग किया जाता है। तो फिर क्यों है sudo
के आधार पर sudo पासवर्ड के लिए उत्साह RUID
भी जब EUID
है 0
?
EUID 0
गैर और रूट के रूप में आमंत्रित किया जाता हैRUID
?