2009-05-22 18 views
5

मेरे पास Win32 अनुप्रयोगों का एक सेट है जो CreateFileMapping() और MapViewOfFile() के साथ बनाए गए साझा मेमोरी सेगमेंट का उपयोग करके जानकारी साझा करता है। अनुप्रयोगों में से एक एक सिस्टम सेवा है; शेष लॉग इन उपयोगकर्ता द्वारा शुरू किया जाता है। विंडोज एक्सपी पर, कोई समस्या नहीं थी। हमने अपने सेगमेंट "ग्लोबल \ समथिंग" नाम दिया और सब ठीक थे।सेवाओं और उपयोगकर्ता प्रक्रियाओं के बीच मेमोरी साझा करने के लिए कैसे?

Vista में अतिरिक्त सुरक्षा (और माना जाता है कि विंडोज 7) इस आर्किटेक्चर को काम करने से रोकने के लिए प्रतीत होता है। सामान्य उपयोगकर्ताओं को वैश्विक नामस्थान में (Win32 त्रुटि 5) ऑब्जेक्ट्स बनाने की अनुमति नहीं है। एमएसडीएन इंगित करता है कि यदि खाते में "वैश्विक बनाएं" विशेषाधिकार है तो सभी को अच्छी तरह से होना चाहिए, लेकिन यह अभ्यास में मामला प्रतीत नहीं होता है। इसके अलावा, Vista की "अखंडता" विशेषताएं "कम अखंडता" उपयोगकर्ता प्रक्रियाओं को "उच्च अखंडता" सेवा-निर्मित साझा मेमोरी ऑब्जेक्ट तक पहुंचने से रोकने के लिए दिखाई देती हैं। ऐसा लगता है कि मुझे कुछ जादुई SetSecurityDescriptorSacl() इंकेंटेशन के माध्यम से इसे ठीक करने में सक्षम होना चाहिए, लेकिन मुझे sacl बोलने में कठिनाई हो रही है।

तो सवाल यह है: सेवाओं और सामान्य उपयोगकर्ता प्रक्रियाओं के बीच साझा मेमोरी सेगमेंट का उपयोग करने का सही तरीका क्या है?

"यूएसी बंद करें" के आसान उत्तर को मुक्त करने के लिए, हम काफी लॉक डाउन वातावरण में हैं और यह संभावना नहीं है।

संपादित करें: सेवा और उपयोगकर्ता प्रक्रिया दोनों को सेगमेंट तक पहुंच पढ़ने/लिखने की आवश्यकता है।

उत्तर

9

सबसे आसान तरीका यह होगा कि आपकी सेवा साझा मेमोरी बनाएं और CreateFileMapping में एक DACL निर्दिष्ट करें जो नियमित उपयोगकर्ताओं को साझा स्मृति तक पहुंच पढ़ने के लिए अनुदान देता है।

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

एक डीएसीएल बनाने का सबसे आसान तरीका ConvertStringSecurityDescriptorToSecurityDescriptor का उपयोग करना है, जो एससीडीएल नामक प्रारूप में एक स्ट्रिंग लेता है जिसे एसीएल निर्दिष्ट करता है।

Writing Secure Code में एसडीडीएल के साथ डीएसीएल बनाने पर एक उत्कृष्ट अध्याय है।

// Error handling removed for brevity 
SECURITY_ATTRIBUTES security; 
ZeroMemory(&security, sizeof(security)); 
security.nLength = sizeof(security); 
ConvertStringSecurityDescriptorToSecurityDescriptor(
     L"D:P(A;OICI;GA;;;SY)(A;OICI;GA;;;BA)(A;OICI;GR;;;IU)", 
     SDDL_REVISION_1, 
     &security.lpSecurityDescriptor, 
     NULL); 

CreateFileMapping(INVALID_HANDLE_VALUE, &security, 
       PAGE_READWRITE, sizeHigh, sizeLow, L"Global\\MyObject"); 

LocalFree(securityDescriptor.lpSecurityDescriptor); 

'डी: पी (ए; OICI; जीए ;;; एसवाई) (ए; OICI; जीए ;;; बीए) (ए; OICI; जीआर ;;; आइयू) "DACL निर्दिष्ट करता है। डी: पी का मतलब है कि यह एक डीएसीएल है (एक एसएसीएल के बजाय ... आप शायद ही कभी एसएसीएल का उपयोग करेंगे) इसके बाद कई एसीई स्ट्रिंग्स हैं जो नियंत्रित करते हैं कि कौन पहुंचता है। प्रत्येक एक ए (अनुमति) है और वस्तु के लिए अनुमति देता है और विरासत (ओआईसीआई) है। सिस्टम (एसवाई) और प्रशासक (बीए, अंतर्निहित प्रशासकों) को सभी पहुंच (जीए - अनुदान सभी) प्रदान करने वाला पहला। अंतिम अनुदान इंटरैक्टिव उपयोगकर्ताओं (आईयू) के लिए पढ़ा जाता है (जीआर), जो उपयोगकर्ता वास्तव में एक सत्र में लॉग इन होते हैं।

एक बार ऐसा करने के बाद, सामान्य उपयोगकर्ता साझा मैपिंग में हैंडल प्राप्त करने के लिए OpenFileMapping को कॉल करने में सक्षम होना चाहिए, और इसे अपनी प्रक्रिया में मैप करने में सक्षम होना चाहिए। चूंकि सामान्य उपयोगकर्ताओं के पास ऑब्जेक्ट पर सीमित अधिकार हैं, इसलिए उन्हें इसे खोलना होगा और इसे केवल पढ़ने के लिए मानचित्र बनाना होगा।

यदि उपयोगकर्ताओं को लिखने की आवश्यकता है, तो आप जीडब्ल्यूजीआर के साथ जीआर को बदल देंगे। ध्यान दें कि यह सुरक्षित नहीं है - एक सीमित उपयोगकर्ता तब आपकी याददाश्त को संशोधित करने में सक्षम होगा, जबकि आपकी सेवा पढ़ रही है और सूचना का विश्लेषण करने की कोशिश कर रही है, जिसके परिणामस्वरूप आपकी सेवा का दुर्घटना हो।

+1

दुर्भाग्य से, सामान्य उपयोगकर्ताओं को भी लेखन पहुंच – Clay

+1

अद्यतन उत्तर होना चाहिए। आपको बस सुरक्षा डिस्क्रिप्टर को ट्विक करने की आवश्यकता है। – Michael

+0

अच्छा जवाब - हम एक अजीब सुरक्षा स्थिति में हैं। अंतिम उपयोगकर्ताओं को सिस्टम के साथ बातचीत करने के लिए भरोसा किया जाता है (इस प्रकार वे सेवा के स्वामित्व वाली स्मृति को संशोधित कर सकते हैं) लेकिन हमें उनकी पहुंच सीमित करने की आवश्यकता है (यूएसी चालू होना चाहिए)। सरकारी नेटवर्क दुनिया की पागलपन में आपका स्वागत है। – Clay

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