본문 바로가기

Android

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

이전 글에서 지문인증이 REE보다 더 안전한 TEE에서 이루어진다는 것을 확인하였고, 더 나아가 지문인증의 결과를 전달받는 Android Framework이나 Android App이 동작하는 REE 환경로 지문인증 결과가 전달된다면 굳이 TEE에서의 지문인증이 과연 더 안전할까라는 의문이 생겼습니다.

https://source.android.com/security/authentication/fingerprint-hal


비밀은 같은 TEE에서 동작하는 Keymaster에 있습니다. TEE에서 지문인증이 이루어지면 그 결과가 같은 TEE에 있는 Keymaster로 전달되도록 되어 있습니다.

 

이를 이용해 여러 보안 시나리오 설계가 가능합니다. 예를 들어, 지문인증 후 이미지나 동영상같은 파일을 암호화/복호화하는 경우를 생각해봅시다.

 

1. App은 Android KeyStore에 암호화/복호화를 위한 Key 생성을 요청합니다. 그리고 Key 생성 요청 시 생성될 Key가 사용자 인증이 이루어진 후에만 사용되도록 설정합니다.

developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.Builder#setUserAuthenticationRequired(boolean)

 

2. App은 파일의 암호화/복호화를 수행하기 위해 지문인증을 수행합니다.

 

3-1. 실제 지문인증이 성공된 경우, App은 지문인증 성공을 확인하고 대상 파일을 KeyStore가 보관 중인 Key로 암호화/복호화 합니다.

3-2. 실제 지문인증이 실패한 경우, App은 지문인증 실패를 확인하고 예외처리를 합니다.

3-3. 실제 지문인증이 실패했지만 REE 어딘가쯤에서 공격당해 지문인증이 성공한 것으로 결과가 바뀐 경우, App은 실제 결과와 다르게 지문인증이 성공했다고 판단할 수 밖에 없고 대상 파일을 KeyStore가 보관 중인 Key로 암호화/복호화 합니다. 하지만, Key는 사용자 인증 후에만 사용되도록 설정되었고, TEE의 지문인증 모듈로부터 지문인증 성공을 연락받지 못하였으므로 Keymaster는 App에서의 암호화/복호화를 위한 Key 사용을 거부하게 됩니다.


TEE의 지문인증 모듈과 Keymaster 모듈은 지문인증 결과를 서로 어떻게 주고 받을까요?

다음 글에서는 이 부분에 대해 이야기하겠습니다.