У цій статті ми будемо досліджувати файлову систему операційної системи IOS. Будуть розглянуті організація директорій, деякі важливі файли і способи добування інформації з бази даних і plist-файлів. Також ми розглянемо, як додатки зберігають дані в своїх власних директоріях (пісочниці) і способи їх отримання.
Автор: Пратика Джіанчандані (Prateek Gianchandani)
У цій статті ми будемо досліджувати файлову систему операційної системи IOS. Будуть розглянуті організація директорій, деякі важливі файли і способи добування інформації з бази даних і plist-файлів. Також ми розглянемо, як додатки зберігають дані в своїх власних директоріях (пісочниці) і способи їх отримання.
Слід звернути увагу на одну важливу деталь. У попередніх статтях ми працювали з пристроєм під користувачем root. Існує ще один користувач з ім'ям mobile, у якого рівень привілеїв менше, ніж у користувача root. Практично всі програми (за винятком Cydia і деяких інших, які вимагають привілеїв root) працюють під користувачем mobile. Деякі внутрішні демони і сервіси Apple також вимагають привілеїв root. Щоб переконатися в цьому, виконаємо команду ps aux. На малюнку нижче показані параметри процесів системи. У самій лівій колонці показана колонка користувача, з-під якого запущений процес. Ми бачимо, що Cydia працює від імені root, в той час як інші програми працюють під користувачем mobile (наприклад, /Applications/AppStore.app/AppStore). Також в цьому списку показані деякі демони (наприклад, / usr / sbin / wifid), запущені під користувачем root. Деякі інші додатки, які ви встановлюєте через Cydia, можуть вимагати привілеїв root. За замовчуванням на джейлбрейковом пристрої у користувачів root і mobile один і той же пароль alpine.
Малюнок 1: Результат виконання команди ps aux, яка видає список процесів системи і їх параметри
Ви можете конфігурувати додатки для роботи під користувачем root. Більш докладно про це можна дізнатися з дискусії на Stack Overflow.
Підключіться до пристрою через ssh і зайдіть в директорію / Applications. У цій папці знаходяться декілька додатків, більшість з яких йдуть в комплекті з IOS. Також в цій папці є додатки, встановлені через Cydia (наприклад, додаток Terminal). Будь ласка, зверніть увагу, що всі програми з директорії / Applications запускаються не в ізольованому середовищі (sandboxed environment), в той час як додатки з папки / var / mobile / Applications запускаються в ізольованому середовищі. Про пісочниці ми поговоримо далі в цій статті. Всі ці програми працюють під користувачем mobile, не рахуючи спеціально сконфігурованих додатків, які працюють під користувачем root.
Малюнок 2: Вміст папки / Applications
Всі додатки, що завантажуються з App Store, відразу ж потрапляють в директорію / var / mobile / Applications /. У цій папці також знаходяться додатки, встановлені за допомогою утиліти installipa або з зовнішнього джерела на зразок Cydia. Всі ці програми запускаються в ізольованому середовищі.
Малюнок 3: Вміст папки / var / mobile / Applications /
Зверніть увагу, що, починаючи з IOS 4, кожен додаток розташовується в ізольованому середовищі або пісочниці. Це зроблено для того, щоб додаток не могло отримати доступ до даних поза ізольованою середовища. Таким чином, підвищується рівень безпеки. Хоча все ще залишається можливим отримати доступ до певних призначених для користувача даних з програми, якщо є відповідні привілеї. У цей набір включені привілеї для отримання користувальницьких контактів, фотографій і так далі (на цю тему були і тривають дискусії). Наприклад, починаючи з IOS 6, додаток може отримати доступ до призначених для користувача контактам після того, як користувач наділив додаток відповідними правами. У більш ранніх версіях додаток могло отримати доступ до даних користувача без відома самого користувача, що викликало запеклі суперечки щодо застосування Path.
Крім того, можливо одержати доступ і до іншої інформації, що знаходиться поза ізольованою середовища, за допомогою Entitlements (права доступу на ресурси поза пісочниці). Більш докладно про це можна прочитати в документації для розробників. Наприклад, для доступу на читання і запис в календар користувача до відповідного ключ com.apple.security.personal-information.calendars необхідно встановити значення YES у файлі .entitlements.
Давайте розглянемо структуру директорії конкретного додатка на прикладі додатка Snapchat. Для всіх інших додатків структура директорій приблизно однакова.
Малюнок 4: Структура директорій для додатка Snapchat
Розглянемо вміст кожної директорії більш докладно.
- Папка Snapchat.app (і всі інші папки, назва яких відповідає шаблону Appname.app) містить ресурси (картинки), plist-файли і бінарний файл програми.
- Папка Documents використовується для зберігання будь-яких файлів. Для даних, які не належать до контексту додатки (для таких даних використовується папка Appname.app), існує окрема папка. Ось витяг з документації Apple : Зберігайте в папці / Documents / призначені для користувача дані і будь-яку іншу інформацію, яка не може бути відтворена додатком (призначені для користувача документи та інші дані, створювані користувачем)
- В папці tmp використовується для зберігання тимчасових призначених для користувача даних. Розробнику додатки слід дбати про те, щоб ця папка роздувалася до величезних розмірів.
- В папці Library зберігаються файли, які не відносяться до призначених для користувача файлів.
Нижче наводиться витяг з документації Apple, де наводиться більш детальна інформація по структурі директорій додатки.
- Обробляйте файли, які ваше додаток може завантажувати, генерувати або відтворювати, одним з двох способів:
- У iOS 5.0 і нижче кладіть ці файли в папку <Application_Home> / Library / Caches для того, щоб вони не потрапляли в резервну копію.
- В iOS 5.0.1 і вище кладіть ці файли в папку <Application_Home> / Library / Application Support і внесіть їх в атрибут com.apple.MobileBackup. Цей атрибут не дозволяє додавати файли в резервні копії iTunes або iCloud. Якщо у вас багато таких файлів, ви можете зберігати їх в піддиректорії і додати в атрибут тільки цю директорію.
- Файли кешу кладіть в папку <Application_Home> / Library / Caches. Наприклад, сюди можна класти файли (але не тільки їх) кеша бази даних і завантаження контенту, який використовується додатками для перегляду журналів, газет або карт. Ваша програма повинна вміти розрулювати ситуації, коли кеш очищується системою для звільнення дискового простору.
Отримання інформації з файлів баз даних
Apple використовує бази даних sqlite для зберігання великих масивів інформації. Зазвичай файли баз даних містять розширення .db або .sqlitedb. Розробникам можуть працювати з базами даних на низькому рівні за допомогою безлічі інструментів (фреймворк Core Data, NSUserDefaults і т. Д.). Файли баз даних можуть використовуватися для отримання величезних обсягів інформації, як в конкретному додатку, так і в операційній системі. Наприклад, це може бути історія дзвінків або електронні листи. Для знаходження всіх .db файлів використовуйте команду find. -name * .db.
Малюнок 5: Отримання списку всіх .db файлів за допомогою команди find. -name * .db
На малюнку вище показаний список всіх файлів баз даних, які зберігаються на пристрої. Давайте поглянемо деякі важливі файли баз даних.
На моєму пристрої встановлено додаток gmail. Я зацікавився файлом, показаним на малюнку нижче.
Малюнок 6: Файл бази даних, який використовується додатком gmail
Здається, файл містить деяку важливу інформацію. Давайте проаналізуємо його за допомогою клієнта sqlite. Для цього вам необхідно встановити клієнт sqlite з ім'ям sqlite3 (якщо він у вас не встановлений). Відкриваємо файл, використовуючи команду sqlite3 file_name.
Малюнок 7: Команда для аналізу вмісту файлу бази даних за допомогою клієнта sqlite
Після виконання команди ви опинитеся в інтерпретаторі sqlite. Для початку включимо відображення заголовків таблиці. Після цього, використовуючи команду .tables, виведемо список всіх таблиць бази даних.
Малюнок 8: Включення заголовків і виведення списку всіх таблиць бази даних
Таблиці cached_contacts, cached_queries і cached_messages представляють для нас певний інтерес. Давайте поглянемо на вміст таблиці cached_messages.
Малюнок 9: Вміст таблиці cached_messages
Як видно з малюнка вище, в таблиці знаходяться закешовану електронні повідомлення.
Схожим чином можна вивантажити всю інформацію з бази даних, яка містить SMS-повідомлення (база даних знаходиться в папці / private / var / mobile / Library / SMS). Як видно з малюнка нижче, в базі даних міститься повідомлення з текстом Test message for ios security tutorial.
Малюнок 10: Вміст таблиці messages бази даних sms.db
Інший приклад: база даних адресної книги, яку можна знайти в папці / var / mobile / Library / AddressBook.
Малюнок 11: Вміст таблиці ABPerson бази даних AddressBook.sqlitedb
Ви також можете знайти історію викликів (база даних знаходиться в папці / private / var / wireless / Library / CallHistory).
Малюнок 12: Вміст таблиці call бази даних call_history.db
Іноді робота з командним рядком може забирати багато часу і сил. Ще простіше аналізу інформації - експорт файлу бази даних на робочий стіл. Наприклад, давайте експортуємо базу даних адресної книги.
Малюнок 13: Процедура експорту бази даних
Потім ми можемо проаналізувати інформацію за допомогою клієнта sqlite з графічною оболонкою (в моєму випадку це MesaSQLite, він безкоштовний і простий у використанні). Зайдіть в MesaSQLite і в розділі File клікніть на Open Database, а потім виберіть файл бази даних. Далі перейдіть на вкладку Content, виберіть таблицю і клацніть на Show All.
Малюнок 14: Перегляд вмісту таблиці за допомогою MesaSQLite
Як ви вже могли переконатися, з файлів баз даних можна отримати величезний обсяг інформації. Рекомендую вам проаналізувати вміст системних баз даних і баз даних, що використовуються конкретними програмами.
Отримання інформації з plist-файлів
Plist-файли являють собою структуровані текстові файли, які використовуються для зберігання налаштувань певної програми. Оскільки інформація структурована і зберігається за методом «ключ-значення», то легко додавати нові дані, і розробники іноді зберігають в цих файлах більше інформації, ніж реально використовується в додатку.
Навіть в неджейлбрейковом пристрої plist-файли можна витягти за допомогою утиліти iExplorer. Ви також можете побіжно оглянути plist-файл, використовуючи iExplorer. На малюнку нижче показано вміст plist-файлу, що використовується додатком Defcon.
Малюнок 15: Вміст plist-файлу програми Defcon
Нижче показаний фрагмент файлу User.plist для додатка Snapchat, який зберігається в папці Documents. Перша позначена секція зберігає інформацію про аутентифікаційних токені конкретного користувача. Друга позначена секція зберігає ім'я користувача додатки Snapchat.
Малюнок 16: Фрагмент файлу User.plist додатки Snapchat
Plist-файли можуть також містити конфіденційну інформацію (наприклад, імена користувачів і паролі). Тут важливо пам'ятати про те, що будь-хто може отримати інформацію з plist-файлу з будь-якого пристрою (навіть якщо воно неджейлбрековое). Ви також можете отримати plist-файли з резервної копії itunes. Останні кілька років розробники використовують plist-файли для зберігання конфіденційної інформації, що неправильно. Раніше була знайдена вразливість в додатку Linkedin, суть якої полягала в тому, що розробник як раз використовував plist-файли для зберігання інформації про аутентифікації користувача.
Якщо ви хочете читати plist-файл прямо з терміналу, файл необхідно конвертувати в формат xml за допомогою утиліти plutil (команда plutil -covert xml1 [filename]). Спочатку знайдемо всі plist-файли на пристрої, використовуючи команди, показані на малюнку нижче.
Малюнок 17: Шукаємо усі plist-файли на пристрої
Сконвертіруем який-небудь файл в формат xml.
Малюнок 18: Конвертуємо plist-файл в формат xml
Тепер файл знаходиться в легкому для читання форматі. Відкриємо його, використовуючи vim.
Малюнок 19: Перегляд xml-файлу в текстовому редакторі vim
Тепер ми зможемо проаналізувати plist-файл.
висновок
У цій статті ми досліджували файлову систему в IOS, вивчили структуру директорій додатки, розглянули деякі важливі файли і вивчили способи добування інформації з баз даних і plist-файлів. У наступній статті ми розглянемо просте застосування і за допомогою технік, вивчених нами в попередніх статтях, виконаємо детальний аналіз безпеки цього додатка.