2015-11-06 5 views
15

System.Security.Principal.WindowsIdentity है यथोचित से सुरक्षित हैक होने ऐसी है कि एक उदाहरण मैं Thread.CurrentPrincipal के Identity या WindowsIdentity.GetCurrent() है जो IsAuthenticated के लिए true मेरी विधानसभा गलत पहचान जानकारी देता है से मिल सकता है? कुछ भी नहीं, ज़ाहिर है, पूरी तरह से छेड़छाड़ का सबूत है, लेकिन माइक्रोसॉफ्ट की प्रतिबद्धता और निर्भरता को देखते हुए, मुझे उम्मीद है कि इस तरह की महत्वपूर्ण एपीआई लॉक डाउन हार्ड और साथ छेड़छाड़ करना मुश्किल होगा। क्या यह मेरे हिस्से पर मान्य धारणा है?क्या यह सिस्टम का उपयोग है। सुरक्षा। प्रिंसिपल। WindowsIdentity उचित रूप से सुरक्षित है?

मेरे यहाँ लक्ष्य उचित सर्वोत्तम प्रथाओं मेरी विधानसभा में एसएसओ प्रदान करना है। यदि विंडोज़ के साथ समझौता किया गया है, तो यह मेरे नियंत्रण से बाहर है, लेकिन अगर (उदाहरण के लिए) यह मेरी असेंबली से जुड़ी एक ऐप के लिए एक सीधा जानकारी है जो मुझे झूठी सूचना खिलाती है, तो यह मेरे लिए उचित परिश्रम करने में असफल रहने के लिए होगा। यह मेरे लिए अज्ञानता का एक बड़ा क्षेत्र है।

स्पष्ट है कि, मैं कठिन जानकारी के लिए देख रहा हूँ, नहीं बंद कफ राय। इसलिए, प्रकाशित किए गए शोषण, या WindowsIdentity कन्स्ट्रक्टर का एक ऐसे तरीके से प्रदर्शित किया गया जो मेरे कोड, आदि को चालित करेगा या "यह एक वैध धारणा है" पक्ष पर, ठोस लेख इसे समर्थन दे रहा है, ज्ञात उपयोगों पर निर्भर करता है, आदि। उन्हें बहुत भाग्य नहीं मिला, लेकिन मैंने विभाजनकर्ता के तहत अब तक जो पाया है उसे शामिल किया है।

यहाँ कैसे मैं उपयोग करने का इरादा है WindowsIdentity:

using System.Security.Principal; 
using System.Threading; 
// ... 

// I only want Windows-authenticated users 
WindowsIdentity identity = Thread.CurrentPrincipal == null 
    ? null 
    : Thread.CurrentPrincipal.Identity as WindowsIdentity; 
SecurityIdentifier sid; 

// I can't imagine how an authenticated account would be anonymous, but... 
if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) { 
    // SSO success from thread identity 
    sid = identity.User; 
    // ...check that that SID is allowed to use our system... 
} else { 
    identity = WindowsIdentity.GetCurrent(); 
    if (identity != null && identity.IsAuthenticated && !identity.IsAnonymous) { 
     // SSO success from current Windows user 
     sid = identity.User; 
     // ...check that that SID is allowed to use our system... 
    } else { 
     // SSO fail 
    } 
} 

यह एक DLL विधानसभा   — उदासी हम नेट पर अटक कर रहे हैं में है 3.5   — कि संसाधनों से प्रतिबंधित किया जा सकता करने के लिए एक सार्वजनिक एपीआई प्रदान करता है प्रयोगकर्ता के अधिकार। यह डेस्कटॉप ऐप्लिकेशन में उपयोग किया जा सकता है, या Windows प्रमाणीकरण के साथ एक ASP.Net आईआईएस अनुप्रयोग में (ASP.Net जब विंडोज प्रमाणन का उपयोग कर Thread.CurrentPrincipal.Identity पर एक WindowsIdentity उदाहरण सेट, हम आईआईएस प्रमाणन वर्तमान के अन्य प्रकार का समर्थन नहीं करते)।

मैं यथोचित इस तरह प्रमाणीकृत होने का दावा उन स्रोतों से एक WindowsIdentity उदाहरण से एक सिड पर भरोसा कर सकते हैं?

यह आश्चर्य है कि अगर ठीक था मेरे लिए नहीं होती है (DOH!) तक this question उपयोगकर्ता lc. में एक चिंता का विषय है कि विधानसभा है कि यह और के साथ जुड़ा हुआ एक दुर्भावनापूर्ण एप्लिकेशन द्वारा धोखा दिया जा रहा करने के लिए अतिसंवेदनशील हो सकता है उठाया " उस जानकारी को फिक्र किया गया। उनके पास कोई विशिष्ट सबूत नहीं था कि यह क्यों महत्वपूर्ण चिंता हो सकती है, हालांकि, यह सवाल है।


क्या (छोटे) मैं अब तक मिल गया है:

  • This answer दावा

    आप भरोसा कर सकते हैं बनाता है कि वर्तमान WindowsIdentity यह कौन कहता है, यह है अब तक क्योंकि आप अपने आवेदन में किसी भी दिए गए डेटा पर भरोसा कर सकते हैं।

  • पुस्तक Hacking the Code दावों ASP.Net एक WindowsIdentity की आवश्यकता है कि जब फ़ाइल authorizaton चेकिंग, अगर सच कह रही है माइक्रोसॉफ्ट, कम से कम, यह काफी अच्छा समझता है के लिए एक काफी ठोस आधार की तरह लगता है जो कर के लिए एक अनुरोध के साथ जुड़े होने ।

  • मैं अपने कोड में WindowsIdentity जानकारी का उपयोग करके खुशी से लोगों के कई उदाहरण पा सकते हैं, लेकिन उनमें से अधिकतर सवाल पूछते हैं कि वे सुरक्षित हैं या नहीं। वहाँ एक निहितार्थ, लेकिन ...

+0

आप किस संदर्भ में यह पूछ रहे हैं? आप एएसपी.नेट और डेस्कटॉप ऐप दोनों के बारे में बात कर रहे हैं। यह स्पष्ट हो सकता है, लेकिन ["पनडुब्बी" प्रणाली पर चलते समय, सभी दांव बंद हो जाते हैं - एक दुर्भावनापूर्ण उपयोगकर्ता आपकी प्रक्रिया में इंजेक्ट और संशोधित कर सकता है जिस तरह से वे चाहते हैं] (http://stackoverflow.com/questions/8357469/ कैसे-कर सकते हैं-ए-रक्षा-मेरी-निजी-funcs-के खिलाफ प्रतिबिंब-क्रियान्वित करने)। – CodeCaster

+0

@ कोडकस्टर: यदि विंडोज़ स्वयं ठीक से समझौता किया गया है, तो यह मेरे नियंत्रण से बाहर है। लेकिन अगर (उदाहरण के लिए) एक ऐप सिर्फ 'विंडोज़ इडेंटिटी' इंस्टेंस बना सकता है, तो इसे वर्तमान थ्रेड पर असाइन करें, और फिर मेरी असेंबली को कॉल करें और मुझे विश्वास करें कि वे किसी ऐसे व्यक्ति हैं जो वे नहीं हैं, जो मेरे कारण असफल रहेगा लगन। असल में, मैं उचित सर्वोत्तम अभ्यास एसएसओ प्राप्त करने की कोशिश कर रहा हूं। मैंने सवाल नहीं किया कि क्या मैं ऊपर दिए गए एपीआई पर भरोसा कर सकता हूं जब तक कि उस उपयोगकर्ता ने इसे मेरे अन्य प्रश्न पर ध्वजांकित नहीं किया (वह सिर्फ पागल हो सकता है), और फिर मुझे जो पता नहीं है उसके बारे में चिंतित हो गया, जो इस क्षेत्र में है बहुत। :-) –

उत्तर

10

आप Thread.CurrentPrincipal से एक भरोसा नहीं कर सकते, नहीं। कोड को धोखा देने से पूर्ण ट्रस्ट में चलने वाले कोड को रोकने के लिए कुछ भी नहीं है।

मैं इस तरह मेरे वातावरण में धोखा करने में सक्षम था:

var admin = new WindowsIdentity(@"Administrator"); 
var princ = new WindowsPrincipal(admin); 
System.Threading.Thread.CurrentPrincipal = princ; 

... अपने कोड लागू करने से पहले। मेरी मशीन पर, बनाई गई WindowsIdentity ऑब्जेक्ट में IsAuthenticatedtrue और IsAnonymous झूठी है, और इसलिए, आपका कोड मेरे डोमेन व्यवस्थापक के एसआईडी को निकालता है।

बस इतना ही वातावरण में काम नहीं करता है, लेकिन यह चाहिए, बशर्ते चल कोड प्रतिबिंब का उपयोग करने के लिए पर्याप्त अनुमतियां हैं: (। फिर, अपने कोड कॉल करने से पहले किया)

var ident = WindowsIdentity.GetCurrent(); 
Thread.CurrentPrincipal = new WindowsPrincipal(ident); 
var userSid = ident.User; 

var fakeSid = new SecurityIdentifier("S-1-3-0"); 

typeof (WindowsIdentity).GetField("m_user", 
    BindingFlags.Instance | BindingFlags.NonPublic).SetValue(ident, fakeSid); 


असल में, एक ही प्रक्रिया में एक दूसरे से झूठ बोलने से एक ही प्रक्रिया में पूर्ण ट्रस्ट के तहत चल रहे कोड के दो टुकड़े रोकने के लिए कुछ भी नहीं है।

+0

@Damien_The_Unbeliever: प्रतिबिंब एक ऐसा करता है, मेरे गैर-डोमेन वातावरण और मेरे उचित एडी वातावरण में। ** वाह जो डरावना है। ** उस 'm_user' फ़ील्ड को सेट करने के बाद, न केवल' यूज़र 'उपयोगकर्ता को सेट करता है, लेकिन' नाम 'अपना डोमेन उपयोगकर्ता नाम देता है; इसलिए 'WindowsIdentifier' को एक मामूली तरीके से ठीक तरह से हैक किया गया प्रतीत होता है। आपके समय और मदद के लिए धन्यवाद। –

+0

@Damien_The_Unbeliever: ** हालांकि **, 'नई विंडोज़ इडेंटिटी (पहचान फ्रॉम थ्रेड। टोकन) '** स्पूफ ** का खुलासा करता है (और कम से कम प्रारंभिक परीक्षण में, मेरे दो गैर-दुर्भावनापूर्ण उपयोग मामलों में सही ढंग से काम करता है)। मुझे लगता है कि यह उत्तर मेरे वास्तविक प्रश्न के लिए सही है (प्रश्न लक्ष्य नहीं जा रहे हैं!), क्योंकि मैंने कोड शामिल किया है जिसे आपने सफलतापूर्वक धोखा दिया है। मैं निश्चित रूप से यह पता लगाने के लिए हूं कि यह भी धोखा दिया जा सकता है ... –

+0

... और इसलिए हमारे पास [यह सवाल] है (http://stackoverflow.com/questions/33573773/is-it- संभव करने वाली चाल इस-windowsidentity-कोड-में-का उपयोग कर-गलत-उपयोगकर्ता)। :-) –

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