MASTG-TEST-0060: Teste de Memória para Dados Sensíveis
Visão Geral¶
Análise Estática¶
Ao realizar análise estática para dados sensíveis expostos via memória, você deve:
- tentar identificar os componentes da aplicação e mapear onde os dados são utilizados,
- assegurar que dados sensíveis sejam manipulados com o menor número possível de componentes,
- garantir que referências de objetos sejam removidas adequadamente quando o objeto contendo dados sensíveis não for mais necessário,
- garantir que dados altamente sensíveis sejam sobrescritos assim que não forem mais necessários,
- não passar tais dados via tipos de dados imutáveis, como
StringeNSString, - evitar tipos de dados não primitivos (pois podem deixar dados residuais),
- sobrescrever o valor na memória antes de remover as referências,
- prestar atenção a componentes de terceiros (bibliotecas e frameworks). Ter uma API pública que manipule dados de acordo com as recomendações acima é um bom indicador de que os desenvolvedores consideraram os problemas discutidos aqui.
Análise Dinâmica¶
Existem várias abordagens e ferramentas disponíveis para testar dinamicamente a memória de um aplicativo iOS em busca de dados sensíveis.
Recuperação e Análise de um Despejo de Memória¶
Seja você estiver usando um dispositivo com jailbreak ou sem jailbreak, pode despejar a memória do processo do aplicativo com objection e Fridump. Você pode encontrar uma explicação detalhada deste processo em Exploração de Processos.
Após a memória ter sido despejada (por exemplo, para um arquivo chamado "memory"), dependendo da natureza dos dados que você está procurando, você precisará de um conjunto de ferramentas diferentes para processar e analisar esse despejo de memória. Por exemplo, se você estiver focado em strings, pode ser suficiente executar o comando strings ou rabin2 -zz do rabin2 para extrair essas strings.
# usando strings
$ strings memory > strings.txt
# usando rabin2
$ rabin2 -ZZ memory > strings.txt
Abra strings.txt em seu editor preferido e examine-o para identificar informações sensíveis.
No entanto, se você quiser inspecionar outros tipos de dados, é preferível usar o radare2 e suas capacidades de busca. Consulte a ajuda do radare2 sobre o comando de busca (/?) para mais informações e uma lista de opções. A seguir mostra apenas um subconjunto delas:
$ r2 <nome_do_seu_arquivo_de_despejo>
[0x00000000]> /?
Usage: /[!bf] [arg] Search stuff (see 'e??search' for options)
|Use io.va for searching in non virtual addressing spaces
| / foo\x00 search for string 'foo\0'
| /c[ar] search for crypto materials
| /e /E.F/i match regular expression
| /i foo search for string 'foo' ignoring case
| /m[?][ebm] magicfile search for magic, filesystems or binary headers
| /v[1248] value look for an `cfg.bigendian` 32bit value
| /w foo search for wide string 'f\0o\0o\0'
| /x ff0033 search for hex string
| /z min max search for strings of given size
...
Análise de Memória em Tempo de Execução¶
Realize Exploração de Processos, por exemplo, usando r2frida, para analisar e inspecionar a memória do aplicativo durante a execução e sem a necessidade de despejá-la.
Por exemplo, você pode executar os comandos de busca anteriores a partir do r2frida e pesquisar na memória por uma string, valores hexadecimais, etc. Ao fazer isso, lembre-se de prefixar o comando de busca (e quaisquer outros comandos específicos do r2frida) com uma barra invertida : após iniciar a sessão com r2 frida://usb//<nome_do_seu_app>.