มาตรวจดูกันว่าโปรเจค Android, iOS project เราปลอดภัยแค่ไหนด้วย MobSF
Tags: android, ios, security
Published: 2020-04-19 12:14:14

# MobSF

น่าจะได้อ่านกันไปแล้วกับบทความที่แล้วกับการ[ตรวจ dependencies ของ iOS ด้วย OWASP Dependency-Check](https://dev.to/ph9/ios-project-dependencies-owasp-dependency-check-54lj) วันนี้มาตรวจ `ipa` กันต่อด้วย MobSF

ซึ่ง MobSF สามารถตรวจได้ทั้งแบบ static และ dynamic สำหรับบทความนี้จะตรวจแบบ static เท่านั้น และ MobSF สามารถติดตั้งลงเครื่องก็ได้ แต่เราจะพาทำแบบใช้ docker เท่านั้น

## ต้องใช้อะไรบ้าง

- docker โดยผมจะข้ามการติดตั้ง docker ไป
- `ipa` ไม่สอนการ archive ในบทความนี้เช่นกัน

## เริ่ม

เมื่อเรา start docker แล้ว ให้ทำการดึง MobSF

```sh
docker pull opensecurity/mobile-security-framework-mobsf
```

run แบบใช้ครั้งเดียวทิ้ง

```sh
docker run --rm -it --name MobSF -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
```

พอ start เสร็จแล้วก็เข้าไปที่ [http://localhost:8080](http://localhost:8080) แล้วโยนไฟล์ `apk`, `ipa`, หรือ `zip` ของ โปรเจค iOS เข้าไปได้เลย แล้วมันจะทำการวิเคราะห์ให้ทันที และพาไปหน้าผลการวิเคราะห์เมื่อเสร็จ แต่ผลของการวิเคราะห์ `zip` กับ `ipa` จะไม่เหมือนกัน

โดย zip ของ iOS ต้องไม่รวม folder project นอกสุด ให้ (ให้ไฟล์ `xcodeproj` อยู่ที่ root ของ zip)

## ผลการทดลอง

ตัว report มีหน้าเว็บให้ดู ถ้าเราใช้ docker แล้วทุบทิ้งอาจจะดูย้อนหลังไม่ได้ ซึ่งเราสามารถดึงเป็น JSON ผ่าน API ของ MobSF หรือดาวโหลด PDF มาเก็บไว้ก็ได้

### ทดลองด้วย zip ของโปรเจค iOS

ซึ่งไม่มี source code ของเราเองเลยเป็นของ dependencies ล้วน ๆ จะเจอว่า

- เจอว่ามีการเก็บ keys, usersnames, passwords, ในไฟล์ของ dependencies ซึ่ง เข้าไปดูก็ไม่มี
- เจอว่ามีการใส่ ip ไว้ตรง ๆ ใน source code แต่มันคือ comment ของ Alamofire
- เจอว่ามีการใช้ hash ที่ไม่แข็งแรงแล้วเช่น MD5 ซึ่งมีใน source code ของ Kingfisher
- เจอว่ามีการเก็บ log ซึ่งอาจจะมีการ log ข้อมูล sensitive ก็ได้ ตรงนี้ถ้าเราต้องใช้ dependencies นั้น ๆ ก็คงแก้อะไรไม่ได้ 🤣
- เจอว่ามีการใช้ API ที่ไม่อนุญาต ตรงนี้เดี๋ยวตอนเอาขึ้น TestFlight เดี๋ยวมันบอกอีกทีเองแหละว่าเจอจริงหรือป่าว

แต่ก็น่าสนว่ามันสามารถวิเคราะห์ได้ประมาณนึงว่าเราพลาดอะไรหรือป่าว ที่ไฟล์ไหน ถ้าใช้กับโปรเจคจริง อาจจะเจอสิ่งที่เราพลาดไปก็ได้ แต่ถ้าต้องมาดูทุกวันคงเหนื่อยน่าดู อาจจะดู release ละครั้งก็ได้

### ทดลองด้วย ipa

สำหรับการตรวจด้วย ipa นั้น จะไม่สามารถระบุได้ว่าที่ตรวจเจอหนะมาจากไฟล์ไหน

- มีตรวจเจอว่าใช้คำสั่งที่อันตราย เช่น _strlen, _strncpy, _fopen, _printf, _memcpy, _sscanf แต่ดูแล้ว เราคงไม่ได้ใช้เองนะ
- พบ NSLog ใน code อาจจะเผลอ log ข้อมูล sensitive ได้
– มีการใช้ _malloc ฟังก์ชัน ซึ่งอาจจองหรือเข้าถึง memory บางส่วน หรือจอง memory เยอะเกินไปได้ แหงหละ lib ของ Google ส่วนใหญ่เป็น C จะเจอก็ไม่แปลก
- มีคำชมเช่นใช้ Automatic Reference Counting (ARC), Position Independent Executable (PIE), etc.
- และมีการตรวจว่า domain ที่ระบุอยู่ใน source code มียิงไปหา server ที่อยู่ในรายชื่อของเว็บไม่พึงประสงค์หรือไม่ ซึ่งจะเจอเป็นของ Google, Fabric, Apple, etc. แต่ไม่เจอ domain ของ server เราเองแฮะ น่าจะเพราะไม่ได้ใส่ `https://` ไว้ข้างหน้าของ string ที่ไว้เก็บ domain ของเรา (นอกงี้ hacker ก็แอบใส่ domain ที่ไม่รวม http เข้าไปใน open source ก็จะตรวจหาไม่เจอแล้วสินะ)

### ทดลองด้วย apk

ซึ่งทดลองจาก Debug ที่ไม่ได้ obfuscate ไม่ใช่จาก Release อาจจะเจอช่องโหว่ หรือจุดอันตรายมากกว่าปกติ

- Sign ตัวแอปด้วย SHA1 ซึ่งไม่ค่อยแข็งแรงแล้ว
- จะมีการตรวจ permission ที่ขอในแอป ซึ่งบางส่วนผมก็ว่าปกตินะ ก็ต้องขออะ แต่บางส่วนผมก็ดูไม่รู้เรื่องเหมือนกัน พอดีไม่ค่อยเชี่ยว Android
- Activities สามารถเข้าถึงด้วยแอปอื่นได้ บอกรายชื่อมาด้วย
- เนื่องจากของ Android จะ compile เป็น object code เลยสามารถ decompile และแกะชื่อไฟล์กลับมาได้ด้วย ก็ว่าทำไม ไม่มีให้ตรวจ `zip` ของ Android
- หลาย ๆ อย่างก็ตรวจได้ข้อเดียวกับของ iOS เช่น algorithm hash ห่วย มี log อาจจะ hardcode username, password, keys

อื้ม มีประโยชน์มากทีเดียว เพราะรอบนี้จงใจ hardcode key เข้าไป แล้วมันก็ตรวจเจอจริง ๆ (ไม่มีโปรเจคให้ดูนะ 555) จริง ๆ เราก็ไปเอา apk จากใน Play Store มาโยนเข้าไปเล่น ๆ ก็ได้ น่าจะง่ายกว่าสร้างโปรเจคมาเล่น

## ทิ้งท้าย

คิดว่ามีประโยชน์มากเลยทีเดียวสำหรับ security audit หรือทีมที่พัฒนาที่ต้องการมอบความปลอดภัยให้กับผู้ใช้งาน

ซึ่งตอนเราเขียน เราอาจจะไม่มีความรู้ว่า code ที่เราเขียนส่งผลร้ายขอผู้ใช้งานอย่างไรบ้าง แต่พอเราเจอรายงานที่ระบุประเภทช่องโหว่ และไฟล์ที่ตรวจเจอ เราก็นำผลการตรวจมาแก้ไข และ code ครั้งหน้าเราก็จะทำได้ดีขึ้น

สำหรับบทความนี้ไว้เท่านี้ก่อนแล้วกันนะครับ เดี๋ยวจะยาวเกินไป ถ้ามีโอกาส จะมาเขียนให้ทำงานผ่าน build pipelines ให้ดูว่าพอจะทำยังไงได้บ้าง

สำหรับใครที่อ่านมาถึงตรงนี้ผมกำลังมองหางานอยู่ครับ ไม่มีงานทำ skill หลัก ๆ จะเป็น iOS ถ้าสนใจอยากทำงานด้วย จิ้มเบา ๆ ไปหาเบอร์โทรหรืออีเมลได้ที่ [https://github.com/ph9/cv](https://github.com/ph9/cv)