Skip to content

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 String e NSString,
  • 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>.