KeyStore 키를 안전하게 보관하고 암복호화 인증 과정에서만 정상적으로 key 사용할 있도록 해주는 매커니즘 이다.

결과적으로 악의적인 추출이나 획득 공격을 방어할 있고 정상적으로 키를 사용해야 하는 경우에만 키를 사용할 있도록 해줌으로써 Key 대한 보안성을 담당하는 모듈이다.

 

기본적으로 KeyStore Android system TEE영역에 존재하며 apk 존재하지 않는다. 이러한 이유는 apk 존재하거나 android REE영역에 존재하는 경우 공격자가 공격을 통해 키를 외부로 추출할 있는데 TEE 영역에 보관함으로써 Android 해킹되거나 APK 해킹되었을 악의적인 Key 사용을 막을 없으나 외부로의 Key 추출과정은 방어할 있다.

 

자세하게 정리하면 아래와 같다.

      1. 공격자가 APK, Android OS 해킹 성공
      2. 해킹한 프로세스를 통해서 KeyStore Key 작업 요청(인증, 암복호화)
      1. KeyStore 정상 요청으로 판단하고 인증 암복호화 작업을 진행해주기 때문에 악의적인 목적에 Key 사용 가능
      2. 하지만 인증, 암복호화 요청시 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 통해 함수가 존재하며 함수의 요건에 맞춰 동작되도록 구현해서 사용한다.

+ Recent posts