ตัววิเคราะห์ลักษณะการทำงานที่ไม่ได้กำหนด

UndefinedBehaviorSanitizer (UBSan) ทำการวัดคุมเวลาคอมไพล์เพื่อ ตรวจหาพฤติกรรมประเภทต่างๆ ที่ไม่ระบุ แม้ว่า UBSan จะสามารถ กำลังตรวจจับ จำนวนมาก ข้อบกพร่องลักษณะการทำงานที่ไม่ระบุ, Android สนับสนุนสิ่งต่อไปนี้

  • การจัดข้อความ
  • บูลีน
  • ขอบเขต
  • Enum
  • Floatcast-overflow
  • จำนวนการหารลอยตัวต่อศูนย์
  • จำนวนเต็มที่หารด้วยศูนย์
  • แอตทริบิวต์ที่ไม่ใช่ค่าว่าง
  • ค่าว่าง
  • คำสั่ง "return"
  • แอตทริบิวต์return-nonnull
  • Shift-base
  • เปลี่ยนเลขชี้กำลัง
  • ไม่มากเกินจำนวนเต็มที่มีการลงชื่อเข้าใช้
  • ไม่สามารถเข้าถึง
  • หน่วยเพิ่มเติมที่ไม่มีการลงชื่อ
  • Vla-bound

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

การใช้งาน

ในระบบบิลด์ของ Android คุณสามารถเปิดใช้ UBSan ได้ทั่วโลกหรือภายในเครื่อง วิธีเปิดใช้งาน UBSan ทั่วโลก ตั้งค่า SANITIZE_TARGET ใน Android.mk หากต้องการเปิดใช้งาน UBSan ที่ ระดับต่อโมดูล ให้ตั้งค่า LOCAL_SANITIZE และระบุลักษณะการทำงานที่ไม่ได้กำหนดไว้ซึ่ง ที่ต้องการค้นหาใน Android.mk เช่น

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_CFLAGS := -std=c11 -Wall -Werror -O0

LOCAL_SRC_FILES:= sanitizer-status.c

LOCAL_MODULE:= sanitizer-status

LOCAL_SANITIZE := alignment bounds null unreachable integer
LOCAL_SANITIZE_DIAG := alignment bounds null unreachable integer

include $(BUILD_EXECUTABLE)

และการกำหนดค่าพิมพ์เขียว (Android.bp) ที่เทียบเท่า:

cc_binary {

    cflags: [
        "-std=c11",
        "-Wall",
        "-Werror",
        "-O0",
    ],

    srcs: ["sanitizer-status.c"],

    name: "sanitizer-status",

    sanitize: {
        misc_undefined: [
            "alignment",
            "bounds",
            "null",
            "unreachable",
            "integer",
        ],
        diag: {
            misc_undefined: [
                "alignment",
                "bounds",
                "null",
                "unreachable",
                "integer",
            ],
        },
    },

}

ทางลัด UBSan

Android ยังมีทางลัดอีก 2 รายการ คือ integer และ default-ub เพื่อเปิดใช้ชุดเจลฆ่าเชื้อในเวลาเดียวกัน จำนวนเต็ม จะเปิดใช้ integer-divide-by-zero signed-integer-overflow และ unsigned-integer-overflow default-ub เปิดใช้การตรวจสอบที่มีคอมไพเลอร์ขั้นต่ำ ปัญหาด้านประสิทธิภาพ: bool, integer-divide-by-zero, return, returns-nonnull-attribute, shift-exponent, unreachable and vla-bound คลาส Sanitizer จำนวนเต็มสามารถใช้กับ SANITIZE_TARGET และ LOCAL_SANITIZE แม้ว่า ub เริ่มต้นจะสามารถใช้ได้เฉพาะกับ SANITIZE_TARGET เท่านั้น

การรายงานข้อผิดพลาดที่ดีขึ้น

การใช้งาน UBSan เริ่มต้นของ Android จะเรียกใช้ฟังก์ชันที่ระบุเมื่อ พบการทำงานที่ไม่ได้กำหนด โดยค่าเริ่มต้น ฟังก์ชันนี้จะถูกล้มเลิก อย่างไรก็ตาม ตั้งแต่เดือนตุลาคม 2016 UBSan บน Android มีไลบรารีรันไทม์ที่ไม่บังคับซึ่ง ให้การรายงานข้อผิดพลาดโดยละเอียดมากขึ้น รวมถึงประเภทของลักษณะการทำงานที่ไม่ได้กำหนดไว้ ที่พบ ได้แก่ ไฟล์และข้อมูลบรรทัดของซอร์สโค้ด วิธีเปิดใช้ข้อผิดพลาดนี้ การรายงานที่มีการตรวจสอบจำนวนเต็มจะเพิ่มค่าต่อไปนี้ลงในไฟล์ Android.mk

LOCAL_SANITIZE:=integer
LOCAL_SANITIZE_DIAG:=integer

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

ต่อไปนี้คือตัวอย่างของข้อมูลที่ได้รับจากไลบรารีรันไทม์ UBSan

pixel-xl:/ # sanitizer-status ubsan
sanitizer-status/sanitizer-status.c:53:6: runtime error: unsigned integer overflow: 18446744073709551615 + 1 cannot be represented in type 'size_t' (aka 'unsigned long')

การทำความสะอาดข้อมูลส่วนเกินจำนวนเต็ม

จำนวนเต็มที่เพิ่มขึ้นโดยไม่ได้ตั้งใจอาจทำให้ข้อมูลหรือหน่วยความจำเสียหาย การเปิดเผยช่องโหว่ในตัวแปรที่เกี่ยวข้องกับการเข้าถึงหน่วยความจำ หรือ การจัดสรรหน่วยความจำ เพื่อต่อต้านเรื่องนี้ เราได้เพิ่ม Clang UndefinedBehaviorSanitizer (UBSan) ได้มีการรับรองผลิตภัณฑ์เพิ่มเติมที่มีจำนวนเต็มและไม่มีการลงลายเซ็นไปยัง ฮาร์เดน เฟรมเวิร์กสื่อใน Android 7.0 ใน Android 9 เรา ขยายแล้ว UBSan เพื่อให้ครอบคลุมคอมโพเนนต์ต่างๆ มากขึ้นและปรับปรุงการรองรับระบบบิลด์สำหรับคอมโพเนนต์ดังกล่าว

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

ตัวอย่างและแหล่งที่มา

Integer Overflow Sanitization (IntSan) ได้รับการจัดเตรียมโดยคอมไพเลอร์และเพิ่ม การใช้เครื่องมือในไบนารีระหว่างเวลาคอมไพล์เพื่อตรวจหาเลขคณิต ข้อมูลล้น มีการเปิดใช้โดยค่าเริ่มต้นในคอมโพเนนต์ต่างๆ ทั่วทั้ง แพลตฟอร์ม เช่น /platform/external/libnl/Android.bp

การใช้งาน

IntSan ใช้ตัวล้างทำความสะอาดตัวเลขเพิ่มเติมที่มีจำนวนเต็มและไม่มีการรับรองของ UBSan ช่วงเวลานี้ มีการเปิดใช้การลดการตรวจสอบในระดับของแต่ละโมดูล ช่วยรักษาองค์ประกอบที่สำคัญ ของ Android ที่ปลอดภัยและไม่ควรปิดใช้

เราขอแนะนำอย่างยิ่งให้คุณเปิดใช้ Integer Overflow Sanitization เพื่อวัตถุประสงค์เพิ่มเติม คอมโพเนนต์ ตัวเลือกที่เหมาะสมคือโค้ดเนทีฟที่เป็นสิทธิพิเศษหรือรหัสเนทีฟที่ แยกวิเคราะห์อินพุตของผู้ใช้ที่ไม่น่าเชื่อถือ มีค่าใช้จ่ายในการดำเนินการที่เกี่ยวข้องเล็กน้อย ที่ขึ้นอยู่กับการใช้งานโค้ดและความแพร่หลายของ การคำนวณทางคณิตศาสตร์ คาดว่าจะมีค่าเปอร์เซ็นต์ค่าใช้จ่ายสูง และทดสอบหาก ประสิทธิภาพก็เป็นเรื่องน่ากังวล

รองรับ IntSan ใน createfile

หากต้องการเปิดใช้ IntSan ในไฟล์ที่จำเป็น ให้เพิ่มค่าต่อไปนี้

LOCAL_SANITIZE := integer_overflow
    # Optional features
    LOCAL_SANITIZE_DIAG := integer_overflow
    LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt
  • LOCAL_SANITIZE รับรายการเจลฆ่าเชื้อโรคที่คั่นด้วยคอมมา โดย integer_overflow เป็นชุดตัวเลือกที่จัดไว้ล่วงหน้าสำหรับ เจลล้างทำความสะอาดที่มีจำนวนเต็มที่มีลายเซ็นและไม่มีลายเซ็นที่มี ค่าเริ่มต้น รายการที่บล็อก
  • LOCAL_SANITIZE_DIAG เปิดโหมดการวินิจฉัยสำหรับ เจลฆ่าเชื้อ ใช้โหมดการวินิจฉัยเท่านั้นระหว่างการทดสอบเนื่องจากไม่ใช่ ล้มเลิกกับการดำเนินการเพิ่มเติม ซึ่งเป็นการปฏิเสธข้อได้เปรียบด้านความปลอดภัยของ การผ่อนปรนชั่วคราว ดูการแก้ปัญหา เพื่อดูรายละเอียดเพิ่มเติม
  • LOCAL_SANITIZE_BLOCKLIST อนุญาตให้คุณระบุ BLOCKLIST เพื่อป้องกันไม่ให้ฟังก์ชันและไฟล์ต้นฉบับถูกล้าง โปรดดู การแก้ปัญหาสำหรับ รายละเอียด

หากต้องการการควบคุมที่ละเอียดยิ่งขึ้น ให้เปิดใช้เจลล้างฆ่าเชื้อโรคทีละรายการ หรือทั้ง 2 แบบ

LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
    LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow

รองรับ IntSan ในไฟล์พิมพ์เขียว

หากต้องการเปิดใช้การกรองข้อมูลส่วนเกินจำนวนเต็มในไฟล์พิมพ์เขียว เช่น /platform/external/libnl/Android.bp เพิ่ม:

   sanitize: {
          integer_overflow: true,
          diag: {
              integer_overflow: true,
          },
          BLOCKLIST: "modulename_BLOCKLIST.txt",
       },

พร็อพเพอร์ตี้ integer_overflow มีลักษณะเป็นแพ็กเกจล่วงหน้าเช่นเดียวกับการสร้างไฟล์ ชุดตัวเลือกสำหรับการขึ้นบรรทัดใหม่ด้วยจำนวนเต็มที่มีลายเซ็นและไม่ได้ลงชื่อ สารฆ่าเชื้อที่มีค่าเริ่มต้น BLOCKLIST

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

พร็อพเพอร์ตี้ BLOCKLIST อนุญาตให้ระบุไฟล์ BLOCKLIST ที่ทำให้นักพัฒนาซอฟต์แวร์สามารถป้องกันไม่ให้ฟังก์ชันและไฟล์ต้นฉบับ ถูกสุขอนามัย ดูการแก้ปัญหาสำหรับ รายละเอียดเพิ่มเติม

หากต้องการเปิดใช้เจลล้างทำความสะอาดทีละรายการ ให้ใช้รายการต่อไปนี้

   sanitize: {
          misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
          diag: {
              misc_undefined: ["signed-integer-overflow",
                               "unsigned-integer-overflow",],
          },
          BLOCKLIST: "modulename_BLOCKLIST.txt",
       },

การแก้ปัญหา

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

หากต้องการค้นหา ล้มเลิกเนื่องจากการปรับปรุงข้อมูลให้สะอาดในบิลด์ผู้ใช้ ให้ค้นหา SIGABRT ขัดข้องพร้อมข้อความล้มเลิกที่ระบุว่าพบการดำเนินการเพิ่มเติม โดย UBSan เช่น

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/surfaceflinger <<<
    signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
    Abort message: 'ubsan: sub-overflow'

แต่สแต็กเทรซควรมีฟังก์ชันที่ทําให้ล้มเลิก ส่วนเกินที่เกิดขึ้นในฟังก์ชันในบรรทัดอาจมองไม่เห็นในสแต็กเทรซ

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

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')

เมื่อพบการดำเนินการทางคณิตศาสตร์ที่เป็นปัญหาแล้ว ให้ตรวจสอบว่า ไม่เป็นอันตรายและมีเจตนา (เช่น ไม่มีผลกระทบด้านความปลอดภัย) คุณสามารถจัดการกับ ผลิตภัณฑ์ทำความสะอาด ล้มเลิกโดย:

  • การเปลี่ยนโครงสร้างภายในโค้ดเพื่อหลีกเลี่ยงส่วนเกิน (ตัวอย่าง)
  • แสดงเพิ่มเติมอย่างชัดเจนผ่าน __builtin_*_overflow ของ Clang ฟังก์ชัน (ตัวอย่าง)
  • ปิดใช้การทำความสะอาดข้อมูลในฟังก์ชันด้วยการระบุแอตทริบิวต์ no_sanitize (ตัวอย่าง)
  • ปิดใช้การทำความสะอาดไฟล์ฟังก์ชันหรือไฟล์แหล่งที่มาผ่านไฟล์ BLOCKLIST (ตัวอย่าง)

คุณควรใช้โซลูชันที่ละเอียดที่สุดเท่าที่จะเป็นไปได้ ตัวอย่างเช่น ที่มีการดำเนินการทางคณิตศาสตร์จำนวนมากและมีการดำเนินการล้นบรรทัดเดียว ควรเปลี่ยนโครงสร้างภายในโค้ดเดียวแทนที่จะเป็นทั้งฟังก์ชัน อยู่ในรายการที่บล็อก

รูปแบบทั่วไปที่อาจทำให้เกิดการเพิ่มขึ้นที่ไม่เป็นอันตราย ได้แก่:

  • โดยนัย แคสต์ในกรณีที่มีรายการเพิ่มเติมที่ไม่มีการลงชื่อก่อนที่จะแคสต์ไปยังประเภทที่มีการลงชื่อ (ตัวอย่าง)
  • การลบรายการที่ลิงก์ซึ่งลดดัชนีวนซ้ำเมื่อลบ (ตัวอย่าง)
  • การกำหนดประเภทที่ไม่มีการรับรองให้กับ -1 แทนที่จะระบุค่าสูงสุดตามจริง (ตัวอย่าง)
  • การวนซ้ำซึ่งลดจำนวนเต็มที่ไม่ได้ลงชื่อในเงื่อนไข (ตัวอย่าง, ตัวอย่าง)

เราขอแนะนำให้นักพัฒนาแอปตรวจสอบว่าในกรณีที่ผลิตภัณฑ์ทำความสะอาดตรวจพบ เพิ่มขึ้นอย่างล้นหลามว่าเป็นสิ่งที่ไม่เป็นอันตรายจริงๆ โดยไม่ก่อให้เกิดผลข้างเคียงหรือความปลอดภัยโดยไม่ตั้งใจ ผลกระทบก่อนที่จะปิดใช้การทำความสะอาดข้อมูล

ปิดใช้ IntSan

คุณสามารถปิดใช้ IntSan ด้วย BLOCKLIST หรือแอตทริบิวต์ฟังก์ชัน ปิดใช้เท่าที่จำเป็น และเฉพาะเมื่อเปลี่ยนโครงสร้างภายในโค้ด ไม่สมเหตุผลหรือหากมี ค่าใช้จ่ายในการดำเนินการที่เป็นปัญหา

โปรดดูเอกสาร Clang ของอัปสตรีมสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปิดใช้ IntSan ด้วยฟังก์ชัน แอตทริบิวต์และไฟล์ BLOCKLIST การจัดรูปแบบ การบล็อกรายการควรกำหนดขอบเขตเฉพาะเจลฆ่าเชื้อโรคเฉพาะโดย โดยใช้ชื่อส่วนที่ระบุตัวล้างเป้าหมายเพื่อหลีกเลี่ยงไม่ให้เกิดผลกระทบต่อส่วนอื่นๆ เจลฆ่าเชื้อ

การตรวจสอบความถูกต้อง

ปัจจุบันยังไม่มีการทดสอบ CTS สำหรับการตรวจสอบความสะอาดข้อมูลจำนวนเต็ม (Integer Overflow Sanitization) โดยเฉพาะ โดยให้ตรวจสอบว่าการทดสอบ CTS ผ่านหรือไม่เปิดใช้ IntSan เพื่อยืนยัน ไม่ส่งผลกระทบต่ออุปกรณ์

การทำความสะอาดขอบเขต

BoundsSanitizer (BoundSan) เพิ่มการใช้เครื่องมือไปยังไบนารีเพื่อแทรกขอบเขต ตรวจสอบการเข้าถึงอาร์เรย์ การตรวจสอบเหล่านี้จะถูกเพิ่มเข้ามาหากคอมไพเลอร์ไม่สามารถ พิสูจน์ได้ ณ เวลาที่คอมไพล์ว่าการเข้าถึงจะปลอดภัย และขนาดของอาร์เรย์ ทราบขณะรันไทม์เพื่อให้ตรวจสอบได้ Android 10 ทำให้ BoundSan ใช้งานได้ บลูทูธและตัวแปลงรหัส BoundSan ให้บริการโดยคอมไพเลอร์และเปิดใช้งานโดย ในคอมโพเนนต์ต่างๆ ทั่วทั้งแพลตฟอร์ม

การใช้งาน

BoundSan ใช้ UBSan สิ่งที่ต้องมี เปิดใช้การลดความเสี่ยงนี้ในระดับของแต่ละโมดูล มีประโยชน์ เก็บคอมโพเนนต์ที่สำคัญของ Android ให้ปลอดภัยและไม่ควรปิดใช้

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

เปิดใช้ BoundSan ในไฟล์พิมพ์เขียว

เปิดใช้ BoundSan ในไฟล์พิมพ์เขียวได้โดยการเพิ่ม "bounds" ไปยังพร็อพเพอร์ตี้ Sanitize ของ misc_undefined สำหรับไบนารีและไลบรารี โมดูล:

    sanitize: {
       misc_undefined: ["bounds"],
       diag: {
          misc_undefined: ["bounds"],
       },
       BLOCKLIST: "modulename_BLOCKLIST.txt",
วินิจฉัย

พร็อพเพอร์ตี้ diag เปิดใช้โหมดการวินิจฉัยสำหรับเจลฆ่าเชื้อ ใช้โหมดการวินิจฉัยเท่านั้นระหว่างการทดสอบ โหมดการวินิจฉัยไม่ล้มเลิกใน ซึ่งลดการได้เปรียบด้านความปลอดภัยของการลดข้อผิดพลาดและ ค่าใช้จ่ายสำหรับประสิทธิภาพสูงกว่า เราจึงไม่แนะนำสำหรับเวอร์ชันที่ใช้งานจริง

รายการที่บล็อก

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

เปิดใช้ BoundSan ใน คุณสามารถสร้างไฟล์

เปิดใช้ BoundSan ใน Makefile ได้โดยการเพิ่ม "bounds" เป็นตัวแปร LOCAL_SANITIZE สำหรับโมดูลไบนารีและไลบรารี:

    LOCAL_SANITIZE := bounds
    # Optional features
    LOCAL_SANITIZE_DIAG := bounds
    LOCAL_SANITIZE_BLOCKLIST := modulename_BLOCKLIST.txt

LOCAL_SANITIZE ยอมรับรายการเจลล้างทำความสะอาดที่คั่นด้วย คอมมา

LOCAL_SANITIZE_DIAG เปิดโหมดการวินิจฉัย ใช้การวินิจฉัย ในระหว่างการทดสอบเท่านั้น โหมดการวินิจฉัยไม่ได้ล้มเลิกการดำเนินการเพิ่มเติมซึ่ง จะลดความได้เปรียบด้านความปลอดภัยจากการลดความเสี่ยง และ ค่าใช้จ่ายสำหรับประสิทธิภาพการทำงาน เราจึงไม่แนะนำสำหรับเวอร์ชันที่ใช้งานจริง

LOCAL_SANITIZE_BLOCKLIST อนุญาตให้กำหนด BLOCKLIST ที่ทำให้นักพัฒนาซอฟต์แวร์สามารถป้องกันไม่ให้ฟังก์ชันและไฟล์ต้นฉบับ ถูกสุขอนามัย ใช้พร็อพเพอร์ตี้นี้เมื่อเป็นข้อกังวลเกี่ยวกับประสิทธิภาพ และ ไฟล์/ฟังก์ชัน มีส่วนอย่างมาก ตรวจสอบไฟล์/ฟังก์ชันเหล่านี้ด้วยตนเอง เพื่อให้แน่ใจว่าการเข้าถึงอาร์เรย์มีความปลอดภัย โปรดดูการแก้ปัญหาสำหรับ รายละเอียด

ปิดใช้ BoundSan

คุณสามารถปิดใช้ BoundSan ในฟังก์ชันและไฟล์ต้นฉบับที่มี BLOCKLIST หรือ ของฟังก์ชัน ควรเปิดใช้ BoundSan ไว้เสมอ จึงควรปิดใช้ต่อเมื่อ ฟังก์ชันหรือไฟล์นั้นๆ กำลังสร้างค่าใช้จ่ายสำหรับประสิทธิภาพจำนวนมาก และ แหล่งที่มาได้รับการตรวจสอบโดยเจ้าหน้าที่แล้ว

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการปิดใช้งาน BoundSan ด้วยฟังก์ชัน แอตทริบิวต์และไฟล์ BLOCKLIST การจัดรูปแบบ โปรดดูเอกสารประกอบของ Clang LLVM กำหนดขอบเขต การทำบล็อกสำหรับเจลล้างทำความสะอาดหนึ่งๆ โดยใช้ชื่อส่วนที่ระบุ เจลล้างเป้าหมายเพื่อหลีกเลี่ยงไม่ให้ส่งผลต่อผลิตภัณฑ์ฆ่าเชื้ออื่นๆ

การตรวจสอบความถูกต้อง

ไม่มีการทดสอบ CTS สำหรับ BoundSan โดยเฉพาะ แต่ให้ตรวจสอบว่า CTS การทดสอบจะต้องผ่านหรือไม่มีการเปิดใช้ BoundSan เพื่อยืนยันว่าไม่มีผลกระทบ อุปกรณ์

การแก้ปัญหา

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

สามารถระบุข้อผิดพลาด BoundSan ได้อย่างง่ายดายด้วยข้อมูลต่อไปนี้ ข้อความล้มเลิก Tombstone:

    pid: ###, tid: ###, name: Binder:###  >>> /system/bin/foobar <<<
    signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
    Abort message: 'ubsan: out-of-bounds'

เมื่อทำงานในโหมดการวินิจฉัย ไฟล์ต้นฉบับ หมายเลขบรรทัด และดัชนี พิมพ์ค่าเป็น logcat แล้ว โดยค่าเริ่มต้น โหมดนี้จะไม่ ส่งข้อความบอกเลิก ตรวจสอบ logcat เพื่อตรวจสอบ

    external/foo/bar.c:293:13: runtime error: index -1 out of bounds for type 'int [24]'