본문 바로가기

Android

보안 측면에서의 Android 지문인증 (3)

이전 글에서 TEE의 지문인증모듈과 TEE의 Keymaster모듈이 지문인증의 결과를 주고 받음으로서 지문인증의 결과를 더욱 신뢰할 수 있다고 하였습니다. 이번 글에서는 TEE의 두 모듈이 어떻게 지문인증 결과를 주고 받는지에 대해 이야기해보겠습니다.

 

이에 대한 개략적인 내용은 source.android.com/security/authentication 에 설명되어 있습니다.

https://source.android.com/security/authentication

  1. 앱에서 지문인증을 요청합니다.
  2. REE의 fingerprint 데몬이 TEE의 지문인증모듈에 지문인증을 수행하도록 합니다. 지문이 인증된 경우 TEE의 지문인증모듈은 AuthToken이라는 것을 생성하고, AuthToken HMAC키를 이용하여 일종의 전자서명이 됩니다. 
  3. 전자서명된(HMAC 값) AuthToken이 keystore로 전달됩니다.
  4. REE의 keystore는 TEE의 keymaster에서 이 전자서명된 AuthToken을 전달합니다. 위 그림에서 확인할 수 있듯이 지문인증의 결과를 나타내는 AuthToken은 TEE의 keymaster까지 전달되기 위해 REE 환경을 경유하게 되어 있습니다. REE는 공격(위/변조)당할 가능성이 높기 때문에 이를 수신 측인 TEE keymaster 모듈에서 확인하기 위해 전자서명이 됩니다.

참고로, 위 3번과정을 Android 10 Q 버전 소스에서 다음과 같이 확인해볼 수 있습니다.

aosp.opersys.com/xref/android-10.0.0_r47/xref/frameworks/base/services/core/java/com/android/server/biometrics/AuthenticationClient.java#167

// android/frameworks/base/services/core/java/com/android/server/biometrics/AuthenticationClient.java

@Override
public boolean onAuthenticated(BiometricAuthenticator.Identifier identifier,
        boolean authenticated, ArrayList<Byte> token) {
// skip ...        
    boolean result = false;
// skip ...
    if (authenticated) {
// skip ...    
        result = true;
// skip ...        
        KeyStore.getInstance().addAuthToken(byteToken);
// skip ...
    return result;
}

지문인증이 된 경우, KeyStore.getInstance().addAuthToken(byteToken) 를 통해 AuthToken을 keymaster로 전달함을 알 수 있습니다.

 

AuthToken의 자료구조는 아래와 같으며 빨간 박스 부분을 통해 중간의 위/변조를 확인할 수 있습니다.

https://source.android.com/security/authentication

 

정리하자면,

  • AuthToken HMAC을 생성/검증하기 위한 HMAC key는 TEE내의 keymaster 모듈이 단말이 부팅할 때마다 랜덤하게 만들어냅니다.
  • AuthToken HMAC key는 TEE keymaster 모듈로부터 TEE 지문인증모듈로 전달됩니다.
  • TEE 지문인증모듈은 지문인증이 성공한 경우 AuthToken HMAC을 포함한 AuthToken 을 생성합니다.
  • 생성된 AuthToken은 REE를 거쳐 TEE keymaster 모듈로 전달됩니다.
  • TEE keymaster 모듈은 AuthToken HMAC을 확인하게 AuthToken의 위/변조를 확인한 후 지문인증결과를 확인합니다.