ตัวล้าง HWAddress

Android NDK รองรับ HWAddress Sanitizer หรือที่รู้จักกันในชื่อ HWASan โดยเริ่มต้นใช้งาน พร้อม NDK r21 และ Android 10 (API ระดับ 29) HWASan มีให้บริการในแบบ 64 บิตเท่านั้น เปิดระบบอุปกรณ์

HWASan เป็นเครื่องมือตรวจสอบข้อผิดพลาดด้านหน่วยความจําที่คล้ายกับ ASan เมื่อเทียบกับแบบคลาสสิก ASan, HWASan มี

  • โอเวอร์เฮดของ CPU ที่คล้ายกัน (ประมาณ 2 เท่า)
  • โอเวอร์เฮดขนาดโค้ดที่คล้ายกัน (40 – 50%)
  • โอเวอร์เฮดของ RAM น้อยกว่ามาก (10% - 35%)

HWASan ตรวจพบข้อบกพร่องชุดเดียวกันกับ ASan

  • สแต็กและฮีปบัฟเฟอร์ล้นหรือล้นเกิน
  • การใช้ฮีปหลังจากฟรี
  • การใช้สแต็กนอกขอบเขต
  • Double Free หรือ Wild Free

นอกจากนี้ HWASan ยังตรวจพบสิ่งต่อไปนี้ด้วย

  • การใช้สแต็กหลังจากการส่งคืน

แอปตัวอย่าง

ตัวอย่างแอป แสดงวิธีกำหนดค่าเวอร์ชันบิลด์สำหรับ Hwasan

สร้าง

หากต้องการสร้างโค้ดเนทีฟ (JNI) ของแอปด้วย HWAddress Sanitizer ให้ทำดังนี้ ดังต่อไปนี้:

Ndk-Build

ในไฟล์ Application.mk

APP_STL := c++_shared # Or system, or none, but not c++_static.
APP_CFLAGS := -fsanitize=hwaddress -fno-omit-frame-pointer
APP_LDFLAGS := -fsanitize=hwaddress

ผู้ผลิต

ในไฟล์ build.gradle ของโมดูล:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                # Can also use system or none as ANDROID_STL, but not c++_static.
                arguments "-DANDROID_STL=c++_shared"
            }
        }
    }
}

สำหรับแต่ละเป้าหมายใน CMakeLists.txt

target_compile_options(${TARGET} PUBLIC -fsanitize=hwaddress -fno-omit-frame-pointer)
target_link_options(${TARGET} PUBLIC -fsanitize=hwaddress)

เมื่อใช้ NDK 27 หรือใหม่กว่า คุณยังใช้สิ่งต่อไปนี้ใน build.gradle ได้ด้วย และไม่ต้องเปลี่ยน CMakeLists.txt:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments "-DANDROID_SANITIZE=hwaddress"
            }
        }
    }
}

คำสั่งนี้จะใช้งานไม่ได้เมื่อใช้ ANDROID_USE_LEGACY_TOOLCHAIN_FILE=false

Android 14 ขึ้นไป: เพิ่ม wrap.sh

หากคุณใช้ Android 14 ขึ้นไป คุณสามารถใช้ สคริปต์ wrap.sh เพื่อเรียกใช้แอปที่แก้ไขข้อบกพร่องได้ในเว็บไซต์ อุปกรณ์ที่ใช้ระบบ Android คุณข้ามขั้นตอนนี้ได้หากเลือกทำตามขั้นตอน ในวิธีการตั้งค่า

ทำตามวิธีการเพื่อ ทำแพ็กเกจสคริปต์ wrap.sh เพื่อเพิ่มฟังก์ชัน สคริปต์ wrap.sh ต่อไปนี้สำหรับ arm64-v8a

#!/system/bin/sh
LD_HWASAN=1 exec "$@"

เรียกใช้

หากใช้ Android เวอร์ชันที่เก่ากว่า 14 หรือไม่ได้เพิ่ม wrap.sh ให้ทำตามคำแนะนำการตั้งค่าก่อนเรียกใช้แอป

เรียกใช้แอปตามปกติ เมื่อตรวจพบข้อผิดพลาดของหน่วยความจํา แอปขัดข้องด้วย SIGABRT และพิมพ์ข้อความโดยละเอียดไปยัง Logcat สำเนาข้อความจะทำสิ่งต่อไปนี้ได้ ในไฟล์ภายใต้ /data/tombstones และมีลักษณะดังนี้

ERROR: HWAddressSanitizer: tag-mismatch on address 0x0042a0826510 at pc 0x007b24d90a0c
WRITE of size 1 at 0x0042a0826510 tags: 32/3d (ptr/mem) in thread T0
    #0 0x7b24d90a08  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x2a08)
    #1 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)
    #2 0x7b8f1db364  (/apex/com.android.art/lib64/libart.so+0x18f364)
    #3 0x7b8f2ad8d4  (/apex/com.android.art/lib64/libart.so+0x2618d4)

0x0042a0826510 is located 0 bytes to the right of 16-byte region [0x0042a0826500,0x0042a0826510)
allocated here:
    #0 0x7b92a322bc  (/apex/com.android.runtime/lib64/bionic/libclang_rt.hwasan-aarch64-android.so+0x212bc)
    #1 0x7b24d909e0  (/data/app/com.example.hellohwasan-eRpO2UhYylZaW0P_E0z7vA==/lib/arm64/libnative-lib.so+0x29e0)
    #2 0x7b8f1e4ccc  (/apex/com.android.art/lib64/libart.so+0x198ccc)

ข้อความอาจมีข้อมูลการแก้ไขข้อบกพร่องเพิ่มเติมรวมถึง รายการเทรดแบบสดในแอปพลิเคชัน แท็กของการจัดสรรหน่วยความจำใกล้เคียง ค่าการลงทะเบียน CPU

ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดของ HWASan ได้ที่การทำความเข้าใจรายงาน HWASan ข้อความ

การสร้างไฟล์ปฏิบัติการบรรทัดคำสั่ง

คุณสามารถสร้างและเรียกใช้ไฟล์สั่งการที่ใช้ HWASan ใน Android 14 และ ใหม่กว่า คุณสามารถใช้การกำหนดค่าเดียวกับที่อธิบายไว้ใน Build สำหรับ ndk-build หรือ CMake สำหรับไฟล์ปฏิบัติการของคุณ พุชไฟล์ปฏิบัติการไปยังอุปกรณ์ ใช้ Android 14 ขึ้นไปและทํางานตามปกติโดยใช้ Shell

หากคุณใช้ libc++ ให้ตรวจสอบว่าคุณใช้ STL ที่แชร์อยู่และพุชไปยัง อุปกรณ์และตั้งค่า LD_LIBRARY_PATH เป็นไดเรกทอรีที่มีอุปกรณ์เมื่อ ที่ใช้ไบนารีของคุณ

หากคุณไม่ได้ใช้ Gradle โปรดดูเอกสาร NDK เพื่อเรียนรู้วิธีสร้างจาก บรรทัดคำสั่งด้วย CMake และ ndk-build

Android 13 หรือเวอร์ชันก่อนหน้า: การตั้งค่า

หากอุปกรณ์ของคุณใช้ Android 14 ขึ้นไป คุณข้ามขั้นตอนนี้และทำตาม วิธีการใช้ wrap.sh ในส่วนสร้างด้านล่าง คุณยังสามารถเลือกทำตามส่วนนี้ และข้ามคำแนะนำในการใช้ wrap.sh ด้านล่าง

ก่อน Android 14 แอปพลิเคชัน HWASan ต้องใช้บิลด์ HWASan ของ Android จึงจะทำงานได้ คุณสามารถแฟลชอิมเมจ HWASan ที่สร้างไว้ล่วงหน้าไปยังอุปกรณ์ Pixel ที่รองรับได้ สิ่งที่สร้างขึ้นคือ ใน ci.android.com ซึ่งคุณสามารถคลิกรูปสี่เหลี่ยมจัตุรัสสำหรับ บิลด์ที่คุณต้องการรับลิงก์ Flash Build โดยคุณต้องทราบว่า ชื่อรหัสสำหรับโทรศัพท์ของคุณ

แฟลชบิลด์ของอุปกรณ์

การไปที่ flash.android.com โดยตรงจะง่ายกว่า เนื่องจากมี ขั้นตอนเริ่มต้นจากการตรวจหาอุปกรณ์ของคุณและแสดงเฉพาะบิลด์ที่คุณใช้ได้ ภาพต่อไปนี้แสดงขั้นตอนการตั้งค่าในเครื่องมือนี้

เปิดใช้โหมดนักพัฒนาซอฟต์แวร์ในอุปกรณ์ และเชื่อมต่อกับคอมพิวเตอร์โดยใช้ สาย USB คลิกเพิ่มอุปกรณ์ใหม่ เลือกอุปกรณ์จากกล่องโต้ตอบ และ ให้คลิกเชื่อมต่อ

ตรวจจับอุปกรณ์ที่จะแฟลช เลือกอุปกรณ์ที่จะเชื่อมต่อ

หลังจากเชื่อมต่ออุปกรณ์แล้ว ให้คลิกอุปกรณ์เพื่อกำหนดค่าบิลด์ ในช่องเลือกรหัสบิลด์ ให้เลือก aosp-master-with-phones-throttled เพื่อเลือกภาพที่ถูกต้องสำหรับอุปกรณ์ที่คุณมีโดยอัตโนมัติ เชื่อมต่อ แล้ว

เลือกอุปกรณ์ที่จะแฟลช ยืนยันตัวเลือกแฟลชและแฟลชอุปกรณ์

คลิกติดตั้งเพื่อแฟลชอุปกรณ์

มีรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งค่าที่จำเป็นใน เอกสาร Android Flash Tool หรือคุณสามารถตรวจสอบ เอกสารประกอบของ AOSP สำหรับวิธีการสร้างอิมเมจ HWASan จากต้นทาง