Escolar Documentos
Profissional Documentos
Cultura Documentos
com
Depois de desbloquear o carregador de inicialização em alguns dispositivos, você pode inicializar o código
não assinado, mas não pode exibir o código não assinado. Nesse caso, a atualização de um sistema
personalizado ou imagem de recuperação só é possível depois de obter root no sistema inicializado. Nesse
cenário, você usariaddpara gravar uma imagem de recuperação personalizada diretamente no dispositivo de
bloco para a partição de recuperação.
Quando o carregador de inicialização está bloqueado e o fabricante não fornece um método legítimo
para desbloqueá-lo, geralmente você precisa encontrar uma falha no dispositivo que servirá como
ponto de entrada para fazer o root.
Primeiro você precisa identificar qual tipo de bloqueio do carregador de inicialização você
possui; pode variar dependendo do fabricante, operadora, variante do dispositivo ou versão do
software no mesmo dispositivo. Às vezes, o acesso fastboot é proibido, mas você ainda pode
usar o protocolo de flash proprietário do fabricante, como Motorola SBF ou Samsung ODIN. Às
vezes, as verificações de assinatura no mesmo dispositivo são aplicadas de maneira diferente ao
usar o fastboot em vez do modo de download proprietário do fabricante. A verificação de
assinatura pode acontecer no momento da inicialização, no momento de piscar ou em ambos.
outras técnicas para obter acesso root, conforme descrito na seção “Ganhando root em
um sistema inicializado”.
Obter acesso root inicial em um sistema inicializado consiste em obter um shell de root por
meio de uma falha de segurança não corrigida no sistema operacional Android. Um método de
enraizamento como esse também é amplamente conhecido comoraiz maciaporque o ataque é
quase inteiramente baseado em software. Normalmente, um soft root é realizado por meio de
uma vulnerabilidade no kernel do Android, um processo executado como root, um programa
vulnerável com o bit set-uid definido, um ataque de link simbólico contra um bug de permissão
de arquivo ou outros problemas. Há um grande número de possibilidades devido ao grande
número de áreas em que os problemas podem ser introduzidos e os tipos de erros que os
programadores podem cometer.
Embora os binários root set-uid ou set-gid não sejam comuns no Android, operadoras ou
fabricantes de dispositivos às vezes os introduzem como parte de suas modificações
personalizadas. Uma falha de segurança típica em qualquer um desses binários set-uid pode
levar ao escalonamento de privilégios e, posteriormente, gerar acesso root.
Outro cenário típico é explorar uma vulnerabilidade de segurança em um processo
executado com privilégios de root. Tal exploit permite que você execute código
arbitrário como root. O final deste capítulo inclui alguns exemplos disso.
Como você verá no Capítulo 12, essas explorações estão se tornando mais difíceis de desenvolver à
medida que o Android amadurece. Novas técnicas de mitigação e recursos de proteção de segurança
são introduzidos regularmente com as novas versões do Android.
É importante compreender que oadbddaemon começará a ser executado como root e descartará seus
privilégios para oConchausuário (AID_SHELL), a menos que a propriedade do sistema
ro.secureestá configurado para0.Esta propriedade é somente leitura e geralmente é definida comoro.secure=1
Essas ferramentas geralmente combinam várias explorações públicas ou privadas para poder
atualizar o carregador de inicialização corrigido e ignorar os bloqueios NAND. Na maioria dos casos, a
atualização de um HBOOT de estoque reativa o sinalizador de segurança do dispositivo (S-ON).
Os exploits Unlimited.io disponíveis emhttp://unlimited.io/,como JuopunutBear,
LazyPanda e DirtyRacun, permitem obter S-OFF de rádio completo em
Capítulo 3-Enraizando seu dispositivo 71
alguns dispositivos combinando vários exploits presentes nas ROMs do Android da HTC e na
banda base do dispositivo.
Em dezembro de 2010, Scott Walker publicou o exploit gfree disponível emhttps://
github.com/tmzt/g2root-kmod/tree/master/scotty2/gfreesob a GPL3
licença. Esta exploração desativou a proteção incorporada do MultiMediaCard (eMMC) do T-
Mobile G2. A memória eMMC, que contém a partição de banda base, é inicializada no modo
somente leitura quando o carregador de inicialização inicializa o hardware. O exploit então liga
e desliga o chip eMMC usando um módulo de kernel Linux e define o @bandeira segurapara falso.
Finalmente, ele instala um filtro de solicitação de bloco MultiMediaCard (MMC) no kernel para
remover a proteção contra gravação na partição oculta de configurações de rádio.
Quando a HTC iniciou seu portal oficial de desbloqueio, forneceu imagens HBOOT para alguns
dispositivos que permitem ao usuário desbloquear o carregador de inicialização - e remover bloqueios
NAND - em duas etapas:
Quando você tem um shell de root (soft root), obter acesso root permanente é simples.
Em telefones sem bloqueios NAND, você só precisa de acesso de gravação à partição do
sistema. Se o telefone tiver um bloqueio NAND, ele deve ser removido primeiro (consulte a
seção “Bloqueios NAND, raiz temporária e raiz permanente” anteriormente neste
capítulo).
Com os bloqueios NAND fora de cena, você pode simplesmente remontar a partição do
sistema no modo de leitura/gravação, colocar umsubinário com permissões de root set-uid e
remonte-o novamente no modo somente leitura; opcionalmente, você pode instalar umsu
wrapper como SuperUser ou SuperSU.
72 Capítulo 3-Enraizando seu dispositivo
é o telefone
O usuário obtém O usuário envia o O portal de desbloqueio O usuário desbloqueia o
desbloquear tokenusando desbloquearsímbolotoken para valida o dispositivo usando o
fastboot o portal de desbloqueio OEM símboloe envia desbloqueio fornecidochave
DO UTILIZADOR
Outra maneira de manter o acesso root persistente é gravar uma recuperação personalizada
na partição de recuperação usando oddcomando no dispositivo Android. Isso é equivalente a
exibir uma recuperação personalizada via fastboot ou modo de download, conforme descrito na
seção “Enraizando com um carregador de inicialização desbloqueado” anteriormente neste
capítulo.
Primeiro, você precisa identificar a localização da partição de recuperação no dispositivo. Por
exemplo:
A saída anterior mostra que a partição de recuperação neste caso está localizada em
/dev/block/mmcblk0p7.
Capítulo 3-Enraizando seu dispositivo 73
Agora você pode enviar uma imagem de recuperação personalizada para o cartão SD e gravá-la na
partição de recuperação:
O restante desta seção discute vários métodos conhecidos anteriormente para obter
acesso root a dispositivos Android. Ao apresentar esses problemas, esperamos fornecer
informações sobre as possíveis maneiras de obter acesso root a dispositivos Android.
Embora alguns desses problemas afetem o ecossistema Linux maior, a maioria é
específica do Android. Muitos desses problemas não podem ser explorados sem acesso ao
shell ADB. Em cada caso, discutimos a causa raiz da vulnerabilidade e os principais
detalhes de como a exploração a aproveitou.
NOTAO leitor astuto pode notar que vários dos seguintes problemas foram descobertos
sem saber por várias partes separadas. Embora isso não seja uma ocorrência comum,
acontece de vez em quando.
Alguns dos detalhes de exploração fornecidos nesta seção são bastante técnicos. Se eles são
esmagadores, ou você já está intimamente familiarizado com o funcionamento interno dessas
façanhas, sinta-se à vontade para ignorá-los. De qualquer forma, esta seção serve para
documentar essas explorações em detalhes moderados. O Capítulo 8 cobre algumas dessas
façanhas com mais detalhes.
Kernel: Wunderbar/asroot
Este bug foi descoberto por Tavis Ormandy e Julien Tinnes da equipe de
segurança do Google e foi atribuído a CVE-2009-2692:
O kernel do Linux 2.6.0 a 2.6.30.4 e 2.4.4 a 2.4.37.4, não inicializa todos os ponteiros de
função para operações de soquete em estruturas proto_ops, o que permite que
usuários locais acionem uma referência de ponteiro NULL e ganhem privilégios
usando mmap para mapear página zero, colocando código arbitrário nesta página e,
em seguida, invocando uma operação indisponível, conforme demonstrado pela
operação sendpage (função sock_sendpage) em um soquete PF_PPPOX.
74 Capítulo 3-Enraizando seu dispositivo
Recuperação: Volez
Udev: Explodir
Essa vulnerabilidade afetou todas as versões do Android até 2.1. Foi originalmente
descoberto como uma vulnerabilidade noudevdaemon usado em sistemas Linux x86. Foi
atribuído CVE-2009-1185. Mais tarde, o Google reintroduziu o problema noiniciar
daemon, que lida com oudevfuncionalidade no Android.
A exploração dependeudevcódigo falhando ao verificar a origem de uma mensagem
NETLINK. Essa falha permite que um processo de espaço do usuário obtenha privilégios
enviando umudevevento alegando ser originário do kernel, que era confiável. A exploração
Exploid original lançada por Sebastian Krahmer (“The Android Exploid Crew”) teve que ser
executada a partir de um diretório gravável e executável no dispositivo.
Primeiro, o exploit criou um socket com um domínio de PF_NETLINK e uma família de
NETLINK_KOBJECT_UEEVENTO(mensagem do kernel para o evento do espaço do usuário).
Em segundo lugar, ele criou um arquivohotplugno diretório atual, contendo o caminho
para oexplodirbinário. Terceiro, criou um link simbólico chamadodadosna corrente
Capítulo 3-Enraizando seu dispositivo 75
Adbd: RageAgainstTheCage
Conforme discutido na seção “Abuso do adbd para obter root”, o daemon do ADB (adbd
processo) começa a ser executado como root e descarta privilégios para oConchado utilizador.
Nas versões do Android até 2.2, o daemon ADB não verificava o valor de retorno dosetuid
chamar ao descartar privilégios. Sebastian Krahmer usou esse check-in ausente
adbdpara criar o exploit RageAgainstTheCage disponível emhttp://stealth
. openwall.net/xSports/RageAgainstTheCage.tgz.
A exploração deve ser executada através do shell ADB (sob oConchaUID). Basicamente,
bifurca processos até ogarfofalha na chamada, o que significa que o limite de processo para
esse usuário foi atingido. Este é um limite rígido imposto pelo kernel chamadoLIMITE_
NPROC, que especifica o número máximo de processos (ou threads) que podem ser
criados para o UID real do processo de chamada. Neste ponto, o exploit mataadbd,
fazendo com que ele reinicie (como root novamente). Infelizmente, desta vezadbd
não pode descartar privilégios para o shell porque o limite do processo foi atingido para
esse usuário. osetuidfalha na chamada,adbdnão detecta essa falha e, portanto, continua
executando com privilégios de root. Uma vez bem sucedido,adbdfornece um shell de raiz
atravésshell adbcomando.
Essa vulnerabilidade foi explorada por Joshua Wise nas primeiras versões da ferramenta de
desbloqueio não revogada. Mais tarde, quando Sebastian Krahmer fez o Zimperlich
explorar fontes públicas emhttp://c-skills.blogspot.com.es/2011/02/
zimperlich-sources.html,Joshua Wise decidiu abrir o código de seu Zysploit
implementação também, disponível emhttps://github.com/unrevoked/zysploit.
Vold: GingerBreak
Esta vulnerabilidade foi atribuída a CVE-2011-1823 e foi demonstrada pela primeira
vez por Sebastian Krahmer no exploit GingerBreak, disponível emhttp://c-skills
. blogspot.com.es/2011/04/yummy-yummy-gingerbreak.html.
O daemon do gerenciador de volume (vold) no Android 3.0 e 2.x antes do 2.3.4 confia nas
mensagens recebidas de um soquete PF_NETLINK, que permite a execução de código
arbitrário com privilégios de root por meio de um índice negativo que ignora uma
verificação de número inteiro assinado somente no máximo.
Capítulo 3-Enraizando seu dispositivo 77
PowerVR: levitador
Em outubro de 2011, Jon Larimer e Jon Oberheide lançaram o exploit do levitator em
http://jon.oberheide.org/files/levitator.c.Este exploit usa dois
vulnerabilidades que afetam dispositivos Android com o chipset PowerVR SGX. O
driver PowerVR nas versões do Android até 2.3.5 continha especificamente os
seguintes problemas.
Libsysutils: zergRush
A equipe revolucionária lançou o popular exploit zergRush em outubro de 2011;
fontes estão disponíveis emhttps://github.com/revolutionary/zergRush.o
vulnerabilidade explorada foi atribuído CVE-2011-3874, da seguinte forma:
O exploit usa o daemon do Volume Manager para acionar a vulnerabilidade, pois está
vinculado aolibsysutils.sobiblioteca e é executado como root. Como a pilha não é executável,
o exploit constrói uma cadeia de programação orientada a retorno (ROP) usando gadgets
delibc.sobiblioteca. Em seguida, enviavoldum especialmente elaboradoComando Framework
objeto, fazendo com queComando de execuçãoapontar para a carga útil ROP do exploit. Isso
executa o payload com privilégios de root, que descarta um shell de root e altera o
ro.kernel.qemupropriedade para 1. Como mencionado anteriormente, isso faz com que o
ADB reinicie com privilégios de root.
Um estudo de caso mais detalhado dessa vulnerabilidade é fornecido no Capítulo 8.
Kernel: mempodroid
A vulnerabilidade foi descoberta por Jüri Aedla e recebeu o identificador CVE
CVE-2012-0056:
A função mem_write no kernel Linux 2.6.39 e outras versões, quando o ASLR está
desabilitado, não verifica corretamente as permissões ao gravar em /proc/<pid>/mem, o
que permite que usuários locais obtenham privilégios modificando a memória do
processo, conforme demonstrado por Mempodipper.
O /proc/<pid>/memA entrada do sistema de arquivos proc é uma interface que pode ser usada
para acessar as páginas da memória de um processo por meio de operações de arquivo POSIX,
comoabrir, ler,eeu procuro.No kernel versão 2.6.39, as proteções para acessar a memória de
outros processos foram removidas por engano.
Jay Freeman (saurik) escreveu o exploit mempodroid para Android baseado em um
exploit anterior do Linux, o mempodipper, de Jason A. Donenfeld (zx2c4). A exploração do
mempodroid usa essa vulnerabilidade para gravar diretamente no segmento de código
docorrer comoprograma. Esse binário, usado para executar comandos como um UID de
aplicativo específico, executa set-uid root no Android padrão. Porquecorrer comoestá
vinculado estaticamente no Android, o exploit precisa do endereço na memória dosetresuid
ligue e osaídafunção, para que a carga útil possa ser colocada exatamente à direita
Capítulo 3-Enraizando seu dispositivo 79
Como você pode adivinhar agora, se o /dados/localpasta é gravável pelo shell do usuário
ou grupo, você pode explorar essa falha para tornar o /dadospasta gravável substituindo /
dados/local/tmpcom um link simbólico para /dadose reinicializar o dispositivo. Após a
reinicialização, você pode criar ou modificar o /data/local.proparquivo para definir a
propriedadero.kernel.qemupara 1.
Os comandos para explorar esta falha são os seguintes:
diretórios acessíveis por outros aplicativos. O segundo problema permitia restaurar conjuntos
de arquivos de pacotes executados sob um UID especial, comosistema, sem um agente de
backup especial para lidar com o processo de restauração.
Para explorar esses problemas, Andreas Makris (Bin4ry) criou um arquivo de
backup especialmente criado com um diretório legível/gravável/executável contendo
100 arquivos com o conteúdoro.kernel.qemu=1ero.secure=0dentro dele. Quando o
conteúdo deste arquivo é gravado em /data/local.prop,fazadbdexecute com privilégios
de root na inicialização. O exploit original pode ser baixado emhttp://
forum.xda-developers.com/showthread.php?t=1886460.
O seguinte one-liner, se executado enquanto orestauração adbcomando está em execução,
causa uma corrida entre o processo de restauração no serviço do gerenciador de backup e o
enquantoloop executado peloConchado utilizador:
a questão Exynos4. Ele incorporou um novo exploit no Framaroot que explora um estouro
de inteiro presente na correção da Samsung. Isso permite ignorar a validação adicional e
novamente permite sobrescrever a memória do kernel. Essas novas façanhas foram
silenciosamente incluídas no Farmaroot por Alephzain e mais tarde descobertas e
documentado por Dan Rosenberg emhttp://blog.azimuthsecurity.com/2013/02/re-
visiting-exynos-memory-mapping-bug.html.
Esta vulnerabilidade foi descoberta pela Giantpune e foi atribuído o identificador CVE
CVE-2012-4220:
A exploração iluminada usou essa vulnerabilidade para fazer com que o kernel
executasse código nativo da memória do espaço do usuário. Ao ler o /sys/class/leds/lcd-
backlight/regarquivo, era possível fazer com que o kernel processasse estruturas de dados
na memória do espaço do usuário. Durante esse processamento, ele chamou um ponteiro
de função de uma das estruturas, levando ao escalonamento de privilégios.
A exploração diaggetroot, para o dispositivo HTC J Butterfly, também usou essa
vulnerabilidade. No entanto, nesse dispositivo, o dispositivo de personagem vulnerável só
é acessível por usuário ou gruporádio. Para contornar essa situação, o pesquisador
abusou de um provedor de conteúdo para obter um descritor de arquivo aberto para o
dispositivo. O enraizamento por esse método só foi possível com a combinação das duas
técnicas. Você pode baixar o código de exploração emhttps://docs.google.com/
arquivo/d/0B8LDObFOpzZqQzducmxjRExXNnM/edit?pli=1.
Resumo
Fazer root em um dispositivo Android oferece controle total sobre o sistema Android. No entanto, se
você não tomar nenhuma precaução para corrigir os caminhos abertos para obter acesso root, a
segurança do sistema pode ser facilmente comprometida por um invasor.
Este capítulo descreveu os principais conceitos para entender o processo de enraizamento. Ele passou por
métodos legítimos de desbloqueio do carregador de inicialização, como os presentes em dispositivos com um
carregador de inicialização desbloqueado, bem como outros métodos que permitem obter e persistir o
acesso root em um dispositivo com um carregador de inicialização bloqueado. Finalmente,
82 Capítulo 3-Enraizando seu dispositivo
você viu uma visão geral dos exploits de root mais famosos que foram usados durante a última
década para fazer root em muitos dispositivos Android.
O próximo capítulo mergulha na segurança de aplicativos Android. Ele aborda problemas
comuns de segurança que afetam aplicativos Android e demonstra como usar ferramentas
públicas gratuitas para realizar avaliações de segurança de aplicativos.
APÓS
CH 4
A segurança de aplicativos tem sido um tópico importante desde antes mesmo do Android
existir. Durante o início da mania de aplicativos da Web, os desenvolvedores se reuniram
para desenvolver aplicativos rapidamente, ignorando as práticas básicas de segurança ou
usando estruturas sem controles de segurança adequados. Com o advento dos aplicativos
móveis, esse mesmo ciclo está se repetindo. Este capítulo começa discutindo alguns
problemas comuns de segurança em aplicativos Android. Ele conclui com dois estudos de
caso demonstrando a descoberta e exploração de falhas de aplicativos usando
ferramentas comuns.
Problemas comuns
83
84 Capítulo 4-Revisando a segurança do aplicativo
é provável que outras falhas — talvez até novas classes de problemas — venham
à tona.
Isso difere do código-fonte real desse método (no Android 4.2), que indica
uma chamada paraforceCallingOrSelfPermission,que verifica se o chamador tem
oACCESS_WIFI_STATEpermissão por meio de
forceChangePermission:
public void startScan(boolean forceActive) {
forceChangePermission();
mWifiStateMachine.startScan(forceActive);
noteScanStart();
}
...
private void forceChangePermission() {
mContext.enforceCallingOrSelfPermission(android.Manifest.
permission.CHANGE_WIFI_STATE,
"Serviço Wi-Fi");
}
Capítulo 4-Revisando a segurança do aplicativo 85
Outro
TelefoniaM
sion deACCE
desenvolvimento
} catch (SecurityException e) {
// Se tivermos permissão ACCESS_FINE_LOCATION, pule a verificação // para
ACCESS_COARSE_LOCATION
// Uma falha deve lançar o SecurityException de
// ACCESS_COARSE_LOCATION já que esta é a pré-condição mais fraca
mApp.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
}
Esses tipos de descuidos, embora aparentemente inócuos, geralmente levam a más práticas por
parte dos desenvolvedores, a sabersubconcessãoou pior,superlotaçãode permissões. No caso de
subconcessão, muitas vezes é um problema de confiabilidade ou funcionalidade, como um problema
não tratadoExceção de segurançaleva ao travamento do aplicativo. Quanto à concessão excessiva, é mais
uma questão de segurança; imagine um aplicativo cheio de bugs e com privilégios excessivos
explorado por um aplicativo malicioso, levando efetivamente ao escalonamento de privilégios.
Para obter mais informações sobre a pesquisa de mapeamento de permissões, consulte
www.slideshare.net/quineslideshare/mapping-and-evolution-of-androidpermissions.
Como ele recebe escrutínio constante, a ideia geral de segurança de transporte (por exemplo,
SSL, TLS e assim por diante) geralmente é bem compreendida. Infelizmente, isso nem sempre
se aplica ao mundo dos aplicativos móveis. Talvez devido à falta de entendimento sobre como
implementar corretamente SSL ou TLS, ou apenas a noção incorreta de que “se for pela rede da
operadora, é seguro”, os desenvolvedores de aplicativos móveis às vezes falham em proteger
dados confidenciais em trânsito.
Esse problema tende a se manifestar de uma ou mais das seguintes maneiras:
Descobrir problemas de transmissão insegura pode ser tão simples quanto capturar o tráfego
enviado do dispositivo de destino. Os detalhes sobre a construção de uma plataforma man-in-the-
middle estão fora do escopo deste livro, mas existem várias ferramentas e tutoriais para facilitar essa
tarefa. Em um piscar de olhos, o emulador do Android suporta tanto o proxy de tráfego quanto o
despejo de tráfego para um rastreamento de pacote no formato PCAP. Você pode conseguir isso
passando o -proxy HTTPou -tcpdumpopções, respectivamente.
Um exemplo público proeminente de transmissão de dados insegura foi a
implementação do protocolo de autenticação Google ClientLogin em determinados
componentes do Android 2.1 a 2.3.4. Esse protocolo permite que os aplicativos solicitem
um token de autenticação para a conta do Google do usuário, que pode ser reutilizado
para transações subsequentes na API de um determinado serviço.
Em 2011, pesquisadores da Universidade de Ulm descobriram que os aplicativos
Calendário e Contatos no Android 2.1 a 2.3.3 e o serviço Picasa Sync no Android 2.3.4
enviavam o token de autenticação Google ClientLogin por HTTP de texto simples. Depois
que um invasor obtiver esse token, ele poderá ser reutilizado para representar o usuário.
Como existem inúmeras ferramentas e técnicas para conduzir ataques man-in-the-middle
em redes Wi-Fi, a interceptação desse token seria fácil – e seria uma má notícia para um
usuário em uma rede Wi-Fi hostil ou não confiável.
Para obter mais informações sobre as descobertas do Google ClientLogin da Universidade de Ulm,
Vejowww.uni-ulm.de/en/in/mi/staff/koenings/catching-authtokens.html.
Capítulo 4-Revisando a segurança do aplicativo 87
O Android oferece vários recursos padrão para armazenamento de dados, ou seja, preferências
compartilhadas, bancos de dados SQLite e arquivos antigos simples. Além disso, cada um desses tipos
de armazenamento pode ser criado e acessado de várias maneiras, incluindo código gerenciado e
nativo, ou por meio de interfaces estruturadas, como provedores de conteúdo. Os erros mais comuns
incluem armazenamento em texto simples de dados confidenciais, provedores de conteúdo
desprotegidos (discutidos posteriormente) e permissões de arquivo inseguras.
Um exemplo coeso de armazenamento de texto simples e permissões de arquivos
inseguros é o cliente Skype para Android, que apresentou esses problemas em abril de
2011. Relatado por Justin Case (jcase) viahttp://AndroidPolice.com,o aplicativo Skype criou
vários arquivos, como bancos de dados SQLite e arquivos XML, com permissões de leitura
e gravação mundial. Além disso, o conteúdo não era criptografado e incluía dados de
configuração e logs de mensagens instantâneas. A saída a seguir mostra o diretório de
dados do aplicativo Skype do jcase, bem como o conteúdo parcial do arquivo:
# ls -l /data/data/com.skype.merlin_mecha/files/jcaseap
- rw-rw-rw- app_152 aplicativo_152 331776 2011-04-13 00:08 main.db 119528 2011-04-13
- rw-rw-rw- app_152 aplicativo_152 00:08 main.db-journal 40960 2011-04-11 14:05
- rw-rw-rw- app_152 aplicativo_152 keyval.db 3522 2011-04-12 23:39 config.xml
- rw-rw-rw- app_152 aplicativo_152
NOTAA partir do Android 4.1, o umask para Zygote foi definido para um valor mais seguro de
077. Mais informações sobre essa alteração são apresentadas no Capítulo 12.
88 Capítulo 4-Revisando a segurança do aplicativo
O recurso de log do Android é uma ótima fonte de vazamentos de informações. Por meio do uso
gratuito de métodos de log pelos desenvolvedores, geralmente para fins de depuração, os aplicativos
podem registrar qualquer coisa, desde mensagens gerais de diagnóstico até credenciais de login ou
outros dados confidenciais. Mesmo os processos do sistema, como o ActivityManager, registram
mensagens bastante detalhadas sobre a invocação de atividade. Aplicações com o
READ_LOGSpermissão pode obter acesso a essas mensagens de log (por meio
dologcatcomando).
Você vê o navegador de ações sendo chamado, talvez por meio do usuário tocar em um link
em um e-mail ou mensagem SMS. Os detalhes do Intent que está sendo passado são
claramente visíveis e incluem o URL (http://www.wiley.com/)o usuário está visitando. Embora esse
exemplo trivial possa não parecer um problema importante, nessas circunstâncias ele
apresenta uma oportunidade de coletar algumas informações sobre a atividade de navegação
na web de um usuário.
Um exemplo mais convincente de registro excessivo foi encontrado no navegador
Firefox para Android. Neil Bergman relatou esse problema no rastreador de bugs da
Mozilla em dezembro de 2012. O Firefox no Android registrou atividade de navegação,
incluindo URLs que foram visitados. Em alguns casos, isso inclui identificadores de sessão,
como Neil apontou em sua entrada de bug e saída associada dologcatcomando:
I/GeckoBrowserApp(17773): Favicon carregado com sucesso para URL = https://mobile.walmart.com/m/
pharmacy;jsessionid=83CB330691854B071CD172D41DC2C3 AB
AB
E/GeckoConsole(17773): [Aviso de JavaScript: "Erro na análise do valor de 'fundo'. Declaração
descartada." {Arquivo:
"https://mobile.walmart.com/m/pharmacy;jsessionid=83CB330691854B071CD172D41DC2C 3AB?
wicket:bookmarkablePage=:com.wm.mobile.web.rx.privacy.PrivacyPractices" linha: 0}]
Nesse caso, um aplicativo malicioso (com acesso ao log) poderia coletar esses identificadores
de sessão e sequestrar a sessão da vítima no aplicativo remoto da Web. Para obter mais
detalhes sobre esse problema, consulte o rastreador de bugs da Mozilla emhttps://
bugzilla.mozilla.org/show_bug.cgi?id=825685.
NOTAOs intents implícitos são aqueles sem um componente de destino específico, enquanto os
intents explícitos visam um aplicativo específico e um componente de aplicativo (como
“com.wiley.exampleapp.SomeActivity”).
realizado usando Intents. Isso inclui ações como iniciar o serviço, interromper o serviço ou
vincular-se ao serviço. Um serviço vinculado também pode expor uma camada adicional
de funcionalidade específica do aplicativo para outros aplicativos. Como essa
funcionalidade é personalizada, um desenvolvedor pode ser tão ousado a ponto de expor
um método que executa comandos arbitrários.
Um bom exemplo do efeito potencial de explorar uma interface IPC
desprotegida é a descoberta de Andre “sh4ka” Moulu no aplicativo Samsung Kies
no Galaxy S3. sh4ka descobriu que o Kies, um aplicativo de sistema altamente
privilegiado (incluindo ter oINSTALL_PACKAGESpermissão) tinha um
BroadcastReceiver que restaurava pacotes de aplicativos (APKs) do /sdcard/
restaurardiretório. O trecho a seguir é da descompilação de Kies do sh4ka:
...
if
(paramIntent.getAction().toString().equals( "com.intent.action.KIES_START_RESTORE_APK"))
{
kies_start.m_nKiesActionEvent = 15; int i3 =
Log.w("KIES_START",
"KIES_ACTION_EVENT_SZ_START_RESTORE_APK");
byte[] arrayOfByte11 = new byte[6];
byte[] arrayOfByte12 = paramIntent.getByteArrayExtra("head"); byte[]
arrayOfByte13 = paramIntent.getByteArrayExtra("corpo"); byte[] arrayOfByte14 =
new byte[arrayOfByte13.length]; int i4 = arrayOfByte13.length;
intentCreateTemp.putExtra("pastePath", "/data/data/
com.android.clipboardsaveservice/temp/");
startService(intentCreateTemp);
Intenção intentStartRestore =
new Intent("com.intent.action.KIES_START_RESTORE_APK"); intentStartRestore.putExtra("head",
new String("cocacola").getBytes()); intentStartRestore.putExtra("body", new
String("cocacola").getBytes()); sendBroadcast(intentStartRestore);
Para mais informações sobre o trabalho de sh4ka, confira sua postagem no blog emhttp://sh4ka.
fr/android/galaxys3/from_0perm_to_INSTALL_PACKAGES_on_galaxy_S3.html.
Perfil
Na fase de criação de perfil, você reúne algumas informações superficiais sobre o
aplicativo de destino e tem uma ideia do que está enfrentando. Supondo que você tenha
pouca ou nenhuma informação sobre o aplicativo para começar (às vezes chamado de
abordagem de “conhecimento zero” ou “caixa preta”), é importante aprender um pouco
sobre o desenvolvedor, as dependências do aplicativo e quaisquer outras propriedades
notáveis pode ter. Isso ajudará a determinar quais técnicas empregar em outras fases e
pode até revelar alguns problemas por conta própria, como utilizar uma biblioteca ou
serviço da Web com vulnerabilidade conhecida.
Primeiro, tenha uma ideia do propósito do aplicativo, seu desenvolvedor e o histórico
de desenvolvimento ou revisões. Basta dizer que aplicativos com pouca segurança
92 Capítulo 4-Revisando a segurança do aplicativo
histórico
Figura 4-3 sh
aplicação o
Ao examinar essa entrada um pouco mais, você percebe que ela solicita algumas
permissões. Este aplicativo, se instalado, seria bastante privilegiado no que diz
respeito aos aplicativos de terceiros. Ao clicar na guia Permissões na interface do
Play, você pode observar quais permissões estão sendo solicitadas, conforme
mostrado na Figura 4-4.
Com base na descrição e em algumas das permissões listadas, você pode tirar
algumas conclusões. Por exemplo, a descrição menciona travamento remoto,
limpeza e alerta de áudio, que, quando combinados com oLER_SMSpermissão, pode
levar você a acreditar que o SMS é usado para comunicações fora de banda, o que é
comum entre aplicativos antivírus móveis. Anote isso para mais tarde, porque
significa que você pode ter algum código de receptor de SMS para examinar.