Основи безпеки операційної системи Android

Вступ

У цій статті я спробую розглянути безпеку трохи вище ядра, а саме: як працює безпека в Native user space. Ми торкнемося теми процесу завантаження операційної системи та розглянемо структуру файлової системи Android. Як я вже говорив, я не дуже сильний у Linux, тому якщо помітите неточності, то виправляйте - мене навчіть і покращіть статтю. Так як ця тема досить широка, я вирішив розбити її на дві частини. У першій частині ми розглянемо процес завантаження операційної системи та особливості файлової системи. Всім кому цікаво, ласкаво просимо!

Список статей

Тут зібрано посилання на попередні або наступні мої статті з цієї теми:

Що мається на увазі під Native user space

Під Native user space маються на увазі всі компоненти простору користувача, які виконуються поза Dalvik Virtual Machine, і які не є частиною Linux kernel.

Файлова система Android

Для початку розглянемо структуру файлової системи Android. Хоча Android і базується на Linux kernel, звичну для нашого ока структуру файлової системи ми тут не побачимо. Давайте запустимо емулятор і подивимося, що ми маємо. Для цього виконаємо команду:

У терміналі для емулятора на Android 4.2 я бачу наступний результат:

Я відзначу тут лише головні директорії та ті, які нам знадобляться у майбутньому. В Інтернеті можна знайти опис та призначення інших директорій. Можна помітити, що деякі директорії такі ж, як і в Linux, наприклад/dev,/proc,/sys,/mnt,/etcІ їхнє призначення в основному таке ж, як і в Linux. До речі, зауважте, що ми не бачимо/binі/libдиректорій. Де вони зникли, я розповім трохи згодом.

З іншого боку можна побачити директорії, яких у Linux взагалі немає. Серед них нас цікавлять/data,/system,/cache,/init,/init.rcДавайте розглянемо їх призначення докладніше./systemЦе головна директорія, де зберігаються незмінні компоненти Android системи. Якщо проводити аналогію, то ця папка схожа на текуC:windows, доступну тільки для читання. Тобто. змінювати дані у цій директорії ми можемо. Саме тут можна знайти директорії/binі/lib, де зберігаються різні файли та shared libraries. Крім того, тут же лежать системні програми, які вбудовані в операційну систему і які, за замовчуванням, не можна видалити. Вміст цієї директорії формується під час компіляції операційної системи./dataТ.к./systemу нас доступна тільки для читання, то має бути директорія де зберігаються дані, що змінюються./dataсаме нею і є. Наприклад, в цю директорію/data/appзберігаються apk файли встановлюваних додатків, а в/data/dataзберігаються їх дані (цю директорію ми докладно розглядали в минулій статті)./cacheЦе просто тимчасове сховище. Також у цю директорію зберігаються, а потім із неї запускаються системні оновлення.

Щоб зрозуміти, що таке файл/initі для чого потрібні незрозумілі файли з розширенням *.rc, розглянемо процес завантаження системи.

Процес завантаження Android

Давайте розглянемо кілька кроків процесу завантаження операційної системи Android. Ця картинка взята з книги Embedded Android, там же можна знайти і більш детальний опис. Хоча загалом я й розумію процес, але для мене це більше магія:)

Першою програмою у випадку Android єinit. Виконуваний файл знаходиться у кореневій директорії (/init). Саме цю програму стартує ядро ​​після завантаження. Її вихідники знаходяться в папці system/core/init/12 Давайте в них злегка покопаємося. Нас цікавитьsystem/core/init/init.c:

Спочатку ми створюємо та монтуємо деякі необхідні для роботи директорії, а потім паримо файл/init.rcі виконуємо те, що розпарили. Формат/init.rcфайлу дуже добре описаний у readme, там же можна знайти приклад. Якщо коротко, то цей файл є набір actions (секцій - самеванна послідовність команд). Кожна послідовність команд спрацьовує за певним trigger (тригер). Наприклад, наступна послідовно це action, в якій trigger це fs, а послідовність команд це набір mount команд:

Вони означають, що крімinit.rcфайлу потрібно також імпортувати налаштування з файлівinit.usb.rc,init.trace.rcта з файлу з незрозумілим ім'ямinit.$.rcВтім,$ - це просто змінна, значення яка визначає тип заліза. У разі емулятора, її значення, наприклад, -goldfish. Далі визначаються змінні оточення:

Після цього відбувається ініціалізація змінних, необхідні роботи пристрою. Якщо вас зацікавить ця тема, то ви легко знайдете інформацію про ту чи іншу команду. Давайте докладно розглянемо наступний блок (який я вже приводив у цій статті):

MTD - Memory Technology Devices. Якщо загалом, то MTD - це спеціальний чіп з енергонезалежною (тобто дані на цьому чіпі зберігаються після перезавантаження або вимкнення) flash-пам'яттю (типу NOR або NAND), на який зберігаються образи дисків. В цій статтідетальніше розповідається про цей тип пристроїв, а також про обмеження. Спеціально для цих різновидів flash-пам'яті були розроблені спеціальні файлові системи, наприклад YAFFS. Одне з найважливіших обмежень цих типів пам'яті у тому, що щоб записати дані у сектор, куди вже записані якісь дані, вам треба повністю переформатувати весь пристрій. Тому виробники стали переходити на новий тип блокової flash-пам'яті (eMMC), на які можна поставити звичайну ext4 файлову систему та позбутися зазначеного обмеження. Т.к. я показую прикладinit.rcфайлу для емулятора, де вся робота емулюється, то в ньому за замовчуванням використовується файлова система YAFFS2 (думаю, що це пережитки минулого, тому що YAFFS2 використовувалася для всіх пристроїв до Android 2.2 ). У реальному пристрої (це якраз один із прикладів, коли необхідно використовуватиinit.rcфайл для певного заліза) ці команди будуть перезаписані. Наприклад, у випадку пристроюherring(Google Nexus S), у файліinit.herring.rcця секція виглядає так:

Деfstab.herring— це файл, вміст якого виглядає так:

Слід зазначити, що/systemзмонтований read-only (тільки читання). Це означає, що вміст цього розділу не змінюється в процесі роботи пристрою, а лише коли ви, наприклад, оновлюєте систему на вашому пристрої (використовуючи системні оновлення).

">