Assinatura do aplicativo

A assinatura do aplicativo permite que os desenvolvedores identifiquem o autor do aplicativo e atualizem seu aplicativo sem criar interfaces e permissões complicadas. Todo aplicativo executado na plataforma Android deve ser assinado pelo desenvolvedor . Os aplicativos que tentarem instalar sem estar assinados serão rejeitados pelo Google Play ou pelo instalador do pacote no dispositivo Android.

No Google Play, a assinatura de aplicativos conecta a confiança que o Google tem com o desenvolvedor e a confiança que o desenvolvedor tem com seu aplicativo. Os desenvolvedores sabem que seu aplicativo é fornecido, sem modificações, ao dispositivo Android; e os desenvolvedores podem ser responsabilizados pelo comportamento de seu aplicativo.

No Android, a assinatura do aplicativo é o primeiro passo para colocar um aplicativo em seu Application Sandbox. O certificado de aplicativo assinado define qual ID do usuário está associado a qual aplicativo; diferentes aplicativos são executados em diferentes IDs de usuário. A assinatura do aplicativo garante que um aplicativo não possa acessar nenhum outro aplicativo, exceto por meio de um IPC bem definido.

Quando um aplicativo (arquivo APK) é instalado em um dispositivo Android, o Gerenciador de Pacotes verifica se o APK foi assinado corretamente com o certificado incluído nesse APK. Se o certificado (ou, mais precisamente, a chave pública no certificado) corresponder à chave usada para assinar qualquer outro APK no dispositivo, o novo APK tem a opção de especificar no manifesto que compartilhará um UID com o outro da mesma forma APKs assinados.

Os aplicativos podem ser assinados por terceiros (OEM, operadora, mercado alternativo) ou autoassinados. O Android fornece assinatura de código usando certificados autoassinados que os desenvolvedores podem gerar sem assistência ou permissão externa. Os pedidos não precisam ser assinados por uma autoridade central. Atualmente, o Android não executa a verificação de CA para certificados de aplicativos.

Os aplicativos também podem declarar permissões de segurança no nível de proteção de assinatura, restringindo o acesso apenas a aplicativos assinados com a mesma chave, mantendo UIDs e caixas de proteção de aplicativos distintos. Um relacionamento mais próximo com um Application Sandbox compartilhado é permitido por meio do recurso UID compartilhado, onde dois ou mais aplicativos assinados com a mesma chave de desenvolvedor podem declarar um UID compartilhado em seu manifesto.

Esquemas de assinatura de APK

O Android suporta três esquemas de assinatura de aplicativos:

Para compatibilidade máxima, assine aplicativos com todos os esquemas, primeiro com v1, depois com v2 e depois com v3. Dispositivos Android 7.0+ e mais recentes instalam aplicativos assinados com esquemas v2+ mais rapidamente do que aqueles assinados apenas com esquema v1. As plataformas Android mais antigas ignoram as assinaturas v2+ e, portanto, precisam que os aplicativos contenham assinaturas v1.

Assinatura JAR (esquema v1)

A assinatura de APK faz parte do Android desde o início. É baseado em JAR assinado . Para obter detalhes sobre como usar esse esquema, consulte a documentação do Android Studio em Como assinar seu aplicativo .

As assinaturas v1 não protegem algumas partes do APK, como metadados ZIP. O verificador de APK precisa processar muitas estruturas de dados não confiáveis ​​(ainda não verificadas) e descartar dados não cobertos pelas assinaturas. Isso oferece uma superfície de ataque considerável. Além disso, o verificador de APK deve descompactar todas as entradas compactadas, consumindo mais tempo e memória. Para resolver esses problemas, o Android 7.0 introduziu o APK Signature Scheme v2.

Esquema de assinatura do APK v2 e v3 (esquema v2+)

Os dispositivos que executam o Android 7.0 e posterior são compatíveis com o esquema de assinatura APK v2 (esquema v2) e posterior. (O esquema v2 foi atualizado para v3 no Android 9 para incluir informações adicionais no bloco de assinatura, mas funciona da mesma forma.) O conteúdo do APK é criptografado e assinado, então o bloco de assinatura APK resultante é inserido no APK. Para obter detalhes sobre como aplicar o esquema v2+ a um aplicativo, consulte APK Signature Scheme v2 .

Durante a validação, o esquema v2+ trata o arquivo APK como um blob e realiza a verificação de assinatura em todo o arquivo. Qualquer modificação no APK, incluindo modificações de metadados ZIP, invalida a assinatura do APK. Essa forma de verificação de APK é substancialmente mais rápida e permite a detecção de mais classes de modificações não autorizadas.

O novo formato é compatível com versões anteriores, portanto, os APKs assinados com o novo formato de assinatura podem ser instalados em dispositivos Android mais antigos (que simplesmente ignoram os dados extras adicionados ao APK), desde que esses APKs também sejam assinados por v1.

Processo de verificação de assinatura do APK

Figura 1. Processo de verificação de assinatura do APK

O hash de arquivo inteiro do APK é verificado em relação à assinatura v2+ armazenada no APK Signing Block. O hash cobre tudo, exceto o APK Signing Block, que contém a assinatura v2+. Qualquer modificação no APK fora do APK Signing Block invalida a assinatura v2+ do APK. APKs com assinatura v2+ removida também são rejeitados, porque sua assinatura v1 especifica que o APK foi assinado por v2, o que faz com que o Android 7.0 e mais recentes se recusem a verificar APKs usando suas assinaturas v1.

Para obter detalhes sobre o processo de verificação de assinatura do APK, consulte a seção Verificação do Esquema de assinatura do APK v2.

,

A assinatura do aplicativo permite que os desenvolvedores identifiquem o autor do aplicativo e atualizem seu aplicativo sem criar interfaces e permissões complicadas. Todo aplicativo executado na plataforma Android deve ser assinado pelo desenvolvedor . Os aplicativos que tentarem instalar sem estar assinados serão rejeitados pelo Google Play ou pelo instalador do pacote no dispositivo Android.

No Google Play, a assinatura de aplicativos conecta a confiança que o Google tem com o desenvolvedor e a confiança que o desenvolvedor tem com seu aplicativo. Os desenvolvedores sabem que seu aplicativo é fornecido, sem modificações, ao dispositivo Android; e os desenvolvedores podem ser responsabilizados pelo comportamento de seu aplicativo.

No Android, a assinatura do aplicativo é o primeiro passo para colocar um aplicativo em seu Application Sandbox. O certificado de aplicativo assinado define qual ID do usuário está associado a qual aplicativo; diferentes aplicativos são executados em diferentes IDs de usuário. A assinatura do aplicativo garante que um aplicativo não possa acessar nenhum outro aplicativo, exceto por meio de um IPC bem definido.

Quando um aplicativo (arquivo APK) é instalado em um dispositivo Android, o Gerenciador de Pacotes verifica se o APK foi assinado corretamente com o certificado incluído nesse APK. Se o certificado (ou, mais precisamente, a chave pública no certificado) corresponder à chave usada para assinar qualquer outro APK no dispositivo, o novo APK tem a opção de especificar no manifesto que compartilhará um UID com o outro da mesma forma APKs assinados.

Os aplicativos podem ser assinados por terceiros (OEM, operadora, mercado alternativo) ou autoassinados. O Android fornece assinatura de código usando certificados autoassinados que os desenvolvedores podem gerar sem assistência ou permissão externa. Os pedidos não precisam ser assinados por uma autoridade central. Atualmente, o Android não executa a verificação de CA para certificados de aplicativos.

Os aplicativos também podem declarar permissões de segurança no nível de proteção de assinatura, restringindo o acesso apenas a aplicativos assinados com a mesma chave, mantendo UIDs e caixas de proteção de aplicativos distintos. Um relacionamento mais próximo com um Application Sandbox compartilhado é permitido por meio do recurso UID compartilhado, onde dois ou mais aplicativos assinados com a mesma chave de desenvolvedor podem declarar um UID compartilhado em seu manifesto.

Esquemas de assinatura de APK

O Android suporta três esquemas de assinatura de aplicativos:

Para compatibilidade máxima, assine aplicativos com todos os esquemas, primeiro com v1, depois com v2 e depois com v3. Dispositivos Android 7.0+ e mais recentes instalam aplicativos assinados com esquemas v2+ mais rapidamente do que aqueles assinados apenas com esquema v1. As plataformas Android mais antigas ignoram as assinaturas v2+ e, portanto, precisam que os aplicativos contenham assinaturas v1.

Assinatura JAR (esquema v1)

A assinatura de APK faz parte do Android desde o início. É baseado em JAR assinado . Para obter detalhes sobre como usar esse esquema, consulte a documentação do Android Studio em Como assinar seu aplicativo .

As assinaturas v1 não protegem algumas partes do APK, como metadados ZIP. O verificador de APK precisa processar muitas estruturas de dados não confiáveis ​​(ainda não verificadas) e descartar dados não cobertos pelas assinaturas. Isso oferece uma superfície de ataque considerável. Além disso, o verificador de APK deve descompactar todas as entradas compactadas, consumindo mais tempo e memória. Para resolver esses problemas, o Android 7.0 introduziu o APK Signature Scheme v2.

Esquema de assinatura do APK v2 e v3 (esquema v2+)

Os dispositivos que executam o Android 7.0 e posterior são compatíveis com o esquema de assinatura APK v2 (esquema v2) e posterior. (O esquema v2 foi atualizado para v3 no Android 9 para incluir informações adicionais no bloco de assinatura, mas funciona da mesma forma.) O conteúdo do APK é criptografado e assinado, então o bloco de assinatura APK resultante é inserido no APK. Para obter detalhes sobre como aplicar o esquema v2+ a um aplicativo, consulte APK Signature Scheme v2 .

Durante a validação, o esquema v2+ trata o arquivo APK como um blob e realiza a verificação de assinatura em todo o arquivo. Qualquer modificação no APK, incluindo modificações de metadados ZIP, invalida a assinatura do APK. Essa forma de verificação de APK é substancialmente mais rápida e permite a detecção de mais classes de modificações não autorizadas.

O novo formato é compatível com versões anteriores, portanto, os APKs assinados com o novo formato de assinatura podem ser instalados em dispositivos Android mais antigos (que simplesmente ignoram os dados extras adicionados ao APK), desde que esses APKs também sejam assinados por v1.

Processo de verificação de assinatura do APK

Figura 1. Processo de verificação de assinatura do APK

O hash de arquivo inteiro do APK é verificado em relação à assinatura v2+ armazenada no APK Signing Block. O hash cobre tudo, exceto o APK Signing Block, que contém a assinatura v2+. Qualquer modificação no APK fora do APK Signing Block invalida a assinatura v2+ do APK. APKs com assinatura v2+ removida também são rejeitados, porque sua assinatura v1 especifica que o APK foi assinado por v2, o que faz com que o Android 7.0 e mais recentes se recusem a verificar APKs usando suas assinaturas v1.

Para obter detalhes sobre o processo de verificação de assinatura do APK, consulte a seção Verificação do Esquema de assinatura do APK v2.