How to test insecure data storage – Keychain data (Snoop-it)

บทนำ (Overview)

“Keychain” ในเครื่อง “iOS” เป็นที่จัดเก็บข้อมูลอย่างปลอดภัย ซึ่งสามารถจัดเก็บพวกข้อมูลสำคัญ (Sensitive information) อย่างเช่นพวก “usernames”  “password” หรือ “Tokens” ต่าง ๆ สำหรับการพิสูจน์ตัวตนได้ โดยปกติแล้วเครื่อง “iOS” จะใช้ “keychain” จัดเก็บรหัสผ่านของ “WiFi” และเราสามารถเข้าถึงและเปิดอ่านโดยใช้โปรแกรมจำพวก “SQLite Browser” โดยเข้าไปที่โฟลเดอร์ “/private/var/Keychains” จากนั้นหาไฟล์ที่ชื่อ “keychain-2.db” แต่ข้อมูลส่วนใหญ่ก็เข้ารหัสเสียหมด snoop18

ในเชิงการเขียนโปรแกรมการใช้งาน “Key-chain” ไม่ต่างจาก “NSUserdefaults” (สามารถติดตามได้ที่บทความ How to test insecure data storage – NSUserDefaults) ดังนี้

การเขียนค่า

PDKeychainBindings *bindings = [PDKeychainBindings sharedKeychainBindings];
[bindings setObject:@"value" forKey:@“authToken”];

การดึงค่า

//initWithIdentifier เป็น id ที่ใช้อ้างอิงในการดึงข้อมูล
PDKeychainBindings *bindings = [PDKeychainBindings sharedKeychainBindings];
NSString *value = [bindings objectForKey:@“authToken”];
NSLog(@"%@",value);

“Keychain” สามารถถูกแชร์ร่วมกันระหว่างโปรแกรมได้ อย่างไรก็ตามวิธีการใช้ “Keychain” ให้ปลอดภัยควรเรียกใช้ผ่าน “KeychainItemWrapper” ที่ทาง Apple ได้กำหนดเอาไว้ ตัวอย่างการใช้งานเริ่มต้นการสร้าง “Instance” จาก “Class” ของ “KeychainItemWrapper” ดังนี้

//accessGroup ใช้กำหนดว่า Group ใดบ้างสามารถเข้าถึง Keychain นี้
//และ Application ใด อยู่ใน Group นี้จะเข้าถึง Keychain นี้ได้หมด
//จากตัวอย่างเป็น nil เราไม่ได้กำหนด Group ใด ๆ
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@“authToken” accessGroup:nil];

ตัวอย่างการกำหนด Group เช่น

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@“authToken” accessGroup:@“”];

ในการเขียนค่า เราจะเรียกใช้ Method ชื่อ setObject:forKey: method

//จาก instance ที่ชื่อ wrapper เราสามารถเขียนข้อมูลลง keychain ได้ในรูปแบบต่าง ๆ ดังนี้
[keychainItemWrapper setObject:kSecClassGenericPassword forKey:(id)kSecClass];
[wrapper setObject:@"username" forKey:(id)kSecAttrAccount];

[keychainItemWrapper setObject:@"password"forKey:(id)kSecValueData];
[wrapper setObject:(id)kSecAttrAccessibleAlwaysThisDeviceOnly forKey:(id)kSecAttrAccessible];

เราสามารถใช้ Keychain_dumper สำหรับดึงข้อมูลออกมาตรวจสอบได้แล้ว (How to test insecure data storage – Keychain data) โปรแกรม “Snoop-it” ก็ทำได้เช่นกัน

ขั้นตอน (Steps)

  1. เครื่องต้องผ่าน “Jailbreak” มาแล้ว (ติดตามตัวอย่างการ Jailbreak ได้ที่ How to jailbreak iOS – “PP Jailbreak”)
  2. ติดตั้ง “Sources” สำหรับ “Cydia” ต่าง ๆ เรียบร้อยแล้ว (ติดตามได้จากบทความ How to add Soures of Cydia)
  3. ติดตั้งโปรแกรม “Snoop-it” เรียบร้อยแล้ว (ติดตามได้ที่บทความ How to install Snoop-it)
  4. การใช้งานเบื้องต้นของ “Snoop-it” (สามารถติดตามได้ที่บทความ How to reverse engineering (Snoop-it))
  5. ไปที่โปรแกรม “DVIA” เลือก “Menu > Keychain”
  6. แล้วพิมพ์ “p@ssword” ลงในช่อง จากนั้นกด “Save in Keychain” snoop14
  7. ไปที่ “Snoop-it” เลือก “Monitoring > Keychain” snoop15
  8. ให้ตรวจเวลาที่ “Save” และตรวจสอบตรง “Action” ที่เป็น “New” snoop16
  9. เราจะพบค่า “Keychain” ที่ได้บันทึกเข้าไป snoop17

 

ใส่ความเห็น