Todos os sistemas de informação devem apresentar e presar pela segurança. Nesse capítulo serão apresentados os métodos de segurança da plataforma em cada camada (conforme as camadas apresentadas na figura 1).
Kernel Linux
Conforme Cibrão, Gonçalves (2012, pág. 4) é a camada da qual todos os acessos de hardware do Android são realizados. Providencia, também, aspectos importantes ao modelo de segurança do sistema, tais como:
- Modelo de permissões aos arquivos baseado no usuário: um usuário com permissões específicas pode modificar as permissões aos arquivos, como leitura, escrita e execução para o seu criador ou grupo a que pertence. O "super usuário" ainda pode se sobrepor a essas permissões e ter acesso total a todo o sistema de arquivos.
- Isolamento de processos: cada processo tem endereçamento, instruções, estado e recursos próprio, como uma máquina virtual.
- Mecanismo de comunicação inter processos: um processo só se comunica com outro através de mecanismos bem definidos.
- Possibilidade de remoção de partes desnecessárias do kernel.
Desse modo, esse sistema multiusuário, garante manter o isolamento e proteger recursos de uma possível monopolização, por exemplo.
Controle de execução das aplicações
O Kernel
Linux contribui para a plataforma Android no isolamento de aplicações usando um identificador do utilizador para cada aplicação. Quando uma aplicação é iniciada é executada no contexto desse utilizador em um processo separado, isso assegura o isolamento das execuções no nível do kernel, garantindo maior segurança.
Desse modo as aplicações possuem uma gerência de arquivos própria impedindo acesso à dispositivos de chamada e SMS, por exemplo, dado que essas funções não correspondem a esse aplicativo. O owner de cada recurso disponível é atribuído a própria aplicação.
Conforme mencionado por Cibrão, Gonçalves (2012, pág. 6), esse controle previne danos causados por aplicações mal-intencionadas e a exploração de vulnerabilidades em aplicações já existentes como erros de memória corrompida, pois nesse caso o código mal-intencionado estaria restrito ao contexto da aplicação em questão. Para ocorrer quebra nesse controle, obrigatoriamente, deve ocorrer quebra na segurança do kernel.
Sistema de arquivos
O sistema de arquivos na plataforma Android está sujeito ao mecanismo de permissões usado no Linux. Cada arquivo tem associado a si um Owner ID, Group ID e três tipos de permissões: Leitura (R), Escrita (W) e execução (X). Os arquivos de cada aplicação são relacionados à Owners distintos que apenas a aplicação pode acessar, a não ser que o programador defina de modo diferente.
Semelhante ao Linux, o suporte ao armazenamento externo é feito através de montagem numa árvore de arquivos. Porém, diferente do armazenamento interno, qualquer usuário tem acesso ao cartão de memória. Isso faz do cartão de memória um local para armazenar conteúdo que pode ser lido por outras aplicações. Conforme Cibrão. Gonçalves (2012, pág. 8), a escrita neste local está limitada ao grupo sdcard_r que necessita de uma permissão específica para tal (WRITE_EXTERNAL_STORAGE).
Já a imagem do sistema operacional é montada com permissão apenas de leitura e os executáveis mais importantes, assim como os arquivos de configuração estão localizados no ramdisk ou na imagem do sistema. Isso garante que em caso de ataque o invasor será impedido de substituir arquivos críticos. Para efetuar alteração na árvore de arquivos da imagem do sistema será necessário ter acesso root.
Acesso Root
Identifica-se uma confusão dos usuários do Android sobre o conceito de Rooting de um dispositivo móvel. Esta operação normalmente é confundida com a possibilidade de instalação de imagens modificadas do sistema (ROMs) ou liberação de funcionalidades, porém o Rooting refere-se a obtenção de acesso root ao kernel Linux. Isso libera controle sobre o sistema operacional do dispositivo.
É uma prática comum explorar vulnerabilidades existentes na plataforma com o objetivo de fazer com que determinadas aplicações obtenham privilégios de acesso root. Os mecanismos de proteção considerados são:
- Bootloader e recovery: o bootloader semelhante a BIOS dos computadores pessoais, sendo o primeiro bloco código executado ao ligar o dispositivo. É o responsável pelo arranque automático do Android e ao acessar opções específicas nesse momento é possível executar a recuperação do sistema ou o recovery. A recuperação do sistema é um componente de baixo nível da plataforma onde o conceito root não existe. Desse modo, são possíveis operações como formatação e instalação de ROM assinada digitalmente pelo fabricante. Isto implica que, a não ser que se corrompa a assinatura digital do fabricante, não é possível a instalação de ROMs modificadas nem obter acesso root através do recovery.
- Android Debug Bridge (ADB): ferramenta criada pela Google para comunicação de um dispositivo Android com um PC através da entrada USB. É possível executar comandos via um shell como no Linux. Porém, uma configuração na propriedade ro.secure define se esse acesso é possível para o usuário. Se essa propriedade for igual a 0 o ADB realizará comandos com privilégios root e se for igual a 1, que a maioria dos dispositivos usam como padrão, não será possível. O seu valor é definido durante a inicialização do sistema a partir de valores do arquivo default.prop na raíz do sistema de arquivos e só pode ser alterado com permissões de root.
- Application Framework: no Linux as alterações de privilégios de uma aplicação são realizadas através de programas especiais como su ou sudo, os únicos que podem realizar a chamada do sistema setuid(0) que permite alterar o usuário que tem o programa para root (que é sempre 0). Conforme citado por Cibrão. Gonçalves (2012, pág. 12), as aplicações que necessitam de acesso root são na verdade, programas comuns que executam programas através de su. As ROMs incluídas nos dispositivos pelos fabricantes costumam não providenciar o programa su na imagem do sistema. Também não é possível simplesmente copiar o programa para o sistema de arquivos, é necessário que o bit especial SUID esteja marcado indicando que a aplicação pode escalar os seus privilégios durante a execução. E esse bit só pode ser marcado com privilégios de acesso root, garantindo a segurança.
Pode-se concluir que para que possa ser feito o rooting de um dispositivo, é necessário explorar a falha de algum dos itens citados acima, sendo que obtendo acesso a um deles será possível obter acesso a todos devido ao privilégio de acesso root.
Criptografia
A criptografia do sistema de arquivos do Android foi introduzida na versão 3.0 (Honeycomb) da plataforma. Cibrão, Gonçalves (2012, pág. 12) citam que a criptografia é feita ao nível do kernel, usando a implementação do dm-crypt (um subsistema do kernel Linux para criptografia transparente do disco de AES128 com CBC (Cipher Block Chaining) e ESSIV:SHA256 (Encrypted Salt-Sector Initialization Vector, usando SHA256 como função de hash).
O ESSIV é um método criptográfico desenvolvido por Clemens Fruhwirth e integrado no kernel Linux desde a versão 2.6.10 do Android. Tem como objetivo obter o vetor de inicialização para o método de CBC não só a partir de fontes previsíveis, como o número do setor do disco, mas também da hash da chave da criptografia. Isso garante a imprevisibilidade dos vetores de inicialização, impedindo alguns tipos de ataques, como watermarking attacks.
A chave AES128 é derivada da senha do usuário, prevenindo assim que um usuário sem senha não tenha acesso ao sistema de arquivos do dispositivo. O administrador pode exigir o uso de uma senha de acordo com regras de complexidade.