Solução da vulnerabilidade de redirecionamento de intents

Estas informações são destinadas a desenvolvedores de apps com vulnerabilidade de redirecionamento de intents.

O que está acontecendo

Um ou mais dos seus apps têm um problema de redirecionamento de intents que pode permitir que apps maliciosos acessem componentes ou arquivos privados do app. Veja abaixo as etapas detalhadas para corrigir o problema dos seus apps. Após os prazos exibidos no Play Console, todos os apps com vulnerabilidades de segurança não corrigidas serão removidos do Google Play.

Ação necessária​

  1. Faça login no Play Console e acesse a seção "Alertas" para ver os apps afetados e os prazos para resolver os problemas.
  2. Siga as etapas destacadas abaixo para fazer as atualizações necessárias.
  3. Envie as versões atualizadas dos apps afetados.

Após o reenvio, seu app será revisado novamente. Esse processo pode levar várias horas. Se o app for aprovado na revisão e publicado, nenhuma outra ação será necessária. Se ele for reprovado, a nova versão não será publicada, e você receberá uma notificação por e-mail.

Detalhes adicionais

Os apps que extraem intents do campo "Extras" de um intent não confiável e iniciam um componente chamando startActivity (ou startService) em um intent extraído podem ser enganados e iniciar um componente privado não intencional. Isso pode levar a ações confidenciais com argumentos maliciosos e/ou roubo de arquivos confidenciais por meio da concessão de permissões de URI.

Recomendamos evitar essa vulnerabilidade com um dos métodos a seguir:

Opção 1: definir como privado o componente afetado do app que redireciona o intent extraído.

Se o componente do app afetado não precisar receber intents de outros apps, defina android:exported=”false” no seu manifesto para tornar o componente privado. 

Opção 2: verificar se o intent extraído tem uma origem confiável.

Use métodos como getCallingActivity para verificar se a atividade de origem é confiável. Exemplo: 

 // check if the originating Activity is from trusted package
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extract the nested Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirect the nested Intent
   startActivity(forward);
 }

Opção 3: verificar se o intent redirecionado é nocivo.

É preciso verificar se o intent redirecionado:

  1. não será enviado para os componentes privados do seu app;
  2. não concederá uma permissão de URI a um dos provedores de conteúdo privados do seu app.

Os apps podem usar métodos como resolveActivity a fim de verificar que componentes serão usados para lidar com o intent antes de redirecioná-lo. Exemplo:

 Intent intent = getIntent();
 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the component name
 ComponentName name = forward.resolveActivity(getPackageManager());
 // check that the package name and class name are as intended
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirect the nested Intent
   startActivity(forward);
 }

Os apps podem usar métodos como getFlags para verificar se um intent concede uma permissão de URI. Exemplo:

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION > 0) ||
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION > 0) {
   // redirect the nested Intent
   startActivity(forward);
 }

Estamos aqui para ajudar

Se você tiver dúvidas técnicas sobre a vulnerabilidade, escreva uma postagem no Stack Overflow e use a tag "android-security". Caso precise de mais informações sobre as etapas necessárias para resolver esse problema, entre em contato com nossa equipe de suporte ao desenvolvedor.

Isso foi útil?
Como podemos melhorá-lo?