2012-10-27 13 views
7

मेरे पास task_struct * है जो मुझे find_task_by_vpid(get_pid()) पर कॉल करके मिला है। मैं यह जानना चाहता हूं कि उस उपयोगकर्ता के पास कौन सी प्रक्रिया है, ताकि मैं लिखने वाले सिस्टम कॉल में कुछ अनुमति जांच कर सकूं, लेकिन task_struct स्रोत कोड को देखकर बहुत मदद नहीं मिली है। उपयोगी दिखने वाली एकमात्र चीज loginuid है, लेकिन किसी कारण से कर्नेल संकलित नहीं होगा अगर मैं इसे इस तरह एक्सेस करने का प्रयास करता हूं: my_task_struct->loginuid। क्या task_struct से प्रक्रिया को कॉल करने वाले उपयोगकर्ता को पाने का कोई और तरीका है?क्या यह पता लगाने का कोई तरीका है कि उपयोगकर्ता के पास प्रक्रिया के task_struct से कोई प्रक्रिया है?

+1

'geteuid' के कार्यान्वयन को देखें। अनुमति जांच के लिए, हालांकि, आप निश्चित रूप से अपने स्वयं के तर्क को बनाने के बजाए उस तरह की चीज़ के लिए मौजूदा सामान्य ढांचे का उपयोग करना चाहते हैं जो शेष सिस्टम के साथ असंगत है। – zwol

+0

मैं उस उपयोगकर्ता के 'euid' को प्राप्त करने के लिए 'geteuid()' का उपयोग करता हूं, जिसे सिस्टम कॉल कहा जाता है, लेकिन मुझे यकीन नहीं है कि 'task_struct' के' uid' (या' euid') को प्राप्त करने के लिए इसका उपयोग कैसे किया जाए। प्रणाली में पारित 'पिड' के लिए खुद को कॉल करें। – Mason

उत्तर

7

दुर्भाग्यवश, उपयोगकर्ता/समूह आईडी अब कार्य संरचना में संग्रहीत नहीं हैं, बल्कि इसके बजाय एक अलग विशेषाधिकार संरचना में जो गतिशील रूप से आवंटित और समान कार्यों वाले सभी कार्यों के बीच साझा की जाती है। यह बदले में वैसे भी एक स्थिति है जहाँ setuid थकावट संसाधन की वजह से असफल हो सकता है, और setuid की विफलता विशेषाधिकार सहारा को बनाता है कमजोरियों का एक कुख्यात स्रोत है ...

, यह task_struct के इन सदस्यों में बताया गया है:

const struct cred __rcu *real_cred; /* objective and real subjective task 
            * credentials (COW) */ 
    const struct cred __rcu *cred; /* effective (overridable) subjective task 
            * credentials (COW) */ 
+0

धन्यवाद यह वास्तव में मदद करता है। क्या आप जानते हैं कि प्रारंभ करने के लिए कैसे उपयोगकर्ता_struct शुरू किया? – saman

+0

@saman: ठीक नहीं है, लेकिन 'setuid()' आदि के लिए कोड पाएं और आपको कुछ उदाहरणों को देखना चाहिए कि यह कैसे किया जाता है। –

+0

@ आर .. मैं केवल unistd.h में सेटयूड सिस्टम कॉल की घोषणा पा सकता हूं लेकिन मुझे इस सिस्टम कॉल के कार्यान्वयन को नहीं मिला [यहां] (http://stackoverflow.com/questions/27594865/add-another -फील्ड-टू-यूज़र-स्ट्रक्चर) क्या मेरा सवाल यह है कि आप इसका उत्तर दे सकते हैं? – saman

0

गिरी अंतरिक्ष के भीतर एक यूजर आईडी (यूआईडी) का उपयोग करने के लिए आप (लिनक्स 4.9.13) के रूप में निम्नलिखित लाइनों के साथ कुछ कर सकते हैं:

struct task_struct *task; 
for_each_process(task) { 
    uid_t uid = __kuid_val(task_uid(task)); 
} 

task_uid एक संरचना रिटर्न kuid_t कहा जाता है और वास्तविक मूल्य तक पहुंचने के लिए आपको या तो __kuid_val पर कॉल करना है या इसे सीधे एक्सेस करना है (task_uid(task).val)।

वैकल्पिक रूप से, आप from_kuid(&init_user_ns, task_uid(task)) का उपयोग कर सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे