इंटेंट रीडायरेक्शन के जोखिम की संभावना दूर करने का तरीका

यह जानकारी उन डेवलपर के लिए है जिनके ऐप्लिकेशन में, इंटेंट रीडायरेक्शन के जोखिम की संभावना है.

क्या हो रहा है

आपके एक या उससे ज़्यादा ऐप्लिकेशन में इंटेंट रीडायरेक्शन की समस्या है. यह नुकसान पहुंचाने वाले ऐप्लिकेशन को, निजी ऐप्लिकेशन के कॉम्पोनेंट या फ़ाइलों को ऐक्सेस करने की मंज़ूरी दे सकती है. कृपया अपने ऐप्लिकेशन की समस्या ठीक करने के लिए, नीचे ज़्यादा जानकारी के साथ दिए गए कदमों काे देखें. आपके Play Console में दिख रही समयसीमा के बाद, उन ऐप्लिकेशन को Google Play से हटा दिया जाएगा जिनमें सुरक्षा की गड़बड़ियों को ठीक न किया गया हो.

कार्रवाई ज़रूरी है​

  1. अपने Play Console में साइन इन करें. इसके बाद, चेतावनी सेक्शन पर जाकर देखें कि किन ऐप्लिकेशन पर असर हुआ है और इन समस्याओं को ठीक करने की आखिरी तारीख क्या है.
  2. यहां हाइलाइट किए गए तरीके इस्तेमाल करके, उन ऐप्लिकेशन को अपडेट करें जिन पर असर हुआ है.
  3. आपके जिन ऐप्लिकेशन पर असर हुआ है उनके अपडेट किए गए वर्शन सबमिट करें.

दोबारा सबमिट करने पर, आपके ऐप्लिकेशन की फिर से समीक्षा की जाएगी. इस प्रक्रिया में कई घंटे लग सकते हैं. अगर ऐप्लिकेशन, समीक्षा में पास होता है और पब्लिश कर दिया जाता है, तो कुछ और करने की ज़रूरत नहीं है. अगर ऐप्लिकेशन समीक्षा में फ़ेल हो जाता है, तो उसका नया वर्शन पब्लिश नहीं किया जाएगा और आपको ईमेल से इसकी सूचना मिल जाएगी.

कुछ और जानकारी

कॉम्पोनेंट को लॉन्च करने के लिए, किसी गैर-भरोसेमंदइंटेंट का इस्तेमाल करना (उदाहरण के लिए, startActivity को कॉल करना) या डेटा वापस भेजना (उदाहरण के लिए, setResult को कॉल करना) खतरनाक है. ऐसा करने से, नुकसान पहुंचाने वाले ऐप्लिकेशन को नीचे दी गई समस्याएं पैदा करने की अनुमति मिल सकती है: 

  1. आपके ऐप्लिकेशन से संवेदनशील फ़ाइलें या सिस्टम डेटा (जैसे कि एसएमएस मैसेज) चोरी करने की अनुमति
  2. आपके ऐप्लिकेशन के निजी कॉम्पोनेंट को गलत तर्कों के साथ लॉन्च करने की अनुमति.

यह ज़रूरी है कि आपके ऐप्लिकेशन से इंटेट की पुष्टि या गैर-भरोसेमंद इंटेट को मिटाए बिना, गैर-भरोसेमंद इंटेट परstartActivity, startService, sendBroadcast या setResult को कॉल न किया जाए.

हमारा सुझाव है कि आप नीचे बताए गए किसी एक तरीके का इस्तेमाल करके इस जोखिम को रोकें:

विकल्प 1: जिस ऐप्लिकेशन कॉम्पोनेंट पर असर हुआ है, यानी इंटेंट रीडायरेक्ट हुआ है उसे निजी बनाएं.

जिस ऐप्लिकेशन कॉम्पोनेंट पर असर हुआ है, अगर उसे दूसरे ऐप्लिकेशन से इंटेंट पाने की ज़रूरत नहीं है, तो आप अपने मेनिफ़ेस्ट में android:exported=”false” सेट करके, उस ऐप्लिकेशन कॉम्पोनेंट को निजी बना सकते हैं.

विकल्प 2: पक्का करें कि निकाला गया इंटेंट, किसी भरोसेमंद स्रोत से है.

आप पुष्टि कर सकते हैं कि शुरुआती ऐक्टिविटी पर, getCallingActivity जैसे तरीकों का इस्तेमाल करके भरोसा किया जा सकता है या नहीं. उदाहरण के लिए:

 // देखना कि शुरुआत करने वाली ऐक्टिविटी भरोसेमंद पैकेज से है या नहीं
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // नेस्ट किए गए इंटेंट को निकालना
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // नेस्ट किए गए इंटेंट को रीडायरेक्ट करना
   startActivity(forward);
 }

ध्यान दें:

  • जांच हो रही है कि getCallingAction() शून्य के अलावा, कोई ऐसी वैल्यू दिखाता है या नहीं जो जोखिम की संभावना को रोकने के लिए काफ़ी नहीं है. इस फ़ंक्शन के लिए, नुकसान पहुंचाने वाले ऐप्लिकेशन, शून्य वैल्यू दे सकते हैं.
  • 'Google Play सेवाओं' में एसएमएस की मदद से पुष्टि करने के मामले में, एक ब्रॉडकास्ट रिसीवर की SEND_PERMISSION के साथ सुरक्षा से यह पक्का होगा कि इंटेंट 'Play सेवाओं' से आया है.

विकल्प 3: पक्का करें कि रीडायरेक्ट करने वाला इंटेंट, नुकसान पहुंचाने वाला न हो.

आपको पुष्टि करनी होगी कि रीडायरेक्ट करने वाला इंटेंट

  1. आपके ऐप्लिकेशन के किसी भी निजी कॉम्पोनेंट में नहीं भेजा जाएगा और
  2. इसे किसी बाहरी ऐप्लिकेशन के कॉम्पोनेंट में नहीं भेजा जाएगा. अगर किसी बाहरी ऐप्लिकेशन को टारगेट करने के लिए रीडायरेक्ट किया गया है, तो पक्का करें कि इंटेंट, आपके ऐप्लिकेशन के निजी कॉन्टेंट देने वाले या सिस्टम डेटा को यूआरआई की अनुमति देने वाला न हो.

ऐप्लिकेशन यह जांच कर सकते हैं कि resolveActivity जैसे तरीकों की मदद से इंटेंट को रीडायरेक्ट करने से पहले, उसे हैंडल करने के लिए किस कॉम्पोनेंट का इस्तेमाल किया जाएगा. उदाहरण के लिए:

 Intent intent = getIntent();
 // नेस्ट किए गए इंटेंट को निकालना
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // कॉम्पोनेंट का नाम हासिल करना
 ComponentName name = forward.resolveActivity(getPackageManager());
 // देखना कि पैकेज का नाम और क्लास का नाम इंटेंट किए गए हैं
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // नेस्ट किए गए इंटेंट को रीडायरेक्ट करना
   startActivity(forward);
 }

ऐप्लिकेशन यह जांच कर सकते हैं कि कोई इंटेंट getFlags जैसे तरीकों का इस्तेमाल करके, यूआरआई की अनुमति देता है या नहीं. उदाहरण के लिए:

 // नेस्ट किए गए इंटेंट पाना
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // फ़्लैग पाना
 int flags = forward.getFlags();
 // देखना कि नेस्ट किए गए इंटेंट यूआरआई की अनुमतियां नहीं देते हैं
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // नेस्ट किए गए इंटेंट को रीडायरेक्ट करना
   startActivity(forward);
 }

ऐप्लिकेशन removeFlags का इस्तेमाल करके, यूआरआई की अनुमतियों को हटा भी सकते हैं. उदाहरण के लिए:

 // गैर-भरोसेमंद इंटेंट
 Intent intent = getIntent();
 // गैर-भरोसेमंद इंटेंट से दी गई यूआरआई की अनुमतियां हटाएं
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // गैर-भरोसेमंद इंटेंट पास करें
 setResult(intent);

चेतावनियों को समझना और उनसे बचने का विकल्प चुनना 

Play Console से मिलने वाली चेतावनी में यह बताया जाता है कि आपके ऐप्लिकेशन में किसी गैर-भरोसेमंद इंटेट का इस्तेमाल करके startActivity, startActivityForresults, startService, sendBroadcast या setResult को कहां कॉल किया गया है. इससे बचने के सबसे बेहतर विकल्प के बारे में जानने के लिए, फिर से ट्रेस करें और कॉल करने वालों के तरीकों पर ध्यान दें. इससे, यह जानकारी मिलेगी कि गैर-भरोसेमंद इंटेंट कहां से आता है. उदाहरण के लिए, पहले विकल्प के लिए फिर से ट्रेस करें और जानें कि किस कॉम्पोनेंट को निजी बनाना है.

हम आपकी मदद के लिए हमेशा तैयार हैं

अगर आप जोखिम की संभावना से जुड़े तकनीकी सवाल पूछना चाहते हैं, तो आप इन्हें Stack Overflow पर पोस्ट कर सकते हैं और इसके साथ “android-security” टैग का इस्तेमाल कर सकते हैं. इस समस्या को ठीक करने के लिए, आपको जो चरण अपनाने हैं उनके बारे में ज़्यादा जानकारी के लिए, आप हमारी डेवलपर सहायता टीम से संपर्क कर सकते हैं.

false
मुख्य मेन्यू
13134447013621613315
true
खोज मदद केंद्र
true
true
true
true
true
5016068
false
false