MTE 부트로더 지원

Android 13에서는 요청된 MTE 모드를 부트로더에 전달할 수 있도록 사용자 공간용 ABI를 도입했습니다. 이는 하드웨어를 지원하지만 기본적으로 MTE가 사용 설정된 상태로 제공되지 않는 기기에서 MTE를 사용 설정하거나 기본적으로 MTE가 사용 설정된 상태로 제공되는 기기에서 MTE를 사용 중지하는 데 사용할 수 있습니다.

부트로더 지원

이 ABI를 지원하려면 부트로더가 misc 파티션에서 misc_memtag_message(bootloader_message.h에 정의됨)를 읽어야 합니다. 유효한 misc_memtag_message가 있으면(MISC_VIRTUAL_AB_MAGIC_HEADER가 일치하고 버전 번호가 지원됨) 부트로더가 계산합니다.

memtag = (default_memtag && !(misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_OFF)) ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_ONCE

memtag_kernel = misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL ||
      misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE

default_memtag는 SKU의 기본 memtag 사용/사용 중지 설정입니다. memtag가 true인 경우 부트로더는 MTE 태그 예약을 설정하고 하위 예외 수준에서 태그 확인을 사용 설정하며 태그 예약 영역을 DT를 통해 커널에 전달합니다. memtag가 false인 경우 부트로더는 커널 명령줄에 arm64.nomte를 추가합니다.

memtag_kernel이 true인 경우 부트로더는 커널 명령줄에 kasan=on을 추가합니다.

부트로더는 부팅할 때마다 MISC_MEMTAG_MODE_MEMTAG_ONCEMISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE를 삭제해야 합니다.

부트로더가 fastboot oem mte를 지원하면 다른 플래그를 보존하면서 MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF}(1, 0, 0)으로 설정하여 사용하고 (0, 0, 1)로 설정하여 사용 중지합니다.

사용자 공간 지원을 위한 mtectrl 바이너리를 빌드하도록 제품을 구성해야 합니다. 그런 다음 부트로더가 memtag 메시지를 지원한다고 시스템에 나타내도록 ro.arm64.memtag.bootctl_supported 시스템 속성을 설정합니다.

사용자 인터페이스

ro.arm64.memtag.bootctl_supported 속성이 설정되면 개발자 옵션 메뉴의 버튼을 사용하여, MTE가 사용 설정된 상태에서 사용자가 한 번 재부팅할 수 있습니다. 타겟층은 MTE로 앱을 테스트하려는 앱 개발자입니다. MTE 개발자 옵션 스크린샷

시스템 속성

고급 사용을 위해 시스템 속성 arm64.memtag.bootctl은 다음 값의 쉼표로 구분된 목록을 사용할 수 있습니다.

  • memtag: 사용자 공간 MTE를 지속적으로 사용 설정합니다(MISC_MEMTAG_MODE_MEMTAG 설정).
  • memtag-once: 사용자 공간 MTE를 한 번 사용 설정합니다(MISC_MEMTAG_MODE_MEMTAG_ONCE 설정).
  • memtag-kernel: 커널 공간 MTE를 사용 설정합니다(MISC_MEMTAG_MODE_MEMTAG_KERNEL 설정).
  • memtag-kernel-once: 커널 공간 MTE를 한 번 사용 설정합니다(MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE).
  • memtag-off: MTE를 사용 중지합니다(MISC_MEMTAG_MODE_MEMTAG_OFF 설정)

새로운 설정을 적용하려면 시스템을 재부팅해야 합니다(부트로더에서 적용함).