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.

false
Menu principal
4131393822766603088
true
Pesquisar no Centro de ajuda
true
true
true
true
true
5016068
false
false