KeyStore는 키를 안전하게 보관하고 암복호화 및 인증 과정에서만 정상적으로 key를 사용할 수 있도록 해주는 매커니즘 이다.
결과적으로 악의적인 키 추출이나 키 획득 공격을 방어할 수 있고 정상적으로 키를 사용해야 하는 경우에만 키를 사용할 수 있도록 해줌으로써 Key에 대한 보안성을 담당하는 모듈이다.
기본적으로 KeyStore는 Android system TEE영역에 존재하며 apk에 존재하지 않는다. 이러한 이유는 apk에 존재하거나 android REE영역에 존재하는 경우 공격자가 공격을 통해 키를 외부로 추출할 수 있는데 TEE 영역에 보관함으로써 Android가 해킹되거나 APK가 해킹되었을 때 악의적인 Key 사용을 막을 순 없으나 외부로의 Key 추출과정은 방어할 수 있다.
자세하게 정리하면 아래와 같다.
- 공격자가 APK, Android OS 해킹 성공
- 해킹한 프로세스를 통해서 KeyStore에 Key 작업 요청(인증, 암복호화)
- KeyStore는 정상 요청으로 판단하고 인증 및 암복호화 작업을 진행해주기 때문에 악의적인 목적에 Key 사용 가능
- 하지만 인증, 암복호화 요청시 TEE에 존재하는 KeyStore가 요청을 받은 후 TEE와 같은 안전한 공간에서 처리 후 결과를 응답 해주는 방식으로 운영되기 때문에 공격자가 외부로 Key값 유출은 불가
1. KeyStore
위와 같이 KeyStore는 Key를 보호하기 위한 매커니즘으로 Android 4.0버전부터 지원됬다.
추가적으로 Android 9.0버전 이상에서는 Hardware(SE)를 KeyStore에 연계함으로써 키 생성 및 난수 생성 등의 일련의 과정을 SE내에서 진행할 수 있도록 규정하였고 이 때 SE내 해당 Key 관련 업무를 진행하는 모듈 이름을 StrongBox로 명명했다.
추가적으로 사용하는 사용자에 대한 인증 과정을 추가하여 보안성을 높일 수 있는데 SE에서 사용자 인증 추가 기능을 지원하는지 여부는
KeyInfo.isUserAuthenticationRequirementEnforcedBySecureHardware()
출처: <https://developer.android.com/training/articles/keystore?hl=ko>
API 를 통해서 확인할 수 있다.
1) Key 생성
KeyGenerator를 통해 새 공개키, 개인키를 생성하게 된다면 추가적으로 안전하게 KeyStore로 해당 Key를 가져오기 위한 방법이 필요하다.
해당 방법은 Android9.0이상에서 ASN.1 방식으로 생성된 키를 인코딩하여 평문이 노출되지 않도록 KeyStore로 Key를 가져오고 있다.
KeyStore로 Key를 안전하게 가져오면 Keymaster가 해당 Key를 복호화하여 사용할 수 있도록 한다.
2) Key증명
Hardware수준의 Key를 보관소에서 해당 Key가 유효한지 판단하기위해 Key를 증명하려면 먼저 KeyStore에서 getCertificateChain()함수를 통해 X.509인증서 chain 인증을 진행한다. 결과적으로는 X.509인증의 chain검증을 통해 루트 인증서의 유효성을 판단하는데
해당 키는 구글 키 혹은 벤더사 키가 될 수 있으며 루트 키들은 공정과정에서 H/W 내부에 미리 주입하는 방식으로 관리된다.
최종적으로 루트유효성 판단 후에 증명서 체인의 유효성을 판단하는 과정은 ASN.1 파서를 통한 값 비교로 진행된다.
또한 로트 체인의 인증서를 증명하는 과정에서 인증서의 유효기간을 판단하고 유효한 인증서인지에 대한 판단이 추가적으로 필요하다. 이경우 인증서 목록 검색을 통해 해당 인증서가 유효인증서인지 확인할 수 있으며 이 인증서 목록은 Google에서 직접 관리하고 있다.
- ASN.1
ASN.1은 서로 다른 시스템간에서도 데이터 통신이 가능하도록 만든 데이터 송수신 방법이다. 각각 시스템별 다른 컴파일러 등의 컴파일 방법차이에 따라 올바르지 않은 작업이 진행될 수 있는데 ASN.1은 이러한 부분까지 포함하여 직렬화 데이터 전송을 진행하기 때문에 다른 시스템간에서도 정상적으로 원하는 작업을 수해할 수 있도록 호환성이 좋은 데이터 송수신 방법이다.
기본적으로 ASN.1이라는 언어를 통해서 데이터 송수신의 규칙을 정의하며 이렇게 정의된 규칙을 표준으로하여 데이터 송수신 작업을 진행하고 있다.
2. Keymaster
Keymaster는 key 사용을 위해 접근가능한 프로세스 등(Key 승인목록)을 관리하고 Key를 사용하여 각종 암복호화 등의 작업을 진행할 수 있으며 Key의 만료기간 등을 관리하는 역할을 진행한다. (만약 Keymaster권한을 탈취당한다면 공격자는 Key를 자기 마음대로 할 수 있을 것이다)
Keymaster의 남용은 보안상 매우 위험하기 때문에 정상적으로 secure boot등이 이루어지지 않고 이미지가 교체 되어 루트 인증서 등의 정상적인 인증이 되지 않은 이미지로의 로드 작업이 일어나면 keymaster가 정상적으로 동작하지 않아 공격자가 keymaster를 통한 악의적인 행동을 할 수 없게한다.
KeyStore - Key를 안전하게 저장하기 위한 모듈
Kermaster - Key를 안전하게 관리하기 위한 모듈
keymaster는 HIDL을 통한 HAL이 존재하고 해당 HAL을 통해서 접근 및 요청 응답이 진행된다.
기본적으로 Keymaster의 동작은 노출 시 매우 위험할 수 있기 때문에 TEE에서만 동작하며 해당 작업을 진행하고 결과를 받아오는 과정은 위와 같이 Library를 통해 동적으로 Keymaster HAL을 생성 및 호출하면 전달을 통해 TEE에서 해당 동작을 수행하고 TEE에서는 동작에 따른 응답을 다시 REE로 던져줌으로써 전달과정을 거쳐 결과를 받을 수 있도록 구현되어있다.
1) 버전관리
Keymaster는 각 파티션별로 독립적으로 버전을 관리하며 각 파티션 모듈의 버전에 연계하여 다운그레이드를 통한 취약점을 제공하지 않도록 구조를 갖추고 있다. 기본적으로 파티션을 로드할 때 패치 버전을 확인하고 버전이 맞지 않은 경우 정상적으로 keymaster가 동작하지않으며 버전이 올라갈 때 keymaster에서 upgradeKey를 통해 key역시 upgrade를 하여 버전 sync를 맞출 수 있도록 한다.
이 때, 이전 key가 사라지는 것은 아니며 별도 delete과정을 통해 이전 key를 지워주는 작업이 필요하다.
이 때 삭제한 이전 key를 복원하여 공격자가 다운그레이드를 통한 공격이 진행될 수도 있으므로 RP관리가 추가적으로 반드시 필요하다.
2) 기능
Keymaster는 위와 같이 키를 관리하는 역할을 진행하며 이를 통해 key 증명, ID 증명, H/W 인증 등의 작업도 진행할 수 있고 HMAC등을 붙여 무결성과 변조가 되지 않음을 확인하는 역할도 진행하며 KeyStore의 key 생성 그리고 key 삭제 등 일련의 과정을 진행한다.
해당 동작들은 API를 통해 함수가 존재하며 함수의 요건에 맞춰 동작되도록 구현해서 사용한다.
'Android > 안드로이드 운영체제' 카테고리의 다른 글
[Android] 안드로이드(13) - Binder (0) | 2021.02.28 |
---|---|
[Android] 안드로이드(12) - JNI (0) | 2021.01.30 |
[Android] 안드로이드(10) - 파티션 (2) | 2020.12.13 |
[Android] 안드로이드(9) - AIDL (0) | 2020.11.29 |
[Android] 안드로이드(8) - Application의 권한 (0) | 2020.11.21 |