จากเอกสารเรื่อง Best Practice for Security and Privacy
ได้อธิบายแนวปฏิบัติต่าง ๆ สำหรับการพัฒนา Android app ให้ปลอดภัย
ประกอบไปด้วยเรื่องที่น่าสนใจดังนี้

  • Networking
  • Intent
  • Data storage
  • เรื่องอื่น ๆ เช่น Emulator, Debug, Root, Obfuscation เป็นต้น

ดังนั้นจึงทำการสรุปไว้นิดหน่อย

ปล. มี Android developer คนไหนอ่านและศึกษากันบ้างนะ ?

1. เรื่องของ Network

คงปฏิเสธไม่ได้ว่า Android app ส่วนใหญ่
มีการดึงข้อมูลจาก server ต่าง ๆ ผ่าน internet
ดังนั้นเรื่องความปลอดภัยของข้อมูลที่ส่งไปมานั้นมันจึงสำคัญมาก ๆ

ลองคิดดูสิถ้ามีคนพยายามมาดักข้อมูลที่ส่งไปมา (Man In The Middle)
ระหว่าง Android app กับ server
โดยที่ข้อมูลส่งเป็น plain text กันชัดเจนมาก ๆ
แถมข้อมูลเหล่านั้นเป็น sensitive data หรือเป็นข้อมูลส่วนตัวของแต่ละคน
น่าจะส่งผลไม่ดีอย่างแน่นอน

ดังนั้นลองมาตรวจดูสิว่า Android app ของเรานั้นปลอดภัยกันบ้างไหม ?

  • ใช้ HTTPS ไหม ? แต่ถึงใช้ก็ยังไม่ปลอดภัยนะ
  • ข้อมูลที่รับส่งไปมานั้น ทำการเข้ารหัสบ้างหรือไม่ ? encrypt นะ ไม่ใช้ encode !!

แก้ไขข้อมูลเรื่องของ DH 

ขอขอบคุณข้อมูลจากบทความเรื่อง ผู้เชี่ยวชาญด้านความปลอดภัยแอพพลิเคชั่นในไทย ?

  • รวมทั้งใช้ SSL pinning เพื่อเสริมความแข็งแกร่งให้มากขึ้น

โดยที่มี library ที่สนับสนุนทั้ง HTTPS และ SSL Pinning
เช่น OkHTTP และ Retrofit เป็นต้น

ลองดู app ที่เราพัฒนาสิว่า
จำเป็นต้องมีระดับความปลอดภัยของข้อมูลที่รับส่งกันในระดับไหน ?

2. การใช้งาน Intent

ในการติดต่อระหว่าง Android app จะผ่านสิ่งที่เรียกว่า Intent
ซึ่งประกอบไปด้วย Explicit intent และ Implicit intent
โดยทั้งสองต่างมีข้อดีและข้อเสียดังนี้

Explicit intent
ข้อดีคือ ไม่สามารถดักจับข้อมูลที่ส่งไปมาได้
ข้อเสียคือ สามารถใช้ได้เฉพาะใน app เดียวกันเท่านั้น

Implicit intent
ข้อดีคือ ใช้ที่ไหนก็ได้
ข้อเสียคือ ง่ายต่อการดักจับข้อมูล

ดังนั้นถ้าเราใช้งาน Implicit intent โดยที่ไม่ได้เข้าใจ
จะทำให้สามารถโดนดักจับข้อมูล หรือ ขโมยข้อมูลได้ง่าย ๆ
แต่เราสามารถแก้ไขปัญหานี้ ด้วยการระบบชื่อ package ไปเลยดังนี้

และถ้ามี service ใด ๆ ไม่ต้องเปิดให้ใครใช้ก็ปิดซะ

ดังนั้นถ้าให้ดีแนะนำให้ใช้ Explicit intent เป็นหลักของ app นะครับ

3. เรื่องของ Data Storage

ใน Android app นั้นส่วนใหญ่นักพัฒนา
จะทำการเก็บข้อมูลต่าง ๆ ที่ต้องดึงจาก server นั้น
มักจะทำการเก็บข้อมูลไว้ในมือถือด้วย
เพื่อลดการดึงข้อมูลจากระบบ network
ที่สำคัญทำให้ app ทำงานรวดเร็วขึ้นมาก ๆ
จะเรียกว่า caching data

ซึ่งสามารถทำได้หลายแบบ
วิธีการที่ยากต่อการขโมยข้อมูล คือ
การสร้างไฟล์ชั่วคราวใน Memory cache ซะ
เนื่องจากถ้าต้องการจะขโมยข้อมูลใน Memory cache นั้น
ต้องทำการ dump memory เท่านั้น
ซึ่งต้อง ROOT access เท่านั้น

ข้อมูลที่ต้องเก็บใน caching, database และ shared preference นั้นต้องเข้ารหัสก่อนเสมอ
ตัวอย่างเช่นการใช้งาน Cipher เป็นต้น

ส่วนข้อมูลที่ต้องเก็บลง SharedPreference ต้องเป็น MODE_PRIVATE เท่านั้น
หรือสามารถใช้งาน SecureSharedPreference ก็ได้

อีกอย่างที่สำคัญคือ การเก็บ Key สำหรับ algorithm การเข้าและถอดรหัส
เป็นสิ่งที่สำคัญมาก ๆ
ถ้า key นี้ถูกขโมยไปได้ง่าย ๆ มันก็แย่เลยนะ
แต่ถ้าเก็บไว้ใน app ก็เป็นการยากต่อการซ่อน
ดังนั้นสิ่งที่ควรทำคือ สร้างความซับซ้อนในการหาหรือเข้าถึง key นี้ซะ
ทั้งการใช้งาน KeyStore แต่มีใน API 18 ขึ้นไป
ทั้งการใช้งาน JNI ซึ่งยากต่อการ decompile code
ทั้งการซ่อนไว้ในไฟล์ที่ไม่น่าจะอยู่ เช่นซ่อนไว้ในไฟล์รูปภาพเป็นต้น !!

ปล. Algorithm ในการเข้ารหัสข้อมูลมีมากมาย
แน่นอนว่าก็สามารถ hack ได้นั่นแหละ
แต่ผมคิดว่า ก็ดีกว่าไม่ทำอะไรเลยนะ

วิธีการที่ดีที่สุดคือ อย่าเก็บอะไรไว้ที่มือถือนะครับ !!
แต่หลาย ๆ กรณีมันเป็นไปไม่ได้นะ

ยังมีวิธีการอื่น ๆ อีกเช่น

  • ตรวจสอบว่า run อยู่บน Emulator หรือไม่ ?
  • ตรวจสอบว่า device ทำการ ROOT มาหรือไม่ ?
  • ตรวจสอบว่าทำการเปิด debugger ไว้หรือไม่ ? ด้วย code สั้น ๆ Debug.isDebuggerConnected()
  • ก่อนจะ release APK ออกไปใช้ Proguard, DexGuard และ DexProtector กันบ้างหรือยัง ?
  • แนะนำตัวอย่างการใช้งาน Proguard

วันนี้นักพัฒนา Android app สนใจเรื่อง security ของ app กันแล้วหรือยัง ?

Reference Websites
https://www.owasp.org/index.php/OWASP_Mobile_Security_Project#tab=Top_10_Mobile_Risks
https://www.qdtricks.net/android-penetration-testing-apps/
https://medium.com/uptech-team/how-to-make-your-android-application-secured-21c054b371e7#.ek01gzrnz