Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.
이 페이지는 Cloud Translation API를 통해 번역되었습니다.
Switch to English

태그 포인터

64 비트 프로세스의 경우 Android R에서 시작하여 모든 힙 할당에는 ARM TBI (Top-byte Ignore)에 대한 커널 지원이있는 디바이스에서 포인터의 최상위 바이트에 설정된 태그 정의 구현이 있습니다. 할당 해제 중에 태그를 확인하면이 태그를 수정하는 모든 응용 프로그램이 종료됩니다. 이는 ARM 메모리 태그 확장 (MTE)을 지원하는 향후 하드웨어에 필요합니다.

최상위 바이트 무시

ARM의 최상위 바이트 무시 기능은 모든 Armv8 AArch64 하드웨어에서 64 비트 코드에 사용할 수 있습니다. 이 기능은 메모리에 액세스 할 때 하드웨어가 포인터의 최상위 바이트를 무시한다는 것을 의미합니다.

TBI에는 사용자 공간에서 전달 된 태그가 지정된 포인터를 올바르게 처리하는 호환 가능한 커널 이 필요합니다. 4.14 (Pixel 4) 이상의 Android 공통 커널에는 필수 TBI 패치가 있습니다 .

커널에서 TBI를 지원하는 장치는 프로세스 시작시 동적으로 감지되며 모든 힙 할당을 위해 포인터의 최상위 바이트에 구현 종속 태그가 삽입됩니다. 그런 다음 메모리 할당 해제시 태그가 잘리지 않았는지 확인합니다.

메모리 태그 확장 준비

ARM의 메모리 태그 확장 (MTE)은 메모리 안전 문제를 해결하는 데 도움이됩니다. MTE는 스택, 힙 및 글로벌에서 각 메모리 할당의 56-59 번째 주소 비트에 태그를 지정 하여 작동합니다. 하드웨어 및 명령어 세트는 모든 메모리 액세스시 올바른 태그가 사용되는지 자동으로 확인합니다.

포인터의 최상위 바이트에 정보를 잘못 저장하는 Android 앱 은 MTE 지원 장치에서 깨질 수 있습니다. 태그가 지정된 포인터를 사용하면 MTE 장치를 사용할 수 있기 전에 포인터의 상위 바이트를 잘못 사용하는 것을 쉽게 감지하고 거부 할 수 있습니다.

개발자 지원

앱이 다운되고이 링크가 표시되면 다음 중 하나를 의미 할 수 있습니다.

  1. 응용 프로그램이 시스템의 힙 할당 자에 의해 할당되지 않은 포인터를 해제하려고했습니다.
  2. 앱의 무언가가 포인터의 최상위 바이트를 수정했습니다. 포인터의 최상위 바이트는 수정할 수 없으며이 문제를 해결하려면 코드를 변경해야합니다.

상단 바이트 포인터가 잘못 수정 된 예.

  • 특정 유형에 대한 포인터에는 상위 16 개 주소 비트에 저장된 응용 프로그램 특정 메타 데이터가 있습니다.
  • 더 낮은 주소 비트를 잃고 포인터가 두 배로 갔다가 다시 캐스트됩니다.
  • 재귀 깊이를 측정하는 방법으로 다른 스택 프레임의 로컬 변수 주소 간의 차이를 코드로 계산합니다.

일부 응용 프로그램은 포인터의 최상위 바이트가 설정 될 때 잘못 작동하는 라이브러리에 의존 할 수 있습니다. 라이브러리에서 이러한 근본적인 문제를 신속하게 해결하는 것은 사소한 일이 아님을 알고 있습니다. 따라서 targetSdkLevel < R 을 사용하는 응용 프로그램은 기본적으로 포인터 태깅을 사용할 수 없습니다. 또한 전환 기간을 단축하기 위해 Android R 이상용으로 구축 된 응용 프로그램을위한 탈출구를 제공합니다.

이스케이프 해치는 AndroidManifest.xml 파일에 다음을 추가하여 사용됩니다.

  <application android:allowNativeHeapPointerTagging="false">
  ...
  </application>

응용 프로그램에 대한 포인터 태그 기능이 비활성화됩니다. 이는 기본 코드 상태 문제를 해결하지 않습니다 . 이 탈출 문제는 향후 버전의 Android에서는 사라질 것입니다. 이러한 특성의 문제는 MTE 와 호환되지 않기 때문입니다.