इंस्टॉल करने से पहले APK के अंदर क्या है
APK एक zip फ़ाइल है जिसके साथ एक घोषणा जुड़ी होती है। Android उसके कोड की एक भी पंक्ति चलाए, उससे पहले पैकेज यह बता चुका होता है कि वह खुद को क्या कहता है, किन Android संस्करणों का समर्थन करता है, क्या करने की अनुमति चाहता है, उसके किन हिस्सों को दूसरे ऐप बुला सकते हैं, और उसे किसने हस्ताक्षरित किया। इनमें से किसी के लिए भी कुछ इंस्टॉल करना ज़रूरी नहीं है। इसे पहले पढ़ने से अंधा भरोसा दस मिनट की जाँच में बदल जाता है — और वह जाँच अक्सर फ़ैसले के लिए काफ़ी होती है।
साइडलोड किया गया APK पहले देखना क्यों ज़रूरी है
आधिकारिक स्टोर के ऐप एक लिस्टिंग, समीक्षाओं के इतिहास और प्रकाशक पेज के साथ आते हैं। बाहर से डाउनलोड किया गया APK — किसी विक्रेता की साइट, मिरर, फ़ोरम पोस्ट, चैट संदेश या पुराने बैकअप से — उस संदर्भ में से कुछ भी साथ नहीं लाता, और इंस्टॉल प्रॉम्प्ट उसकी जगह नहीं लेता। Android का इंस्टॉलर नाम और आइकन दिखाता है, और अनुमतियाँ देर से, समूहों में और सरल रूप में आती हैं, ठीक उसी क्षण जब आपके रुककर सोचने की संभावना सबसे कम होती है। जब कोई ऐप एक बार इंस्टॉल और लॉन्च हो जाए, तो वह दी गई अनुमतियों को पहले ही रख चुका हो सकता है और नेटवर्क का उपयोग कर चुका हो सकता है। सवाल पूछने का सस्ता क्षण उससे पहले है, जब फ़ाइल अभी सिर्फ़ एक फ़ाइल है।
यह साइडलोडिंग के ही ख़िलाफ़ तर्क नहीं है। विक्रेता वैध ऐप सीधे वितरित करते हैं, कंपनियाँ आंतरिक टूल इसी तरह तैनात करती हैं, और पुराने संस्करण कभी-कभी असली समस्याएँ हल करते हैं। यह तर्क यह पढ़ने के पक्ष में है कि आपको क्या सौंपा गया। इस साइट का APK विश्लेषक पैकेज को आपके ब्राउज़र में पार्स करता है — फ़ाइल कभी अपलोड नहीं होती और कभी चलाई नहीं जाती — और मैनिफ़ेस्ट, अनुमतियाँ, घटक और हस्ताक्षर प्रमाणपत्र एक ही दृश्य में रख देता है। आप जो भी टूल उपयोग करें, यही क्रम रखें: पहले जाँच, फिर इंस्टॉल, और जो ऐप जाँच में न टिके उसे खुद एक उत्तर मानें।
मैनिफ़ेस्ट ऐप की अपनी घोषणा है
हर APK में AndroidManifest.xml होता है, जो बाइनरी XML में संग्रहीत रहता है, और यह ऐप की अपने बारे में घोषणा है। यह पैकेज का नाम देता है — वह अनूठी पहचान जो Android उपयोग करता है, जैसे com.example.app — साथ में एक संख्यात्मक versionCode और मानव-पठनीय versionName। यह उन घटकों को घोषित करता है जो ऐप में हैं, जिन अनुमतियों का वह अनुरोध करता है, और जिन हार्डवेयर व सॉफ़्टवेयर सुविधाओं की उसे अपेक्षा है। चूँकि Android इस फ़ाइल का बहुत हिस्सा लागू करता है, इसलिए इसे स्टोर लिस्टिंग या डाउनलोड पेज की तुलना में हल्के में जाली बनाना कठिन है: कोई ऐप उस अनुमति का चुपचाप उपयोग नहीं कर सकता जिसे उसने कभी घोषित न किया हो, और वह किसी ऐसे पैकेज का अपडेट होने का दिखावा नहीं कर सकता जिसका नाम वह साझा न करता हो।
मैनिफ़ेस्ट की दो संख्याएँ रखरखाव के बारे में आश्चर्यजनक रूप से बहुत कुछ कहती हैं। minSdkVersion वह सबसे पुराना Android है जिस पर ऐप चलेगा; बहुत नीची मंज़िल का मतलब है कई वर्षों पुराने डिवाइसों और सुरक्षा मॉडलों का समर्थन, जो कभी ज़रूरी होता है और कभी बस विरासत में मिला और भुला दिया गया होता है। targetSdkVersion वह Android व्यवहार स्तर है जिसका पालन करने का ऐप दावा करता है। Google हर साल स्टोर अपडेट के लिए ज़रूरी लक्ष्य को बढ़ाता है, क्योंकि ऊँचा लक्ष्य ऐप को नए गोपनीयता और सुरक्षा नियमों के अधीन करता है। कई वर्षों पुराने लक्ष्य वाला साइडलोड APK अपने आप दुर्भावनापूर्ण नहीं होता — लेकिन वह आपको बता रहा है कि उसने उन नए नियमों से परहेज़ किया, या उन्हें कभी पूरा नहीं किया, और आपको पूछना चाहिए कि क्यों।
अनुमतियाँ, ठीक से पढ़ी गईं
Android अनुमतियों को वर्गों में बाँटता है, और वह वर्ग नाम से अधिक मायने रखता है। सामान्य अनुमतियाँ इंस्टॉल के समय अपने आप मिल जाती हैं — नेटवर्क पहुँच इसका परिचित उदाहरण है — क्योंकि सिस्टम उन्हें कम जोखिम वाला मानता है। ख़तरनाक अनुमतियाँ संवेदनशील डेटा और कार्रवाइयों को शामिल करती हैं, जैसे संपर्क, संदेश, सटीक स्थान, माइक्रोफ़ोन और कैमरा; इन्हें रनटाइम पर एक प्रॉम्प्ट चाहिए जिसे उपयोगकर्ता मना कर सके। हस्ताक्षर अनुमतियाँ केवल उसी प्रमाणपत्र से हस्ताक्षरित ऐपों को, या खुद सिस्टम को मिलती हैं, इसलिए कोई तीसरे पक्ष का ऐप यदि एक को घोषित भी करे तो उसे कुछ नहीं मिलता। अनुमतियों की सूची पढ़ते समय, किसी एक पंक्ति का मूल्यांकन करने से पहले उसे मन में इन वर्गों में बाँट लें।
फ़ैसला संदर्भ होता है, गिनती नहीं। एक टॉर्च ऐप का SMS पढ़ने का अनुरोध किसी ईमानदार कारण से नहीं हो सकता; वही अनुमति माँगने वाला मैसेंजर ऐप कम से कम खुद को समझा सकता है — एक सत्यापन कोड पढ़ना, या खुद को आपका डिफ़ॉल्ट संदेश ऐप बनाने की पेशकश। एक बैंकिंग ऐप वैध रूप से कई अनुमतियाँ माँग सकता है, जबकि एक साधारण गेम केवल कुछ ही माँगते हुए ठीक वही एक शामिल कर सकता है जो फिट नहीं बैठती। इसलिए ऐपों को केवल अनुमति गिनती से न आँकें। हर ख़तरनाक अनुमति के लिए पूछें कि इस ऐप की कौन-सी सुविधा उसके बिना टूटेगी। जिन अनुरोधों को आप किसी सुविधा से नहीं जोड़ सकते, वही निष्कर्ष है, और ठीक वही इंस्टॉल सारांश छिपाता है।
एक्सपोर्ट किए गए घटक और वे जो आक्रमण सतह बनाते हैं
एक ऐप घटकों से बना होता है — एक्टिविटी (स्क्रीन), सेवाएँ, ब्रॉडकास्ट रिसीवर और कंटेंट प्रोवाइडर — और मैनिफ़ेस्ट बताता है कि उनमें से कौन-से एक्सपोर्ट किए गए हैं, यानी डिवाइस के दूसरे ऐप उन तक पहुँच सकते हैं। एक्सपोर्ट किए गए घटक अपने आप में ग़लती नहीं हैं: एक शेयर लक्ष्य, एक फ़ाइल खोलने वाला, और एक डीप लिंक इसलिए काम करते हैं क्योंकि कोई घटक जानबूझकर एक्सपोर्ट किया गया होता है, संरक्षित होता है और आधुनिक Android में स्पष्ट रूप से घोषित किया जाता है। जोखिम उन एक्सपोर्ट किए गए घटकों में है जो कभी सार्वजनिक द्वार नहीं बनने चाहिए थे: एक ऐसी सेवा जिसे कोई भी ऐप शुरू कर सके, एक ऐसा रिसीवर जिसे कोई भी ट्रिगर कर सके, या एक ऐसा प्रोवाइडर जो ऐप का डेटा माँगने वाले किसी को भी बिना किसी अनुमति जाँच के सौंप दे।
किसी भी उत्पादन ऐप में मैनिफ़ेस्ट के दो फ़्लैग सीधे देखने लायक हैं। डीबग योग्य चिह्नित एप्लिकेशन को जुड़ी हुई मशीन के टूल से जोड़कर निरीक्षण किया जा सकता है; यह एक विकास सेटिंग है, और इसे चालू रखकर भेजना इस बात का लाल झंडा है कि रिलीज़ कैसे बनी। बैकअप की अनुमति देने का मतलब है कि ऐप का निजी डेटा डिवाइस बैकअप में शामिल हो सकता है, जो सुविधाजनक हो सकता है और यह भी हो सकता है कि वह डेटा, जिसे आप ऐप के अंदर ही रहता समझते थे, किसी बहुत कम नियंत्रित जगह पर चला जाए। कोई भी फ़्लैग यह साबित नहीं करता कि ऐप हानिकारक है। दोनों की जाँच सस्ती है, तैयार उत्पाद में उनका औचित्य कठिन है, और ये ठीक उसी तरह के विवरण हैं जो डाउनलोड पेज पर कभी नहीं दिखते।
हस्ताक्षर प्रमाणपत्र: Android की पहचान प्रणाली
हर APK हस्ताक्षरित होता है, और हस्ताक्षर प्रमाणपत्र Android के पास पहचान दस्तावेज़ के सबसे निकट की चीज़ है। Android किसी मौजूदा ऐप के ऊपर अपडेट तभी इंस्टॉल करेगा जब दोनों प्रतियाँ एक ही पैकेज नाम और एक ही हस्ताक्षरकर्ता साझा करें। यह एक नियम बहुत-सा शांत काम करता है: इसका मतलब है कि कोई अजनबी उस ऐप का ट्रोजनयुक्त अपडेट नहीं भेज सकता जिस पर आप पहले से भरोसा करते हैं, क्योंकि उसके पास मूल कुंजी नहीं है, और इसका मतलब है कि प्रमाणपत्र का फ़िंगरप्रिंट — आमतौर पर SHA-256 डाइजेस्ट के रूप में दिखाया जाता है — निरंतरता की जाँच का व्यावहारिक तरीका है। यदि कोई विक्रेता अपेक्षित फ़िंगरप्रिंट प्रकाशित करता है, तो उसकी तुलना करें। इस साइट का प्रमाणपत्र और कुंजी मैचर प्रमाणपत्रों और कुंजियों के लिए सामान्य रूप से वही फ़िंगरप्रिंट तर्क कवर करता है।
स्पष्ट रहें कि एक फ़िंगरप्रिंट क्या साबित करता है और क्या नहीं। यह साबित करता है कि यह फ़ाइल एक विशेष निजी कुंजी के धारक द्वारा हस्ताक्षरित की गई थी, और यह कि वह उसी कुंजी से हस्ताक्षरित किसी अन्य फ़ाइल से मेल खाती है या नहीं। यह यह साबित नहीं करता कि कुंजी धारक ईमानदार है, सक्षम है, या यह तक कि वह प्रमाणपत्र के विषय फ़ील्ड में नामित कंपनी ही है, जिन्हें हस्ताक्षरकर्ता स्वयं भरता है। दोबारा पैक किया गया ऐप आमतौर पर मूल से अलग प्रमाणपत्र से हस्ताक्षरित होता है, इसलिए फ़िंगरप्रिंट का न मिलना एक मज़बूत रुकने का संकेत है; मिलना केवल निरंतरता का संकेत है। Android में पहचान कुंजी की निरंतरता है, इससे अधिक कुछ नहीं — उसके साथ उसी तरह व्यवहार करें।
एक इंस्टॉल-पूर्व जाँच सूची
हिस्सों को एक निश्चित क्रम में जोड़ें और जाँच में मिनट लगते हैं। पहला, पहचान: क्या पैकेज नाम आपके अपेक्षित ऐप से मेल खाता है, और क्या संस्करण कोड और नाम उस रिलीज़ के लिए विश्वसनीय हैं जिसे आप डाउनलोड करना चाहते थे? दूसरा, रखरखाव: न्यूनतम और लक्ष्य SDK स्तर कितने पुराने हैं, और क्या यह उस ऐप से मेल खाता है जिसकी अभी भी देखभाल हो रही हो? तीसरा, अनुमतियाँ: ख़तरनाक अनुमतियों को सूचीबद्ध करें और हर एक को किसी सुविधा से जोड़ें, और जिसे आप समझा न सकें उस पर रुकें। चौथा, सतह: कौन-से घटक एक्सपोर्ट किए गए हैं, और क्या डीबगिंग और बैकअप चालू हैं? पाँचवाँ, हस्ताक्षर: क्या प्रमाणपत्र का फ़िंगरप्रिंट प्रकाशक के बताए मूल्य से, या कम से कम उस प्रति से मेल खाता है जिस पर आप पहले से भरोसा करते हैं? फ़ाइल को APK विश्लेषक से गुज़ारें और एक ही स्क्रीन पर इस सूची में नीचे जाएँ।
फिर दो नहीं, तीन श्रेणियों में फ़ैसला करें। इंस्टॉल करें, जब सब कुछ किसी सुविधा से जुड़ता है और फ़िंगरप्रिंट ठीक बैठता है। सावधानी से इंस्टॉल करें — किसी परीक्षण डिवाइस पर, वर्क प्रोफ़ाइल में, या संदिग्ध अनुमतियाँ दिए बिना — जब अधिकांश चीज़ें फिट बैठती हैं लेकिन एक बिंदु पर नज़र रखने की ज़रूरत है। या दूर हट जाएँ, जब पैकेज नाम ग़लत है, फ़िंगरप्रिंट मेल नहीं खाता, या किसी ख़तरनाक अनुमति के पीछे कोई कल्पनीय सुविधा नहीं है। दूर हटने की लागत एक डाउनलोड है; दूसरी दिशा की लागत एक खाता हो सकती है। और इस आदत को अनुपात में रखें: यह ट्राइएज है, पैकेट कैप्चर विश्लेषक के साथ पहले दस मिनट की तरह — फ़ाइल जो अपने बारे में घोषित करती है उसकी एक तेज़, ईमानदार पढ़त, जो उसे उस डिवाइस पर जगह देने से पहले की जाती है जिसे आप हर जगह साथ ले जाते हैं।
अक्सर पूछे जाने वाले प्रश्न
क्या साफ़ मैनिफ़ेस्ट पढ़ने का मतलब है कि APK सुरक्षित है?
नहीं। मैनिफ़ेस्ट एक घोषणा है, व्यवहार रिपोर्ट नहीं। एक ऐप अनुमतियों और घटकों का एक विनम्र, पूरी तरह विश्वसनीय दिखने वाला समूह घोषित कर सकता है और फिर भी कोड में बुरा व्यवहार कर सकता है — घर फोन करना, वैध रूप से मिली अनुमतियों का दुरुपयोग करना, या इंस्टॉल के बाद नया व्यवहार डाउनलोड करना। मैनिफ़ेस्ट पढ़ना ट्राइएज है: यह बेमेल पहचानों, अस्पष्ट अनुमतियों, उजागर घटकों और ग़लत हस्ताक्षर प्रमाणपत्रों को तेज़ी से और सस्ते में पकड़ता है। यह मैलवेयर पर फ़ैसला नहीं है, और कोई भी टूल जो मैनिफ़ेस्ट की पढ़त को हरे "सुरक्षित" ठप्पे में बदल दे, वह सबूत से अधिक का दावा कर रहा है।
एक ही ऐप अलग-अलग टूल में अलग अनुमतियाँ क्यों दिखाता है?
आमतौर पर तीन वैध कारणों से। पहला, संस्करण सीमा: एक अनुमति पर maxSdkVersion हो सकता है, इसलिए वह केवल किसी निश्चित Android स्तर तक लागू होती है, और टूल इस बात में भिन्न होते हैं कि वे ऐसी प्रविष्टियाँ दिखाते हैं या नहीं। दूसरा, समूहन: Android पूछते समय अनुमतियों को समूहों में प्रस्तुत करता है, जबकि मैनिफ़ेस्ट व्यक्तिगत अनुमतियों को सूचीबद्ध करता है, इसलिए समूह दृश्य पूरी सूची से छोटा लगता है। तीसरा, विलय: ऐप में बंडल की गई लाइब्रेरी अपनी मैनिफ़ेस्ट प्रविष्टियाँ लाती हैं, जिन्हें बिल्ड अंतिम फ़ाइल में मिला देता है — इसलिए इंस्टॉल किए गए मैनिफ़ेस्ट में ऐसी अनुमतियाँ हो सकती हैं जिन्हें ऐप के अपने कोड के किसी हिस्से ने कभी घोषित ही नहीं किया। अंतर यह देखने का संकेत हैं कि कौन-सा कारण लागू होता है, छेड़छाड़ का अपने आप सबूत नहीं।
क्या मैं कुछ भी इंस्टॉल किए बिना APK की जाँच कर सकता हूँ?
हाँ — यही ब्राउज़र-स्थानीय विश्लेषक का मक़सद है। APK को एक फ़ाइल के रूप में पार्स किया जाता है: उसका बाइनरी मैनिफ़ेस्ट डीकोड किया जाता है, उसके संसाधन लेबल और स्ट्रिंग के लिए पढ़े जाते हैं, और उसके हस्ताक्षर प्रमाणपत्र निकालकर फ़िंगरप्रिंट किए जाते हैं। ऐप का कोड कभी चलाया नहीं जाता, किसी डिवाइस पर कुछ भी इंस्टॉल नहीं होता, और इस साइट के विश्लेषक के साथ फ़ाइल अपलोड भी नहीं होती — पार्सिंग आपके ब्राउज़र टैब में होती है। यदि कोई जाँच सेवा आपसे APK को किसी सर्वर पर अपलोड करने को कहे, तो खुद से पूछें कि क्या वह फ़ाइल — जो एक आंतरिक बिल्ड हो सकती है — किसी और की मशीन पर होनी ही चाहिए।