طرح امضای APK نسخه 3.1

اندروید ۱۳ از طرح امضای APK نسخه ۳.۱ پشتیبانی می‌کند که نسبت به طرح امضای APK نسخه ۳ موجود، بهبود یافته است. طرح امضای نسخه ۳.۱ برخی از مشکلات شناخته‌شده طرح امضای APK نسخه ۳ در مورد چرخش را برطرف می‌کند. به‌طور خاص، طرح امضای نسخه ۳.۱ از هدف‌گیری نسخه SDK پشتیبانی می‌کند که به چرخش اجازه می‌دهد تا نسخه‌های بعدی پلتفرم را هدف قرار دهد.

طرح امضای نسخه ۳.۱ از یک شناسه بلوک استفاده می‌کند که در اندروید ۱۲ یا پایین‌تر شناخته نمی‌شود. بنابراین، این پلتفرم رفتار امضاکننده زیر را اعمال می‌کند:

  • دستگاه‌هایی که اندروید ۱۳ یا بالاتر را اجرا می‌کنند، از امضاکننده‌ی چرخشی در بلوک نسخه ۳.۱ استفاده می‌کنند.
  • دستگاه‌هایی که نسخه‌های قدیمی‌تر اندروید را اجرا می‌کنند، امضای چرخشی را نادیده می‌گیرند و در عوض از امضای اصلی در بلوک v3 استفاده می‌کنند.

برنامه‌هایی که هنوز کلید امضای خود را تغییر نداده‌اند، نیازی به هیچ اقدام اضافی ندارند. هر زمان که این برنامه‌ها تغییر را انتخاب کنند، سیستم به طور پیش‌فرض طرح امضای نسخه ۳.۱ را اعمال می‌کند.

بلوک امضای نسخه ۳.۱

بلوک امضای نسخه ۳.۱ همان محتوای بلوک امضای نسخه ۳ را دارد، اما با شناسه بلوک جدید، این امضاها فقط در دستگاه‌هایی که اندروید ۱۳ و بالاتر دارند، شناخته می‌شوند. این امر به برنامه‌ها اجازه می‌دهد تا کلیدهای امضای خود را با خیال راحت بچرخانند بدون اینکه نیازی به نگرانی در مورد APKهای چند هدفه داشته باشند، زیرا می‌توان از امضاکننده اصلی برای امضای APK در بلوک امضای نسخه ۳ و از امضاکننده چرخانده شده در بلوک امضای نسخه ۳.۱ استفاده کرد. این امر همچنین به پلتفرم اجازه می‌دهد تا هنگام تأیید امضای نسخه ۳.۱، از تمام کدهای تأیید موجود برای بلوک امضای نسخه ۳ دوباره استفاده کند.

به طور پیش‌فرض، کتابخانه apksig هر زمان که یک کلید و دودمان چرخشی در پیکربندی امضا ارائه شود، از بلوک امضای نسخه ۳.۱ استفاده می‌کند. اگر minSdkVersion برنامه کمتر از اندروید ۱۲ باشد و از یک کلید چرخشی استفاده شود، کلید امضای اصلی نیز باید مشخص شود تا بتوان از آن برای امضای APK در بلوک امضای نسخه ۳ استفاده کرد. این مشابه رفتار فعلی است که در آن اگر APK نسخه‌ای قبل از اندروید ۹ را هدف قرار دهد، امضاکننده اصلی مورد نیاز است.

برای پشتیبانی از چرخش کلید هدف‌گیری شده با شروع از یک نسخه SDK خاص، کتابخانه apksig رابط‌های برنامه‌نویسی کاربردی (API) جدیدی را ارائه می‌دهد که امکان تنظیم حداقل نسخه SDK برای چرخش را فراهم می‌کند. اگر نسخه SDK کمتر از اندروید ۱۲ به عنوان حداقل نسخه برای پشتیبانی از چرخش مشخص شود، از بلوک اصلی v3 استفاده می‌شود. بلوک امضای v3.1 فقط در صورت وجود چرخش استفاده می‌شود که در آن حداقل نسخه SDK برای چرخش روی اندروید ۱۲ و بالاتر تنظیم شده باشد. بلوک امضای v3 دارای ویژگی‌ای برای محافظت در برابر حذف حداقل نسخه SDK چرخش است.

APK شامل دودمان است مقدار rotation-min-sdk-version بلوک امضای v3 بلوک امضای نسخه ۳.۱
خیر پیش‌فرض یا هر مقداری (در زیر با x نشان داده شده است) با امضاکننده اصلی امضا شده است، اندروید ۹ و بالاتر را هدف قرار می‌دهد موجود نیست
بله پیش‌فرض با امضاکننده اصلی امضا شده است، اندروید ۹ تا ۱۲L را هدف قرار می‌دهد با امضای چرخشی امضا شده است، اندروید ۱۲ و بالاتر را هدف قرار می‌دهد
بله x < 33 (اندروید ۱۳) با امضای چرخشی امضا شده است، اندروید ۹ و بالاتر را هدف قرار می‌دهد موجود نیست
بله x >= 33 (اندروید ۱۳) با امضاکننده اصلی امضا شده، با هدف اندروید ۹ - ( x -1) با امضاکننده‌ی چرخشی امضا شده، با هدف x+

مسائل مربوط به چرخش

مشکلات مربوط به چرخش زیر در پلتفرم برطرف شده است:

رفع مشکلات اندروید ۱۲

  • این پلتفرم تنها در صورتی به برنامه‌ی درخواست‌کننده اجازه‌ی امضا می‌دهد که امضاکننده‌ی فعلی هر یک از برنامه‌ها در سلسله‌ی امضاکننده‌ها باشد، یا امضاکننده‌ی فعلی برنامه‌ی دیگر باشد؛ این امر مانع از اعطای اجازه‌ی امضا به برنامه‌ی درخواست‌کننده می‌شود اگر دو برنامه از بهترین شیوه‌های کلید امضا پیروی کنند و به کلیدهای امضای متفاوتی روی آورند.
  • قابلیت بازگرداندن APK این پلتفرم نمی‌توانست APKای را که کلید امضایش به تازگی تغییر یافته بود، به حالت اولیه برگرداند، مگر اینکه کلید قبلی در دودمان امضا قابلیت بازگشت به حالت اولیه را داشته باشد، اما این قابلیت هدف چرخش را نقض می‌کند زیرا اجازه می‌دهد به‌روزرسانی بسته جدید توسط کلید امضای قبلی امضا شود و کلید تغییر یافته به حالت اولیه برگردد.
  • یک APK که فقط با کلید چرخانده شده امضا شده و بعداً با یک APK امضا شده با کلید اصلی و کلید چرخانده شده در دودمان به‌روزرسانی شده است، در دستگاه‌هایی که اندروید ۱۱ و قبل از آن را اجرا می‌کنند، فقط کلید چرخانده شده را در دودمان نشان می‌دهد.

رفع مشکلات اندروید ۱۱

  • PackageManager#checkSignatures به درستی به‌روزرسانی نشده بود تا کلیدهای امضای اصلی دو بسته را بررسی کند. این امر باعث اختلال در ابزار دقیق برای برنامه‌هایی شد که از کلید امضای چرخشی استفاده می‌کردند، در حالی که APK ابزار دقیق از کلید امضای اصلی استفاده می‌کرد.
  • بسته‌های تحت یک sharedUserId دودمان امضای خود را به اشتراک می‌گذارند. هر زمان که برنامه‌ای با دودمان امضای به‌روز شده در یک sharedUiserId نصب یا به‌روزرسانی شود، دودمان آن برنامه جایگزین دودمان مشترک برای sharedUserId می‌شود (یعنی اگر دودمان امضای یک برنامه A -> B باشد و یک برنامه در sharedUserId با دودمان B -> C به‌روزرسانی شود، دودمان sharedUserId با B -> C جایگزین می‌شود). به طور مشابه، قابلیت‌های یک امضاکننده قبلی در دودمان نمی‌تواند به‌روزرسانی شود، مگر اینکه دودمان امضا تغییر کند.

ادغام نسخه ۴

طرح امضای v4 از پیکربندی امضای ارائه شده به apksigner استفاده می‌کند؛ در صورت وجود چندین پیکربندی امضای ارائه شده برای چرخش، از آخرین پیکربندی امضای چرخش یافته استفاده می‌شود. قبل از معرفی نسخه ۳.۱، نسخه ۳ فقط شامل این آخرین پیکربندی امضای چرخش یافته بود، بنابراین نسخه ۴ می‌توانست از این پیکربندی به همان صورت استفاده کند. با این کار، طرح امضای v4 قادر به پشتیبانی از چرخش بود زیرا از کلید امضای چرخش یافته در SigningInfo خود استفاده می‌کرد. در حالی که SigningInfo نسخه ۴ شامل دودمان امضای کامل نیست، می‌تواند این را از بلوک امضای v3 استخراج کند تا به پلتفرم اجازه دسترسی به دودمان برای هرگونه درخواست امضا را بدهد. هنگامی که نسخه ۳.۱ برای چرخش هدف برای نسخه rotation-min-sdk ارائه شده استفاده می‌شود، پیکربندی عمومی v3 شامل پیکربندی امضای اصلی و همچنین آخرین پیکربندی امضای چرخش یافته است. افزونه‌ای از طرح امضای v4 ایجاد شده است که شامل بلوک‌های اطلاعات امضای اضافی برای هر یک از پیکربندی‌های امضای از بلوک v3.1 است.

اعتبارسنجی

برای آزمایش پیاده‌سازی نسخه ۳.۱، تست‌های CTS مربوط به PkgInstallSignatureVerificationTest.java را در cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ اجرا کنید.

برای اطلاعات بیشتر در مورد آزمایش، به بخش تأیید در نسخه ۳ مراجعه کنید.