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

نمای کلی

اندروید 13 از طرح امضای APK نسخه 3.1 پشتیبانی می کند، که بهبودی در طرح امضای APK موجود نسخه 3 است. طرح v3.1 برخی از مشکلات شناخته شده APK Signature Scheme v3 در مورد چرخش را بررسی می کند. به طور خاص، طرح امضای v3.1 از هدف‌گیری نسخه SDK پشتیبانی می‌کند، که به چرخش اجازه می‌دهد تا نسخه بعدی پلتفرم را هدف قرار دهد.

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

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

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

بلوک امضا نسخه 3.1

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

به‌طور پیش‌فرض، کتابخانه apksig از بلوک امضای v3.1 استفاده می‌کند، هر زمان که یک کلید چرخشی و دودمان در پیکربندی امضا ارائه شود. اگر minSdkVersion یک برنامه کمتر از Android 13 باشد و از یک کلید چرخشی استفاده شود، کلید امضای اصلی نیز باید مشخص شود تا بتوان از آن برای امضای APK در بلوک امضای v3 استفاده کرد. اگر APK نسخه‌ای زودتر از Android 9 را هدف قرار دهد، این شبیه رفتار فعلی است که امضاکننده اصلی لازم است.

برای پشتیبانی از چرخش کلید هدفمند که از یک نسخه SDK خاص شروع می شود، کتابخانه apksig API های جدیدی را نشان می دهد که اجازه می دهد حداقل نسخه SDK را برای چرخش تنظیم کنید اگر نسخه SDK کمتر از Android 13 به عنوان حداقل نسخه برای پشتیبانی از چرخش مشخص شده باشد، نسخه اصلی نسخه 3 مشخص شده است. بلوک استفاده خواهد شد. بلوک امضای نسخه 3.1 فقط در صورت وجود چرخش استفاده می‌شود که حداقل نسخه SDK برای چرخش روی Android 13 و بالاتر تنظیم شده است. بلوک امضای v3 دارای یک ویژگی جدید برای محافظت از حذف حداقل نسخه SDK با چرخش است.

APK شامل Lineage است مقدار rotation-min-sdk-version بلوک امضای v3 بلوک امضا نسخه 3.1
خیر پیش فرض یا هر مقداری (که با x در زیر نشان داده شده است) امضا شده با امضاکننده اصلی، اندروید 9 و بالاتر حاضر نیست
بله پیش فرض امضا شده با امضا کننده اصلی، اندروید 9 تا 12L را هدف قرار می دهد امضا شده با امضاکننده چرخشی که Android 13 و بالاتر را هدف قرار می‌دهد
بله x < 33 (اندروید 13) امضا شده با امضاکننده چرخشی، اندروید 9 و بالاتر را هدف قرار می‌دهد حاضر نیست
بله x >= 33 (اندروید 13) امضا شده با امضاکننده اصلی، با هدف قرار دادن Android 9 - ( x -1) امضا شده با امضا کننده چرخانده، x+ را هدف قرار می دهد

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

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

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

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

اصلاحات اندروید 11

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

ادغام v4

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

اعتبار سنجی

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

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