Skip to content

MASTG-TEST-0064: Testando Autenticação Biométrica

Visão Geral

O uso de frameworks em um aplicativo pode ser detectado analisando a lista de bibliotecas dinâmicas compartilhadas do binário do aplicativo. Isso pode ser feito usando otool:

otool -L <AppName>.app/<AppName>

Se LocalAuthentication.framework for usado em um aplicativo, a saída conterá ambas as linhas a seguir (lembre-se que LocalAuthentication.framework utiliza Security.framework internamente):

/System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication
/System/Library/Frameworks/Security.framework/Security

Se apenas Security.framework for utilizado, apenas a segunda linha será exibida.

Análise Estática

É importante lembrar que o framework LocalAuthentication é um procedimento baseado em eventos e, como tal, não deve ser o único método de autenticação. Embora esse tipo de autenticação seja eficaz no nível da interface do usuário, ele pode ser facilmente contornado através de modificações ou instrumentação. Portanto, é melhor usar o método de serviços de keychain, o que significa que você deve:

  • Verificar se processos sensíveis, como reautenticar um usuário realizando uma transação de pagamento, são protegidos usando o método de serviços de keychain.
  • Verificar se os flags de controle de acesso estão definidos para o item da keychain, garantindo que os dados do item da keychain só possam ser desbloqueados por meio da autenticação do usuário. Isso pode ser feito com um dos seguintes flags:
    • kSecAccessControlBiometryCurrentSet (antes do iOS 11.3 kSecAccessControlTouchIDCurrentSet). Isso garantirá que um usuário precise autenticar com biometria (ex: Face ID ou Touch ID) antes de acessar os dados no item da keychain. Sempre que o usuário adicionar uma impressão digital ou representação facial ao dispositivo, isso invalidará automaticamente a entrada na Keychain. Isso garante que o item da keychain só possa ser desbloqueado por usuários que estavam cadastrados quando o item foi adicionado à keychain.
    • kSecAccessControlBiometryAny (antes do iOS 11.3 kSecAccessControlTouchIDAny). Isso garantirá que um usuário precise autenticar com biometria (ex: Face ID ou Touch ID) antes de acessar os dados na entrada da Keychain. A entrada da Keychain sobreviverá a qualquer (re)cadastro de novas impressões digitais ou representações faciais. Isso pode ser muito conveniente se o usuário tiver uma impressão digital variável. No entanto, também significa que atacantes que de alguma forma conseguirem cadastrar suas impressões digitais ou representações faciais no dispositivo agora também poderão acessar essas entradas.
    • kSecAccessControlUserPresence pode ser usado como alternativa. Isso permitirá que o usuário se autentique através de um código de acesso se a autenticação biométrica não funcionar mais. Isso é considerado mais fraco que kSecAccessControlBiometryAny, pois é muito mais fácil roubar o código de acesso de alguém por meio de observação visual (shoulder surfing) do que contornar o serviço Touch ID ou Face ID.
  • Para garantir que a biometria possa ser usada, verifique se a classe de proteção kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly ou kSecAttrAccessibleWhenPasscodeSet está definida quando o método SecAccessControlCreateWithFlags é chamado. Observe que a variante ...ThisDeviceOnly garantirá que o item da keychain não seja sincronizado com outros dispositivos iOS.

Nota: uma classe de proteção de dados especifica a metodologia de acesso usada para proteger os dados. Cada classe usa políticas diferentes para determinar quando os dados estão acessíveis.

Análise Dinâmica

O Objection Biometrics Bypass pode ser usado para contornar o LocalAuthentication. O Objection usa Frida para instrumentar a função evaluatePolicy de modo que ela retorne True mesmo que a autenticação não tenha sido realizada com sucesso. Use o comando ios ui biometrics_bypass para contornar a autenticação biométrica insegura. O Objection registrará uma tarefa (job) que substituirá o resultado de evaluatePolicy. Funcionará em implementações Swift e Objective-C.

...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # ios ui biometrics_bypass
(agent) Registering job 3mhtws9x47q. Type: ios-biometrics-disable
...itudehacks.DVIAswiftv2.develop on (iPhone: 13.2.3) [usb] # (agent) [3mhtws9x47q] Localized Reason for auth requirement: Please authenticate yourself
(agent) [3mhtws9x47q] OS authentication response: false
(agent) [3mhtws9x47q] Marking OS response as True instead
(agent) [3mhtws9x47q] Biometrics bypass hook complete

Se for vulnerável, o módulo contornará automaticamente o formulário de login.