Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

HWAddressSanitizer

하드웨어 지원 AddressSanitizer(HWASan)는 AddressSanitizer와 유사한 메모리 오류 감지 도구입니다. HWASan은 ASan에 비해 RAM을 훨씬 적게 사용하므로 전체 시스템 정리에 적합합니다. HWASan은 Android 10 이상 및 AArch64 하드웨어에서만 사용할 수 있습니다. 미리 빌드된 HWASan 이미지를 ci.android.com에서 지원되는 Pixel 기기에 플래시할 수 있습니다(자세한 설정 안내).

HWASan은 기본 ASan과 비교하여 다음과 같은 이점이 있습니다.

  • 유사한 CPU 오버헤드(최대 2배)
  • 유사한 코드 크기 오버헤드(40~50%)
  • RAM 오버헤드가 훨씬 적음(10%~35%)

HWASan은 다음과 같이 ASan과 동일한 버그 집합을 감지합니다.

  • 스택 및 힙 버퍼 오버플로우/언더플로우
  • 프리 후 힙 사용
  • 범위를 벗어난 스택 사용
  • 더블 프리/와일드 프리

또한 HWASan은 반환 후에 스택 사용을 감지합니다.

구현 세부정보 및 제한사항

HWASan은 메모리 태그하기 접근 방식을 기반으로 하며, 작은 임의 태그 값이 포인터 및 메모리 주소 범위와 연결됩니다. 메모리 액세스가 유효하려면 포인터와 메모리 태그가 일치해야 합니다. HWASan은 포인터 태그를 주소의 최상위 비트에 저장하기 위해 가상 주소 태그하기라고도 하는 ARMv8의 기능인 TBI(Top Byte Ignore)를 사용합니다.

HWASan의 설계에 관한 자세한 내용은 Clang 문서 사이트를 참조하세요.

의도적으로, HWASan에는 오버플로우 감지를 위한 ASan의 크기가 제한된 Redzone 또는 해제 후 사용 감지를 위한 ASan의 제한된 용량 격리 저장소가 없습니다. 따라서 HWASan은 오버플로우의 크기 또는 메모리 할당 취소 기간에 상관없이 버그를 감지할 수 있습니다. 덕분에 HWASan은 ASan에 비해 큰 이점을 갖습니다.

하지만 HWASan은 가능한 태그 값이 256개로 제한되어 있으므로 프로그램을 한 번 실행하는 동안 버그가 누락될 확률은 0.4%입니다.

요건

HWASan은 Linux 커널에서 시스템 호출 인수의 태그 포인터를 승인하도록 요구합니다. 이에 관한 지원은 다음 업스트림 패치 세트에서 구현되었습니다.

이러한 패치는 android-4.14 이상 분기의 일반 Android 커널에서 백포트로 사용할 수 있지만 android-4.14-q와 같은 Android 10의 특정 분기에서는 사용할 수 없습니다.

HWASan의 사용자 공간 지원은 Android 11부터 사용할 수 있습니다.

맞춤 도구 모음을 사용하여 빌드하는 경우 LLVM 커밋 c336557f까지 모두 포함되어 있는지 확인합니다.

HWASan 사용

다음 명령어를 사용하여 HWASan을 사용하는 전체 플랫폼을 빌드합니다.

lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j

편의상 aosp_coral_hwasan과 유사하게 제품 정의에 SANITIZE_TARGET 설정을 추가할 수 있습니다.

ASan과 달리 HWASan은 두 번 빌드할 필요가 없습니다. 빌드를 쌓아가도 잘 작동하며, 특별한 플래시 지침이나 완전 삭제 요구사항이 없습니다. 정적 실행 파일이 지원되며 libc 이외의 라이브러리는 정리하지 않아도 됩니다. 라이브러리를 정리하는 경우 라이브러리에 연결된 모든 실행 파일도 정리해야 한다는 요구사항도 없습니다.

모듈 정리를 건너뛰려면 LOCAL_NOSANITIZE := hwaddress 또는 sanitize: { hwaddress: false }를 사용합니다.

개별 모듈은 HWASan으로 정리될 수 있으며 단, libc도 HWASan으로 정리됩니다. 이 작업은 각 Android.bp 모듈 정의에 sanitize: { hwaddress: true }를 추가하여 실행할 수 있습니다. 전체 Android 플랫폼은 접미어가 _hwasan인 빌드(libc 포함)를 사용할 때 HWASan으로 빌드되므로 libc를 수동으로 정리하는 것은 HWASan 빌드에 필요하지 않습니다.

향상된 스택 트레이스

HWASan은 고속 프레임 포인터 기반 언와인더를 사용하여 프로그램의 모든 메모리 할당 및 할당 취소 이벤트에 관한 스택 트레이스를 기록합니다. Android는 기본적으로 AArch64 코드에서 프레임 포인터를 사용 설정하므로 실제로 매우 잘 작동합니다. 관리 코드를 통해 해제해야 하는 경우 프로세스 환경에서 HWASAN_OPTIONS=fast_unwind_on_malloc=0을 설정합니다. 잘못된 메모리 액세스 스택 트레이스는 기본적으로 '느린' 언와인더를 사용합니다. 이 설정은 할당 및 할당 취소 트레이스에만 영향을 미칩니다. 이 옵션은 로드에 따라 CPU를 매우 많이 사용할 수 있습니다.

기호화

ASan 문서에서 기호화를 참조하세요.

앱 내 HWASan

AddressSanitizer와 마찬가지로 HWASan에서는 자바 코드를 볼 수 없지만 JNI 라이브러리에서 버그를 감지할 수 있습니다. ASan과 달리 HWASan 기기 이외의 기기에서는 HWASan 앱을 실행할 수 없습니다.

HWASan 기기에서 Make에서는 SANITIZE_TARGET:=hwaddress로, 컴파일러 플래그에서는 -fsanitize=hwaddress로 앱 코드를 빌드하여 HWASan으로 앱을 확인할 수 있습니다. 자세한 내용은 앱 개발자 문서를 참조하세요.