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

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]'