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

หมวดหมู่ 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 อาจเปิดเผยข้อมูลความปลอดภัยที่สำคัญได้

แหล่งข้อมูล