खास जानकारी
Android 13, APK सिग्नेचर स्कीम v3.1 के साथ काम करता है. यह मौजूदा APK सिग्नेचर स्कीम v3 की तुलना में बेहतर है. v3.1 स्कीम, रोटेशन से जुड़ी APK सिग्नेचर स्कीम v3 की कुछ समस्याओं को हल करता है. खास तौर पर, v3.1 साइनिंग स्कीम, SDK वर्शन टारगेटिंग के साथ काम करता है. इससे रोटेशन की मदद से, प्लैटफ़ॉर्म के नए वर्शन को टारगेट किया जा सकता है.
सिग्नेचर स्कीम v3.1, ऐसे ब्लॉक आईडी का इस्तेमाल करता है जिसे Android 12 या इससे पहले के वर्शन पर नहीं पहचाना जाता. इसलिए, प्लैटफ़ॉर्म पर हस्ताक्षर करने वाले व्यक्ति के व्यवहार के लिए ये नियम लागू होते हैं:
- Android 13 या इसके बाद के वर्शन पर चलने वाले डिवाइस, v3.1 ब्लॉक में रोटेट किए गए हस्ताक्षरकर्ता का इस्तेमाल करते हैं.
- Android के पुराने वर्शन वाले डिवाइस, बदले गए साइनिंग पासकोड को अनदेखा करते हैं. इसके बजाय, वे v3 ब्लॉक में मौजूद ओरिजनल साइनिंग पासकोड का इस्तेमाल करते हैं.
जिन ऐप्लिकेशन ने अब तक अपनी साइनिंग कुंजी नहीं बदली है उन्हें कोई और कार्रवाई करने की ज़रूरत नहीं है. जब भी ये ऐप्लिकेशन घूमते हैं, तो सिस्टम डिफ़ॉल्ट रूप से हस्ताक्षर की सुविधा के v3.1 वर्शन को लागू करता है.
v3.1 साइनिंग ब्लॉक
साइनिंग ब्लॉक के v3.1 वर्शन में वही कॉन्टेंट होगा जो v3 वर्शन में है. हालांकि, नए ब्लॉक आईडी के साथ इन साइन को सिर्फ़ Android 13 और उसके बाद के वर्शन वाले डिवाइसों पर ही पहचाना जाएगा. इससे ऐप्लिकेशन, मल्टी-टारगेट APK के बारे में चिंता किए बिना, अपनी साइनिंग कुंजियों को सुरक्षित तरीके से बदल सकते हैं. इसकी वजह यह है कि ओरिजनल साइनिंग कुंजी का इस्तेमाल, साइनिंग ब्लॉक v3 में APK को साइन करने के लिए किया जा सकता है. साथ ही, बदली गई साइनिंग कुंजी का इस्तेमाल, साइनिंग ब्लॉक v3.1 में APK को साइन करने के लिए किया जा सकता है. इससे प्लैटफ़ॉर्म को v3.1 हस्ताक्षर की पुष्टि करते समय, v3 साइनिंग ब्लॉक के लिए सभी मौजूदा पुष्टि करने वाले कोड का फिर से इस्तेमाल करने की अनुमति भी मिलती है.
डिफ़ॉल्ट रूप से, apksig
लाइब्रेरी, साइनिंग कॉन्फ़िगरेशन में बदली गई 'की' और लीनेज उपलब्ध कराने पर, साइनिंग ब्लॉक के तीसरे वर्शन का इस्तेमाल करेगी. अगर किसी ऐप्लिकेशन का minSdkVersion
, Android 13 से कम है और रोटेट की गई कुंजी का इस्तेमाल किया जा रहा है, तो साइनिंग के लिए इस्तेमाल की जाने वाली मूल कुंजी की जानकारी भी देनी होगी, ताकि इसका इस्तेमाल, साइनिंग के लिए इस्तेमाल किए जाने वाले v3 ब्लॉक में APK पर हस्ताक्षर करने के लिए किया जा सके. यह मौजूदा व्यवहार से मिलता-जुलता है, जहां APK के Android 9 से पहले के वर्शन को टारगेट करने पर, हस्ताक्षर करने वाले व्यक्ति को फिर से हस्ताक्षर करना पड़ता है.
किसी खास SDK वर्शन से शुरू होने वाले कुंजी रोटेशन को टारगेट करने के लिए, apksig
लाइब्रेरी नए एपीआई को एक्सपोज़ करेगी. इन एपीआई की मदद से, रोटेशन के लिए SDK टूल का कम से कम वर्शन सेट किया जा सकेगा. अगर रोटेशन के लिए, Android 13 से पहले के किसी वर्शन को कम से कम वर्शन के तौर पर सेट किया जाता है, तो ओरिजनल v3 ब्लॉक का इस्तेमाल किया जाएगा. साइन करने के लिए v3.1 ब्लॉक का इस्तेमाल सिर्फ़ तब किया जाता है, जब रोटेशन की सुविधा चालू हो और रोटेशन के लिए SDK टूल का कम से कम वर्शन, Android 13 और उसके बाद के वर्शन पर सेट हो. V3 साइनिंग ब्लॉक में, रोटेशन के लिए एक नया एट्रिब्यूट होगा. यह एट्रिब्यूट, SDK टूल के कम से कम वर्शन को हटाने से जुड़ी सुरक्षा से जुड़ा होगा.
APK में Lineage शामिल है | rotation-min-sdk-version की वैल्यू | v3 साइनिंग ब्लॉक | v3.1 साइनिंग ब्लॉक |
---|---|---|---|
नहीं | डिफ़ॉल्ट या कोई वैल्यू (यहां x से दिखाया गया है) | मूल साइनर से साइन किया गया हो और Android 9 और उसके बाद के वर्शन को टारगेट करता हो | मौजूद नहीं है |
हां | डिफ़ॉल्ट | मूल साइनर के साथ साइन किया गया, जो Android 9 से 12L को टारगेट करता है | Android 13 और उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए, साइन करने वाले व्यक्ति की जानकारी बदली गई हो |
हां | x < 33 (Android 13) | Android 9 और इसके बाद के वर्शन को टारगेट करने वाले, रोटेट किए गए साइनर के साथ साइन किया गया | मौजूद नहीं है |
हां | x >= 33 (Android 13) | Android 9 को टारगेट करने वाले, ओरिजनल साइनर के साथ हस्ताक्षर किया गया - (x-1) | हस्ताक्षर करने वाले व्यक्ति की फ़ोटो घुमाकर हस्ताक्षर किया गया, x+ को टारगेट किया गया |
रोटेशन से जुड़ी समस्याएं
प्लैटफ़ॉर्म में, घुमाने से जुड़ी ये समस्याएं ठीक कर दी गई हैं:
Android 12 में किए गए सुधार
- प्लैटफ़ॉर्म, अनुरोध करने वाले ऐप्लिकेशन को सिर्फ़ तब साइन करने की अनुमति देगा, जब दोनों ऐप्लिकेशन के मौजूदा साइन करने वाले व्यक्ति का नाम, साइन करने के लिए तय किए गए क्रम में शामिल हो या वह दूसरे ऐप्लिकेशन के लिए साइन करने वाला मौजूदा व्यक्ति हो. इससे, अनुरोध करने वाले ऐप्लिकेशन को साइन करने की अनुमति नहीं दी जाती, अगर दोनों ऐप्लिकेशन, साइनिंग पासकोड के सबसे सही तरीकों का पालन करते हैं और अलग-अलग साइनिंग पासकोड का इस्तेमाल करते हैं.
- प्लैटफ़ॉर्म की APK रोलबैक सुविधा, ऐसे APK को रोलबैक नहीं कर सकती जिसका साइनिंग पासकोड अभी-अभी बदला गया है. ऐसा तब तक नहीं किया जा सकता, जब तक कि साइनिंग पासकोड के क्रम में मौजूद पिछले पासकोड में रोलबैक की सुविधा न हो. हालांकि, इस सुविधा से रोटेशन का मकसद पूरा नहीं होता, क्योंकि इससे नए पैकेज अपडेट को पिछले साइनिंग पासकोड से साइन किया जा सकता है और बदले गए पासकोड को रोलबैक किया जा सकता है.
- अगर किसी APK को सिर्फ़ रोटेट किए गए पासकोड से साइन किया गया है और बाद में उसे ओरिजनल पासकोड और रोटेट किए गए पासकोड से साइन किए गए APK से अपडेट किया गया है, तो Android 11 और उससे पहले के वर्शन पर, सिर्फ़ रोटेट किए गए पासकोड दिखेगा.
Android 11 में किए गए सुधार
- दो पैकेज की ओरिजनल हस्ताक्षर कुंजियों की जांच करने के लिए,
PackageManager#checkSignatures
को ठीक से अपडेट नहीं किया गया था. इस वजह से, उन ऐप्लिकेशन के लिए इंस्ट्रूमेंटेशन काम नहीं कर रहा था जिनके लिए, रोटेट की गई साइनिंग पासकोड का इस्तेमाल किया गया था. साथ ही, जिनके इंस्ट्रूमेंटेशन APK के लिए, ओरिजनल साइनिंग पासकोड का इस्तेमाल किया गया था. sharedUserId
के तहत मौजूद पैकेज, हस्ताक्षर करने की प्रक्रिया के बारे में जानकारी शेयर करते हैं. जब भी किसीsharedUiserId
में, हस्ताक्षर करने के लिए इस्तेमाल होने वाले अपडेट किए गए लाइनेज वाले ऐप्लिकेशन को इंस्टॉल या अपडेट किया जाता है, तो उस ऐप्लिकेशन का लाइनेज,sharedUserId
के लिए शेयर किए गए लाइनेज की जगह ले लेता है. इसका मतलब है कि अगर किसी ऐप्लिकेशन के हस्ताक्षर करने के लिए इस्तेमाल होने वाले लाइनेज A -> B थे औरsharedUserId
में उस ऐप्लिकेशन को लाइनेज B -> C के साथ अपडेट किया गया है, तोsharedUserId
के लाइनेज को B -> C से बदल दिया जाएगा. इसी तरह, हस्ताक्षर करने वाले किसी व्यक्ति के लेगसी में मौजूद सुविधाओं को तब तक अपडेट नहीं किया जा सकता, जब तक हस्ताक्षर करने वाले व्यक्ति के लेगसी को बदला नहीं जाता.
v4 इंटिग्रेशन
v4 साइनिंग स्कीम, apksigner को दिए गए साइनिंग कॉन्फ़िगरेशन का इस्तेमाल करता है. अगर रोटेशन के लिए एक से ज़्यादा साइनिंग कॉन्फ़िगरेशन दिए गए हैं, तो रोटेट किए गए सबसे नए साइनिंग कॉन्फ़िगरेशन का इस्तेमाल किया जाता है. v3.1 के लॉन्च से पहले, v3 में सिर्फ़ यह सबसे नया रोटेट किया गया साइनिंग कॉन्फ़िगरेशन शामिल था. इसलिए, v4 इस कॉन्फ़िगरेशन का इस्तेमाल वैसे ही कर सकता था. इसकी मदद से, v4 सिग्नेचर स्कीम, रोटेशन की सुविधा के साथ काम कर सकता था, क्योंकि यह अपनी SigningInfo में रोटेट की गई साइनिंग पासकोड का इस्तेमाल करता था. SigningInfo के v4 वर्शन में, हस्ताक्षर करने की पूरी जानकारी शामिल नहीं होती. हालांकि, यह v3 वर्शन के हस्ताक्षर करने वाले ब्लॉक से इस जानकारी को खींच सकता है, ताकि प्लैटफ़ॉर्म किसी भी हस्ताक्षर क्वेरी के लिए, इस जानकारी को ऐक्सेस कर सके. अगर दिए गए rotation-min-sdk-version के लिए रोटेशन को टारगेट करने के लिए v3.1 का इस्तेमाल किया जा रहा है, तो सामान्य v3 कॉन्फ़िगरेशन में, हस्ताक्षर करने के लिए इस्तेमाल होने वाला ओरिजनल कॉन्फ़िगरेशन और रोटेट किया गया नया कॉन्फ़िगरेशन, दोनों शामिल होंगे. हस्ताक्षर करने की सुविधा के वर्शन 4 का एक एक्सटेंशन बनाया गया है. इसमें, हस्ताक्षर करने की सुविधा के वर्शन 3.1 ब्लॉक के हर कॉन्फ़िगरेशन के लिए, हस्ताक्षर करने से जुड़ी अतिरिक्त जानकारी वाले ब्लॉक शामिल हैं.
पुष्टि करें
v3.1 को लागू करने की जांच करने के लिए, PkgInstallSignatureVerificationTest.java
cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
में 'सीटीएस टेस्ट' चलाएं.
टेस्टिंग के बारे में ज़्यादा जानकारी के लिए, v3 में पुष्टि सेक्शन देखें.