Esquema de firma APK v3.1

Descripción general

Android 13 es compatible con APK Signature Scheme v3.1, una mejora con respecto al APK Signature Scheme v3 existente. El esquema v3.1 aborda algunos de los problemas conocidos con el esquema de firma APK v3 con respecto a la rotación. En particular, el esquema de firma v3.1 admite la segmentación por versión del SDK, lo que permite la rotación para apuntar a una versión posterior de la plataforma.

El esquema de firma v3.1 utiliza una ID de bloque que no se reconoce en Android 12 o versiones anteriores. Por lo tanto, la plataforma aplica el siguiente comportamiento del firmante:

  • Los dispositivos que ejecutan Android 13 o superior utilizan el firmante rotado en el bloque v3.1.
  • Los dispositivos que ejecutan versiones anteriores de Android ignoran el firmante rotado y en su lugar utilizan el firmante original en el bloque v3.

Las aplicaciones que aún no han rotado su clave de firma no requieren ninguna acción adicional. Siempre que estas aplicaciones eligen rotar, el sistema aplica el esquema de firma v3.1 de forma predeterminada.

bloque de firma v3.1

El bloque de firma v3.1 tendrá el mismo contenido que el bloque de firma v3, pero con el nuevo ID de bloque estas firmas solo se reconocerán en dispositivos con Android 13 y versiones posteriores. Esto permite que las aplicaciones roten de forma segura sus claves de firma sin necesidad de preocuparse por los APK de múltiples objetivos, ya que el firmante original se puede usar para firmar el APK en el bloque de firma v3 y el firmante rotado en el bloque de firma v3.1. Esto también permite que la plataforma reutilice todos los códigos de verificación existentes para el bloque de firma v3 al verificar una firma v3.1.

De forma predeterminada, la biblioteca apksig utilizará el bloque de firma v3.1 siempre que se proporcione una clave rotada y un linaje en la configuración de firma. Si minSdkVersion de una aplicación es inferior a Android 13 y se utiliza una clave rotada, también se debe especificar la clave de firma original para que pueda usarse para firmar el APK en el bloque de firma v3. Esto es similar al comportamiento actual en el que se requiere el firmante original si el APK apunta a una versión anterior a Android 9.

Para admitir la rotación de claves de orientación a partir de una versión de SDK particular, la biblioteca apksig expondrá nuevas API que permitirán establecer una versión mínima de SDK para la rotación. Si se especifica una versión de SDK inferior a Android 13 como la versión mínima para soporte de rotación, entonces la v3 original Se utilizará el bloque. El bloque de firma v3.1 solo se usa en presencia de rotación donde la versión mínima del SDK para la rotación está configurada en Android 13 y versiones posteriores. El bloque de firma v3 tendrá un nuevo atributo para la protección de eliminación de la versión mínima del SDK de rotación.

APK Incluye Linaje Valor de rotación-min-sdk-version bloque de firma v3 bloque de firma v3.1
No Valor predeterminado o cualquier valor (representado por x a continuación) Firmado con el firmante original, orientado a Android 9 y posterior No presente
Por defecto Firmado con el firmante original, orientado a Android 9 a 12L Firmado con firmante rotado, orientado a Android 13 y versiones posteriores
x < 33 (Androide 13) Firmado con firmante rotado, orientado a Android 9 y versiones posteriores No presente
x >= 33 (Androide 13) Firmado con el firmante original, orientado a Android 9 - ( x -1) Firmado con firmante rotado, orientado a x+

Problemas relacionados con la rotación

Se han solucionado los siguientes problemas relacionados con la rotación en la plataforma:

Correcciones de Android 12

  • La plataforma solo otorgaría un permiso de firma a una aplicación solicitante si el firmante actual de cualquiera de las aplicaciones está en el linaje de firmas o es el firmante actual de la otra aplicación; esto evita otorgar un permiso de firma a una aplicación solicitante si las dos aplicaciones siguen las mejores prácticas de claves de firma y rotan a claves de firma diferentes.
  • La función de reversión de APK de la plataforma no podía revertir un APK al que se le acababa de rotar su clave de firma a menos que la clave anterior en el linaje de firma tuviera la capacidad de revertir, pero esta capacidad anula el propósito de la rotación, ya que permite que una nueva actualización de paquete sea firmada por el clave de firma anterior y revertir la clave rotada.
  • Un APK firmado solo con la clave rotada y luego actualizado con un APK firmado con la clave original y la clave rotada en el linaje solo mostrará la clave rotada en el linaje en dispositivos con Android 11 y versiones anteriores.

Correcciones de Android 11

  • PackageManager#checkSignatures no se actualizó correctamente para verificar las claves de firma originales de dos paquetes. Esto rompió la instrumentación de aplicaciones que usaban una clave de firma rotada con el APK de instrumentación usando la clave de firma original.
  • Los paquetes bajo un sharedUserId comparten su linaje de firma. Siempre que se instala o actualiza una aplicación con un linaje de firma actualizado en un sharedUiserId , el linaje de esa aplicación reemplazó el linaje compartido de sharedUserId (es decir, si el linaje de firma de una aplicación fuera A -> B y una aplicación se actualiza en sharedUserId ). con el linaje B -> C, entonces el linaje sharedUserId se reemplazaría con B -> C). De manera similar, las capacidades de un firmante anterior en el linaje no se podrían actualizar a menos que se cambiara el linaje de firma.

integración v4

El esquema de firma v4 utiliza la configuración de firma proporcionada a apksigner; en el caso de varias configuraciones de firma proporcionadas para la rotación, se utiliza la última configuración de firma rotada. Antes de la introducción de v3.1, v3 solo incluía esta última configuración de firma rotada, por lo que v4 podía usar esta configuración tal cual; con esto, el esquema de firma v4 pudo admitir la rotación ya que usó la clave de firma rotada en su SigningInfo. Si bien SigningInfo v4 no incluye el linaje de firma completo, puede extraerlo del bloque de firma v3 para permitir que la plataforma acceda al linaje para cualquier consulta de firma. Cuando se utiliza la versión 3.1 para apuntar a la rotación para la versión de SDK mínima de rotación proporcionada, la configuración genérica v3 incluirá tanto la configuración de firma original como la configuración de firma rotada más reciente. Se ha creado una extensión del esquema de firma v4 que incluye bloques de información de firma adicionales para cada una de las configuraciones de firma del bloque v3.1.

Validación

Para probar su implementación de v3.1, ejecute las pruebas CTS PkgInstallSignatureVerificationTest.java en cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .

Para obtener más información sobre las pruebas, consulte la sección de verificación en v3.