ดูการทำความเข้าใจเกี่ยวกับ HWASan รายงานเพื่ออ่านข้อมูลเกี่ยวกับวิธีอ่านข้อขัดข้องของ HWASan
AddressSanitizer (HWASan) ที่ใช้ฮาร์ดแวร์ช่วยเป็นข้อผิดพลาดของหน่วยความจํา เครื่องมือตรวจจับที่คล้ายกับ AddressSanitizer ฮวาซาน ใช้ RAM น้อยกว่ามากเมื่อเทียบกับ ASan ซึ่งทำให้เหมาะสำหรับ การทำความสะอาดข้อมูลทั้งระบบ HWASan พร้อมให้บริการใน Android 10 เท่านั้น และสูงกว่า และใช้กับฮาร์ดแวร์ AArch64 เท่านั้น
แม้ว่าจะมีประโยชน์สำหรับโค้ด C/C++ เป็นหลัก แต่ HWASan ยังช่วยแก้ไขข้อบกพร่องของโค้ด Java ที่ทําให้เกิด ขัดข้องใน C/C++ ที่ใช้เพื่อใช้งานอินเทอร์เฟซ Java มีประโยชน์เพราะจะจดจำความทรงจำได้ เมื่อเกิดข้อผิดพลาด โดยนำคุณไปยังโค้ดที่รับผิดชอบโดยตรง
คุณสามารถแฟลชอิมเมจ HWASan ที่สร้างไว้ล่วงหน้าไปยังอุปกรณ์ Pixel ที่รองรับได้ตั้งแต่ ci.android.com (วิธีการตั้งค่าโดยละเอียด)
HWASan มีคุณสมบัติดังนี้เมื่อเทียบกับ ASan คลาสสิก
- โอเวอร์เฮดของ CPU ที่คล้ายกัน (ประมาณ 2 เท่า)
- โอเวอร์เฮดขนาดโค้ดที่คล้ายกัน (40 – 50%)
- โอเวอร์เฮดของ RAM น้อยลงมาก (10% – 35%)
HWASan ตรวจพบข้อบกพร่องชุดเดียวกันกับ ASan
- สแต็กและฮีปบัฟเฟอร์ล้น/ล้นเกิน
- การใช้ฮีปหลังจากฟรี
- การใช้สแต็กนอกขอบเขต
- Double Free/Wild Free
นอกจากนี้ HWASan ยังตรวจจับการใช้สแต็กหลังจากการส่งคืนด้วย
HWASan (เช่นเดียวกับ ASan) ใช้ได้กับ UBSan คุณสามารถเปิดใช้ทั้ง 2 รายการในเป้าหมายได้พร้อมกัน
รายละเอียดและข้อจำกัดในการใช้งาน
HWASan อิงตาม หน่วยความจำ การติดแท็ก โดยที่ค่าแท็กแบบสุ่มเล็กน้อยจะเชื่อมโยงกัน ทั้งที่มีตัวชี้และช่วงของที่อยู่หน่วยความจำ เพื่อความทรงจำ สิทธิ์การเข้าถึงที่ถูกต้อง แท็กตัวชี้และแท็กหน่วยความจำต้องตรงกัน HWASan ใช้ ARMv8 ฟีเจอร์ใหม่แบบ Top Byte (TBI) หรือที่เรียกว่า การติดแท็กที่อยู่เสมือน เพื่อจัดเก็บแท็กตัวชี้ใน บิตสูงสุดของที่อยู่
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ การออกแบบ ของ HWASan ในเว็บไซต์เอกสารประกอบของ Clang
ตามการออกแบบ HWASan ไม่มีพื้นที่สีแดงที่จำกัดของ ASan สำหรับ การตรวจจับข้อมูลล้นหรือเขตกักเก็บที่จำกัดของ ASan สำหรับ กำลังตรวจพบการใช้งานหลังจากฟรี ด้วยเหตุนี้ HWASan จึงตรวจหาข้อบกพร่องได้ ไม่ว่าข้อมูลล้นจะมีขนาดใหญ่แค่ไหนหรือหน่วยความจำนั้นนานแค่ไหนแล้ว ดีลนี้ ซึ่งทำให้ HWASan มีข้อได้เปรียบเหนือ ASan อย่างมาก
อย่างไรก็ตาม HWASan มีค่าแท็กที่เป็นไปได้จำกัด (256) หมายความว่ามีโอกาส 0.4% ที่ จะพลาดข้อบกพร่องใดๆ ระหว่างการดำเนินโปรแกรมครั้งหนึ่ง
ข้อกำหนด
เวอร์ชันล่าสุด (4.14+) การสนับสนุนเคอร์เนล Android ทั่วไป HWASan พร้อมใช้งาน สาขาที่เจาะจงของ Android 10 ไม่รองรับ HWASan
การรองรับพื้นที่ผู้ใช้สำหรับ HWASan จะพร้อมให้บริการใน Android 11
หากคุณทำงานกับเคอร์เนลอื่น HWASan ต้องใช้เคอร์เนลของ Linux เพื่อยอมรับเคอร์เซอร์ที่ติดแท็กใน อาร์กิวเมนต์การเรียกระบบ มีการสนับสนุนสำหรับการอัปเดตนี้ในแพตช์อัปสตรีมต่อไปนี้:
- ABI ที่อยู่ที่ติดแท็ก arm64
- arm64: ยกเลิกการแท็กเคอร์เซอร์ผู้ใช้ที่ส่งผ่านไปยังเคอร์เนล
- mm: หลีกเลี่ยงการสร้างชื่อแทนที่อยู่เสมือนใน brk()/mmap()/mremap()
- arm64: ตรวจสอบที่อยู่ที่ติดแท็กในaccess_ok() ที่เรียกจากเทรดเคอร์เนล
หากคุณสร้างด้วย Toolchain ที่กำหนดเอง โปรดตรวจสอบว่าได้รวมทุกอย่างจนถึง LLVM คอมมิต c336557f
ใช้ HWASan
ใช้คำสั่งต่อไปนี้เพื่อสร้างแพลตฟอร์มทั้งหมดโดยใช้ HWASan
lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j
เพื่อความสะดวก คุณสามารถเพิ่มการตั้งค่า SANITIZE_TARGET ในการกำหนดผลิตภัณฑ์ได้ คล้ายกับ aosp_coral_hwasan
ผู้ใช้ที่คุ้นเคยกับ AddressSanitizer จะมีความซับซ้อนของบิลด์มากมาย
- ไม่จำเป็นต้องรัน 2 ครั้ง
- งานสร้างที่เพิ่มขึ้นทำงานได้ทันที
- ไม่จำเป็นต้องแสดงข้อมูลผู้ใช้แบบ Flash
ข้อจำกัดบางประการของ AddressSanitizer จะหายไปดังนี้
- รองรับไฟล์ปฏิบัติการแบบคงที่
- คุณสามารถข้ามการตรวจสอบความถูกต้องของเป้าหมายอื่นๆ ที่ไม่ใช่ libc ได้ สิ่งที่ต่างจาก ASan ก็คือ ไม่มีข้อกำหนดว่าหากไลบรารีได้รับการทำความสะอาด ไฟล์ปฏิบัติการใดๆ ที่เชื่อมโยงจะต้องลิงก์ด้วย
สลับระหว่าง HWASan และรูปภาพปกติที่หมายเลขบิลด์เดียวกัน (หรือสูงกว่า) ได้ ได้อย่างอิสระ โดยไม่จำเป็นต้องล้างข้อมูลอุปกรณ์
หากต้องการข้ามการปรับปรุงโมดูล ให้ใช้
LOCAL_NOSANITIZE := hwaddress
(Android.mk) หรือ
sanitize: { hwaddress: false }
(Android.bp)
ทำให้เป้าหมายแต่ละรายการเข้าใจง่ายขึ้น
สามารถเปิดใช้ HWASan ต่อเป้าหมายในบิลด์ปกติ (ไม่อัปเดต) ได้ตราบใดที่ libc.so
ยัง
ถูกสุขอนามัย เพิ่ม hwaddress: true
ไปยังบล็อกล้างใน "libc_defaults"
ใน bionic/libc/Android.bp แล้วทำแบบเดียวกันนี้ในเป้าหมายที่คุณกำลังทำอยู่
โปรดทราบว่าการทำความสะอาด libc จะเปิดใช้การติดแท็กการจัดสรรหน่วยความจำฮีปทั้งระบบ และ
กำลังตรวจสอบแท็กเพื่อดูการดำเนินการด้านหน่วยความจำภายใน libc.so
การดำเนินการนี้อาจจับข้อบกพร่องได้แม้ในไบนารี
ไม่ได้เปิดใช้ HWASan หากการเข้าถึงหน่วยความจำที่ไม่ถูกต้องอยู่ใน libc.so
(เช่น pthread_mutex_unlock()
ในปิดเสียง delete()
)
ไม่จำเป็นต้องเปลี่ยนไฟล์บิลด์ใดๆ หากทั้งแพลตฟอร์มสร้างขึ้นโดยใช้ HWASan
แฟลชการ์ด
เพื่อการพัฒนา คุณสามารถแฟลชบิลด์ AOSP ที่พร้อมใช้งาน HWASan ลงในอุปกรณ์ Pixel ด้วย Bootloader ที่ปลดล็อกโดยใช้ Flashstation เลือกเป้าหมาย _hwasan เช่น aosp_flae_hwasan-userdebug โปรดดู เอกสารประกอบเกี่ยวกับ NDK สำหรับ HWASan สำหรับนักพัฒนาแอปเพื่อให้ทราบรายละเอียดเพิ่มเติม
สแต็กเทรซที่ดียิ่งขึ้น
HWASan ใช้โปรแกรมคลายการไขว้แบบเฟรมที่อาศัยการชี้เมาส์อย่างรวดเร็วเพื่อบันทึกสแต็ก
ติดตามทุกเหตุการณ์การจัดสรรหน่วยความจำและดีลตำแหน่งใน
ของโปรแกรม Android จะเปิดใช้เคอร์เซอร์เฟรมในโค้ด AArch64 โดยค่าเริ่มต้น
วิธีนี้ได้ผลดีในทางปฏิบัติ หากคุณต้องการผ่อนคลาย
โค้ดที่มีการจัดการ ตั้งค่าHWASAN_OPTIONS=fast_unwind_on_malloc=0
ในสภาพแวดล้อมกระบวนการ โปรดทราบว่าสแต็กการเข้าถึงหน่วยความจำที่ไม่ถูกต้อง
ให้ใช้แอตทริบิวต์ "ช้า" unwinder โดยค่าเริ่มต้น การตั้งค่านี้จะส่งผลต่อ
การจัดสรรและการติดตามการซื้อขาย ตัวเลือกนี้อาจมีลักษณะดังนี้
ใช้ CPU หนักหน่วง โดยขึ้นอยู่กับภาระงาน
สัญลักษณ์
ดูการแทนที่ด้วยสัญลักษณ์ ใน "การทำความเข้าใจรายงาน HWASan"
HWASan ในแอป
HWASan จะไม่สามารถมองเห็นในโค้ด Java ได้ เช่นเดียวกับ AddressSanitizer โมเดลนี้สามารถตรวจจับข้อบกพร่อง ในไลบรารี JNI จนถึง Android 14 ซึ่งใช้ HWASan ไม่รองรับแอปบนอุปกรณ์ที่ไม่ใช่ HWASan
บนอุปกรณ์ HWASan คุณสามารถตรวจสอบแอปกับ HWASan ได้โดยการสร้าง
รหัสที่มี SANITIZE_TARGET:=hwaddress
ใน
สร้าง หรือ -fsanitize=hwaddress
ในแฟล็กคอมไพเลอร์
ในอุปกรณ์ที่ไม่ใช่ HWASan (ที่ใช้ Android 14 ขึ้นไป) การตั้งค่าไฟล์ wrap.sh
ต้องเพิ่ม LD_HWASAN=1
โปรดดู
เอกสารประกอบสำหรับนักพัฒนาแอป
เพื่อดูรายละเอียดเพิ่มเติม