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
- 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.
- Atualize as aplicações afetadas ao seguir os passos realçados abaixo.
- 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:
- Roubem ficheiros confidenciais ou dados do sistema (como mensagens SMS) da sua app
- 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:
- Não será enviada para qualquer um dos componentes privados da sua app e
- 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.