การใช้โค้ดเนทีฟ

หมวดหมู่ OWASP: MASVS-CODE: คุณภาพของโค้ด

ภาพรวม

แอปพลิเคชัน Android สามารถใช้ประโยชน์จากโค้ดแบบเนทีฟที่เขียนในภาษาต่างๆ เช่น C และ C++ สำหรับฟังก์ชันการทำงานที่เฉพาะเจาะจง อย่างไรก็ตาม เมื่อแอปพลิเคชันใช้ Java Native Interface (JNI) เพื่อโต้ตอบกับโค้ดแบบเนทีฟนี้ แอปพลิเคชัน อาจเสี่ยงต่อช่องโหว่ต่างๆ เช่น บัฟเฟอร์ล้น และปัญหาอื่นๆ ที่อาจมีอยู่ในการติดตั้งใช้งานโค้ดแบบเนทีฟ

ผลกระทบ

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

การลดปัญหา

คำแนะนำในการพัฒนาและการเขียนโค้ด

  • หลักเกณฑ์การเขียนโค้ดอย่างปลอดภัย: สำหรับโปรเจ็กต์ C/C++ ให้ปฏิบัติตามมาตรฐานการเขียนโค้ดอย่างปลอดภัยที่กำหนดไว้ (เช่น CERT, OWASP) เพื่อลดช่องโหว่ต่างๆ เช่น บัฟเฟอร์โอเวอร์โฟลว์ อินทิเจอร์โอเวอร์โฟลว์ และการโจมตีสตริงรูปแบบ ให้ความสำคัญกับไลบรารี เช่น Abseil ซึ่งเป็นที่รู้จักในด้านคุณภาพและความปลอดภัย หากเป็นไปได้ ให้พิจารณาใช้ ภาษาที่ปลอดภัยด้านหน่วยความจำ เช่น Rust ซึ่งมีประสิทธิภาพเทียบเท่ากับ C/C++
  • การตรวจสอบอินพุต: ตรวจสอบข้อมูลอินพุตทั้งหมดที่ได้รับจากแหล่งที่มาภายนอกอย่างเข้มงวด ซึ่งรวมถึงข้อมูลจากผู้ใช้ ข้อมูลเครือข่าย และไฟล์ เพื่อป้องกันการโจมตีแบบแทรกโค้ดและช่องโหว่อื่นๆ

เพิ่มความปลอดภัยของตัวเลือกการคอมไพล์

ไลบรารีเนทีฟที่ใช้รูปแบบ ELF สามารถเสริมความแข็งแกร่งเพื่อป้องกันช่องโหว่ต่างๆ ได้โดยการเปิดใช้งานกลไกการป้องกัน เช่น การป้องกันสแต็ก (Canary), การย้ายแบบอ่านอย่างเดียว (RELRO), การป้องกันการดำเนินการข้อมูล (NX) และไฟล์ปฏิบัติการที่ไม่ขึ้นกับตำแหน่ง (PIE) โชคดีที่ตัวเลือกการคอมไพล์ Android NDK จะเปิดใช้การป้องกันทั้งหมดนี้โดยค่าเริ่มต้นอยู่แล้ว

หากต้องการยืนยันการติดตั้งใช้งานกลไกด้านความปลอดภัยเหล่านี้ภายในไบนารี คุณ สามารถใช้เครื่องมือต่างๆ เช่น hardening-check หรือ pwntools

Bash

$ pwn checksec --file path/to/libnativecode.so
    Arch:     aarch64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled

ตรวจสอบว่าไลบรารีของบุคคลที่สามไม่มีช่องโหว่

เมื่อเลือกไลบรารีของบุคคลที่สาม ให้จัดลำดับความสำคัญของการใช้ไลบรารีที่มีชื่อเสียงในชุมชนนักพัฒนาแอป แหล่งข้อมูลต่างๆ เช่น ดัชนี SDK ของ Google Play จะช่วยคุณระบุไลบรารีที่ได้รับความนิยมและเชื่อถือได้ ตรวจสอบว่าคุณได้อัปเดตไลบรารีเป็นเวอร์ชันล่าสุดอยู่เสมอ และค้นหาช่องโหว่ที่ทราบซึ่งเกี่ยวข้องกับไลบรารีเหล่านั้นโดยใช้แหล่งข้อมูลต่างๆ เช่น ฐานข้อมูลจาก Exploit-DB การค้นหาเว็บโดยใช้คีย์เวิร์ด เช่น [library_name] vulnerability หรือ [library_name] CVE อาจแสดงข้อมูลความปลอดภัยที่สำคัญ

แหล่งข้อมูล