AddressSanitizer ที่ใช้ฮาร์ดแวร์ช่วย (HWASan) เป็นเครื่องมือตรวจจับข้อผิดพลาดของหน่วยความจำที่คล้ายกับ AddressSanitizer HWASan ใช้ RAM น้อยกว่ามากเมื่อเทียบกับ ASan ซึ่งทำให้เหมาะสำหรับการฆ่าเชื้อทั้งระบบ HWASan ใช้งานได้บน Android 10 ขึ้นไป และในฮาร์ดแวร์ AArch64 เท่านั้น
แม้ว่าจะมีประโยชน์ในเบื้องต้นสำหรับโค้ด C/C++ แต่ HWASan ยังสามารถช่วยดีบักโค้ด Java ที่ทำให้เกิดข้อขัดข้องใน C/C++ ที่ใช้ในการปรับใช้อินเทอร์เฟซ Java มีประโยชน์เพราะจะตรวจจับข้อผิดพลาดของหน่วยความจำเมื่อเกิดขึ้น โดยชี้ให้คุณเห็นรหัสที่รับผิดชอบโดยตรง
คุณสามารถแฟลชรูปภาพ HWASan ที่สร้างไว้ล่วงหน้าไปยังอุปกรณ์ Pixel ที่รองรับได้จาก ci.android.com ( คำแนะนำในการตั้งค่าโดยละเอียด )
เมื่อเทียบกับ ASan แบบคลาสสิก HWASan มี:
- โอเวอร์เฮด CPU ที่คล้ายกัน (~2x)
- ค่าโสหุ้ยขนาดรหัสที่คล้ายกัน (40 – 50%)
- โอเวอร์เฮด RAM ที่เล็กกว่ามาก (10% – 35%)
HWASan ตรวจพบบั๊กชุดเดียวกับ ASan:
- สแต็กและฮีปบัฟเฟอร์ล้น/อันเดอร์โฟลว์
- ใช้กองหลังจากฟรี
- ใช้สแต็คนอกขอบเขต
- ฟรีสองเท่า/ไวด์ฟรี
นอกจากนี้ HWASan ยังตรวจพบการใช้สแต็กหลังจากการส่งคืน
รายละเอียดการใช้งานและข้อจำกัด
HWASan อิงตามวิธีการ ติดแท็กหน่วยความจำ โดยที่ค่าแท็กสุ่มขนาดเล็กจะเชื่อมโยงกับตัวชี้และช่วงที่อยู่หน่วยความจำ เพื่อให้การเข้าถึงหน่วยความจำถูกต้อง ตัวชี้และแท็กหน่วยความจำต้องตรงกัน HWASan อาศัย ARMv8 ฟีเจอร์การละเว้นไบต์บนสุด (TBI) หรือเรียกอีกอย่างว่าการ ติดแท็กที่อยู่เสมือน เพื่อเก็บแท็กตัวชี้ในบิตสูงสุดของที่อยู่
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ การออกแบบ HWASan ได้จากเว็บไซต์เอกสาร Clang
ตามการออกแบบ HWASan ไม่มีโซนสีแดงที่มีขนาดจำกัดของ ASan สำหรับตรวจจับการล้นหรือการกักกันที่มีความจุจำกัดของ ASan สำหรับการตรวจจับการใช้งานหลังจากใช้งานฟรี ด้วยเหตุผลนี้ HWASan จึงสามารถตรวจจับจุดบกพร่องได้ไม่ว่าโอเวอร์โฟลว์จะมีขนาดใหญ่เพียงใดหรือหน่วยความจำถูกจัดสรรคืนมานานแค่ไหน สิ่งนี้ทำให้ HWASan ได้เปรียบเหนือ ASan อย่างมาก
อย่างไรก็ตาม HWASan มีค่าแท็กที่เป็นไปได้ในจำนวนจำกัด (256) ซึ่งหมายความว่ามีความเป็นไปได้ 0.4% ที่จะพลาดจุดบกพร่องใดๆ ในระหว่างการเรียกใช้โปรแกรมครั้งเดียว
ความต้องการ
HWASan ต้องการให้เคอร์เนล Linux ยอมรับพอยน์เตอร์ที่แท็กในอาร์กิวเมนต์การเรียกระบบ การสนับสนุนนี้ได้รับการติดตั้งในแพตช์อัปสตรีมต่อไปนี้:
- arm64 ที่อยู่ที่แท็ก ABI
- arm64: ปลดแท็กพอยน์เตอร์ผู้ใช้ที่ส่งไปยังเคอร์เนล
- mm: หลีกเลี่ยงการสร้างนามแฝงที่อยู่เสมือนใน brk()/mmap()/mremap()
- arm64: ตรวจสอบที่อยู่ที่ติดแท็กใน access_ok() ที่เรียกจากเคอร์เนล threads
แพตช์เหล่านี้มีให้ใช้งานเป็นแบ็คพอร์ตใน เคอร์เนล Android ทั่วไป ใน android-4.14 และสาขาที่สูงกว่า แต่ไม่มีในสาขาเฉพาะของ Android 10 เช่น android-4.14-q
รองรับ Userspace สำหรับ HWASan โดยเริ่มตั้งแต่ Android 11
หากคุณกำลังสร้างด้วย toolchain แบบกำหนดเอง ตรวจสอบให้แน่ใจว่ามีทุกอย่างจนถึง LLVM commit c336557f
ใช้HWASan
ใช้คำสั่งต่อไปนี้เพื่อสร้างทั้งแพลตฟอร์มโดยใช้ HWASan:
lunch aosp_walleye-userdebug # (or any other product)
export SANITIZE_TARGET=hwaddress
m -j
เพื่อความสะดวก คุณสามารถเพิ่มการตั้งค่า SANITIZE_TARGET ให้กับคำจำกัดความผลิตภัณฑ์ คล้ายกับ aosp_coral_hwasan
ไม่เหมือนกับ ASan เพราะ HWASan ไม่จำเป็นต้องสร้างซ้ำสอง บิลด์ที่เพิ่มขึ้นนั้นใช้งานได้ ไม่มีคำแนะนำพิเศษในการกะพริบหรือข้อกำหนดในการลบ รองรับไฟล์เรียกทำงานแบบสแตติก และคุณสามารถข้ามการฆ่าเชื้อของไลบรารีอื่นที่ไม่ใช่ libc
ได้ นอกจากนี้ยังไม่มีข้อกำหนดว่าหากห้องสมุดถูกฆ่าเชื้อ ไฟล์ปฏิบัติการใดๆ ที่เชื่อมโยงไปยังไลบรารีจะต้องถูกฆ่าเชื้อด้วย
หากต้องการข้ามการฆ่าเชื้อของโมดูล ให้ใช้ LOCAL_NOSANITIZE := hwaddress
หรือ sanitize: { hwaddress: false }
แต่ละโมดูลอาจถูกฆ่าเชื้อด้วย HWASan โดยมีข้อแม้ที่ libc
ถูกรับรองโดย HWASan ด้วย สามารถทำได้โดยเพิ่ม sanitize: { hwaddress: true }
ลงในคำจำกัดความโมดูล Android.bp
ที่เกี่ยวข้อง แพลตฟอร์ม Android ทั้งหมดสร้างด้วย HWASan เมื่อใช้ _hwasan
-suffixed build (รวมถึง libc
) และเนื่องจาก libc
ฆ่าเชื้อด้วยตนเองนั้นไม่จำเป็นสำหรับ HWASan builds
การติดตามสแต็กที่ดีขึ้น
HWASan ใช้ตัวคลายตัวแบบอิงเฟรมอย่างรวดเร็วเพื่อบันทึกการติดตามสแต็กสำหรับทุกๆ เหตุการณ์การจัดสรรหน่วยความจำและการจัดสรรคืนในโปรแกรม Android เปิดใช้งานตัวชี้เฟรมในโค้ด AArch64 โดยค่าเริ่มต้น ดังนั้นจึงใช้งานได้ดีในทางปฏิบัติ หากคุณต้องการคลายโค้ดที่ได้รับการจัดการ ให้ตั้งค่า HWASAN_OPTIONS=fast_unwind_on_malloc=0
ในสภาพแวดล้อมกระบวนการ โปรดทราบว่าการติดตามสแต็กการเข้าถึงหน่วยความจำไม่ถูกต้องใช้ตัวคลาย "ช้า" โดยค่าเริ่มต้น การตั้งค่านี้มีผลกับการติดตามการจัดสรรและการจัดสรรคืนเท่านั้น ตัวเลือกนี้อาจใช้ CPU มาก ขึ้นอยู่กับโหลด
สัญลักษณ์
ดู สัญลักษณ์ ในเอกสารประกอบ ASan
HWASan ในแอป
คล้ายกับ AddressSanitizer HWASan มองไม่เห็นโค้ด Java แต่สามารถตรวจจับจุดบกพร่องในไลบรารี JNI ได้ ไม่สนับสนุน ASan การเรียกใช้แอป HWASan บนอุปกรณ์ที่ ไม่ใช่ HWASan
บนอุปกรณ์ HWASan แอปสามารถตรวจสอบกับ HWASan ได้โดยการสร้างโค้ดด้วย SANITIZE_TARGET:=hwaddress
ใน Make หรือ -fsanitize=hwaddress
ในแฟล็กคอมไพเลอร์ ดู เอกสารสำหรับนักพัฒนาแอป สำหรับรายละเอียดเพิ่มเติม