অ্যান্ড্রয়েড ১৩ এপিকে সিগনেচার স্কিম ভি৩.১ সমর্থন করে, যা বিদ্যমান এপিকে সিগনেচার স্কিম ভি৩- এর একটি উন্নত সংস্করণ। ভি৩.১ স্কিমটি রোটেশন সংক্রান্ত এপিকে সিগনেচার স্কিম ভি৩-এর কিছু পরিচিত সমস্যার সমাধান করে। বিশেষত, ভি৩.১ সিগনেচার স্কিমটি এসডিকে ভার্সন টার্গেটিং সমর্থন করে, যা রোটেশনকে প্ল্যাটফর্মের পরবর্তী কোনো রিলিজকে টার্গেট করার সুযোগ দেয়।
v3.1 সিগনেচার স্কিমটি এমন একটি ব্লক আইডি ব্যবহার করে যা অ্যান্ড্রয়েড ১২ বা তার নিচের সংস্করণগুলোতে স্বীকৃত নয়। তাই, প্ল্যাটফর্মটি নিম্নলিখিত সাইনার আচরণ প্রয়োগ করে:
- যেসব ডিভাইসে অ্যান্ড্রয়েড ১৩ বা তার উচ্চতর সংস্করণ চলে, সেগুলোতে v3.1 ব্লকের রোটেটেড সাইনারটি ব্যবহৃত হয়।
- যেসব ডিভাইসে অ্যান্ড্রয়েডের পুরোনো সংস্করণ চলে, সেগুলো রোটেটেড সাইনারকে উপেক্ষা করে এবং এর পরিবর্তে v3 ব্লকের আসল সাইনারটি ব্যবহার করে।
যেসব অ্যাপ এখনও তাদের সাইনিং কী পরিবর্তন করেনি, তাদের জন্য কোনো অতিরিক্ত পদক্ষেপের প্রয়োজন নেই। যখনই এই অ্যাপগুলো কী পরিবর্তন করার সিদ্ধান্ত নেবে, সিস্টেম ডিফল্টরূপে v3.1 সিগনেচার স্কিমটি প্রয়োগ করবে।
v3.1 স্বাক্ষর ব্লক
v3.1 সাইনিং ব্লকের বিষয়বস্তু v3 সাইনিং ব্লকের মতোই, কিন্তু নতুন ব্লক আইডির কারণে এই সিগনেচারগুলো শুধুমাত্র অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণের ডিভাইসে স্বীকৃত হয়। এর ফলে অ্যাপগুলো মাল্টি-টার্গেট APK নিয়ে চিন্তা না করেই নিরাপদে তাদের সাইনিং কী পরিবর্তন করতে পারে, কারণ মূল সাইনারটি v3 সাইনিং ব্লকে এবং পরিবর্তিত সাইনারটি v3.1 সাইনিং ব্লকে APK সাইন করার জন্য ব্যবহার করা যায়। এছাড়াও, এটি v3.1 সিগনেচার যাচাই করার সময় প্ল্যাটফর্মটিকে v3 সাইনিং ব্লকের জন্য বিদ্যমান সমস্ত ভেরিফিকেশন কোড পুনরায় ব্যবহার করার সুযোগ দেয়।
ডিফল্টরূপে, সাইনিং কনফিগে যখনই কোনো রোটেটেড কী এবং লিনিয়েজ প্রদান করা হয়, apksig লাইব্রেরি v3.1 সাইনিং ব্লক ব্যবহার করে। যদি কোনো অ্যাপের minSdkVersion অ্যান্ড্রয়েড ১২-এর চেয়ে কম হয় এবং একটি রোটেটেড কী ব্যবহার করা হয়, তবে মূল সাইনিং কী-টিও অবশ্যই উল্লেখ করতে হবে, যাতে এটি v3 সাইনিং ব্লকে APK-টি সাইন করার জন্য ব্যবহার করা যায়। এটি বর্তমান আচরণের মতোই, যেখানে APK-টি অ্যান্ড্রয়েড ৯-এর আগের কোনো সংস্করণকে টার্গেট করলে মূল সাইনারের প্রয়োজন হয়।
একটি নির্দিষ্ট SDK সংস্করণ থেকে কী রোটেশন টার্গেট করা সমর্থন করার জন্য, apksig লাইব্রেরি নতুন API প্রকাশ করে যা রোটেশনের জন্য একটি ন্যূনতম SDK সংস্করণ সেট করার সুযোগ দেয়। যদি রোটেশন সমর্থনের জন্য ন্যূনতম সংস্করণ হিসেবে Android 12-এর চেয়ে কম কোনো SDK সংস্করণ নির্দিষ্ট করা হয়, তাহলে মূল v3 ব্লকটি ব্যবহৃত হয়। v3.1 সাইনিং ব্লকটি শুধুমাত্র রোটেশনের উপস্থিতিতে ব্যবহৃত হয়, যেখানে রোটেশনের জন্য ন্যূনতম SDK সংস্করণ Android 12 বা তার বেশি সেট করা থাকে। v3 সাইনিং ব্লকে রোটেশনের ন্যূনতম SDK সংস্করণ স্ট্রিপিং সুরক্ষা প্রদানের জন্য একটি অ্যাট্রিবিউট রয়েছে।
| APK-তে বংশতালিকা অন্তর্ভুক্ত রয়েছে | rotation-min-sdk-version এর মান | v3 স্বাক্ষর ব্লক | v3.1 স্বাক্ষর ব্লক |
|---|---|---|---|
| না | ডিফল্ট বা যেকোনো মান (নিচে x দ্বারা নির্দেশিত) | মূল স্বাক্ষরকারীর সাথে স্বাক্ষরিত, অ্যান্ড্রয়েড ৯ এবং উচ্চতর সংস্করণকে লক্ষ্য করে। | উপস্থিত নেই |
| হ্যাঁ | ডিফল্ট | মূল স্বাক্ষরকারীর সাথে স্বাক্ষরিত, অ্যান্ড্রয়েড ৯ থেকে ১২এল পর্যন্ত লক্ষ্য করে। | ঘূর্ণিত স্বাক্ষরকারী দ্বারা স্বাক্ষরিত, অ্যান্ড্রয়েড ১২ এবং উচ্চতর সংস্করণকে লক্ষ্য করে। |
| হ্যাঁ | x < ৩৩ (অ্যান্ড্রয়েড ১৩) | ঘূর্ণিত স্বাক্ষরকারী দ্বারা স্বাক্ষরিত, অ্যান্ড্রয়েড ৯ এবং উচ্চতর সংস্করণকে লক্ষ্য করে। | উপস্থিত নেই |
| হ্যাঁ | x >= ৩৩ (অ্যান্ড্রয়েড ১৩) | মূল স্বাক্ষরকারীর সাথে স্বাক্ষরিত, অ্যান্ড্রয়েড ৯ কে লক্ষ্য করে - ( x -1) | ঘূর্ণিত স্বাক্ষরকারীর সাথে স্বাক্ষরিত, x+ লক্ষ্য করে। |
ঘূর্ণন-সম্পর্কিত সমস্যা
প্ল্যাটফর্মে নিম্নলিখিত ঘূর্ণন-সম্পর্কিত সমস্যাগুলি সমাধান করা হয়েছে:
অ্যান্ড্রয়েড ১২ এর সমাধান
- প্ল্যাটফর্মটি অনুরোধকারী অ্যাপকে কেবল তখনই স্বাক্ষর করার অনুমতি দেবে, যদি উভয় অ্যাপের যেকোনো একটির বর্তমান স্বাক্ষরকারী অন্য অ্যাপটির স্বাক্ষর বংশধারায় থাকে অথবা অন্য অ্যাপটির বর্তমান স্বাক্ষরকারী হয়; এর ফলে, যদি দুটি অ্যাপ সাইনিং কী-এর সর্বোত্তম অনুশীলন অনুসরণ করে এবং পর্যায়ক্রমে ভিন্ন ভিন্ন সাইনিং কী ব্যবহার করে, তাহলে অনুরোধকারী অ্যাপকে স্বাক্ষর করার অনুমতি দেওয়া থেকে বিরত থাকা হয়।
- প্ল্যাটফর্মের APK রোলব্যাক ফিচারটি এমন কোনো APK রোলব্যাক করতে পারত না যার সাইনিং কী সবেমাত্র রোটেট করা হয়েছে, যদি না সাইনিং লিনিয়েজের পূর্ববর্তী কী-টির রোলব্যাক করার ক্ষমতা থাকত। কিন্তু এই ক্ষমতাটি রোটেশনের উদ্দেশ্যকেই ব্যর্থ করে দেয়, কারণ এটি একটি নতুন প্যাকেজ আপডেটকে পূর্ববর্তী সাইনিং কী দ্বারা সাইন করার এবং রোটেট করা কী-টিকে রোলব্যাক করার সুযোগ করে দেয়।
- শুধুমাত্র রোটেটেড কী দিয়ে সাইন করা একটি APK, যা পরবর্তীতে মূল কী এবং রোটেটেড কী উভয় দিয়ে সাইন করা একটি APK দ্বারা আপডেট করা হয়, সেটি 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-তে রোটেটেড সাইনিং কী ব্যবহার করত। যদিও v4 SigningInfo-তে সম্পূর্ণ সাইনিং লিনিয়েজ অন্তর্ভুক্ত থাকে না, এটি v3 সাইনিং ব্লক থেকে তা সংগ্রহ করতে পারে, যাতে প্ল্যাটফর্ম যেকোনো সিগনেচার কোয়েরির জন্য লিনিয়েজে অ্যাক্সেস পায়। যখন প্রদত্ত rotation-min-sdk-version-এর জন্য রোটেশন টার্গেট করতে v3.1 ব্যবহৃত হয়, তখন জেনেরিক v3 কনফিগে মূল সাইনিং কনফিগ এবং সর্বশেষ রোটেটেড সাইনিং কনফিগ উভয়ই অন্তর্ভুক্ত থাকে। v4 সিগনেচার স্কিমের একটি এক্সটেনশন তৈরি করা হয়েছে, যাতে v3.1 ব্লকের প্রতিটি সাইনিং কনফিগের জন্য অতিরিক্ত সাইনিং ইনফো ব্লক অন্তর্ভুক্ত রয়েছে।
বৈধতা
আপনার v3.1-এর বাস্তবায়ন পরীক্ষা করতে, cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ থাকা PkgInstallSignatureVerificationTest.java CTS টেস্টগুলো চালান।
টেস্টিং সম্পর্কে আরও তথ্যের জন্য, v3-এর ভেরিফিকেশন সেকশনটি দেখুন।