HWAที่อยู่เครื่องฆ่าเชื้อ

ฮาร์ดแวร์ช่วย AddressSanitizer (HWASan) เป็นเครื่องมือที่มีการตรวจสอบข้อผิดพลาดของหน่วยความจำที่คล้ายกับ AddressSanitizer HWASan ใช้ RAM น้อยกว่ามากเมื่อเทียบกับ ASan ซึ่งทำให้เหมาะสำหรับการฆ่าเชื้อทั้งระบบ HWASan ใช้ได้เฉพาะใน Android 10 ขึ้นไป และในฮาร์ดแวร์ AArch64 เท่านั้น

แม้ว่าจะมีประโยชน์สำหรับโค้ด C/C++ เป็นหลัก แต่ HWASan ยังสามารถช่วยดีบักโค้ด Java ที่ทำให้เกิดข้อขัดข้องใน C/C++ ที่ใช้ในการปรับใช้อินเทอร์เฟซ Java มีประโยชน์เพราะจะตรวจจับข้อผิดพลาดของหน่วยความจำเมื่อเกิดขึ้น โดยชี้ไปที่รหัสที่รับผิดชอบโดยตรง

คุณสามารถแฟลชที่สร้างไว้ล่วงหน้าภาพไปยังอุปกรณ์ HWASan พิกเซลได้รับการสนับสนุนจาก ci.android.com ( รายละเอียดคำแนะนำการติดตั้ง )

เมื่อเทียบกับ ASan แบบคลาสสิก HWASan มี:

  • โอเวอร์เฮด CPU ที่คล้ายกัน (~2x)
  • ค่าโสหุ้ยขนาดรหัสที่คล้ายกัน (40 – 50%)
  • โอเวอร์เฮด RAM ที่เล็กกว่ามาก (10% – 35%)

HWASan ตรวจพบบั๊กชุดเดียวกับ ASan:

  • สแต็กและฮีปบัฟเฟอร์ล้น/อันเดอร์โฟลว์
  • ใช้กองหลังฟรี
  • ใช้สแต็คนอกขอบเขต
  • ฟรีสองเท่า/ไวด์ฟรี

นอกจากนี้ HWASan ยังตรวจพบการใช้สแต็กหลังจากส่งคืน

รายละเอียดการใช้งานและข้อจำกัด

HWASan จะขึ้นอยู่กับ หน่วยความจำการติดแท็ก วิธีการที่มีขนาดเล็กค่าแท็กสุ่มมีความเกี่ยวข้องทั้งที่มีตัวชี้และมีช่วงที่อยู่ในหน่วยความจำ เพื่อให้การเข้าถึงหน่วยความจำถูกต้อง ตัวชี้และแท็กหน่วยความจำต้องตรงกัน HWASan อาศัย ARMv8 คุณลักษณะด้านบนไบต์ละเว้น (TBI) เรียกว่าการติดแท็กที่อยู่เสมือนการจัดเก็บแท็กตัวชี้ในบิตที่สูงที่สุดของที่อยู่

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ การออกแบบของ HWASan บนเว็บไซต์เอกสารดังกราว

ตามการออกแบบ HWASan ไม่มีโซนสีแดงที่มีขนาดจำกัดของ ASan สำหรับตรวจจับการล้นหรือการกักกันที่มีความจุจำกัดของ ASan สำหรับการตรวจจับการใช้งานหลังจากใช้งานฟรี ด้วยเหตุผลนี้ HWASan จึงสามารถตรวจจับจุดบกพร่องได้ไม่ว่าโอเวอร์โฟลว์จะมีขนาดใหญ่เพียงใดหรือหน่วยความจำถูกจัดสรรคืนมานานแค่ไหน สิ่งนี้ทำให้ HWASan ได้เปรียบเหนือ ASan อย่างมาก

อย่างไรก็ตาม HWASan มีค่าแท็กที่เป็นไปได้ในจำนวนจำกัด (256) ซึ่งหมายความว่ามีความเป็นไปได้ 0.4% ที่จะพลาดจุดบกพร่องใดๆ ในระหว่างการเรียกใช้โปรแกรมหนึ่งครั้ง

ความต้องการ

HWASan ต้องการให้เคอร์เนล Linux ยอมรับพอยน์เตอร์ที่แท็กในอาร์กิวเมนต์การเรียกระบบ การสนับสนุนสำหรับสิ่งนี้ถูกนำมาใช้ในแพตช์อัปสตรีมต่อไปนี้:

แพทช์เหล่านี้มีอยู่เป็น backports ใน ทั่วไป Android เคอร์เนล ใน หุ่นยนต์ 4.14 และสาขาที่สูงขึ้น แต่ไม่ได้อยู่ใน Android สาขา 10 ที่เฉพาะเจาะจงเช่น หุ่นยนต์-4.14-Q

สนับสนุน userspace สำหรับ HWASan สามารถใช้ได้กับ Android เริ่มต้น 11

หากคุณกำลังสร้างด้วย toolchain กำหนดเองให้แน่ใจว่ามันรวมทุกอย่างขึ้นอยู่กับ LLVM กระทำ c336557f

ใช้ HWASan

ใช้คำสั่งต่อไปนี้เพื่อสร้างทั้งแพลตฟอร์มโดยใช้ HWASan:

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

เพื่อความสะดวกของคุณสามารถเพิ่มการตั้งค่า SANITIZE_TARGET เพื่อคำนิยามของผลิตภัณฑ์ที่คล้ายกับ aosp_coral_hwasan

ต่างจาก ASan เนื่องจาก HWASan ไม่จำเป็นต้องสร้างซ้ำสองครั้ง ที่เพิ่มขึ้นสร้างการทำงานเพียงแค่ไม่มีพิเศษกระพริบคำแนะนำหรือเช็ดต้องการ executables คงได้รับการสนับสนุนและมันโอเคที่จะข้ามการรักษาสุขอนามัยของห้องสมุดใด ๆ นอกเหนือจาก libc นอกจากนี้ยังไม่มีข้อกำหนดว่าหากห้องสมุดถูกฆ่าเชื้อ ไฟล์ปฏิบัติการใดๆ ที่เชื่อมโยงไปยังไลบรารีจะต้องถูกฆ่าเชื้อด้วย

หากต้องการข้ามการรักษาสุขอนามัยของโมดูลใช้ LOCAL_NOSANITIZE := hwaddress หรือ sanitize: { hwaddress: false }

แต่ละโมดูลอาจถูกสุขอนามัยด้วย HWASan มีข้อแม้ที่ libc ยังเป็น HWASan-ified ซึ่งสามารถทำได้โดยการเพิ่ม sanitize: { hwaddress: true } กับแต่ละ Android.bp นิยามโมดูล แพลตฟอร์ม Android ทั้งหมดถูกสร้างขึ้นด้วย HWASan เมื่อใช้ _hwasan -suffixed สร้าง (รวม libc ) และเป็นเช่นนั้นด้วยตนเองฆ่าเชื้อ libc ไม่จำเป็นสำหรับการสร้าง HWASan

การติดตามสแต็กที่ดีขึ้น

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 ในยี่ห้อหรือ -fsanitize=hwaddress ในธงคอมไพเลอร์ ดู เอกสารนักพัฒนาแอป สำหรับรายละเอียดเพิ่มเติม