2016-04-05 9 views
8

एंड्रॉयड 4 के अंतर्गत, निम्न सरल देशी सी कोड लाइन एक Permission denied त्रुटि जब नहीं रन के रूप में root के साथ विफल:सॉकेट() "अनुमति अस्वीकार" त्रुटि का कारण क्या हो सकता है?

online_socket = socket(AF_INET, SOCK_DGRAM, 0); 

मुझे क्या करना डिवाइस के लिए root उपयोग कर सकते है, लेकिन चाहते हैं प्रक्रिया को गैर-विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में चलाने के लिए।

ध्यान दें कि सॉकेट बाध्य करने से पहले भी त्रुटि होती है।

मुझे लगता है कि कुछ सुरक्षा सेटिंग है जो tweaked की जरूरत है? कोई मुझे बता सकता है कि कहां देखना है?

ओ/एस इस मामले में वास्तव में एंड्रॉइड है, लेकिन मुझे लगता है कि समस्या वास्तव में लिनक्स से संबंधित है (क्योंकि एंड्रॉइड लिनक्स कर्नेल पर आधारित है)।

उन लोगों के लिए सोच रहा है: यह एक कस्टम प्रोग्राम है जो पूर्ण (debootstrap पेड) एंड्रॉइड 4 वातावरण में चल रहे डेबियन जेसी इंस्टॉलेशन में चलता है।

अद्यतन

मैंने सीखा है कि एंड्रॉयड कर्नेल एक विशेष CONFIG_ANDROID_PARANOID_NETWORK विस्तार है कि नेटवर्क AID_INET और AID_NET_RAW समूहों में उपयोगकर्ताओं के लिए केवल उपयोग की अनुमति देता है।

हालांकि, इन समूहों में उपयोगकर्ता को जोड़ने के बाद भी, socket() अभी भी अस्वीकार कर दिया गया है (और ping एक ही समस्या है, बीटीडब्ल्यू)।

uid=5(imp) gid=51(imp) groups=51(imp),3003(aid_inet),3004(aid_net_raw),3005(aid_admin),3001(aid_bt),3002(aid_bt_net) 

कि अगर CONFIG_ANDROID_PARANOID_NETWORK झंडा इस विशेष कर्नेल में सेट है मैं नहीं बता सकता, जैसा कि मैंने कॉन्फ़िग फ़ाइल के लिए उपयोग नहीं है।

अद्यतन 2

मुझे पता चला है कि दोनों rootऔर भी मेरी आम उपयोगकर्ता imp वास्तव में सफलतापूर्वक socket() कॉल कर सकते हैं - कम से कम समूहों ऊपर वर्णित सेटअप के साथ।

हालांकि, root रूप में एक ही प्रक्रिया बुला और फिर seteuid() सिस्टम कॉल का उपयोग कर imp का उपयोग करने जा सफल से socket() से बचाता है। कोई विचार?

+0

मैं एक x68_64 लैपटॉप पर आर्क लिनक्स के तहत एक त्रुटि नहीं मिलता है। मुझे संदेह है कि यह एक एंड्रॉइड चीज है। –

+0

क्या आपने "0" (तीसरा पैरामीटर) से भिन्न प्रोटोकॉल का उपयोग करने का प्रयास किया है? उदाहरण: टीसीपी के लिए 6 या udp के लिए 17? असल में, आपको एक udp डेटाग्राम सॉकेट के लिए प्रोटोकॉल 17 का उपयोग करना होगा। –

+0

@gerhardd। - बस 17 को प्रोटोकॉल बदलने की कोशिश की, लेकिन दुर्भाग्य से यह मदद नहीं करता है। मुझे यह नहीं करना चाहिए कि प्रश्न में कार्यक्रम 2.4 से 4.4 –

उत्तर

10

जैसा कि यह पता चला है, एंड्रॉइड एक विशेष कर्नेल पैच का उपयोग करता है जो CONFIG_ANDROID_PARANOID_NETWORK के साथ सक्रिय है। यह पैच सिस्टम उपयोगकर्ताओं को नेटवर्क पहुंच की अनुमति देता है जो हार्डकोडेड आईडी वाले कुछ विशेष समूहों से संबंधित हैं।

groupadd -g 3001 aid_bt 
groupadd -g 3002 aid_bt_net 
groupadd -g 3003 aid_inet 
groupadd -g 3004 aid_net_raw 
groupadd -g 3005 aid_admin 

(अर्थात क्षुधा) इन समूहों को ऐसा इसलिए है क्योंकि एंड्रॉयड सामान्य रूप से उन कहते है विशिष्ट एप्लिकेशन नेटवर्किंग अनुमतियों केवल जब।

usermod -a -G aid_bt,aid_bt_net,aid_inet,aid_net_raw,aid_admin someuser 

हालांकि, जब एक प्रक्रिया seteuid() का उपयोग करता है उदाहरण के someuser के लिए एक आम उपयोगकर्ता (करने के लिए root से स्विच करने के लिए:

इन समूहों को उपयोगकर्ता जोड़ रहे सवाल में वर्णित के रूप में यह करने की अनुमति देता है socket() का उपयोग), तो यह पर्याप्त नहीं है (या शायद अप्रासंगिक) कि यह प्रभावी उपयोगकर्ता aid_* समूह सदस्यता है।

usermod -a -G aid_bt,aid_bt_net,aid_inet,aid_net_raw,aid_admin root 

यह मेरे लिए समस्या हल: इसके बजाय, root उपयोगकर्ता स्पष्ट रूप से इन समूहों में से एक सदस्य होना चाहिए।

ध्यान दें कि मैं भी setegid() साथ खेलने के लिए की कोशिश की है और एक विकल्प के रूप समान है, लेकिन मदद की है कि में से कोई भी ...

+0

तक केर्नल्स के साथ कई अन्य, * गैर-एंड्रॉइड * प्लेटफार्मों में ठीक काम करता है, यह मेरे लिए काम करता है। – Geofferey

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