Escolar Documentos
Profissional Documentos
Cultura Documentos
com
Atualizar problemas
estão no centro da questão. No geral, esse é o maior fator que contribui para o
grande número de dispositivos inseguros em uso no ecossistema Android.
Mecanismos de atualização
A causa raiz desse problema decorre dos processos divergentes envolvidos na atualização de software
no Android. As atualizações de aplicativos são tratadas de maneira diferente das atualizações do
sistema operacional. Um desenvolvedor de aplicativos pode implantar um patch para uma falha de
segurança em seu aplicativo por meio do Google Play. Isso é verdade se o aplicativo for escrito pelo
Google, OEMs, operadoras ou desenvolvedores independentes. Por outro lado, uma falha de
segurança no próprio sistema operacional requer a implantação de uma atualização de firmware ou
atualização OTA. O processo de criação e implantação desses tipos de atualizações é muito mais
árduo.
Por exemplo, considere um patch para uma falha no sistema operacional Android
principal. Um patch para esse problema começa com o Google corrigindo o problema
primeiro. É aqui que as coisas ficam complicadas e se tornam dependentes do dispositivo.
Para dispositivos Nexus, o firmware atualizado pode ser lançado diretamente para os
usuários finais neste momento. No entanto, a atualização de um dispositivo de marca
OEM ainda exige que os OEMs produzam uma versão incluindo a correção de segurança
do Google. Em outra reviravolta, os OEMs podem entregar o firmware atualizado
diretamente aos usuários finais de dispositivos OEM desbloqueados neste momento. Para
dispositivos subsidiados pela operadora, a operadora deve preparar sua construção
personalizada incluindo a correção e entregá-la à base de clientes. Mesmo neste exemplo
simples, o caminho de atualização para vulnerabilidades do sistema operacional é muito
mais complicado do que atualizações de aplicativos.
Frequência de atualização
Como mencionado anteriormente, as novas versões do Android são adotadas de forma bastante
lenta. Na verdade, essa questão em particular gerou protestos públicos em várias ocasiões. Em abril
de 2013, a American Civil Liberties Union (ACLU) apresentou uma queixa à Federal Trade Commission
(FTC). Eles afirmaram que as quatro principais operadoras de celular nos EUA não forneceram
atualizações de segurança oportunas para os smartphones Android que vendem. Eles afirmam ainda
que isso é verdade mesmo que o Google tenha publicado atualizações para corrigir vulnerabilidades
de segurança exploráveis. Sem receber atualizações de segurança oportunas, o Android não pode ser
considerado um sistema operacional maduro, seguro ou protegido. Não é nenhuma surpresa que as
pessoas estão procurando por ação do governo sobre o assunto.
Retroportação
Atualizando dependências
Manter-se atualizado com projetos de código aberto upstream é uma tarefa complicada. Isso é
especialmente verdadeiro no ecossistema Android porque o ciclo de vida do patch é muito
estendido. Por exemplo, o Android Framework inclui um mecanismo de navegador da Web
chamado WebKit. Vários outros projetos também usam esse mecanismo, incluindo o navegador
da Web Chrome do Google. O Chrome tem um ciclo de vida de patch admiravelmente curto, da
ordem de semanas. Ao contrário do Android, ele também possui um programa de recompensas
de bugs bem-sucedido no qual o Google paga e divulga as vulnerabilidades descobertas a cada
lançamento de patch. Infelizmente, muitos desses bugs estão presentes no código usado pelo
Android. Esse bug é muitas vezes referido como ummeio dia vulnerabilidade. O termo nasce do
termometade-vida, que mede a taxa na qual o material radioativo decai. Da mesma forma, um
bug de meio dia é aquele que está se deteriorando. Infelizmente, enquanto decai, os usuários
do Android ficam expostos a ataques que podem aproveitar esses tipos de bugs.
Os fornecedores também lutam para encontrar um equilíbrio entre segurança e abertura. Todos os
fornecedores querem clientes satisfeitos. Como mencionado anteriormente, os fornecedores modificam
22 Capítulo 1-Olhando para o ecossistema
Android para agradar os usuários e se diferenciar. Bugs podem ser introduzidos no processo, o
que diminui a segurança geral. Os fornecedores devem decidir se farão tais modificações. Além
disso, os fornecedores oferecem suporte aos dispositivos após a compra. As modificações do
usuário avançado podem desestabilizar o sistema e levar a chamadas de suporte
desnecessárias. Manter os custos de suporte baixos e proteger contra substituições
fraudulentas de garantia são os melhores interesses dos fornecedores. Para lidar com esse
problema específico, os fornecedores empregam mecanismos de bloqueio do carregador de
inicialização. Infelizmente, esses mecanismos também dificultam a modificação de seus
dispositivos por usuários avançados competentes. Para comprometer, muitos fornecedores
oferecem maneiras para os usuários finais desbloquearem os dispositivos. Você pode ler mais
sobre esses métodos no Capítulo 3.
Divulgações públicas
Por último, mas não menos importante, a complexidade final está relacionada às divulgações
públicas, ou anúncio público, de vulnerabilidades. Em segurança da informação, esses anúncios
servem como aviso para administradores de sistema e consumidores experientes atualizarem o
software para corrigir vulnerabilidades descobertas. Várias métricas, incluindo participação total
no processo de divulgação, podem ser usadas para avaliar a maturidade de segurança de um
fornecedor. Infelizmente, tais divulgações são extremamente raras no ecossistema Android.
Aqui documentamos divulgações públicas conhecidas e exploramos várias possíveis razões
pelas quais esse é o caso.
Em 2008, o Google iniciou oandroid-security-announcelista de e-mails em grupos do
Google. Infelizmente, a lista contém apenas um único post apresentando a lista. Você
pode encontrar essa única mensagem emhttps://groups.google.com/d/
msg/android-security-announce/aEba2l7U23A/vOyOllbBxw8J.Após a inicial
post, nem um único anúncio oficial de segurança foi feito. Como tal, a única maneira
de rastrear problemas de segurança do Android é lendo os logs de alterações no
AOSP, rastreando as alterações do Gerrit ou separando o trigo do joio no Android
rastreador de problemas emhttps://code.google.com/p/android/issues/list.Esses
os métodos são demorados, propensos a erros e improváveis de serem integrados às práticas
de avaliação de vulnerabilidade.
Embora não esteja claro por que o Google não seguiu com suas intenções de entregar
anúncios de segurança, existem vários motivos possíveis. Uma possibilidade envolve a
exposição estendida a vulnerabilidades crescentes no ecossistema Android. Por causa
desse problema, é possível que o Google considere a divulgação pública de problemas
corrigidos como irresponsável. Muitos profissionais de segurança, incluindo os autores
deste texto, acreditam que o perigo imposto por tal divulgação é muito menor do que a
exposição prolongada em si. Ainda outra possibilidade envolve as complexas parcerias
entre o Google, fabricantes de dispositivos e operadoras. É fácil ver como a divulgação de
uma vulnerabilidade que permanece presente no produto de um parceiro de negócios
pode ser vista como um mau negócio. Se este
Capítulo 1-Olhando para o ecossistema 23
é o caso, significa que o Google está priorizando uma relação comercial antes do
bem do público.
Além do Google, muito poucas outras partes interessadas do Android no lado do fornecedor
realizaram divulgações públicas. Muitos OEMs evitaram totalmente a divulgação pública, até
mesmo evitando perguntas da imprensa sobre vulnerabilidades de botão de acesso. Por
exemplo, embora a HTC tenha uma política de divulgação publicada emwww.htc.com/www/terms/
product-security/,a empresa nunca fez uma divulgação pública até o momento. Em algumas
ocasiões, as operadoras mencionaram que suas atualizações incluem “correções de segurança
importantes”. Em ainda menos ocasiões, as operadoras até referenciaram números CVE
públicos atribuídos a questões específicas.
oVulnerabilidades e exposições comuns(CVE) visa criar um número de rastreamento
centralizado e padronizado para vulnerabilidades. Profissionais de segurança, especialmente
especialistas em vulnerabilidades, usam esses números para rastrear problemas em software
ou hardware. O uso de números CVE melhora muito a capacidade de identificar e discutir um
problema além dos limites organizacionais. As empresas que adotam o projeto CVE
normalmente são vistas como as mais maduras, pois reconhecem a necessidade de
documentar e catalogar problemas anteriores em seus produtos.
De todas as partes interessadas do lado do fornecedor, uma se destacou por levar
a sério a divulgação pública. Esse fornecedor é a Qualcomm, com seu fórum Code
Aurora. Este grupo é um consórcio de empresas com projetos que atendem a
indústria de telefonia móvel e é operado pela Qualcomm. O site Code Aurora tem
uma página de avisos de segurança disponível emhttps://www.codeaurora.org/projects/
conselhos de segurança,com detalhes abrangentes sobre questões de segurança e números
CVE. Esse nível de maturidade é aquele que outras partes interessadas devem buscar
seguir para que a segurança do ecossistema Android como um todo possa melhorar.
Em geral, os pesquisadores de segurança são os maiores defensores das divulgações públicas no
ecossistema Android. Embora nem todo pesquisador de segurança seja totalmente disponível, eles
são responsáveis por trazer os problemas à atenção de todas as outras partes interessadas. Muitas
vezes, os problemas são divulgados publicamente por pesquisadores independentes ou empresas de
segurança em listas de discussão, em conferências de segurança ou em outros fóruns públicos. Cada
vez mais, os pesquisadores estão coordenando essas divulgações com as partes interessadas do lado
do fornecedor para melhorar de forma segura e silenciosa a segurança do Android.
Resumo
Neste capítulo, você viu como o sistema operacional Android cresceu ao longo dos
anos para conquistar o mercado de sistemas operacionais móveis (SO) de baixo para
cima. O capítulo guiou você pelos principais atores envolvidos no ecossistema
Android, explicando seus papéis e motivações. Você examinou de perto os vários
problemas que afetam o ecossistema Android, incluindo como eles afetam a
segurança. Armado com uma compreensão profunda do complexo do Android
24 Capítulo 1-Olhando para o ecossistema
CH 2
Segurança Android y Design
e arco arquitetura
25
26 Capítulo 2-Design e arquitetura de segurança do Android
API
android.*
Encadernador
Dalvik/Android Runtime/Zygote
JNI
Bibliotecas Hardware
Daemons Nativos Iniciar/Caixa de ferramentas
Bionic/OpenGL/WebKit/... Camada de Abstração
Kernel Linux
Wakelocks/Lowmem/Binder/Ashmem/Logger/RAM Console/...
Fonte: Karim Yaghmour da Opersys Inc. (licença Creative Commons Share-Alike 3.0)
http://www.slideshare.net/opersys/inside-androids-ui
Sandbox do Android
A base do Linux do Android traz consigo uma herança bem compreendida de isolamento de
processos semelhante ao Unix e o princípio de privilégio mínimo. Especificamente, o conceito
de que processos executados como usuários separados não podem interferir uns nos outros,
como enviar sinais ou acessar o espaço de memória um do outro. Portanto, grande parte da
sandbox do Android é baseada em alguns conceitos-chave: isolamento de processo padrão do
Linux, IDs de usuário exclusivos (UIDs) para a maioria dos processos e permissões de sistema
de arquivos altamente restritas.
O Android compartilha o paradigma UID/ID de grupo (GID) do Linux, mas não tem o tradicional
senhaegrupoarquivos para sua fonte de credenciais de usuário e grupo. Em vez disso, o Android define
e usuários críticos do sistema, como osistemagrupo de usuários. O Android também reserva intervalos de AID
usados para provisionar UIDs de aplicativos. As versões do Android após a 4.1 adicionaram intervalos de AID
adicionais para vários perfis de usuário e usuários de processos isolados (por exemplo, para mais sandboxing
do Chrome). Você pode encontrar definições para AIDS emsistema/núcleo/
include/private/android_filesystem_config.hno Android Open Source
Árvore do projeto (AOSP). O seguinte mostra um trecho que foi editado para brevidade:
Além dos AIDs, o Android usa grupos suplementares para permitir que os processos
acessem recursos compartilhados ou protegidos. Por exemplo, a adesão ao
sdcard_rwgroup permite que um processo leia e escreva o /cartão SDdiretório, pois suas
opções de montagem restringem quais grupos podem ler e gravar. Isso é semelhante a
como os grupos suplementares são usados em muitas distribuições Linux.
NOTAEmbora todas as entradas de AID sejam mapeadas para um UID e um GID, o UID pode não ser
necessariamente usado para representar um usuário no sistema. Por exemplo,AID_SDCARD_RWmapas para
sdcard_rw, mas é usado apenas como um grupo suplementar, não como um UID no sistema.
Capítulo 2-Design e arquitetura de segurança do Android 29
NOTAUma discussão completa sobre os recursos do Linux está fora do escopo deste capítulo.
Você pode encontrar mais informações sobre a segurança do processo do Linux e os recursos
do Linux na página do kernel do Linux.Documentation/security/credentials.txt e acapacidades
página de manual, respectivamente.
Quando os aplicativos são executados, seu UID, GID e grupos complementares são
atribuídos ao processo recém-criado. A execução sob um UID e GID exclusivos permite
que o sistema operacional imponha restrições de nível inferior no kernel e que o tempo de
execução controle a interação entre aplicativos. Este é o ponto crucial da sandbox do
Android.
O trecho a seguir mostra a saída dopscomando em um HTC One
V. Observe o UID proprietário na extrema esquerda, cada um deles exclusivo para cada processo de
aplicativo:
Os aplicativos também podem compartilhar UIDs, por meio de uma diretiva especial no
pacote do aplicativo. Isso é discutido com mais detalhes na seção “Principais componentes
do aplicativo”.
Sob o capô, os nomes de usuário e grupo exibidos para o processo são, na
verdade, fornecidos por implementações específicas do Android das funções POSIX
normalmente usadas para definir e buscar esses valores. Por exemplo, considere a
getpwuidfunção (definida emesboços.cppna biblioteca Bionic):
30 Capítulo 2-Design e arquitetura de segurança do Android
Como seus irmãos,getpwuidpor sua vez, chama funções adicionais específicas do Android,
tal comoandroid_id_to_passwdeapp_id_to_passwd.Essas funções então
preencher uma estrutura de senha Unix com as informações do AID correspondente
ção. oandroid_id_to_passwdchamadas de funçãoandroid_iinfo_to_passwdpara
realizar isso:
Permissões do Android
<assinaturas contagem="1">
índice="0"
<certificado />
</sigs>
<perm>
<item name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<item name="android.permission.NFC" />
...
<item name="android.permission.WRITE_EXTERNAL_STORAGE" />
<item name="android.permission.ACCESS_COARSE_LOCATION" />
...
<item name="android.permission.CAMERA" />
<item name="android.permission.INTERNET" />
...
</perms>
</pacote>
...
<permission name="android.permission.INTERNET" >
<group gid="inet" />
</permission>
Os direitos definidos nas entradas do pacote são aplicados posteriormente de duas maneiras. O
primeiro tipo de verificação é feito no momento da invocação de um determinado método e é imposto
pelo tempo de execução. O segundo tipo de verificação é aplicado em um nível inferior no sistema
operacional por uma biblioteca ou pelo próprio kernel.
Permissões da API
.:
drwxrwx--x u0_a55 u0_a55 17-10-2013 00:07 cache
drwxrwx--x u0_a55 u0_a55 2013-10-17 00:07 bancos de dados
drwxrwx--x u0_a55 u0_a55 2013-10-17 00:07 arquivos
instalar lrwxrwxrwx instalar 22/10/2013 18:16 lib ->
/data/app-lib/com.twitter.android-1 drwxrwx--x
u0_a55 u0_a55 17-10-2013 00:07 shared_prefs
. /cache:
drwx------ u0_a55 u0_a55 17-10-2013 00:07
com.android.renderscript.cache
. /cache/com.android.renderscript.cache:
. /bancos de dados:
- rw-rw---- u0_a55 u0_a55 184320 2013-10-17 06:47 0-3.db
- rw------- u0_a55 u0_a55 8720 17-10-2013 06:47 0-3.db-journal 61440
- rw-rw---- u0_a55 u0_a55 22-10-2013 18:17 global.db 16928 22-10-2013 18:17
- rw------- u0_a55 u0_a55 global.db-journal
. /arquivos:
drwx------ u0_a55 u0_a55 22/10/2013 18:18
com.crashlytics.sdk.android
. /files/com.crashlytics.sdk.android:
- rw------- u0_a55 u0_a55 80 22/10/2013 18:18
5266C1300180-0001-0334-EDCC05CFF3D7BeginSession.cls
. /shared_prefs:
- rw-rw---- u0_a55 u0_a55 155 2013-10-17 00:07 com.crashlytics.prefs.
xml
- rw-rw---- u0_a55 u0_a55 143 2013-10-17 00:07
com.twitter.android_preferences.xml
root@android :/ # montar
...
/dev/block/dm-2 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime, uid=1000,gid=1015
,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,
iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
...
root@android :/ # ls -l /mnt . . .
Aqui você vê que o cartão SD é montado com GID 1015, que corresponde ao
sdcard_rwgrupo. As candidaturas que solicitam oWRITE_EXTERNAL_STORAGE
permissão terá seu UID adicionado a este grupo, concedendo-lhes acesso de gravação a este
caminho.
Permissões de IPC
Esta seção examina mais de perto as partes mais relevantes para a segurança da pilha de
software do Android, incluindo aplicativos, a estrutura do Android, o DalvikVM, o suporte
ao código nativo do espaço do usuário e serviços associados e o kernel do Linux. Isso
ajudará a preparar o terreno para os capítulos posteriores, que entrarão em maiores
detalhes sobre esses componentes. Isso fornecerá o conhecimento necessário para atacar
esses componentes.
Aplicativos Android
Para entender como avaliar e atacar a segurança dos aplicativos Android, primeiro
você precisa entender do que eles são feitos. Esta seção discute as partes pertinentes
à segurança dos aplicativos Android, o tempo de execução do aplicativo e os
mecanismos IPC de suporte. Isso também ajuda a lançar as bases para o Capítulo 4.
O Android usa criptografia de chave pública para diversos fins relacionados a aplicativos.
Primeiro, o Android usa umchave de plataformapara assinar pacotes de aplicativos pré-
instalados. Os aplicativos assinados com esta chave são especiais, pois podem tersistema
privilégios do usuário. Em seguida, os aplicativos de terceiros são assinados com chaves
geradas por desenvolvedores individuais. Para aplicativos pré-instalados e instalados pelo
usuário, o Android usa a assinatura para evitar atualizações de aplicativos não autorizadas.
Embora os aplicativos Android consistam em várias partes, esta seção destaca aqueles que são
notáveis na maioria dos aplicativos, independentemente da versão de destino do Android.
Estes incluem oManifesto Android,Intenções,Atividades,Receptores de transmissão, Serviços, e
Provedores de conteúdo. Os últimos quatro desses componentes representam terminais IPC,
que possuem propriedades de segurança particularmente interessantes.
AndroidManifest.xml
Todos os pacotes de aplicativos Android (APKs) devem incluir oManifesto Android. xml
Arquivo. Este arquivo XML contém uma miscelânea de informações sobre o
aplicativo, incluindo o seguinte:
- Nome de pacote exclusivo (por exemplo,com.wiley.SomeApp)e informações da versão
Intenções
Uma parte fundamental da comunicação entre aplicativos éIntenções. Esses são objetos de
mensagem que contêm informações sobre uma operação a ser executada, o componente de
destino opcional no qual agir e sinalizadores adicionais ou outras informações de suporte (que
podem ser significativas para o destinatário). Quase todas as ações comuns, como
36 Capítulo 2-Design e arquitetura de segurança do Android
Atividades
...
<activity android:theme="@style/Theme_NoTitle_FullScreen"
android:name="com.yougetitback.androidapplication.ReportSplashScreen"
android:screenOrientation="portrait" />
<activity android:theme="@style/Theme_NoTitle_FullScreen"
android:name="com.yougetitback.androidapplication.SecurityQuestionScreen"
android:screenOrientation="portrait" />
<activity android:label="@string/app_name"
android:name="com.yougetitback.androidapplication.SplashScreen"
android:clearTaskOnLaunch="false" android:launchMode="singleTask"
android:screenOrientation="portrait">
<filtro de intenção>
<action android:name="android.intent.action.MAIN" /> </intent-filter>
...
Receptores de transmissão
<receptor android:name=".MySMSReceiver">
<filtro de intenção android:prioridade:"999">
<action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter>
</receptor>
Serviços
Serviçossão componentes de aplicativo sem uma interface do usuário que são executados em
segundo plano, mesmo que o usuário não esteja interagindo diretamente com o aplicativo do
Serviço. Alguns exemplos de serviços comuns no Android incluem oServiço de Receptor de SMSe a
BluetoothOppService.Embora cada um desses serviços seja executado fora da visão direta do
usuário, como outros componentes de aplicativos Android, eles podem aproveitar as facilidades
do IPC enviando e recebendo Intents.
Os serviços também devem ser declarados no manifesto do aplicativo. Por exemplo, aqui está uma
definição simples para um serviço que também apresenta um filtro de intent:
<serviço
android:name="com.yougetitback.androidapplication.FindLocationService">
<filtro de intenção>
<ação
android:name="com.yougetitback.androidapplication.FindLocationService" />
</intent-filter>
</serviço>
Normalmente, os serviços podem ser interrompidos, iniciados ou vinculados, tudo por meio
de Intents. No último caso, vinculado a um serviço, um conjunto adicional de procedimentos IPC
ou RPC pode estar disponível para o chamador. Esses procedimentos são específicos para a
implementação de um serviço e aproveitam mais profundamente o serviço Binder, discutido
posteriormente na seção “Kernel” do capítulo.
Provedores de conteúdo
Os provedores de conteúdo atuam como uma interface estruturada para armazenamentos de dados
comuns e compartilhados. Por exemplo, o provedor de contatos e o provedor de calendário
gerenciam repositórios centralizados de entradas de contato e entradas de calendário,
respectivamente, que podem ser acessados por outros aplicativos (com as permissões apropriadas).
Os aplicativos também podem criar seus próprios provedores de conteúdo e, opcionalmente, expô-los
a outros aplicativos. Os dados expostos por esses provedores geralmente são apoiados por um banco
de dados SQLite ou um caminho direto do sistema de arquivos (por exemplo, um media player
indexando e compartilhando caminhos para arquivos MP3).
Assim como outros componentes do aplicativo, a capacidade de ler e gravar provedores
de conteúdo pode ser restrita com permissões. Considere o seguinte trecho de um
exemploAndroidManifest.xmlArquivo:
<provider android:name="com.wiley.example.MyProvider"
android:writePermission="com.wiley.example.permission.WRITE"
android:authorities="com.wiley.example.data" />
A estrutura do Android
A cola entre aplicativos e o tempo de execução, oEstrutura do Androidfornece as peças — pacotes e
suas classes — para que os desenvolvedores executem tarefas comuns. Essas tarefas podem incluir o
gerenciamento de elementos de UI, o acesso a armazenamentos de dados compartilhados e a
transmissão de mensagens entre os componentes do aplicativo. A saber, inclui qualquer código não
específico do aplicativo que ainda seja executado no DalvikVM.
Os pacotes de framework comuns são aqueles dentro doandroid.*namespace,
tal comoandroid.contentouandroid.telephony.O Android também oferece muitos
classes Java padrão (noJava.*ejavax.*namespaces), bem como pacotes adicionais
de terceiros, como bibliotecas de cliente Apache HTTP e o analisador SAX XML. O
Android Framework também inclui os serviços usados para gerenciar e facilitar
grande parte da funcionalidade fornecida pelas classes dentro dele. Esses
chamados gerentes são iniciados porservidor_sistema (discutido na seção “Zygote”)
após a inicialização do sistema. A Tabela 2-1 mostra alguns desses gerentes e
sua descrição/função na estrutura.
Ver sistema Gerencia visualizações (composições de interface do usuário que um usuário vê) em atividades
Gerente de Recursos Fornece acesso a recursos de aplicativos sem código, como gráficos, layouts de interface do
Você pode ver alguns desses gerenciadores aparecendo como tópicos dentro do
servidor_sistemaprocesso usando opscomando, especificando oservidor_sistema
PID e -topção:
4. Todos os arquivos de classe são combinados em um único arquivo executável Dalvik (DEX).
Como uma máquina virtual baseada em registro, a Dalvik possui cerca de 64.000 registros
virtuais. No entanto, é mais comum que apenas os primeiros 16, ou raramente 256, sejam
usados. Esses registradores são simplesmente locais de memória designados na memória da
VM que simulam a funcionalidade de registrador dos microprocessadores. Assim como um
microprocessador real, o DalvikVM usa esses registradores para manter o estado e geralmente
acompanhar as coisas enquanto executa o bytecode.
O DalvikVM é projetado especificamente para as restrições impostas por um
sistema embarcado, como baixa memória e velocidade do processador. Portanto, o
DalvikVM foi projetado com velocidade e eficiência em mente. As máquinas virtuais,
afinal, são uma abstração da máquina de registro subjacente da CPU. Isso significa
inerentemente perda de eficiência, razão pela qual o Google procurou minimizar
esses efeitos.
Para aproveitar ao máximo essas restrições, os arquivos DEX são otimizados antes de serem
interpretados pela máquina virtual. Para arquivos DEX iniciados a partir de um aplicativo
Android, isso geralmente acontece apenas uma vez quando o aplicativo é iniciado pela primeira
vez. A saída deste processo de otimização é um arquivo DEX otimizado
Capítulo 2-Design e arquitetura de segurança do Android 41
(ODEX). Deve-se notar que os arquivos ODEX não são portáveis em diferentes
revisões do DalvikVM ou entre dispositivos.
Semelhante ao Java VM, o DalvikVM faz interface com código nativo de nível inferior
usando Java Native Interface (JNI). Esse pouco de funcionalidade permite chamar de
código Dalvik para código nativo e vice-versa. Informações mais detalhadas sobre o
DalvikVM, o formato de arquivo DEX e JNI no Android estão disponíveis no site oficial
Documentação Dalvik emhttp://milk.com/kodebase/dalvik-docs-mirror/docs/.
Zigoto
NOTAoservidor_sistemaprocesso é tão importante que matá-lo faz com que o dispositivo pareça
reiniciar. No entanto, apenas o subsistema Dalvik do dispositivo está realmente reiniciando.
Após sua inicialização inicial, o Zygote fornece acesso à biblioteca para outros processos
Dalvik via RPC e IPC. Esse é o mecanismo pelo qual os processos que hospedam os
componentes do aplicativo Android são realmente iniciados.
O código nativo, no espaço do usuário do sistema operacional, compreende uma grande parte
do Android. Essa camada é composta por dois grupos principais de componentes: bibliotecas e
serviços centrais do sistema. Esta seção discute esses grupos e muitos componentes individuais
que pertencem a esses grupos com um pouco mais de detalhes.
Bibliotecas
Grande parte da funcionalidade de baixo nível utilizada pelas classes de nível superior no
Android Framework é implementada por bibliotecas compartilhadas e acessadas via JNI. Muitas
dessas bibliotecas são os mesmos projetos de código aberto bem conhecidos usados
42 Capítulo 2-Design e arquitetura de segurança do Android
em outros sistemas operacionais do tipo Unix. Por exemplo, o SQLite fornece funcionalidade de
banco de dados local; O WebKit fornece um mecanismo de navegador da Web incorporável; e
FreeType fornece renderização de fonte de bitmap e vetor.
Bibliotecas específicas de fornecedores, ou seja, aquelas que fornecem suporte para
hardware exclusivo para um modelo de dispositivo, estão em /fornecedor/lib (ou /sistema/
fornecedor/lib).Isso inclui suporte de baixo nível para dispositivos gráficos, transceptores de GPS
ou rádios celulares. Bibliotecas não específicas do fornecedor estão em /sistema/lib,e
normalmente incluem projetos externos, por exemplo:
Estas são apenas algumas das muitas bibliotecas incluídas no Android. Um dispositivo
com Android 4.3 contém mais de 200 bibliotecas compartilhadas.
No entanto, nem todas as bibliotecas subjacentes são padrão.Biônicoé um exemplo
notável. Bionic é uma derivação da biblioteca de tempo de execução BSD C, destinada a
fornecer uma pegada menor, otimizações e evitar problemas de licenciamento associados
à GNU Public License (GPL). Essas diferenças têm um pequeno preço. Biônica
libcnão é tão completo quanto, digamos, o GNUlibcou até mesmo o BSD pai de Bioniclibc
implementação. Bionic também contém um pouco de código original. Em um esforço para reduzir a pegada
do tempo de execução C, os desenvolvedores do Android implementaram um vinculador dinâmico
personalizado e uma API de encadeamento.
Como essas bibliotecas são desenvolvidas em código nativo, elas são propensas a
vulnerabilidades de corrupção de memória. Esse fato torna essa camada uma área
particularmente interessante para explorar ao pesquisar a segurança do Android.
Serviços essenciais
Os serviços principais são aqueles que configuram o ambiente do sistema operacional subjacente e os
componentes nativos do Android. Esses serviços variam daqueles que primeiro inicializam o espaço do
usuário, comoiniciar,para fornecer funcionalidade de depuração crucial, comoadbd
edepurado.Observe que alguns serviços principais podem ser específicos de hardware ou versão; esta
seção certamente não é uma lista exaustiva de todos os serviços de espaço do usuário.
iniciar