Mobile Application Security [ตอนที่ 4.2]

Datafarm
3 min readJun 16, 2021

--

สวัสดีผู้อ่านทุกท่านที่ติดตามเพจของบริษัทดาต้าฟาร์มนะครับ กลับมาพบกันอีกครั้งกับบทความในเรื่องของ Mobile Application Security กันอีกเช่นเคยครับ สำหรับในบทความตอนนี้จะยังคงเป็นเรื่องของการ Reversing Android Package กันต่อนะครับ

จาก Content ของบทความก่อนหน้าเราพูดกันถึงเรื่องของความสำคัญในการ Reverse Android Package, Tools หรือเครื่องมือต่างๆที่ใช้ในการ Reverse Android Package ไม่ว่าจะเป็น APKTool, Dex2jar, JD-Gui นอกจากนี้แล้วยังมีเรื่องของ Smali และ Backsmali หากผู้อ่านท่านใดยังไม่ได้อ่านก็สามารถตามไปอ่านได้ที่เพจของบริษัทดาต้าฟาร์มนะครับ เอาละครับเกริ่นกันมาพอสมควรแล้วเรามาเริ่มเข้าสู่เนื้อหากันเลยดีกว่า

Obfuscation

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

ในปัจจุบันมี Product หลายตัวที่สามารถทำ Obfuscate Source Code โดยสามารถใช้งานได้ฟรี เช่น Obfuscapk, ProGuard ซึ่งในบทความนี้แอดจะยกตัวอย่างจากตัว ProGuard นะครับ โดยเจ้า ProGuard นั้นเราสามารถใช้งานได้ฟรีและ Build-in มากับตัว Android Studio มาแล้วทำให้สะดวกในการใช้งาน

ในการใช้งาน ProGuard ให้เราตั้งค่า minifyEnabled ให้เป็น true ในส่วนของ build.gradle เพียงเท่านี้ตัว Android Studio จะดำเนินการ Obfuscate Source Code ให้กับเราแล้ว ซึ่ง ProGuard จะเปลี่ยนชื่อของ Class, Field และชื่อของ Method โดยทำให้เราไม่สามารถทราบได้ว่า Source Code ดังกล่าวคือส่วนใด

จากภาพด้านล่างแสดง Source Code ที่ได้จากการ Decompile เรียบร้อยแล้วซึ่งแอปพลิเคชันตัวนี้ยังไม่ได้ Obfuscation ไว้ทำให้เราสามารถอ่านชื่อของ Class, Method รวมไปถึง Field ต่างๆได้

ต่อมาเรามาลองดูภาพด้านล่างครับ ทั้งสองภาพเป็นแอปพลิเคชันตัวเดียวกัน เมื่อเรา Decompile ออกมาแล้วเราจะเห็นว่า ProGuard ได้เปลี่ยนชื่อ Class, Field และ Method ให้เป็นตัวอักษรเพียงตัวเดียว ตัวอย่างเช่น Class “a” มี Method “b” ซึ่งเรียกใช้งาน Method “c” ใน Class “d” เป็นต้น

จุดประสงค์หลักของการ Obfuscation คือการเอาความหมายของชื่อ Class, Field และ Method ออกเพื่อให้ยากต่อการทำความเข้าใจและทำให้ Source Code ของแอปพลิเคชันมีขนาดเล็กลง ไม่ใช่เพื่อการ Encrypt หรือการเข้ารหัสข้อมูลนะครับ

ในการทดสอบความปลอดภัยของแอปพลิเคชันแอนดรอยด์ หากเราไม่สามารถอ่าน Source Code ต้นฉบับได้ การ Reverse แอปพลิเคชันที่ตัว Debug เวอร์ชันก็เป็นทางเลือกที่ดีครับ เพราะใน Android Studio หากเรา build แอปพลิเคชันแบบ debug mode จะไม่มีการ Obfuscation เหมือนกับ release mode นั่นเองครับ

APK Contents

ต่อมาเรามาดูเรื่องของ APK Content กันครับ จากบทความก่อนหน้าเมื่อเรา Decode แอปพลิเคชันด้วย APKTool แล้วเราจะได้ไฟล์และไดเรกทอรี่ตามภาพด้านล่าง ซึ่งสิ่งเหล่านี้จะแตกต่างกันไปตามแต่ละแอปพลิเคชันครับ ดังนั้นในเนื้อหาตอนนี้เราจะมาดูรายละเอียดพื้นฐานของแต่ละส่วนกันครับ

ในตอนนี้เราจะมาดูกันที่ไฟล์ apktool.yml กันครับ ซึ่งไฟล์นี้จะบอกรายละเอียดทั่วไปของแอปพลิเคชันที่เราได้ Decode ออกมาไม่ว่าจะเป็นชื่อของแอปพลิเคชัน, เวอร์ชันของ APKTool, แอปพลิเคชันนี้มีการใช้ Framework หรือไม่, เวอร์ชันของ minimum SDK ของอุปกรณ์ที่อนุญาตให้สามารถใช้งานแอปพลิเคชันได้ซึ่งในที่นี้มี minSdkVersion เป็นเวอร์ชัน 21 ดังนั้นอุปกรณ์ที่สามารถติดตั้งแอปพลิเคชันนี้ได้คืออุปกรณ์ที่มีระบบปฏิบัติการแอนดรอยด์ 5 (Android Lollipop) ขึ้นไป รวมไปถึง target SDK version ซึ่งเป็นเวอร์ชันของแอนดรอยด์ที่ผู้พัฒนาใช้ในการพัฒนาแอปพลิเคชันนั่นเองครับ ซึ่งข้อมูลในส่วนนี้จะตรงกันกับไฟล์ AndroidManifest.xml ที่แอดได้อธิบายไปในบทความก่อนหน้า

จากภาพด้านบนพบว่าเมื่อเรา Decode แอปพลิเคชัน เราจะพบข้อมูลที่เกี่ยวข้องกับแอปพลิเคชันมากกว่าใน Source Code ที่ไฟล์ apktool.yml ดังกล่าว ซึ่งจุดประสงค์ของไฟล์นี้ก็เพื่อให้เราสามารถ build แอปพลิเคชันใหม่ได้อีกครั้งเมื่อเราได้ disassemble ตัวแอปพลิเคชันแล้ว นอกจากนี้ยังมีไดเรกทอรี่ที่ชื่อ original โดยภาพในไดเรกทอรี่ดังกล่าวจะมีไฟล์ AndroidManifest.xml และไดเรกทอรี่ META-INF ที่ใช้ในการ build ตัวแอปพลิเคชันใหม่ด้วย

ส่วนไดเรกทอรี่ smali จะมีข้อมูลของไฟล์ smali ที่ได้ทั้งหมดจากการ Decode ตัวไฟล์ Dex ซึ่งมีการจัดอยู่ในไดเรกทอรี่ตามชื่อของ Java Package

Hardware Optimization

ต่อมาเป็นเรื่องของ Hardware Optimization หรือการเพิ่มประสิทธิ์ภาพการทำงานของอุปกรณ์ครับ ในบางครั้งการ Reverse แอปพลิเคชันแอนดรอยด์เราอาจจะไม่เจอไฟล์ classes.dex หากแอปพลิเคชันเป็น Pre-installed แอปพลิเคชัน เมื่อเรา Reverse ออกมาแล้วอาจจะเจอไฟล์ .odex หรือ optimized dex ซึ่งไฟล์ odex ดังกล่าวเป็นการปรับประสิทธิ์ภาพให้สามารถทำงานได้เร็วมากยิ่งขึ้นหรือจะเรียกได้ว่าเป็นไฟล์ dex ที่ถูก Optimized แล้วนั่นเองครับ

OEM Apps

ต่อมาเป็นเรื่องสุดท้ายของบทความนี้นะครับ ซึ่งก็คือ OEM Application ย่อมาจากคำว่า Original Equipment Manufacturer Application หรือแอปพลิเคชันที่มีการติดตั้งมาให้จากทางผู้ผลิตอุปกรณ์ที่ใช้งานระบบปฏิบัติการแอนดรอยด์ โดยทั่วไปแล้ว Pre-installed application สามารถแบ่งได้ 3 แหล่งตามที่มาของแอปพลิเคชันนั้นๆ ดังนี้

  1. แอปพลิเคชันประเภท AOSP หรือ Android Open-Source Project ซึ่งแอปพลิเคชันเหล่านี้สามารถหามาใช้งานได้ฟรีโดยไม่มีค่าใช้จ่าย
  2. แอปพลิเคชันที่มีการพัฒนาจากทางผู้ผลิตอุปกรณ์นั้นๆ ซึ่งแอปพลิเคชันประเภทนี้เรียกว่า OEM Application (Original Equipment Manufacturer Application)
  3. แอปพลิเคชันที่มีการพัฒนาจากผู้ให้บริการของอุปกรณ์เคลื่อนที่นั้นๆ หากอุปกรณ์มีการจัดซื้อจากทางผู้ให้บริการดังกล่าว

เอาละครับเป็นอย่างไรกันบ้างครับ แอดคิดว่าบทความนี้คงจะให้ความรู้แก่ผู้อ่านทุกท่านที่มีความสนใจกันบ้างไม่มากก็น้อยนะครับ แอดหวังว่าผู้อ่านทุกท่านจะติดตามตอนต่อไปสำหรับบทความ Mobile Application Security กันต่อไปนะครับ โดยตอนต่อไปจะเป็นเรื่องของการ Rooting อุปกรณ์นะครับ นอกจากนี้ช่วงนี้เป็นช่วงที่ Covid-19 กำลังระบาดอย่างหนัก ดังนั้นขอให้ทุกท่านดูแลรักษาสุขภาพกันด้วยนะครับ อยู่รอดปลอดภัยกันทุกคนนะครับ สำหรับวันนี้แอดขอลาไปก่อน สวัสดีครับผมมมมม

--

--