บทนำ (Overview)
ถ้าแปลโดยใช้ “Google” ยิ่งแปลก็ยิ่งมึน แต่โดยปกติแล้วทาง “Security” ค่าที่ส่งผ่านจาก “Mobile” เข้ายัง “Server” ถูกคิดไว้เสมอว่า ไม่น่าไว้วางใจไว้ก่อน
ที่นี้ค่าที่ส่งผ่านจาก “mobile” กับ “server” อาจเกิดได้จากการโดนดักและแก้ไขข้อมูลระหว่างทาง (Intercept) อย่างเช่น “HTTP” เพื่อเรียกใช้ “Web Service” (How to set proxy into Burp) หรือไม่มีการป้องกันข้อมูลนำเข้าอย่างเพียงพอ (Input validation เมื่อใช้งานผ่าน “URL Scheme” หรือผ่านช่องทาง Inter-process communication (IPC) ช่องทางอื่น ๆ เป็นต้น
URL Scheme (Inter-App communications)
ในบทความนี้จะกล่าวถึง “URL Scheme” ซึ่งเป็นวิธีการเขียนโปรแกรมเพื่อเรียกใช้โปรแกรมอื่นๆ เช่น การใช้คำสั่ง “html” “mailto” “tel” “sms” ผ่านทาง “Web Browser” อย่าง “Safari” และ “URL Scheme” นี้แหละ และทาง iOS ก็อนุญาตให้เราสร้างขึ้นมาเองได้ แต่ต้องไม่ซ้ำกับของ “iOS” ที่กำหนดไว้ หรือของ “application” ตัวอื่น (http://wiki.akosma.com/IPhone_URL_Schemes)
ข้อดี “URL Scheme” เช่น การใช้งานโปรแกรมหนึ่งส่งข้อมูลไปยังอีกโปรแกรมหนึ่งได้ อย่างถ่ายรูปผ่าน “Camera360” แล้วแชร์ภาพลงไปใน “Facebook” เป็นต้น
วิธีลงทะเบียน “URL Scheme” ให้กับ “application” (Custom URL scheme)
- กำหนดค่าในไฟล์ “Info.plist”
- สร้าง “Key” ชื่อ “URL Types”
- “URL identifier”
- “URL Schemes” เพื่อให้ “Application” อื่นๆ สามารถอ้าง หรือเรียกใช้ “Application” ของเราให้ทำงาน
วิธีเรียกใช้งานจาก Application อื่น
- เรียกโดยใช้ Safari ในช่อง “URL” กรอก “referringname://”
- เรียกผ่านการเขียนโปรแกรม
NSURL *url = [NSURL URLWithString: @"referringname://"]; [[UIApplication sharedApplication] openURL: url];
การรับค่า URL เพื่อใช้งาน
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { // Do something with the url here NSLog(@"URL: %@", url); return YES; }
จากตัวอย่างข้างต้นจะเป็นว่า สามารถส่งค่าเป็น “parameter” ตาม “URL” ไปได้ คล้าย ๆ กับการส่งโดยใช้ “Get method” แต่เป็นการส่งระหว่าง “Application” เพราะฉนั้นอาจจะมีช่องโหว่เกิดขึ้นได้ถ้าเรามีการตรวจสอบข้อมูลนำเข้าไม่พอเพียง (Unvalidated input) เช่น
- Buffer overflows
- Local file inclusion
- Cross-site scripting
- SQL injection
สามารถตรวจสอบวิธีการ “coding” ให้ปลอดภัยที่ (https://developer.apple.com/library/ios/documentation/Security/Conceptual/SecureCodingGuide/Articles/ValidatingInput.html#//apple_ref/doc/uid/TP40007246)
ขั้นตอน (Steps)
- เครื่อง “iOS” ต้องผ่านการ “Jailbreak” เสียก่อน (How to jailbreak iOS – “PP Jailbreak”)
- เริ่มต้นตรวจสอบคำที่ลงทะเบียน “URL scheme” ที่เราจะตรวจสอบ (โปรแกรมช่องโหว่ “DVIA”) ให้เปิดโปรแกรม “iFile” จากนั้นไปที่ /var/mobile/Applications/<โฟลเดอร์ของโปรแกรม DVIA>/DamnVulnerableIOSApp.app/info.plist
- จากนั้นเลือก “Property List Viewer”
- เลือก “CFBundleURLType” (หรือบางโปรแกรมอาจเป็น URL Types ตามที่อธิบายไว้ข้างต้น) ให้ไล่เข้าไปเรื่อย ๆ โดยโครงสร้างจะเป็นดังนี้
- CFBundleURLType
- Array: 0
- Dictionary:
- None: CFBundleTypeRole
- Array: CFBundleURLScheme
- 0: dvia
- Dictionary:
- Array: 0
- CFBundleURLType
- เมื่อเข้าไปดูข้อมูลลงทะเบียน URL Scheme พบว่าชื่อ dvia ดังนั้น URL Scheme จะเป็น dvia://
- ทดสอบช่องโหว่โดยการเปิด Safari จากนั้นพิมพ์ dvia://<หมายเลขโทรศัพท์>
- จากนั้นคลิก “Go”
ในการโจมตีนั้น เราก็เปรียบ Application นั้นคล้ายกับ Web server เพราะฉะนั้นเราสามารถมารถทำการ phishing เพื่อแนบ E-mail ฝั่ง Script หรือไปฝั่ง Web board อื่น ๆ โดยใช้ command เช่น<script>document.location='referringname://<parameter ที่เราโจมตี>'<script> <iframe src='referringname://<parameter ที่เราโจมตี>'></iframe>
- แต่ในการทดสอบแบบ Black-box บางครั้งจะต้องสังเกตุค่าพารามิเตอร์ที่ส่งไปจากโปรแกรมที่เรีบกใช้ด้วยก่อนทดสอบ ส่วนในแบบ Gray-box จำเป็นต้องขอคู่มือการเขียนส่ง-รับ URLScheme จากผู้พัฒนาระบบด้วย