ओपनबीएसडी की प्रतिज्ञा क्या है?


18

क्या कोई गैर-प्रोग्रामर, लेकिन आईटी व्यक्ति के लिए वर्णन कर सकता है, क्या प्रतिज्ञा है ?

Ex .: एक कार्यक्रम है, उदा .: "xterm"। प्रतिज्ञा कैसे इसे और अधिक सुरक्षित बना सकती है? यह प्रोग्राम कोड के अंदर या ओएस में ही बाहर प्रतिज्ञा करता है?

प्रतिज्ञा कहाँ है? क्या यह कार्यक्रमों के कोड में है; या ओएस में बायनेरिज़ की एक सूची है जो केवल xy syscalls को लागू कर सकती है?

जवाबों:


13

प्रतिज्ञा क्या है?

pledge एक सिस्टम कॉल है।

pledgeएक कार्यक्रम में कॉल करना यह वादा करना है कि कार्यक्रम केवल कुछ संसाधनों का उपयोग करेगा।

कहने का एक और तरीका यह है कि किसी प्रोग्राम के संचालन को उसकी जरूरतों तक सीमित रखा जाए, जैसे,

"मैं किसी भी अन्य पोर्ट का उपयोग न करने की प्रतिज्ञा करता हूं port 63"
"मैं किसी भी अन्य सिस्टम-कॉल को छोड़कर उपयोग नहीं करने की प्रतिज्ञा करता हूं lseek()और fork()"

यह एक कार्यक्रम को और अधिक सुरक्षित कैसे बनाता है?

यह एक कार्यक्रम के संचालन को सीमित करता है। उदाहरण:

  • आपने एक कार्यक्रम लिखा है, xyzजिसमें केवल readसिस्टम-कॉल की आवश्यकता है ।
  • फिर आप pledgeकेवल उपयोग करने के लिए जोड़ते हैं readलेकिन कुछ और नहीं।
  • तब एक दुर्भावनापूर्ण उपयोगकर्ता को पता चला कि आपके कार्यक्रम में एक भेद्यता है, जिसके द्वारा कोई एक rootशेल का आह्वान कर सकता है ।
  • rootशेल को खोलने के लिए अपने कार्यक्रम को उजागर करने के परिणामस्वरूप कर्नेल प्रक्रिया को मार देगा SIGABRT(जिसे पकड़ा / अनदेखा नहीं किया जा सकता) और एक लॉग उत्पन्न करेगा (जिसे आप पा सकते हैं dmesg)।

ऐसा इसलिए होता है क्योंकि आपके प्रोग्राम के अन्य कोड्स को निष्पादित करने से पहले, यह सिस्टम कॉल के pledgeअलावा किसी अन्य चीज का उपयोग नहीं करता है read। लेकिन खोल rootखोल कई अन्य सिस्टम-कॉल को कॉल करेगा, जो निषिद्ध है क्योंकि इसके पहले से ही किसी अन्य का उपयोग नहीं करने का वादा किया गया है read

कहाँ है प्रतिज्ञा?

आमतौर पर एक कार्यक्रम में। OpenBSD 6.5 मैन पेज से उपयोग :

#include <unistd.h>

int pledge(const char *promises, const char *execpromises);

उदाहरण कोड: cat.ccat से कमांड का उदाहरण कोड

........
#include <unistd.h>
........
int ch;
if (pledge("stdio rpath", NULL) == -1)
    err(1, "pledge");

while ((ch = getopt(argc, argv, "benstuv")) != -1)
..........

5

एक प्रोग्राम आम तौर पर केवल एक निश्चित सिस्टम या लाइब्रेरी कॉल का उपयोग करता है। साथ pledgeआप केवल इस सेट करने की अनुमति दी सिस्टम कॉल के सेट सीमित कर सकते हैं। उदाहरण के लिए, यदि प्रोग्राम को पासवर्ड डेटाबेस को पढ़ने की आवश्यकता नहीं है, तो आप getpwnam()फ़ंक्शन को कॉल करने से मना कर सकते हैं ।

यह कैसे उपयोगी है? यह कमजोरियों के खिलाफ रक्षा की एक अतिरिक्त रेखा है। यदि प्रोग्राम में बग है, तो कोई व्यक्ति प्रोग्राम के निष्पादन प्रवाह को बदलने या प्रक्रिया में कुछ अतिरिक्त कोड को इंजेक्ट करने के लिए बग का उपयोग करने में सक्षम हो सकता है। बग, उदाहरण के लिए, डेमन का सामना कर रहे नेटवर्क में एक बफर अतिप्रवाह त्रुटि हो सकती है, जिसे हमलावर प्रोग्राम को अधिक डेटा भेजकर ट्रिगर कर सकता है जितना संभव हो सके संभाल सकता है, संभवतः प्रोग्राम को /etc/passwdफ़ाइल के ऊपर पढ़ने और भेजने की व्यवस्था कर रहा है। नेटवर्क।


4

आपका प्रोग्राम केवल "ए, बी, सी" कार्यक्षमता का उपयोग करने के लिए "प्रतिज्ञा" करता है

यदि कोई हैकर आपकी प्रतिज्ञा की गई प्रक्रिया में कोड इंजेक्ट कर सकता है और कार्यक्षमता डी का प्रयास कर सकता है, तो ओएस आपके प्रोग्राम को क्रैश कर देता है

उदाहरण के लिए, मान लें कि आपके पास NTP सर्वर है। इसने केवल DNS और CLOCK कार्यक्षमता का उपयोग करने का वचन दिया है। लेकिन इसमें एक दोष है जो दूरस्थ कोड निष्पादन की अनुमति देता है। हैकर इसे WRITE FILE से पूछता है। लेकिन pledgeयह पता लगाएगा और कार्यक्रम को बंद कर देगा और त्रुटि लॉग करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.