Esquema de assinatura de APK v3.1

Visão geral

O Android 13 oferece suporte ao APK Signature Scheme v3.1, uma melhoria em relação ao APK Signature Scheme v3 existente. O esquema v3.1 aborda alguns dos problemas conhecidos do APK Signature Scheme v3 em relação à rotação. Em particular, o esquema de assinatura v3.1 oferece suporte à segmentação de versão do SDK, que permite a rotação para direcionar uma versão posterior da plataforma.

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

  • Os dispositivos que executam o Android 13 ou superior usam o signatário girado no bloco v3.1.
  • Os dispositivos que executam versões mais antigas do Android ignoram o signatário girado e, em vez disso, usam o signatário original no bloco v3.

Os aplicativos que ainda não rotacionaram sua chave de assinatura não requerem nenhuma ação adicional. Sempre que esses aplicativos optarem por alternar, o sistema aplicará o esquema de assinatura v3.1 por padrão.

bloco de assinatura v3.1

O bloco de assinatura v3.1 terá o mesmo conteúdo do bloco de assinatura v3, mas com o novo ID de bloco, essas assinaturas serão reconhecidas apenas em dispositivos com Android 13 e posterior. Isso permite que os aplicativos alternem com segurança suas chaves de assinatura sem precisar se preocupar com APKs de vários destinos, pois o signatário original pode ser usado para assinar o APK no bloco de assinatura v3 e o signatário alternado no bloco de assinatura v3.1. Isso também permite que a plataforma reutilize todos os códigos de verificação existentes para o bloco de assinatura v3 ao verificar uma assinatura v3.1.

Por padrão, a biblioteca apksig usará o bloco de assinatura v3.1 sempre que uma chave rotacionada e linhagem forem fornecidas na configuração de assinatura. Se a minSdkVersion de um aplicativo for menor que o Android 13 e uma chave rotacionada estiver sendo usada, a chave de assinatura original também deverá 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 direcionado 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 exporá novas APIs que permitirão definir uma versão mínima do SDK para rotação. bloco será usado. O bloco de assinatura v3.1 só é usado na presença de rotação em que a versão mínima do SDK para rotação é definida como Android 13 e posterior. O bloco de assinatura v3 terá um novo atributo para proteção mínima de remoção de versão do SDK de rotação.

APK inclui linhagem Valor de rotação-min-sdk-versão 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, visando o Android 9 e posterior Não presente
Sim Padrão Assinado com o signatário original, visando Android 9 a 12L Assinado com signatário rotacionado, visando o Android 13 e posterior
Sim x < 33 (Android 13) Assinado com signatário rotacionado, visando o Android 9 e posterior Não presente
Sim x >= 33 (Android 13) Assinado com o signatário original, visando o Android 9 - ( x -1) Assinado com signatário rotacionado, visando 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 aplicativo solicitante se o signatário atual do aplicativo estiver na linhagem de assinatura ou for o signatário atual do outro aplicativo; isso impede a concessão de uma permissão de assinatura a um aplicativo solicitante se os dois aplicativos seguirem as práticas recomendadas de chave de assinatura e alternarem para chaves de assinatura diferentes.
  • O recurso de reversão do APK da plataforma não pode reverter um APK que acabou de ter sua chave de assinatura rotacionada, a menos que a chave anterior na linhagem de assinatura tenha o recurso de reversão, mas esse recurso anula o propósito da rotação, pois permite que uma nova atualização de pacote seja assinada pelo chave de assinatura anterior e revertendo a chave girada.
  • Um APK assinado apenas com a chave rotacionada e posteriormente atualizado com um APK assinado com a chave original e a chave rotacionada na linhagem mostrará apenas a chave rotacionada 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 quebrou a instrumentação para aplicativos usando uma chave de assinatura rotacionada com o APK de instrumentação usando a chave de assinatura original.
  • Pacotes em um sharedUserId compartilham sua linhagem de assinatura. Sempre que um aplicativo com uma linhagem de assinatura atualizada é instalado ou atualizado em um sharedUiserId , a linhagem desse aplicativo substitui a linhagem compartilhada pelo sharedUserId (isto é, se a linhagem de assinatura de um aplicativo for A -> B e um aplicativo for atualizado no sharedUserId com a linhagem B -> C, então a linhagem sharedUserId seria substituída por B -> C). Da mesma forma, os recursos de um signatário anterior na linhagem não poderiam ser atualizados, a menos que a linhagem de assinatura fosse alterada.

integração 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 última configuração de assinatura rotacionada é usada. Antes da introdução da v3.1, a v3 incluía apenas esta configuração de assinatura rotacionada mais recente, portanto, a v4 era capaz de usar essa configuração como está; com isso, o esquema de assinatura v4 foi capaz de suportar a rotação, pois usava a chave de assinatura rotacionada em seu SigningInfo. Embora o v4 SigningInfo 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 estiver em uso para direcionar a rotação para a versão min-sdk fornecida, a configuração v3 genérica incluirá a configuração de assinatura original, bem como a configuração de assinatura rotacionada mais recente. Foi criada uma extensão do esquema de assinatura v4 que inclui blocos de informações de assinatura adicionais 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 PkgInstallSignatureVerificationTest.java CTS em cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .

Para obter mais informações sobre testes, confira a seção de verificação na v3.