Esquema de assinatura de APK v3.1

O Android 13 oferece suporte ao esquema de assinatura de APK v3.1, uma melhoria em relação ao esquema de assinatura de APK v3. O esquema v3.1 trata de alguns dos problemas conhecidos do esquema de assinatura de APK v3 com relação à alternância. Em especial, o esquema de assinatura v3.1 oferece suporte ao direcionamento de versão do SDK, o que permite que a alternância seja destinada a uma versão mais recente da plataforma.

O esquema de assinatura v3.1 usa um ID de bloco que não é reconhecido no Android 12 ou versões anteriores. Portanto, a plataforma aplica o seguinte comportamento de signatário:

  • Dispositivos com o Android 13 ou versões mais recentes usam o signatário alternado no bloco v3.1.
  • Dispositivos com versões mais antigas do Android ignoram o signatário alternado e, em vez disso, usam o signatário original no bloco v3.

Em apps que ainda não alternaram a chave de assinatura, nenhuma outra ação é necessária. Quando esses apps optarem por alternar, o sistema vai aplicar o novo esquema de assinatura v3.1 por padrão.

Bloco de assinatura v3.1

O bloco de assinatura v3.1 tem o mesmo conteúdo do bloco v3, mas com o novo ID de bloco, essas assinaturas são reconhecidas apenas em dispositivos com o Android 13 e versões mais recentes. Isso permite que os apps façam a rotação segura das chaves de assinatura sem se preocupar com APKs de vários destinos, já que o signatário original pode ser usado para assinar o APK no bloco de assinatura v3 e o signatário rotacionado no bloco de assinatura v3.1. Isso também permite que a plataforma reutilize todos os códigos de verificação atuais para o bloco de assinatura v3 ao verificar uma assinatura v3.1.

Por padrão, a biblioteca apksig usa o bloco de assinatura v3.1 sempre que uma chave alternada e uma linhagem são fornecidas na configuração de assinatura. Se o minSdkVersion de um app for menor que o Android 12 e uma chave alternada estiver sendo usada, a chave de assinatura original também precisará ser especificada para que possa ser usada para assinar o APK no bloco de assinatura v3. Isso é semelhante ao comportamento atual, em que o signatário original é necessário se o APK for destinado a uma versão anterior ao Android 9.

Para oferecer suporte à rotação de chaves de segmentação a partir de uma versão específica do SDK, a biblioteca apksig expõe novas APIs que permitem definir uma versão mínima do SDK para rotação. Se uma versão do SDK anterior ao Android 12 for especificada como a versão mínima para suporte à rotação, o bloco v3 original será usado. O bloco de assinatura v3.1 só é usado na presença de rotação quando a versão mínima do SDK para rotação é definida como Android 12 e versões mais recentes. O bloco de assinatura v3 tem um atributo para proteção contra remoção da versão mínima do SDK de rotação.

O APK inclui linhagem Valor de rotation-min-sdk-version Bloco de assinatura v3 Bloco de assinatura v3.1
Não Padrão ou qualquer valor (representado por x abaixo) Assinado com o signatário original, segmentando o Android 9 e versões mais recentes Ausente
Sim Padrão Assinado com o signatário original, destinado ao Android 9 a 12L Assinado com um signatário alternado, direcionado ao Android 12 e versões mais recentes
Sim x < 33 (Android 13) Assinado com um signatário alternado, segmentando o Android 9 e versões mais recentes Ausente
Sim x >= 33 (Android 13) Assinado com o signatário original, direcionado ao Android 9: (x-1) Assinado com signatário alternado, segmentando x+

Problemas relacionados à rotação

Os seguintes problemas relacionados à rotação foram resolvidos na plataforma:

Correções do Android 12

  • A plataforma só concederia uma permissão de assinatura a um app solicitante se o signatário atual de qualquer um dos apps estiver na linhagem de assinatura ou for o signatário atual do outro app. Isso impede a concessão de uma permissão de assinatura a um app solicitante se os dois apps seguirem as práticas recomendadas de chave de assinatura e alternarem para chaves de assinatura diferentes.
  • O recurso de reversão de APK da plataforma não pode reverter um APK que acabou de ter a chave de assinatura rotacionada, a menos que a chave anterior na linhagem de assinatura tenha a capacidade de reversão. No entanto, essa capacidade anula o propósito da rotação, já que permite que uma nova atualização de pacote seja assinada pela chave de assinatura anterior e reverta a chave rotacionada.
  • Um APK assinado apenas com a chave alternada e atualizado depois com um APK assinado com a chave original e a chave alternada na linhagem mostra apenas a chave alternada na linhagem em dispositivos com Android 11 e versões anteriores.

Correções do Android 11

  • PackageManager#checkSignatures não foi atualizado corretamente para verificar as chaves de assinatura originais de dois pacotes. Isso interrompeu a instrumentação de apps que usam uma chave de assinatura alternada com o APK de instrumentação usando a chave de assinatura original.
  • Pacotes em um sharedUserId compartilham a linhagem de assinatura. Sempre que um app com uma linhagem de assinatura atualizada é instalado ou atualizado em um sharedUiserId, a linhagem desse app substitui a linhagem compartilhada do sharedUserId. Ou seja, se a linhagem de assinatura de um app for A -> B e ele for atualizado no sharedUserId com a linhagem B -> C, a linhagem do sharedUserId será substituída por B -> C. Da mesma forma, não era possível atualizar as capacidades de um signatário anterior na linhagem, a menos que a linhagem de assinatura fosse alterada.

Integração com a v4

O esquema de assinatura v4 usa a configuração de assinatura fornecida ao apksigner. No caso de várias configurações de assinatura fornecidas para rotação, a mais recente é usada. Antes da introdução da v3.1, a v3 incluía apenas essa configuração de assinatura rotacionada mais recente. Assim, a v4 podia usar essa configuração como está. Com isso, o esquema de assinatura v4 passou a oferecer suporte à rotação, já que usava a chave de assinatura rotacionada no SigningInfo. Embora o SigningInfo v4 não inclua a linhagem de assinatura completa, ele pode extrair isso do bloco de assinatura v3 para permitir que a plataforma acesse a linhagem para qualquer consulta de assinatura. Quando a v3.1 é usada para segmentar a rotação da rotation-min-sdk-version fornecida, a configuração genérica v3 inclui a configuração de assinatura original e a mais recente. Foi criada uma extensão do esquema de assinatura v4 que inclui mais blocos de informações de assinatura para cada uma das configurações de assinatura do bloco v3.1.

Validação

Para testar sua implementação da v3.1, execute os testes do CTS PkgInstallSignatureVerificationTest.java em cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.

Para mais informações sobre testes, consulte a seção Verificação na v3.