סכימת חתימות APK v3.1

סקירה כללית

אנדרואיד 13 תומך ב-APK Signature Scheme v3.1, שיפור ב- APK Signature Scheme v3 הקיים. סכימת v3.1 מטפלת בכמה מהבעיות הידועות עם APK Signature Scheme v3 בנוגע לרוטציה. בפרט, סכימת החתימה v3.1 תומכת במיקוד לגרסת SDK, המאפשרת סיבוב כדי למקד לגרסה מאוחרת יותר של הפלטפורמה.

סכימת החתימה v3.1 משתמשת במזהה חסימה שאינו מזוהה ב-Android 12 ומטה. לכן, הפלטפורמה מיישמת את התנהגות החותם הבאה:

  • מכשירים המריצים אנדרואיד 13 ומעלה משתמשים בחותם המסובב בבלוק v3.1.
  • מכשירים שמריצים גרסאות ישנות יותר של אנדרואיד מתעלמים מהחותם המסובב ובמקום זאת משתמשים בחותם המקורי בבלוק v3.

אפליקציות שעדיין לא סובבו את מפתח החתימה שלהן אינן דורשות כל פעולה נוספת. בכל פעם שאפליקציות אלה בוחרות להסתובב, המערכת מיישמת את ערכת החתימה v3.1 כברירת מחדל.

בלוק חתימה v3.1

לחסום החתימה v3.1 יהיה אותו תוכן כמו בלוק החתימה v3, אך עם מזהה הבלוק החדש החתימות הללו יזהו רק במכשירים שבהם פועל אנדרואיד 13 ואילך. זה מאפשר לאפליקציות לסובב בבטחה את מפתחות החתימה שלהן מבלי לדאוג לגבי חבילות APK מרובות יעדים, מכיוון שניתן להשתמש בחותם המקורי כדי לחתום על ה-APK בגוש החתימה v3 והחותם המסובב בבלוק החתימה v3.1. זה גם מאפשר לפלטפורמה לעשות שימוש חוזר בכל קודי האימות הקיימים עבור בלוק החתימה v3 בעת אימות חתימת v3.1.

כברירת מחדל, ספריית apksig תשתמש בבלוק החתימה v3.1 בכל פעם שמפתח מסובבים ושושלת מסופקים בתצורת החתימה. אם minSdkVersion של אפליקציה קטנה מאנדרואיד 13 ונעשה שימוש במפתח מסובב, יש לציין גם את מפתח החתימה המקורי כדי שניתן יהיה להשתמש בו כדי לחתום על ה-APK בבלוק החתימה v3. זה דומה להתנהגות הנוכחית שבה נדרש החותם המקורי אם ה-APK מכוון לגרסה קודמת מאנדרואיד 9.

כדי לתמוך במיקוד סיבוב מפתחות החל מגרסת SDK מסוימת, ספריית apksig תחשוף ממשקי API חדשים שיאפשרו הגדרת גירסת SDK מינימלית לסיבוב אם גירסת SDK פחות מ-Android 13 צוינה כגרסת המינימום לתמיכה בסיבוב, אז ה-v3 המקורי בלוק ישמש. בלוק החתימה v3.1 משמש רק בנוכחות סיבוב כאשר גרסת ה-SDK המינימלית לסיבוב מוגדרת לאנדרואיד 13 ואילך. לחסום החתימה v3 תהיה תכונה חדשה להגנה על הסרת גרסת SDK לסיבוב מינימלי.

APK כולל שושלת ערך של rotation-min-sdk-version בלוק חתימה v3 בלוק חתימה v3.1
לא ברירת מחדל או כל ערך (מיוצג על ידי x למטה) חתום עם חותם מקורי, מכוון לאנדרואיד 9 ואילך אינו נוכח
כן בְּרִירַת מֶחדָל חתום עם חותם מקורי, מכוון לאנדרואיד 9 עד 12L חתום עם חותם מסובב, מכוון לאנדרואיד 13 ואילך
כן x < 33 (אנדרואיד 13) חתום עם חותם מסובב, מכוון לאנדרואיד 9 ואילך אינו נוכח
כן x >= 33 (אנדרואיד 13) חתום עם חותם מקורי, מכוון ל-Android 9 - ( x -1) חתום עם חותם מסובב, מכוון ל- x+

בעיות הקשורות לרוטציה

הבעיות הבאות הקשורות לסיבוב נפתרו בפלטפורמה:

תיקוני אנדרואיד 12

  • הפלטפורמה תעניק הרשאת חתימה לאפליקציה מבקשת רק אם החותם הנוכחי של אחת מהאפליקציות נמצא בשושלת החתימה, או שהוא החותם הנוכחי של האפליקציה השנייה; זה מונע הענקת הרשאת חתימה לאפליקציה מבקשת אם שתי האפליקציות עוקבות אחר שיטות העבודה המומלצות של מפתח חתימה ומסתובבות למפתחות חתימה שונים.
  • תכונת החזרת ה-APK לאחור של הפלטפורמה לא יכלה להחזיר לאחור APK שמפתח החתימה שלו הסתובב רק אם למפתח הקודם בשושלת החתימה הייתה יכולת החזרה לאחור, אך יכולת זו מביס את מטרת הסיבוב מכיוון שהיא מאפשרת חתימה של עדכון חבילה חדש על ידי מפתח חתימה קודמת וגלגל אחורה את המפתח המסובב.
  • APK שנחתם רק עם המפתח המסובב ומעודכן מאוחר יותר עם APK חתום עם המפתח המקורי והמפתח המסובב בשושלת יציג רק את המפתח המסובב בשושלת במכשירים עם אנדרואיד 11 ואילך.

תיקוני אנדרואיד 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 כדי לאפשר לפלטפורמה גישה לשושלת עבור כל שאילתות חתימה. כאשר v3.1 נמצא בשימוש כדי למקד סיבוב עבור גרסת rotation-min-sdk-הנתונה, תצורת v3 הגנרית תכלול גם את תצורת החתימה המקורית וגם את תצורת החתימה האחרונה שסובבה. נוצרה הרחבה של סכימת החתימה v4 הכוללת בלוקים נוספים של מידע חתימה עבור כל אחת מתצורות החתימה מבלוק v3.1.

מַתַן תוֹקֵף

כדי לבדוק את היישום שלך של v3.1, הפעל את בדיקות PkgInstallSignatureVerificationTest.java CTS ב- cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .

למידע נוסף על בדיקות, עיין בסעיף האימות בגרסה 3.