보안

pVM 내에서 임의의 페이로드가 실행되는 것을 방지하기 위해 AVF(Android Virtualization Framework)는 각 계층이 추가 시행을 추가하는 계층화된 보안 접근 방식을 사용합니다. 다음은 AVF 보안 계층 ​​목록입니다.

  • Android – Android는 pVM 권한이 있는 앱만 pVM을 생성하거나 검사할 수 있도록 합니다.

  • 부트로더 – 부트로더는 Google 또는 장치 공급업체가 서명한 pVM 이미지만 부팅할 수 있도록 하고 Android Verified Boot 절차를 따릅니다. 이 아키텍처는 pVM을 실행하는 앱이 자체 커널을 번들로 묶을 수 없음을 의미합니다.

  • pVM – pVM은 SELinux 와 같이 pVM에서 실행되는 페이로드에 대한 심층 방어를 제공합니다. 심층 방어는 매핑 데이터를 실행 가능한 것으로 허용하지 않으며( neverallow execmem ) W^X 가 모든 파일 유형에 대해 유지되도록 합니다.

보안 모델

CIA 트라이어드라고도 하는 기밀성, 무결성 및 가용성은 정보 보안 정책을 안내하도록 설계된 모델입니다.

  • 기밀성은 정보에 대한 액세스를 제한하는 일련의 규칙입니다.
  • 무결성은 정보가 신뢰할 수 있고 정확하다는 보증입니다.
  • 가용성은 권한 있는 엔터티가 정보에 안정적으로 액세스할 수 있도록 보장합니다.

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

기밀성 및 무결성

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

기밀 유지에 대한 제한은 pVM을 대신하여 메모리 액세스를 수행하는 시스템의 모든 엔터티, 즉 더 많은 권한이 있는 계층에서 실행되는 DMA 지원 장치 및 서비스에도 적용됩니다. SoC 공급업체는 pKVM을 지원하기 전에 새로운 요구 사항 집합을 충족해야 합니다. 그렇지 않으면 기밀성을 제공할 수 없습니다.

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

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

이러한 요구 사항은 하이퍼바이저에 의해 시행됩니다. 그러나 데이터 무결성과 관련된 문제는 dm-verity 또는 AuthFS와 같은 다른 솔루션을 적용해야 하는 가상 데이터 스토리지에서도 발생합니다.

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

크기를 감안할 때 pKVM은 공식 검증에 적합합니다. 우리는 실제 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(Boot Certificate Chain) 및 CDI(Compound Device Identifier)는 해당 특정 인스턴스에서만 파생될 수 있습니다.

게스트 OS

Microdroid 는 pVM 내에서 실행되는 OS의 예입니다. Microdroid는 U-boot 기반 부트로더, 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는 해당 특정 인스턴스에서만 파생될 수 있습니다.

기계적 인조 인간

다음은 Android에서 호스트로 유지 관리하는 속성이지만 호스트가 손상되는 경우에는 적용되지 않습니다.

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

유효성

pVM의 맥락에서 가용성은 게스트가 수행하도록 설계된 작업을 수행할 수 있도록 게스트에게 충분한 리소스를 할당하는 호스트를 나타냅니다.

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

마찬가지로 pKVM은 물리적 인터럽트 처리를 호스트 커널에 위임하여 하이퍼바이저의 복잡성을 줄이고 호스트가 스케줄링을 담당하도록 합니다. 게스트 인터럽트 전달이 서비스 거부(너무 적거나 너무 많거나 잘못 라우팅된 인터럽트)만 발생하도록 하기 위해 노력합니다.

마지막으로 호스트의 VMM(가상 머신 모니터) 프로세스는 메모리를 할당하고 네트워크 카드와 같은 가상 장치를 제공하는 역할을 합니다. 악의적인 VMM은 게스트의 리소스를 보류할 수 있습니다.

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

보안 부트

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

DICE는 각 로딩 단계에 증명 키 쌍을 제공하며, 그 공개 부분은 해당 단계의 BCC 항목에서 인증됩니다. 이 키 쌍은 부팅 간에 변경될 수 있으므로 재부팅 시 VM 인스턴스에 대해 안정적이고 지속 상태를 보호하는 데 적합한 봉인 비밀 도 파생됩니다. 봉인 비밀은 VM에 매우 중요하므로 직접 사용해서는 안 됩니다. 대신, 봉인 열쇠는 봉인 비밀에서 파생되어야 하며 봉인 비밀은 가능한 한 빨리 파괴되어야 합니다.

각 단계는 결정적으로 인코딩된 CBOR 개체를 다음 단계로 전달합니다. 이 개체에는 마지막 단계가 안전하게 로드되었는지 여부와 같은 누적 상태 정보가 포함된 BCC와 비밀이 포함됩니다.

잠금 해제된 기기

장치가 fastboot oem unlock 으로 잠금 해제되면 사용자 데이터가 지워집니다. 이 프로세스는 무단 액세스로부터 사용자 데이터를 보호합니다. 장치 잠금 해제가 발생하면 pVM 전용 데이터도 무효화됩니다.

잠금이 해제되면 장치 소유자는 pKVM 구현이 포함된 파티션을 포함하여 일반적으로 검증 부팅으로 보호되는 파티션을 자유롭게 다시 플래시할 수 있습니다. 따라서 잠금 해제된 장치의 pKVM은 보안 모델을 유지하도록 신뢰할 수 없습니다.

원격 당사자는 키 증명 인증서에서 장치의 확인된 부팅 상태 를 검사하여 이 잠재적으로 안전하지 않은 상태를 관찰할 수 있습니다.