Solução para a vulnerabilidade Intent Redirection

Estas informações destinam-se aos programadores com apps que contêm a vulnerabilidade Intent Redirection.

O que está a acontecer

Uma ou mais das suas apps contêm um problema de Intent Redirection que pode permitir que apps maliciosas acedam a ficheiros ou a componentes de apps privados. Reveja os passos detalhados abaixo para corrigir o problema com as suas aplicações. Após os prazos apresentados na Play Console, as apps que contenham vulnerabilidades de segurança não corrigidas serão removidas do Google Play.

Ação necessária​

  1. Inicie sessão na Play Console e navegue até à secção Alertas para ver quais as apps afetadas e os prazos para resolver estes problemas.
  2. Atualize as aplicações afetadas ao seguir os passos realçados abaixo.
  3. Envie as versões atualizadas das aplicações afetadas.

Depois de voltar a enviar, a sua aplicação será revista novamente. Este processo pode demorar várias horas. Se a aplicação passar na revisão e for publicada com êxito, não será necessária qualquer ação adicional. Se a aplicação falhar na revisão, a nova versão da aplicação não será publicada e receberá uma notificação por email.

Detalhes adicionais

Utilizar uma intenção não fidedigna para iniciar um componente (por exemplo, ao chamar startActivity) ou para devolver dados (por exemplo, ao chamar setResult) é perigoso e pode permitir que apps maliciosas causem os seguintes problemas: 

  1. Roubem ficheiros confidenciais ou dados do sistema (como mensagens SMS) da sua app
  2. Iniciem os componentes privados da sua app com argumentos envenenados.

É importante que a sua app não chame startActivity, startService, sendBroadcast ou setResult em intenções não fidedignas sem validar ou limpar estas intenções.

Recomendamos que impeça esta vulnerabilidade de uma das seguintes formas:

Opção 1: torne privado o componente afetado da app a partir do qual a intenção extraída é redirecionada.

Se o componente afetado da app não precisar de receber intenções de outras apps, pode tornar esse componente da app privado ao definir android:exported=”false” no seu manifesto.

Opção 2: certifique-se de que a intenção extraída é proveniente de uma fonte fidedigna.

Pode confirmar se a atividade resultante é fidedigna ao utilizar métodos como getCallingActivity. Por 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);
 }

Nota:

  • A confirmação de que getCallingActivity() devolve um valor não nulo é insuficiente para impedir a vulnerabilidade. As apps maliciosas podem fornecer um valor nulo para esta função.
  • No caso da SMS Retriever Auth dos Serviços do Google Play, proteger o recetor de transmissão com SEND_PERMISSION garante que uma intenção é proveniente dos Serviços do Google Play.

Opção 3: certifique-se de que a intenção que será redirecionada não é prejudicial.

Deve confirmar se a Intenção redirecionada:

  1. Não será enviada para qualquer um dos componentes privados da sua app e
  2. Não será enviada para um componente de uma app externa. Se o redirecionamento se destinar a uma app externa, certifique-se de que a intenção não irá conceder uma autorização de URI a um dos fornecedores de conteúdos privados ou dados do sistema da sua app.

As apps podem verificar que componente será utilizado para processar a intenção antes de a redirecionarem através de métodos como resolveActivity. Por 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);
 }

As apps podem verificar se uma intenção concede uma autorização de URI através de métodos como getFlags. Por 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);
 }

As apps também podem remover concessões de autorizações de URI através de removeFlags. Por exemplo:

 // untrusted Intent
 Intent intent = getIntent();
 // remove the grant URI permissions in the untrusted Intent
 intent.removeFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
 intent.removeFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 // pass the untrusted Intent
 setResult(intent);

Compreender os alertas e escolher uma opção de prevenção 

O alerta da Play Console comunica onde é que a sua app chama startActivity, startActivityForResult, startService, sendBroadcast ou setResult através de uma intenção não fidedigna. Para compreender melhor qual a opção de prevenção mais adequada, rastreie e analise os autores de chamadas dos métodos para descobrir a origem da intenção não fidedigna. Por exemplo, para a opção 1, rastreie para determinar qual o componente a tornar privado.

Estamos aqui para ajudar

Se tiver perguntas técnicas acerca da vulnerabilidade, pode publicar uma mensagem no Stack Overflow e utilizar a etiqueta "android-security". Para obter um esclarecimento sobre os passos que tem de efetuar para resolver este problema, pode contactar a nossa equipa de apoio técnico a programadores.

Esta página pode incluir conteúdo traduzido com tecnologia de IA. As traduções de IA podem conter erros.
false
Menu principal
5820017623050232682
true
Pesquisar no Centro de ajuda
false
true
true
true
true
true
5016068
false
false
false
false
false