INTRODUÇÃO
Recentemente surgiu o desafio profissional de me introduzir no universo dos testes em apk, o que logo no primeiro foi um tanto caótico, dada a necessidade do fast learning
durante este período.
Bom, a falha grave, no meu ponto de vista, era simplesmente não estar preparado pelo menos com o mínimo esperado, ante um assunto aquecido no mercado.
Por conta disso, decidi separar uma parte deste ano, somente para me aprofundar nos estudos de pentesting mobile, e como meus estudos são bem melhores aproveitados quando eu expresso o aprendido de alguma forma, irei compartilhar em blog posts, toda a jornada de aprendizado.
O PRINCÍPIO
Aplicações mobile compreendem um universo de possibilidades que se convergem em vários pontos com outras áreas de segurança, portanto, antes de qualquer contato direto com técnicas específicas, é preciso pincelar sobre alguns temas básicos que fazem parte desta rotina, tais como:
- Criptografia
- SSL/TLS
- mTLS
- Proxies
- Android e sua arquitetura
CRIPTOGRAFIA
A criptografia é um mecanismo aplicado a segurança e a privacidade utilizada para tornar a comunicação segura de diversas formas. A base principal da criptografia, desde sua origem a alguns séculos atrás, é tornar a comunicação initeligível para qualquer um que não tenha acesso aos mecanismos e códigos de tradução de uma mensagem.
Nas comunicações digitais, por exemplo, a criptografia tem grande papel na proteção de dados transmitidos entre dois ou mais nós, evitando que estes dados sejam lidos em texto claro, caso sejam interceptados, ou até mesmo evitando a interceptação em alguns casos.
Um mecanismo de criptografia tem como base, três principais elementos:
- Chave: Um código que utilizado para encriptar e/ou decriptar uma mensagem, funciona basicamente como a chave de uma porta, onde somente quem possui a mesma, consegue abrir ou fechar esta porta. No mundo digital, existem vários tipos de chave, sendo os mais convencionais simétrica e assimétrica. Sua existência é necessária, pois é inviável manter o algoritmo criptográfico em segredo, sendo assim, utiliza-se a chave criada a partir de um algoritmo de criptografia;
- Encriptar: É o processo de codificar uma informação utilizando uma chave, de modo que seu resultado final seja algo incompreensível;
- Decriptar: É o processo de decodificar uma mensagem encriptada utilizando uma chave, ou seja, uma informação encriptada com uma chave é initeligível até que seja decriptada utilizando uma chave.
Criptografia Simétrica
Um sistema criptográfico é considerado simétrico quando é utilizada a mesma chave, uma chave privada, tanto para encriptar quanto para decriptar uma mensagem. A imagem abaixo mostra este fluxo.
Criptografia Assimétrica
Um sistema criptográfico é considerado assimétrico quando são utilizadas duas chaves no processo de encriptação e decriptação, no caso uma chave privada
e um chave pública
. Neste cenário, a chave privada deve ser mantida em segredo e a chave pública pode ser compartilhada.
Neste fluxo de criptografia, a chave pública é utilizada para encriptar uma mensagem, enquanto que somente a chave privada consegue decriptá-la. A imagem abaixo exemplifica este fluxo.
Algorítmo de Hash
A hash
é um algorítmo que recebe qualquer comprimento de entrada, sejam eles qualquer tipo de dados, e mescla esta entrada para produzir uma saída pseudoaleatória de largura fixa, ou seja, independente da largura dos dados encriptados, seu resultado terá sempre uma largura fixa.
Uma hash é identificada pelas seguintes características:
- Um algorítmo de hash sempre redumirá os dados de entrada em uma saída de tamanho fixo, independente do conteúdo de entrada;
- A saída de um algorítmo de hash é pseudoaleatória por princípios matemáticos;
- Se um único bit for alterado nos dados de entrada, a saída de uma hash será completamente diferente;
- Não pode ser reversível, ou seja, a partir de uma hash, é impossível reconstruir os dados de entrada, princípio conhecido como “função de via única”;
- Um algorítmo de hash não pode encontrar duas mensagens que produzam a mesma saída.
Alguns algoritmos de hash conhecidos:
Algorítmo | Tamanho de saída | Hashes possíveis | Exemplo |
---|---|---|---|
MD5 | 16 Bytes / 128 bits | 2128 | 196024cd532a9b08c8096eb3632a97b7 |
SHA-1 | 20 Bytes / 160 bits | 2160 | 54aa06f5a16d8eb7d1141cf49ce3da68c81e90a4 |
SHA-256 | 32 Bytes / 256 bits | 2256 | ca08547be53fa295c6d3f127fc7692096150cd3a2f3a618991991eb0f9983ad6 |
SHA-512 | 64 Bytes / 512 bits | 2512 | abb5d711e31907f0021e346ce34ae7df7e5e866a5369811a4354b533fc451544 0ac9f9d5fa08e7ebf42787e4ca569c3a71378a6a4d112ce461628c5214c9632a |
Assinatura Digital
A assinatura digital, nada mais é que uma chave privada virtual, vinculada a um certificado digital, assim como uma assinatura em um papel, a assinatura digital assume a legalidade de uma assinatura comum.
Uma assinatura digital é composta de dois principais fundamentos:
- A chave primária precisa ser segura e somente o proprietário desta chave possa utilizá-la;
- A única maneira de produzir uma assinatura digital seja utilizando uma chave pública.
Portanto, para ter uma criptografia segura, os dados devem ser criptografados com a chave pública
para que somente a chave privada
possa decriptar.
Certificado Digital
O certificado digital, nada mais é do que uma forma de associar uma chave pública a uma entidade de destino, pois ele associa esta chave a um nome. Ele é composto basicamente do nome, da chave pública e da assinatura digital.
A construção de um certificado digital, é feita de uma maneira que torna perceptível caso alguém ou algo com comportamento malicioso altere qualquer informação que o compõe.
A assinatura de um certificado digital, é normalmente (mas não sempre) feita pr meio de uma autoridade certificadora, ou “CA” (Certification Authority). Atualmente, o certificado digital mais utilizado segue o padrão X.509.
A estrutura de um certificado digital no padrão X.509
segue exemplificado na imagem abaixo e também pode ser lida com detalhes na RFC 5280 na sessão 4.1.1.
SSL/TLS
O SSL/TLS (Secure Sockets Layer e Transport Layer Security) é utilizado para garantir a autenticidade e o sigilo na comunicação entre servidores e clientes, geralmente utilizado nos protocolos HTTP e SMTP.
O SSL/TLS adiciona uma nova camanda, ou layer na comunicação HTTP conforme ilustrado abaixo.
Durante o processo de comunicação entre um cliente e um servidor utilizando SSL, fluxo segue da seguinte maneira:
mTLS
O mTLS
ou Mutual TLS é o proceso pelo qual o servidor solicita ao cliente um certificado TLS durante o estabelecimento do TLS, quendo este certificado é recebido, o servidor possui condições de avaliá-lo.
Este processo chamado de TLS Handshake Certificate Request é uma troca de mensagem opcional enviada do servidor para o cliente. Esta requisição é composta de uma lista de certificados digitais raiz aceitos pelo servidor.
Portanto, quando um cliente recebe esta requisição de um servidor, deve enviar uma resposta com ceu próprio certificado de um dos certificados raiz.
A imagem abaixo, ilustra este fluxo de comunicação.
PROXY
O proxy
, de forma bem simplificada ,é um servidor que age como um intermediário entre requisições de clientes para outros servidores. Esta funçã de intermediação não só monitora, como pode filtrar e/ou armazenar dados transitados.
Desta forma, por mais que um proxy seja diferente de um firewall
, ainda assim pode realizar filtros, e por mais que não seja um cache
também pode implementar esta funcionalidade.
As proxies geralmente são divididas em duas categorias:
- Proxy ativo: O tipo de proxy que precisa ser configurado do lado do cliente, definindo o socket do proxy, o BurpSuite é um exemplo de proxy ativo;
- Proxy transparente: Este proxy direciona conexões que passam por ele para um servidor ou aplicação específico local. Este tipo de proxy não exige configuração do lado do cliente que geralmente não sabe de sua existência. O webserber
NGINX
implementa este tipo de proxy.
Web Application Proxy
O web application proxy
atua diretamente na camada de aplicação, ou seja, na camada 7 do modelo OSI e permitem que os payloads dasrequisições e respostas do protocolo HTTP sejam filtradas, analisadas e armazenadas.
ANDROID E SUA ARQUITETURA
O Android
é um sistema operacional de código aberto baseado em Linux, inicialmente para dispositivos móveis, porém largamente utilizado em diversos outros dispositivos.
A arquitetura do sistema Androide consiste em uma série de componentes que podem ser separados em ses camadas, a imagem abaixo foi retirada da própria Android Developers e listra estas camadas.
Onde:
Camada System Apps
: É a camada onde as aplicações são instaladas, armazenadas e executadas. Nesta camada, estão os instalados os aplicativos nativos e os aplicativos do usuário;Camada Java API Framework
: Esta camada fornece as APIs do sistema para serem utilizadas pelas funcionalidades comuns das aplicações, tais como funcionalidades de compartilhamento de dados, acesso ao telefone, GPS e elementos visuais;Camada Native C/C++ Libraries
: Esta camada fornece as bibliotecas C e C++ que são utilizadas para gerenciar processos em baixo nível, processos como encriptação, renderização de imagens e multimídia, entre outros;Camada Android Runtime
: Cada aplicação dentro do Android executa em uma própria máquina virtual, por fins de segurança e integridade. E é nesta camada que reside a máquina virtual responsável pelas aplicações em execução;Camada Hardware Abstraction Layer (HAL)
: Esta camada define os padrões para os fabricantes de hardware implementarem suas funcionalidades. Utilizando a HAL, os fabricantes podem implementar suas funcionalidades sem afetar o sistema em alto nível;Camada Linux Kernel
: Esta camada contém o kernel Android que é baseado no kernel Linux 2.6. O kernel é responsável pelo gerenciamento de memória, processos e energia. Esta camada é responsável por controlar o acesso ao hardware do dispositivo por meio de drivers. Como sendo a camada base, ela é quem une todas as camadas superiores.
Máquina Virtual Android (AVM)
As máquinas virtuais são basicamente camadas abstração entre uma aplicação e as camadas subjacentes do dispositivo. Os aplicativos Android e o Java API Framework são desenvolvidos na linguagem de programação Java ou Kotlin e são executados dentro de uma máquina virtual Dalvik.
Máquina Virtual Android (Dalvik)
O Dalvik é uma máquina virtual baseada em registro que interpreta códigos em baixo nível em bytes do Executável Dalvik (DEX)
. Para seu funcionamento, o Dalvik depende de funcionalidades fornecidas por várias bibliotecas de código nativo de suporte.
Isso se torna necessário, para que o sistema consiga suportar todas as diferenças entre sistemas operacionais sem que o desenvolvedor precise desenvolver aplicativos diferentes para dispositivos específicos.
Segurança de Aplicativos no Android
Por padrão, os aplicativos Android não tem acesso direto a recursos de hardware e cada aplicativo é executado em sua própria sandbox
, ou seja, cada aplicativo é executado “enjaulado” em um ambiente. Como o Android é baseado em Linux, o sistema de permissionamento é similar ao permissionamento entre usuários, onde cada usuário compartilha recursos do sistema, mas não tem acesso a ambientes e recursos específicos de outros usuários.
Isto ocorre, para permitir o controle preciso sobre recursos, pois não permite que um aplicativo com falha ou malicioso efete outros aplicativos em execução no dispositivo.
CONCLUSÃO
Acredito que isto é o básico para iniciar o entendimento sobre Android e seu funcionamento, antes de iniciar os testes em aplicativos.
Com estas informações em mente, avancaremos nos próximos artigos.