보안

Android 가상화 프레임워크(AVF)는 pVM 내에서 임의의 페이로드가 실행되는 것을 방지하기 위해 각 레이어가 추가적인 시정 조치를 더하는 레이어식 보안 접근 방식을 사용합니다. 다음은 AVF 보안 레이어 목록입니다.

  • Android: Android는 pVM 권한이 있는 앱만 pVM을 만들거나 검사할 수 있도록 합니다.

  • 부트로더: 부트로더는 Google 또는 기기 공급업체에서 서명한 pVM 이미지만 부팅되도록 허용하고 Android 자체 검사 부팅 절차를 따릅니다. 이 아키텍처는 pVM을 실행하는 앱은 자체 커널을 번들로 묶을 수 없음을 암시합니다.

  • pVM: pVM은 pVM에서 실행되는 페이로드를 위해 SELinux와 같은 심층 방어를 제공합니다. 심층 방어를 사용하면 데이터를 실행 파일(neverallow execmem)로 매핑할 수 없으며, 모든 파일 형식에 W^X가 적용됩니다.

보안 모델

CIA 3요소라고도 하는 기밀성(Confidentiality), 무결성(Integrity), 가용성(Availability)은 정보 보안 정책을 안내하기 위해 고안된 모델입니다.

  • 기밀성은 정보에 대한 액세스를 제한하는 일련의 규칙입니다.
  • 무결성은 정보의 신뢰성과 정확성에 관한 보장입니다.
  • 가용성은 허가된 대상이 정보에 안정적으로 액세스할 수 있다는 보장입니다.

pKVM은 게스트의 기밀성과 무결성을 보장하도록 설계되었으나 가용성은 보장하지 않습니다. 이 원칙은 하이퍼바이저에서 사용자 공간 구성요소에 이르기까지 아키텍처의 모든 측면에 걸친 설계 결정에 영향을 줍니다.

기밀성 및 무결성

기밀성은 pKVM 하이퍼바이저가 적용하는 메모리 격리 속성에서 비롯됩니다. pKVM은 개별 실제 메모리 페이지의 메모리 소유권과 페이지 공유를 위한 소유자의 요청을 추적합니다. pKVM은 권한 있는 pVM(호스트 및 게스트)만 하이퍼바이저로 제어되는 2단계 페이지 테이블에서 페이지가 매핑되도록 합니다. 이 아키텍처는 pVM이 소유한 메모리의 콘텐츠를 소유자가 다른 pVM과 명시적으로 공유하지 않는 한 비공개로 유지합니다.

기밀성 유지에 관한 제한사항은 시스템에서 pVM을 대신하여 메모리 액세스를 실행하는 모든 개체(DMA 지원 기기 및 보다 높은 권한이 있는 레이어에서 실행되는 서비스)에도 적용됩니다. SoC 공급업체는 새로운 요구사항을 충족해야 pKVM을 지원할 수 있으며, 그러지 않으면 기밀성을 제공할 수 없습니다.

무결성은 메모리 내 데이터와 계산 중 데이터에 적용됩니다.

  • pVM은 동의 없이 서로의 메모리를 수정할 수 없습니다.
  • pVM은 서로의 CPU 상태에 영향을 줄 수 없습니다.

이러한 요구사항은 하이퍼바이저에 의해 적용됩니다. 다른 솔루션을 적용해야 하는 가상 데이터 스토리지(dm-verity, AuthFS 등)의 경우에도 데이터 무결성과 관련된 문제가 발생합니다.

이러한 원칙은 메모리 페이지에 대한 액세스가 1단계 페이지 테이블로 제어되고 커널 컨텍스트가 프로세스 간에 전환되는 Linux의 프로세스 격리와 다르지 않습니다. 단, 이러한 속성을 적용하는 pKVM의 EL2 부분은 전체 Linux 커널(약 1만 개 또는 2천만 줄의 코드)에 비해 공격 표면의 절반가량을 차지하므로 프로세스 격리에 의존하기에 너무 민감한 사용 사례에 보다 강력한 보장을 제공합니다.

pKVM은 그 크기로 인해 공식 인증에 적합합니다. Google은 실제 pKVM 바이너리에서 이러한 속성을 공식적으로 증명하는 것을 목표로 하는 학계 연구를 적극적으로 지원하고 있습니다.

이 문서의 나머지 부분에서는 pKVM의 각 구성요소가 제공하는 기밀성과 무결성 보장에 관해 설명합니다.

하이퍼바이저

pKVM은 pVM과 Android를 상호 신뢰할 수 없는 실행 환경으로 격리하는 KVM 기반 하이퍼바이저입니다. 이러한 속성은 호스트를 포함한 모든 pVM 내부의 보안 침해 발생 시에도 유지됩니다. AVF를 준수하는 다른 하이퍼바이저는 이와 비슷한 속성을 제공해야 합니다.

  • pVM은 페이지 소유자가 명시적으로 공유하지 않은 한 다른 개체(pVM 또는 하이퍼바이저)에 속한 페이지에 액세스할 수 없습니다. 이 규칙은 호스트 pVM을 포함하며, CPU 및 DMA 액세스에 적용됩니다.
  • pVM이 사용하는 페이지는 호스트로 반환되기 전에(예: pVM이 소멸되었을 때) 완전 삭제됩니다.
  • 기기 부팅의 모든 pVM 및 pVM 펌웨어 메모리는 후속 기기 부팅에서 OS 부트로더가 실행되기 전에 완전 삭제됩니다.
  • SJTAG와 같은 하드웨어 디버거가 연결되면 pVM이 이전에 발급된 키에 액세스할 수 없습니다.
  • pVM 펌웨어는 초기 이미지를 확인할 수 없으면 부팅되지 않습니다.
  • instance.img의 무결성이 손상되면 pVM 펌웨어가 부팅되지 않습니다.
  • pVM 인스턴스에 제공된 부팅 인증서 체인(BCC) 및 복합 기기 식별자(CDI)는 해당 인스턴스에서만 파생될 수 있습니다.

게스트 OS

Microdroid는 pVM 내부에서 실행되는 OS의 한 가지 예입니다. Microdroid는 U 부팅 기반 부트로더인 GKI, Android 사용자 공간의 하위 집합, 페이로드 런처로 구성됩니다. 이러한 속성은 호스트를 포함한 모든 pVM 내부의 보안 침해 발생 시에도 유지됩니다. pVM에서 실행되는 다른 OS도 이와 비슷한 속성을 제공해야 합니다.

  • boot.img, super.img, vbmeta.img 또는 vbmeta\_system.img를 확인할 수 없으면 Microdroid가 부팅되지 않습니다.
  • APK 인증이 실패하면 Microdroid가 부팅되지 않습니다.
  • APK가 업데이트되었더라도 동일한 Microdroid 인스턴스가 부팅되지 않습니다.
  • APEX 중 하나라도 인증이 실패하면 Microdroid가 부팅되지 않습니다.
  • instance.img가 게스트 pVM 외부에서 수정될 경우 Microdroid가 부팅되지 않거나 초기 상태로 부팅됩니다.
  • Microdroid는 부팅 체인에 증명을 제공합니다.
  • 게스트 pVM에 공유된 디스크 이미지가 (서명되지 않은 상태로) 수정되면 pVM 측에서 I/O 오류가 발생합니다.
  • pVM 인스턴스에 제공된 BCC 및 CDI는 해당 인스턴스에서만 파생될 수 있습니다.
  • 암호화된 저장소 볼륨에 쓰기는 기밀이지만 암호화 블록의 세부사항에 롤백 보호는 없습니다. 또한 데이터 블록의 다른 임의의 외부 조작으로 인해 해당 블록이 I/O 오류로 명시적으로 감지되지 않고 Microdroid에 가비지로 표시됩니다.

Android

다음은 Android에서 호스트로 유지관리되나 호스트의 보안이 침해될 경우 참으로 유지되지 않는 속성입니다.

  • 게스트 pVM은 다른 게스트 pVM과 직접 상호작용(예: vsock 연결 만들기)할 수 없습니다.
  • 호스트 pVM의 VirtualizationService만 pVM으로의 통신 채널을 만들 수 있습니다 (참고: 설정된 채널을 다른 채널에 전달할 수 있음).
  • 플랫폼 키로 서명된 앱만 pVM을 만들거나, 소유하거나, pVM과 상호작용할 권한을 요청할 수 있습니다.
  • 호스트와 pVM 간의 vsock 연결을 설정하는 데 사용되는 컨텍스트 식별자(CID)라는 식별자는 호스트 pVM이 실행되는 동안 재사용되지 않습니다. 예를 들어, 실행 중인 pVM을 다른 pVM으로 교체할 수 없습니다.

가용성

pVM이라는 맥락에서 가용성은 게스트가 자신이 실행하도록 디자인된 작업을 실행할 수 있도록 충분한 리소스를 할당하는 것을 의미합니다.

호스트의 책임에는 pVM의 가상 CPU를 예약하는 작업이 포함됩니다. KVM은 Xen과 같은 기존의 Type-1 하이퍼바이저와 달리 워크로드 설계를 호스트 커널에 위임하는 명시적 설계 결정을 내립니다. 현존하는 스케줄러의 크기와 복잡도를 고려할 때 이러한 설계 결정은 신뢰할 수 있는 컴퓨팅 기반(TCB)의 크기를 크게 줄이고 호스트가 정보에 입각한 예약 결정을 내려 성능을 최적화할 수 있도록 지원합니다. 그러나 악성 호스트가 게스트를 예약하지 않도록 선택할 수도 있습니다.

이와 마찬가지로, pKVM은 하이퍼바이저의 복잡성을 줄이고 일정 예약을 호스트가 담당하도록 호스트 커널에 물리적 인터럽트 처리를 위임하기도 합니다. 게스트 전달의 인터럽트가 서비스 거부(인터럽트가 너무 적거나 너무 많거나 잘못 라우팅되는 경우)로만 이어지도록 노력합니다.

마지막으로, 호스트의 가상 머신 모니터(VMM) 프로세스는 메모리를 할당하고 네트워크 카드와 같은 가상 기기를 제공합니다. 악성 VMM이 게스트에게 리소스가 할당되는 것을 막을 수 있습니다.

pKVM은 게스트에게 가용성을 제공하지 않지만, 호스트는 항상 게스트를 선점하거나 종료하여 리소스를 회수할 수 있으므로 pKVM의 설계는 악의적인 게스트로부터 호스트의 가용성을 보호합니다.

안전한 부팅

데이터는 pVM의 인스턴스에 연결되어 있으며, 안전한 부팅은 인스턴스 데이터에 대한 액세스가 제어될 수 있도록 지원합니다. 인스턴스의 첫 번째 부팅에서는 pVM의 보안 비밀 솔트를 무작위로 생성하고 로드된 이미지에서 인증 공개 키, 해시와 같은 세부정보를 추출하여 인스턴스를 프로비저닝합니다. 이 정보는 pVM 인스턴스의 후속 부팅을 확인하고 인스턴스의 보안 비밀이 확인을 통과한 이미지로만 해제되도록 하는 데 사용됩니다. 이 프로세스는 pVM 내부의 모든 로드 단계(pVM 펌웨어, pVM ABL, Microdroid 등)에서 발생합니다.

DICE는 각 로드 단계에 증명 키 쌍을 제공하며, 증명 키 쌍의 공개 부분은 해당 단계의 BCC 개체에서 인증됩니다. 이 키 쌍은 부팅 간에 변경될 수 있으므로 여러 재부팅에서 VM 인스턴스에 안정성을 갖는 봉인 보안 비밀이 파생됩니다. 따라서 이는 영구 상태를 보호하는 데 적합합니다. 봉인 보안 비밀은 VM에 매우 중요하므로 직접 사용해서는 안 됩니다. 대신 봉인 보안 비밀에서 봉합 키를 파생하고 봉인 보안 비밀은 최대한 빨리 폐기해야 합니다.

각 단계에서는 확정적으로 인코딩된 CBOR 객체를 다음 단계로 전달합니다. 이 객체에는 보안 비밀과 BCC가 포함되어 있으며, BCC는 마지막 단계가 안전하게 로드되었는지와 같은 누적 상태 정보가 포함됩니다.

잠금 해제된 기기

기기가 fastboot oem unlock을 사용하여 잠금 해제되면 사용자 데이터가 완전 삭제됩니다. 이 프로세스는 승인되지 않은 액세스로부터 사용자 데이터를 보호합니다. pVM의 비공개 데이터도 기기가 잠금 해제될 경우 무효화됩니다.

잠금 해제된 기기의 소유자는 일반적으로 자체 검사 부팅으로 보호되는 파티션(pKVM 구현을 포함하는 파티션 포함)을 자유롭게 다시 플래시할 수 있습니다. 따라서 잠금 해제된 기기의 pKVM은 보안 모델을 유지할 수 없습니다.

원격 사용자는 키 증명 인증서에서 기기의 자체 검사 부팅 상태를 검사하여 이러한 안전하지 않은 상태를 관찰할 수 있습니다.