MASTG-TEST-0058: Testando Cópias de Segurança para Dados Sensíveis
Visão Geral¶
Análise Estática¶
Um backup de um dispositivo no qual um aplicativo móvel foi instalado incluirá todos os subdiretórios (exceto Library/Caches/) e arquivos no diretório privado do aplicativo.
Portanto, evite armazenar dados sensíveis em texto simples em qualquer um dos arquivos ou pastas que estão no diretório privado do aplicativo ou em seus subdiretórios.
Embora todos os arquivos em Documents/ e Library/Application Support/ sejam sempre incluídos no backup por padrão, você pode excluir arquivos do backup chamando NSURL setResourceValue:forKey:error: com a chave NSURLIsExcludedFromBackupKey.
Você pode usar as propriedades do sistema de arquivos NSURLIsExcludedFromBackupKey e CFURLIsExcludedFromBackupKey para excluir arquivos e diretórios de backups. Um aplicativo que precisa excluir muitos arquivos pode fazê-lo criando seu próprio subdiretório e marcando esse diretório como excluído. Aplicativos devem criar seus próprios diretórios para exclusão em vez de excluir diretórios definidos pelo sistema.
Ambas as propriedades do sistema de arquivos são preferíveis à abordagem obsoleta de definir diretamente um atributo estendido. Todos os aplicativos executados na versão iOS 5.1 e posteriores devem usar essas propriedades para excluir dados de backups.
A seguir está um código de exemplo em Objective-C para excluir um arquivo de um backup no iOS 5.1 e versões posteriores:
- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString
{
NSURL* URL= [NSURL fileURLWithPath: filePathString];
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}
A seguir está um código de exemplo em Swift para excluir um arquivo de um backup no iOS 5.1 e versões posteriores. Consulte Swift excluindo arquivos do backup do iCloud para mais informações:
enum ExcludeFileError: Error {
case fileDoesNotExist
case error(String)
}
func excludeFileFromBackup(filePath: URL) -> Result<Bool, ExcludeFileError> {
var file = filePath
do {
if FileManager.default.fileExists(atPath: file.path) {
var res = URLResourceValues()
res.isExcludedFromBackup = true
try file.setResourceValues(res)
return .success(true)
} else {
return .failure(.fileDoesNotExist)
}
} catch {
return .failure(.error("Error excluding \(file.lastPathComponent) from backup \(error)"))
}
}
Análise Dinâmica¶
Para testar o backup, obviamente você precisa criar um primeiro. A maneira mais comum de criar um backup de um dispositivo iOS é usando o iTunes, que está disponível para Windows, Linux e, claro, macOS (até o macOS Mojave). Ao criar um backup via iTunes, você sempre só pode fazer backup de todo o dispositivo e não selecionar apenas um aplicativo. Certifique-se de que a opção "Criptografar backup local" no iTunes não esteja marcada, para que o backup seja armazenado em texto claro no seu disco rígido.
O iTunes não está mais disponível a partir do macOS Catalina. O gerenciamento de um dispositivo iOS, incluindo atualizações, backup e restauração, foi transferido para o aplicativo Finder. A abordagem permanece a mesma, conforme descrito acima.
Após o backup do dispositivo iOS ser feito, você precisa recuperar o caminho do arquivo de backup, que possui localizações diferentes em cada sistema operacional. A documentação oficial da Apple ajudará você a localizar backups do seu iPhone, iPad e iPod touch.
Quando você quiser navegar até a pasta de backup até o High Sierra, poderá fazê-lo facilmente. A partir do macOS Mojave, você receberá o seguinte erro (mesmo como root):
$ pwd
/Users/foo/Library/Application Support
$ ls -alh MobileSync
ls: MobileSync: Operation not permitted
Isso não é um problema de permissão da pasta de backup, mas um novo recurso no macOS Mojave. Você pode resolver esse problema concedendo acesso total ao disco ao seu aplicativo de terminal seguindo a explicação no OSXDaily.
Antes de acessar o diretório, você precisa selecionar a pasta com o UDID do seu dispositivo. Consulte a seção "Obtendo o UDID de um dispositivo iOS") sobre como recuperá-lo.
Uma vez que você saiba o UDID, pode navegar até este diretório e encontrará o backup completo de todo o dispositivo, que inclui fotos, dados de aplicativos e qualquer coisa que possa ter sido armazenada no dispositivo.
Revise os dados que estão nos arquivos e pastas do backup. A estrutura dos diretórios e nomes de arquivos é ofuscada e se parecerá com isto:
$ pwd
/Users/foo/Library/Application Support/MobileSync/Backup/416f01bd160932d2bf2f95f1f142bc29b1c62dcb/00
$ ls | head -n 3
000127b08898088a8a169b4f63b363a3adcf389b
0001fe89d0d03708d414b36bc6f706f567b08d66
000200a644d7d2c56eec5b89c1921dacbec83c3e
Portanto, não é simples navegar por ele e você não encontrará nenhuma indicação do aplicativo que deseja analisar no nome do diretório ou arquivo. Você pode considerar usar o utilitário shareware iMazing para ajudar aqui. Realize um backup do dispositivo com o iMazing e use seu explorador de backup integrado para analisar facilmente o conteúdo do contêiner do aplicativo, incluindo caminhos originais e nomes de arquivos.
Sem o iMazing ou software similar, você pode precisar recorrer ao uso do grep para identificar dados sensíveis. Esta não é a abordagem mais completa, mas você pode tentar procurar por dados sensíveis que você inseriu enquanto usava o aplicativo antes de fazer o backup. Por exemplo: nome de usuário, senha, dados de cartão de crédito, PII ou qualquer dado considerado sensível no contexto do aplicativo.
~/Library/Application Support/MobileSync/Backup/<UDID>
grep -iRn "password" .
Conforme descrito na seção de Análise Estática, quaisquer dados sensíveis que você conseguir encontrar devem ser excluídos do backup, criptografados adequadamente usando o Keychain ou não armazenados no dispositivo em primeiro lugar.
Para identificar se um backup está criptografado, você pode verificar a chave chamada "IsEncrypted" do arquivo "Manifest.plist", localizado na raiz do diretório de backup. O exemplo a seguir mostra uma configuração indicando que o backup está criptografado:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
<key>Date</key>
<date>2021-03-12T17:43:33Z</date>
<key>IsEncrypted</key>
<true/>
...
</plist>
Caso você precise trabalhar com um backup criptografado, existem alguns scripts Python no repositório GitHub do DinoSec, como backup_tool.py e backup_passwd.py, que servirão como um bom ponto de partida. No entanto, observe que eles podem não funcionar com as versões mais recentes do iTunes/Finder e podem precisar de ajustes.
Você também pode usar a ferramenta Backup do iOS para ler e extrair facilmente arquivos de um backup iOS criptografado por senha.
Prova de Conceito: Removendo Bloqueio de Interface com Backup Manipulado¶
Conforme discutido anteriormente, dados sensíveis não se limitam apenas a dados do usuário e PII. Eles também podem ser arquivos de configuração ou definições que afetam o comportamento do aplicativo, restringem funcionalidades ou habilitam controles de segurança. Se você der uma olhada no aplicativo de carteira bitcoin de código aberto, Bither, verá que é possível configurar um PIN para bloquear a interface. E após alguns passos simples, você verá como contornar esse bloqueio de interface com um backup modificado em um dispositivo não-jailbroken.

Depois de habilitar o pin, use o iMazing para realizar um backup do dispositivo:
- Selecione seu dispositivo na lista no menu DISPONÍVEIS.
- Clique na opção do menu superior Fazer Backup.
- Siga os prompts para concluir o backup usando os padrões.
Em seguida, você pode abrir o backup para visualizar os arquivos do contêiner do aplicativo dentro do seu aplicativo alvo:
- Selecione seu dispositivo e clique em Backups no menu superior direito.
- Clique no backup que você criou e selecione Visualizar.
- Navegue até o aplicativo Bither no diretório Apps.
Neste ponto, você pode visualizar todo o conteúdo do backup do Bither.

É aqui que você pode começar a analisar os arquivos em busca de dados sensíveis. Na captura de tela, você verá o arquivo net.bither.plist que contém o atributo pin_code. Para remover a restrição de bloqueio de interface, simplesmente exclua o atributo pin_code e salve as alterações.
A partir daí, é possível restaurar facilmente a versão modificada do net.bither.plist de volta no dispositivo usando a versão licenciada do iMazing.
A solução alternativa gratuita, no entanto, é encontrar o arquivo plist no backup ofuscado gerado pelo iTunes/Finder. Então crie seu backup do dispositivo com o código PIN do Bither configurado. Em seguida, usando os passos descritos anteriormente, encontre o diretório de backup e use o grep para "pin_code" como mostrado abaixo.
$ ~/Library/Application Support/MobileSync/Backup/<UDID>
$ grep -iRn "pin_code" .
Binary file ./13/135416dd5f251f9251e0f07206277586b7eac6f6 matches
Você verá que houve uma correspondência em um arquivo binário com um nome ofuscado. Este é seu arquivo net.bither.plist. Vá em frente e renomeie o arquivo dando a ele uma extensão plist para que o Xcode possa abri-lo facilmente para você.

Novamente, remova o atributo pin_code do plist e salve suas alterações. Renomeie o arquivo de volta para o nome original (ou seja, sem a extensão plist) e realize a restauração do seu backup. Quando a restauração estiver concluída, você verá que o Bither não solicita mais o código PIN quando iniciado.