אם ראית שגיאת "אימות נכשל" בעת טעינת עדכון לאפליקציות Google Camera או Recorder, קרא את זה כדי לגלות מדוע.
כשגוגל השיקה את ה-Pixel 5 באוקטובר, התרגשנו לשים את ידינו על האפליקציות החדשות שלה. (הטלפון עצמו די מגניבגם.) עם השקת ה-Pixel 5 הגיעו גרסאות חדשות של מצלמת גוגל ו מקליט גוגל אפליקציות ששיתפנו עם הקהילה. עם זאת, כאשר משתמשים רבים של מכשירי Pixel ישנים יותר ניסו להעמיס בצד את העדכונים, הם נתקלו בשגיאה (המוצגת למעלה). באופן מוזר, לא לכולם היו בעיות בהתקנת העדכונים. חלקם הצליחו להתקין אותם בסדר גמור, בעוד שאחרים נאלצו לאפס את היצרן רק כדי שיוכלו להתקין את הגרסאות החדשות. בגלל האופי האקראי לכאורה של הנושא הזה, רבים גירשו את זה לבאג. אנחנו די בטוחים כעת שהבעיה הזו לא נובעת מבאג אלא מהשימוש של גוגל ב-API חדש באנדרואיד 11 כדי לחסום עדכוני טעינת צד.
אם תנסה להטעין בצד את Google Camera 8.0 ואילך או Google Recorder 2.0 ואילך במכשיר Pixel עם אנדרואיד 11, תראה הודעת שגיאה שאומרת שהאימות לא הצליח. גם אם תנסה להעמיס בצד את ה-APK באמצעות פקודת מעטפת, לא תקבל סיבה ספציפית יותר לכישלון ההתקנה. קוד החזרת ההתקנה שיינתן לך הוא "
INSTALL_FAILED_VERIFICATION_FAILURE", שלמרבה הצער לא אומר לך מדוע האימות לא מצליח. על ידי בחינת ה-logcat, נוכל ללמוד בדיוק מדוע האימות נכשל:AppIntegrityManagerServiceImpl: Integritycheckofcom.google.android.GoogleCameraresult: DENYdueto[Rule: (PACKAGE_NAME EQ com.google.android.GoogleCamera) AND (VERSION_CODE GTE 32045130) AND (APP_CERTIFICATE EQ F0FD6C5B410F25CB25C3B53346C8972FAE30F8EE7411DF910480AD6B2D60DB83) AND NOT (INSTALLER_NAME EQ com.android.vending), DENY]
לפי הודעה זו, בדיקת תקינות של התקנת מצלמת Google נכשלה מכיוון שה-"INSTALLER_NAME" לא תאם ל-"com.android.vending", שם החבילה של חנות Google Play. (ניסיתי להתקין את Google Camera 8.0 באמצעות אפליקציית APKMirror Installer, עבור מה שהיא שווה.) הודעה זו נוספה ליומן המערכת על ידי "AppIntegrityManagerServiceImpl", שהוא חלק מתכונת "שלמות האפליקציה" החדשה של אנדרואיד. על פי הקוד ב-AOSP, App Integrity נועד לספק שכבה נוספת של בדיקות על גבי אימות חתימת ה-APK הקיים של מנהל החבילות. נראה כי ממשק ה-API של App Integrity משתמש בסט של כללים כדי להחליט אם לאפשר או לדחות את ההתקנה. הכללים מסופקים על ידי אפליקציית מערכת - שאנו מאמינים שהיא שירותי Google Play - והם מאוחסן בקובץ.
בנוסף, App Integrity גם שיחות כיתה אחרת התקשרה SourceStampVerifier אם "חותמת מקור" מוטמעת במטא נתונים של המניפסט. לדוגמה, הנה מה שאנו מאמינים שהוא "חותמת המקור" מהמניפסט של אפליקציית מצלמת Google:
<meta-dataandroid: name="com.android.stamp.source"android: value="https://play.google.com/store"/>
ממה שאנו יכולים לדעת, חותמת המקור משמשת לאימות החתימה של מתקין החבילה. כך, למשל, אתה לא יכול להערים על AppIntegrity לאפשר את ההתקנה גם אם אתה זיוף את חנות Play בתור המתקין.
מעבר לכך, לא הצלחנו לגלות בדיוק כיצד גוגל משתמשת ב-AppIntegrity ובממשקי API קשורים כדי לחסום עדכוני טעינת צד לאפליקציות Google Camera ו-Google Recorder. בדיקה מהירה של ה-APK של שירותי Google Play מגלה שהוא משתמש בממשקי ה-API האלה, אבל הקוד מעורפל מכדי להבין באמת הכל. אפילו מצאנו את הספרייה שבה מאוחסנים כללי היושרה - /data/system/integrity_rules - אבל זה לא היה מועיל מכיוון שהוא מכיל רק נתונים בסידרה. גם לא מצאנו דרך להשבית אימות שלמות (נראה שזה לא קל כמו סתם שינוי הגדרה), אם כי אנו מאמינים שהסיבה לכך שאיפוס היצרן עובד עבור חלקם היא ששירותי Google Play לא מקבלת הזדמנות לאתחל את ערכת הכללים שלו כדי לחסום את ההתקנה. הודעת ה-logcat וההקדמה של ממשקי ה-API החדשים האלה באנדרואיד 11 מרמזים מאוד שהכל בעיצובו ולא באג.
גוגל לא הגיבה בפומבי על השימוש שלה בממשקי ה-API האלה (וגם אנחנו לא מצפים מהם), והם לא הגיבו כשהגיעו לתגובה. עם זאת, יש לנו כמה תיאוריות מדוע הם חוסמים עדכונים נטענים בצד. ראשית, ייתכן שהם מגנים על אנשים מפני התקנת הגרסה הלא נכונה של האפליקציה עבור המכשיר שלהם. גוגל מספקת גרסאות ספציפיות של האפליקציות שלה למכשירי Pixel ספציפיים. לדוגמה, ניתן למצוא מספר גרסאות של אפליקציית שירותי התאמה אישית של מכשירים באינטרנט. למרות שכולם ניתנים להתקנה במכשירי Pixel, זה היה אפשרי בשלב מסוים לאבד את תכונת הכתוביות החיות ב-Pixel 4 על ידי הורדת גרסה שנבנתה למכשיר Pixel ישן יותר. סיבה נוספת יכולה להיות "שיפור העקיבות של אפליקציות ביחס להפצה לא מורשית", כפי שהוסברה על ידי גוגל במחלקה SourceStampVerifier.
עד כה, רק כמה מהאפליקציות של גוגל המשתמשות בפורמט App Bundle (כמו מצלמת Google ו-Google Recorder) חסימת התקנות שאינן בחנות Play, אך איננו יודעים אם החברה תרחיב התנהגות זו לאפליקציות אחרות שלה ברגע שכולם עוברים לפורמט AAB. שקלנו גם אם המעבר ל-App Bundles מחייב הטמעת App Integrity, אבל גילינו ש-Google כבר יש פתרון לטפל כאשר משתמשים מנסים להתקין אפליקציה שאין בה את כל הפיצולים הנדרשים. לא משנה מה המקרה, אנחנו לא חושבים שגוגל מתכוונת לחסום כל טעינת צד של האפליקציות שלה, אם כי הכלים האלה בהחלט מאפשרים להם לעשות זאת.
תודה למפתחים vvb2060, aviraxp ו-Quinny899 על הסיוע שלהם במאמר זה, ו-תודה ל-PNF Software על שסיפקה לנו רישיון שימוש Decompiler של JEB, כלי הנדסה לאחור ברמה מקצועית עבור יישומי אנדרואיד.