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. 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

O uso de um intent não confiável para iniciar um componente (por exemplo, chamar startActivity) ou retornar dados (por exemplo, chamar setResult) é perigoso e pode permitir que apps maliciosos causem os seguintes problemas: 

  1. Roubo de arquivos confidenciais ou dados do sistema (como mensagens SMS) do seu app
  2. Inicialização de componentes particulares do seu app com argumentos suspeitos

É importante validar e limpar intents não confiáveis antes de chamar startActivity, startService, sendBroadcast ou setResult.

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

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

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 a intent extraída tem uma origem confiável.

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

 // verificar se a atividade tem origem em um pacote confiável
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extrair a intent aninhada
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirecionar a intent aninhada
   startActivity(forward);
 }

Observação:

  • Verifique se o valor nulo retornado por getCallingActivity() é suficiente para evitar a vulnerabilidade. Apps maliciosos podem fornecer um valor nulo para essa função.
  • Para SMS Retriever Auth do Google Play Services, a proteção de um broadcast receiver com SEND_PERMISSION garantirá que uma intent tenha origem no Google Play Services.

Opção 3: verificar se a intent redirecionada é nociva.

É preciso verificar se o intent redirecionado:

  1. não será enviada para os componentes privados do seu app;
  2. não será enviada para o componente de um app externo. Se o redirecionamento for destinado a um app externo, confira se a intent não concederá uma permissão de URI a um dos provedores de conteúdo particulares do seu app ou dados do sistema.

Os apps podem usar métodos como resolveActivity a fim de verificar quais componentes serão usados para gerenciar a intent antes de redirecioná-la. Exemplo:

 Intent intent = getIntent();
 // extrair a intent aninhada
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // acessar o nome do componente
 ComponentName name = forward.resolveActivity(getPackageManager());
 // verificar se os nomes do pacote e da classe estão corretos
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirecionar a intent aninhada
   startActivity(forward);
 }

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

 // extrair a intent aninhada
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // acessar as sinalizações
 int flags = forward.getFlags();
 // verificar se a intent aninhada não concede permissões de URI
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION == 0) &&
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION == 0)) {
   // redirecionar a intent aninhada
   startActivity(forward);
 }

Os apps também podem remover concessões de permissões de URI usando removeFlags. Exemplo:

 // intent não confiável
 Intent intent = getIntent();
 // remover as permissões de URI concedidas pela intent não confiável
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // transmitir a intent não confiável
 setResult(intent);

Como interpretar alertas e escolher uma opção de prevenção 

O alerta do Play Console informa quando o app chama startActivity, startActivityForResult, startService, sendBroadcast ou setResult com uma intent não confiável. Para escolher a opção de prevenção mais apropriada, rastreie os autores das chamadas de métodos para descobrir a origem da intent não confiável. Por exemplo, na Opção 1, faça o rastreamento para determinar qual componente precisa ser particular.

Estamos aqui para ajudar

Em caso de dúvidas técnicas, escreva uma postagem no Stack Overflow (em inglês) e use a tag "android-security". Se precisar 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?
false
Menu principal
7237811634356646373
true
Pesquisar na Central de Ajuda
true
true
true
true
true
5016068
false
false