Esquema de assinatura de APK v3.1

Visão geral

O Android 13 oferece suporte ao APK Signature Scheme v3.1, uma melhoria no APK Signature Scheme v3 existente. O esquema v3.1 aborda alguns dos problemas conhecidos do esquema de assinatura APK v3 em relação à rotação. Em particular, o esquema de assinatura v3.1 oferece suporte ao direcionamento de versão do SDK, o 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 versões anteriores. Portanto, a plataforma aplica o seguinte comportamento do signatário:

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

Os aplicativos que ainda não alternaram sua chave de assinatura não exigem nenhuma ação adicional. Sempre que esses aplicativos optam por alternar, o sistema aplica 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 do bloco essas assinaturas só serão reconhecidas em dispositivos com Android 13 e posterior. Isso permite que os aplicativos alternem com segurança suas chaves de assinatura sem a necessidade de 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 rotacionado 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 uma linhagem forem fornecidas na configuração de assinatura. Se minSdkVersion de um aplicativo for inferior ao 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 direcionamento 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. Se uma versão do SDK inferior ao Android 13 for especificada como a versão mínima para suporte à rotação, então a versão original v3 bloco será usado. O bloco de assinatura v3.1 é usado apenas na presença de rotação, onde a versão mínima do SDK para rotação está definida como Android 13 e posterior. O bloco de assinatura v3 terá um novo atributo para proteção contra remoção de versão mínima do SDK de rotação.

APK inclui linhagem Valor da rotação-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, direcionado ao 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 alternado, direcionado ao Android 13 e versões posteriores
Sim x <33 (andróide 13) Assinado com signatário alternado, direcionado ao Android 9 e versões posteriores Não presente
Sim x >= 33 (andróide 13) Assinado com o signatário original, direcionado ao Android 9 - ( x -1) Assinado com signatário alternado, 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 estivesse na linhagem de assinatura ou fosse o signatário atual do outro aplicativo; isso evita a concessão de 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 de APK da plataforma não poderia reverter um APK que apenas teve sua chave de assinatura girada, a menos que a chave anterior na linhagem de assinatura tivesse 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 girada e atualizado posteriormente com um APK assinado com a chave original e a chave girada na linhagem mostrará apenas a chave girada na linhagem em dispositivos que executam o 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 para aplicativos que usavam uma chave de assinatura rotacionada com o APK de instrumentação que usava a chave de assinatura original.
  • Pacotes sob 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 do sharedUserId (ou seja, se a linhagem de assinatura de um aplicativo for A -> B e um aplicativo for atualizado no sharedUserId com linhagem B -> C, então a linhagem sharedUserId seria substituída por B -> C). Da mesma forma, as capacidades de um signatário anterior na linhagem não poderiam ser atualizadas, 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 múltiplas configurações de assinatura fornecidas para rotação, a configuração de assinatura rotacionada mais recente será 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, uma vez que usou a chave de assinatura rotacionada em seu SigningInfo. Embora o SigningInfo v4 não inclua a linhagem de assinatura completa, ele é capaz de extraí-la 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 rotation-min-sdk fornecida, a configuração genérica da v3 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 adicionais 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 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.