प्रतिज्ञा क्या है?
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)
..........