مخطط توقيع APK v3.0

الروبوت 9 يدعم APK دوران الرئيسي ، الذي يعطي التطبيقات القدرة على تغيير مفتاح التوقيع عليها كجزء من تحديث APK. لجعل التناوب عمليًا ، يجب أن تشير ملفات APK إلى مستويات الثقة بين مفتاح التوقيع الجديد والقديم. لدعم دوران المفتاح، قمنا بتحديث مخطط توقيع APK من V2 إلى V3 للسماح للمفاتيح الجديدة والقديمة لاستخدامها. يضيف V3 معلومات حول إصدارات SDK المدعومة وبنية إثبات التدوير إلى كتلة توقيع APK.

حظر توقيع APK

للحفاظ على التوافق مع الإصدارات السابقة مع تنسيق v1 APK ، يتم تخزين توقيعات v2 و v3 APK داخل حزمة توقيع APK ، الموجودة مباشرة قبل دليل ZIP المركزي.

وAPK V3 توقيع شكل كتلة هو نفس V2 . يتم تخزين توقيع v3 لملف APK كزوج قيم المعرف بالمعرف 0xf05368c0.

مخطط توقيع APK الإصدار 3 بلوك

تم تصميم مخطط V3 لتكون مشابهة جدا ل مخطط V2 . لها نفس الشكل العام وتدعم نفس معرفات خوارزمية التوقيع ، والأحجام الرئيسية، ومنحنيات EC.

ومع ذلك ، يضيف مخطط v3 معلومات حول إصدارات SDK المدعومة وبنية إثبات التدوير.

صيغة

يتم تخزين APK التوقيع مخطط V3 كتلة داخل APK توقيع بلوك تحت ID 0xf05368c0 .

يتبع تنسيق كتلة APK Signature Scheme v3 تنسيق الإصدار 2:

  • تسلسل مسبوقة طول-مسبوقة طول signer :
    • ، مسبوقة طول signed data :
      • تسلسل مسبوقة طول-مسبوقة طول digests :
        • signature algorithm ID (4 بايت)
        • digest (طول محدد مسبقا)
      • تسلسل مسبوقة طول X.509 certificates :
        • ، مسبوقة طول X.509 certificate (ASN.1 شكل DER)
      • minSDK (uint32) - هذا الموقع يجب أن يتم تجاهل إذا إصدار النظام الأساسي أقل من هذا الرقم.
      • maxSDK (uint32) - هذا الموقع يجب أن يتم تجاهل إذا إصدار النظام الأساسي هو أعلى من هذا الرقم.
      • تسلسل مسبوقة طول-مسبوقة طول additional attributes :
        • ID (uint32)
        • value (متغير طول: طول سمة إضافية - 4 بايت)
        • ID - 0x3ba06f8c
        • value - إثبات صحة دوران البنية
    • minSDK (uint32) - مكررة من قيمة minSDK في قسم البيانات الموقعة - تستخدم لتخطي التحقق من هذا التوقيع إذا منصة الحالية ليست في نطاق. يجب أن تتطابق مع قيمة البيانات الموقعة.
    • maxSDK (uint32) - مكررة من قيمة maxSDK في قسم البيانات الموقعة - تستخدم لتخطي التحقق من هذا التوقيع إذا منصة الحالية ليست في نطاق. يجب أن تتطابق مع قيمة البيانات الموقعة.
    • تسلسل مسبوقة طول-مسبوقة طول signatures :
      • signature algorithm ID (uint32)
      • ، مسبوقة طول signature على signed data
    • ، مسبوقة طول public key (SubjectPublicKeyInfo، ASN.1 شكل DER)

إثبات التناوب وبنى الشهادات القديمة الموثوقة ذاتيًا

تسمح بنية إثبات التدوير للتطبيقات بتدوير شهادة التوقيع الخاصة بها دون حظرها من التطبيقات الأخرى التي تتواصل معها. لتحقيق ذلك ، تحتوي توقيعات التطبيق على قطعتين جديدتين من البيانات:

  • تأكيد الجهات الخارجية على أنه يمكن الوثوق بشهادة توقيع التطبيق أينما كانت أسلافها موثوقة
  • شهادات التوقيع الأقدم للتطبيق والتي لا يزال التطبيق نفسه يثق بها

تتكون سمة إثبات التدوير في قسم البيانات الموقعة من قائمة مرتبطة بشكل فردي ، حيث تحتوي كل عقدة على شهادة توقيع مستخدمة لتوقيع الإصدارات السابقة من التطبيق. تهدف هذه السمة إلى احتواء هياكل بيانات إثبات التدوير المفاهيمي والشهادات القديمة الموثوقة ذاتيًا. يتم ترتيب القائمة حسب الإصدار مع أقدم شهادة توقيع تتوافق مع العقدة الجذرية. تم إنشاء بنية بيانات إثبات الدوران من خلال جعل الشهادة في كل عقدة علامة التالية في القائمة ، وبالتالي تزويد كل مفتاح جديد بدليل على أنه يجب أن يكون موثوقًا به مثل المفتاح (المفاتيح) الأقدم.

يتم إنشاء بنية بيانات الشهادات القديمة الموثوقة ذاتيًا عن طريق إضافة إشارات إلى كل عقدة تشير إلى عضويتها وخصائصها في المجموعة. على سبيل المثال ، قد تكون هناك علامة تشير إلى أن شهادة التوقيع في عقدة معينة موثوق بها للحصول على أذونات توقيع Android. تسمح هذه العلامة للتطبيقات الأخرى الموقعة بواسطة الشهادة القديمة بالاستمرار في منح إذن توقيع محدد بواسطة تطبيق موقّع بشهادة التوقيع الجديدة. لأن إثبات صحة دوران يقيم سمة كاملة في مقطع البيانات موقعة من V3 signer الميداني، محمي من قبل المفتاح المستخدم لتوقيع APK تحتوي على.

هذا الشكل يمنع متعددة مفاتيح توقيع والتقارب من شهادات توقيع سلف مختلفة إلى واحد (العقد انطلاق متعددة إلى بالوعة المشترك).

صيغة

يتم تخزين دوران إثبات صحة التوقيع داخل APK برنامج V3 كتلة تحت ID 0x3ba06f8c . شكله هو:

  • تسلسل مسبوقة طول-مسبوقة طول levels :
    • ، مسبوقة طول signed data (التي سيرت السابقة - إن وجدت)
      • ، مسبوقة طول X.509 certificate (ASN.1 شكل DER)
      • signature algorithm ID (uint32) - خوارزمية تستخدم من قبل سيرت في المستوى السابق
    • flags (uint32) - الأعلام تشير إلى ما إذا كان ينبغي أن يكون هذا سيرت في البنية-موتس القديمة موثوق بها النفس، والذي العمليات.
    • signature algorithm ID (uint32) - يجب أن تتطابق مع واحد من قسم البيانات الموقعة في المستوى التالي.
    • ، مسبوقة طول signature على ما سبق signed data

شهادات متعددة

يتعامل Android حاليًا مع ملف APK موقّع بشهادات متعددة باعتباره له هوية توقيع فريدة منفصلة عن الشهادات المكونة. وبالتالي ، فإن سمة إثبات التدوير في قسم البيانات الموقعة تشكل رسمًا بيانيًا لا دوريًا موجهًا ، يمكن عرضه بشكل أفضل كقائمة مرتبطة بشكل فردي ، حيث تمثل كل مجموعة من الإشارات لإصدار معين عقدة واحدة. هذا يضيف تعقيدًا إضافيًا إلى بنية إثبات التدوير (الإصدار متعدد الموقعين أدناه). على وجه الخصوص ، يصبح الطلب مصدر قلق. علاوة على ذلك ، لم يعد من الممكن توقيع ملفات APK بشكل مستقل ، لأن بنية إثبات التدوير يجب أن تحتوي على شهادات التوقيع القديمة التي توقع مجموعة الشهادات الجديدة ، بدلاً من التوقيع عليها واحدة تلو الأخرى. على سبيل المثال ، ملف APK موقع بواسطة المفتاح A الذي يرغب في التوقيع بواسطة مفتاحين جديدين B و C لا يمكن أن يتضمن الموقّع B فقط توقيعًا بواسطة A أو B ، لأن هذه هوية توقيع مختلفة عن B و C. يعني أنه يجب على الموقعين التنسيق قبل إنشاء مثل هذا الهيكل.

سمة إثبات تناوب الموقعين المتعددين

  • تسلسل مسبوقة طول-مسبوقة طول sets :
    • signed data (من قبل مجموعة سابقة - إن وجدت)
      • تسلسل مسبوقة طول certificates
        • ، مسبوقة طول X.509 certificate (ASN.1 شكل DER)
      • سلسلة من signature algorithm IDs (uint32) - واحدة لكل شهادة من المجموعة السابقة، في نفس الترتيب.
    • flags (uint32) - أعلام مشيرا إلى ما إذا كانت هذه مجموعة من موتس ينبغي أن يكون في عمرها، موتس موثوق بها النفس البنية، والذي العمليات.
    • تسلسل مسبوقة طول-مسبوقة طول signatures :
      • signature algorithm ID (uint32) - يجب أن تتطابق مع واحد من قسم البيانات الموقعة
      • ، مسبوقة طول signature على ما سبق signed data

أسلاف متعددة في هيكل إثبات الدوران

لا يتعامل نظام v3 أيضًا مع مفتاحين مختلفين يدوران إلى نفس مفتاح التوقيع لنفس التطبيق. يختلف هذا عن حالة الاستحواذ ، حيث ترغب الشركة المقتناة في نقل التطبيق المكتسب لاستخدام مفتاح التوقيع الخاص به لمشاركة الأذونات. يُنظر إلى الاستحواذ على أنه حالة استخدام مدعومة لأن التطبيق الجديد سيتم تمييزه من خلال اسم الحزمة الخاص به ويمكن أن يحتوي على هيكل إثبات التدوير الخاص به. الحالة غير المدعومة ، لنفس التطبيق والتي لها مساران مختلفان للوصول إلى نفس الشهادة ، تكسر الكثير من الافتراضات التي تم إجراؤها في تصميم تدوير المفتاح.

تحقق

في Android 9 والإصدارات الأحدث ، يمكن التحقق من ملفات APK وفقًا لنظام توقيع APK v3 أو نظام v2 أو نظام v1. تتجاهل الأنظمة الأساسية القديمة توقيعات v3 وتحاول التحقق من توقيعات v2 ، ثم v1.

عملية التحقق من توقيع APK

الشكل 1. APK عملية التحقق من صحة التوقيع

التحقق من ملف APK Signature Scheme v3

  1. حدد موقع حظر توقيع APK وتحقق مما يلي:
    1. يحتوي حقلا الحجمان في كتلة توقيع APK على نفس القيمة.
    2. ZIP Central Directory يتبعه على الفور ZIP نهاية سجل الدليل المركزي.
    3. لا يتم تتبع نهاية الدليل المركزي بتنسيق ZIP بمزيد من البيانات.
  2. حدد موقع كتلة الإصدار 3 من مخطط توقيع APK الأول داخل كتلة توقيع APK. إذا كان V3 بلوك موجود، انتقل إلى الخطوة 3. وإلا، يرتد إلى التحقق من APK باستخدام مخطط V2 .
  3. لكل signer في APK التوقيع V3 برنامج بلوك مع دقيقة والإصدار SDK أقصى ما في نطاق النظام الأساسي الحالي:
    1. اختيار أقوى دعم signature algorithm ID من signatures . يعود ترتيب القوة إلى كل إصدار من إصدارات التطبيق / النظام الأساسي.
    2. التحقق من المطابقة signature من signatures ضد signed data باستخدام public key . (وهو الآن آمن لتحليل signed data .)
    3. تحقق من الإصدارات دقيقة وSDK ماكس في البيانات الموقعة تتطابق مع تلك المحددة لل signer .
    4. تحقق من أن قائمة مرتبة من معرفات خوارزمية التوقيع في digests و signatures متطابقة. (هذا لمنع تجريد / إضافة التوقيع.)
    5. حساب هضم محتويات APK باستخدام نفس هضم خوارزمية باسم هضم الخوارزمية المستخدمة من قبل خوارزمية التوقيع.
    6. تحقق من أن هضم حسابها غير مطابقة للالمقابلة digest من digests .
    7. تحقق من أن SubjectPublicKeyInfo أول certificate من certificates غير مطابقة لل public key .
    8. في حالة وجود سمة إثبات صحة دوران لل signer التحقق من أن البنية صالحة وهذا signer هو شهادة مشاركة في القائمة.
  4. نجح التحقق إذا واحد بالضبط signer وعثر في مجموعة من النظام الأساسي الحالي والخطوة 3 نجحت لهذا signer .

تصديق

إلى الاختبار الذي يدعم جهازك V3 بشكل صحيح، قم بتشغيل PkgInstallSignatureVerificationTest.java اختبارات CTS في cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .