MASTG-KNOW-0011: Security Provider
O Android depende de um provedor de segurança por meio da classe java.security.Provider para implementar serviços de segurança Java e fornecer conexões baseadas em SSL/TLS. Esses provedores são cruciais para garantir comunicações de rede seguras e proteger outras funcionalidades que dependem de criptografia. A lista de provedores de segurança incluídos no Android varia entre as versões do sistema e as compilações específicas de cada fabricante (OEM).
O problema com esse tipo de provedor de segurança (um exemplo é o OpenSSL), que vem com o dispositivo, é que ele frequentemente contém bugs e/ou vulnerabilidades. Portanto, os aplicativos Android não devem apenas escolher os algoritmos corretos e fornecer uma boa configuração, mas em alguns casos também devem prestar atenção à robustez das implementações nos provedores de segurança legados.
Para evitar vulnerabilidades conhecidas, os desenvolvedores precisam garantir que o aplicativo instalará um provedor de segurança adequado. Desde 11 de julho de 2016, o Google passou a rejeitar envios de aplicativos na Play Store (tanto novos aplicativos quanto atualizações) que usam versões vulneráveis do OpenSSL.
Listando os Provedores de Segurança Disponíveis¶
Você pode listar o conjunto de provedores de segurança existentes usando o seguinte código:
StringBuilder builder = new StringBuilder();
for (Provider provider : Security.getProviders()) {
builder.append("provider: ")
.append(provider.getName())
.append(" ")
.append(provider.getVersion())
.append("(")
.append(provider.getInfo())
.append(")\n");
}
String providers = builder.toString();
//agora exiba a string na tela ou nos logs para depuração.
Esta é a saída para Android 9 (API level 28) executado em um emulador com APIs do Google Play:
provider: AndroidNSSP 1.0(Android Network Security Policy Provider)
provider: AndroidOpenSSL 1.0(Android's OpenSSL-backed security provider)
provider: CertPathProvider 1.0(Provider of CertPathBuilder and CertPathVerifier)
provider: AndroidKeyStoreBCWorkaround 1.0(Android KeyStore security provider to work around Bouncy Castle)
provider: BC 1.57(BouncyCastle Security Provider v1.57)
provider: HarmonyJSSE 1.0(Harmony JSSE Provider)
provider: AndroidKeyStore 1.0(Android KeyStore security provider)
Atualizando o Provedor de Segurança¶
Manter componentes atualizados e corrigidos é um dos princípios de segurança. O mesmo se aplica ao provider. O aplicativo deve verificar se o provedor de segurança utilizado está atualizado e, se não estiver, atualizá-lo.
Versões mais antigas do Android¶
Para alguns aplicativos que suportam versões mais antigas do Android (por exemplo, usados apenas em versões inferiores ao Android 7.0 (API level 24)), incluir uma biblioteca atualizada pode ser a única opção. A biblioteca Conscrypt é uma boa escolha nessa situação para manter a criptografia consistente entre os diferentes níveis de API e evitar a importação do Bouncy Castle, que é uma biblioteca mais pesada.
O Conscrypt para Android pode ser importado desta forma:
dependencies {
implementation 'org.conscrypt:conscrypt-android:last_version'
}
Em seguida, o provedor deve ser registrado chamando:
Security.addProvider(Conscrypt.newProvider())