एक setuid रूट बाइनरी में sudo पासवर्ड के लिए संकेत देना


1

मेरे पास एक सेतु जड़ बाइनरी है, 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बनाया गया था , तो बाइनरी सुपरसुसर विशेषाधिकारों के साथ भाग गया था बिना सूडो पासवर्ड के लिए संकेत दिए बिना, हालांकि इसका उपयोग किया गया था।0Effective UIDsetreuid(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?

जवाबों:


3

यह थोड़ा जटिल है। ऑपरेटिंग सिस्टम कर्नेल एक प्रक्रिया का प्रभावी यूआईडी और GID का उपयोग अपने विशेषाधिकार / प्राधिकरणों को निर्धारित करने के लिए करता है; वे के लिए उपयोग किया जाता है

  • उपयोगकर्ता / समूह / अन्य नियमों के आधार पर साधारण फाइलसिस्टम संचालन (जैसे, खुला, लिंक / अनलिंक करना) की अनुमति देना / रोकना
  • नई बनाई गई फ़ाइलों का स्वामित्व सेट करना,
  • यह निर्धारित करते हुए कि अन्य प्रक्रियाएं किस प्रक्रिया को सिग्नल भेज सकती हैं, और
  • यह तय करना कि क्या कोई प्रक्रिया फाइल सिस्टम को माउंट और अनमाउंट कर सकती है, तारीख बदल सकती है, सिस्टम को बंद कर सकती है, आदि।

और शायद अन्य चीजें। लेकिन, पकड़ यह है कि जब किसी कार्यक्रम को किसी प्रकार का उपयोग / प्राधिकरण निर्णय लेने की आवश्यकता होती है, तो उसे आमतौर पर वास्तविक यूआईडी और जीआईडी ​​का उपयोग करने की आवश्यकता होती है। विचार करें: जब आपका with_sudo.cकार्यक्रम निष्पादित होता है sudo, तो प्रभावी यूआईडी रूट (0) है और वास्तविक यूआईडी आप (1000) हैं, जैसा कि आपके द्वारा प्रदर्शित किया गया है printf।  लेकिन यह बिल्कुल वैसा ही है जैसा कि आप sudoएक अनपेक्षित शेल से चलाते हैं तो क्या होगा ।   जब भी sudo चलता है, तो प्रभावी यूआईडी 0 है - इसलिए sudoइसका उपयोग करने का निर्णय नहीं ले सकता कि कैसे व्यवहार किया जाए। यह वास्तविक यूआईडी का उपयोग करने के लिए यह पता लगाने के लिए है कि आप वास्तव में कौन हैं, इसलिए यह निर्धारित कर सकता है कि आपको क्या करने की अनुमति है sudo। केवल तभी वास्तविक UID 0 होता हैsudoनिष्कर्ष निकालें कि आप "वास्तव में" जड़ हैं, या कम से कम यह आपकी वास्तविक पहचान को निर्धारित नहीं कर सकता है, इसलिए यह नहीं जानता है कि आपके लिए क्या प्रतिबंध लागू होते हैं, और यह सिर्फ catआपसे कोई और प्रमाणीकरण मांगे बिना निष्पादित करता है ।


क्या कोई गैर- setuid_root बाइनरी है जो प्रमाणीकरण के लिए संकेत देता है जब इसे EUID 0गैर और रूट के रूप में आमंत्रित किया जाता है RUID?
अक्षय कृष्णन आर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.