Основи на сигурността на операционната система Android

Въведение

В тази статия ще се опитам да разгледам сигурността малко над ядрото, а именно: как работи сигурността в Native потребителското пространство. Ще се докоснем до темата за процеса на зареждане на операционната система и ще разгледаме структурата на файловата система на Android. Както казах, не съм много силен в Linux, така че ако забележите неточности, коригирайте ги - научете ме и подобрете статията. Тъй като темата е доста обширна, реших да я разделя на две части. В първата част ще разгледаме процеса на зареждане на операционната система и характеристиките на файловата система. Който се интересува е добре дошъл!

Списък на статиите

Ето връзки към моите предишни или следващи статии от тази тема:

Какво се разбира под собствено потребителско пространство

Родното потребителско пространство се отнася до всички компоненти на потребителското пространство, които работят извън виртуалната машина Dalvik и не са част от ядрото на Linux.

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

Първо, нека да разгледаме структурата на файловата система на Android. Въпреки че Android е базиран на ядрото на Linux, тук няма да видим познатата ни структура на файловата система. Нека стартираме емулатора и да видим какво имаме. За да направите това, изпълнете командата:

В моя терминал за емулатор на 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, където се съхраняват различни изпълними файлове и споделени библиотеки. Освен това има и системни приложения, които са вградени в операционната система и които по подразбиране не могат да бъдат изтрити. Съдържанието на тази директория се формира по време на компилирането на операционната система./данни/systemе само за четене, тогава трябва да има директория, където се съхраняват променените данни./данние точно това. Например в тази директория/data/appapk файловете на инсталираните приложения се записват, а техните данни се съхраняват в/data/data(обсъдихме подробно тази директория в последната статия)./cacheТова е само временно хранилище. Освен това системните актуализации се записват в тази директория и след това системните актуализации се стартират от нея.

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

Процес на стартиране на Android

Нека преминем през няколко стъпки от процеса на зареждане на операционната система Android. Тази снимка е взета от книгата Embedded Android, където можете да намерите и по-подробно описание. Въпреки че като цяло разбирам процеса, но за мен това е повече магия.:)

Първата програма в случая на Android еinit. Изпълнимият файл се намира в главната директория (/init). Именно тази програма стартира ядрото след стартирането му. Източниците му се намират в папкатаsystem/core/init/Нека се поразровим малко в тях. Интересуваме се отsystem/core/init/init.c:

Първо създаваме и монтираме някои директории, необходими за работата, след което анализираме файла/init.rcи изпълняваме това, което сме анализирали. Форматът на файла/init.rcе много добре описан в readme и можете да намерите пример там. Накратко, този файл е набор от действия (секции - наименована последователност от команди). Всяка последователност от команди се задейства от конкретен тригер. Например следното в последователност е действие, при което тригерът е fs, а последователността от команди е набор от команди за монтиране:

Те означават, че в допълнение към файлаinit.rcтрябва да импортирате настройки и от файловетеinit.usb.rc,init.trace.rcи от файл с неразбираемо имеinit.$.rcОбаче$ е просто променлива, стойността, която определя вида на хардуера. В случай на емулатор стойността му е например -златна рибка. Променливите на средата се дефинират по-долу:

След това се инициализират променливите, необходими за работата на устройството. Ако се интересувате от тази тема, можете лесно да намерите информация за конкретна команда. Нека разгледаме по-отблизо следващия блок (който вече предоставих в тази статия):

MTD означава Технологични устройства с памет. Най-общо казано, MTD е специален чип с енергонезависима (т.е. данните на този чип се записват след рестартиране или изключване) флаш памет (тип NOR или NAND), на която се записват дискови изображения. В тази статияповече подробности за този тип устройство, както и ограничения. Специални файлови системи, като YAFFS, са разработени специално за тези видове флаш памет. Едно от най-важните ограничения на тези видове памет е, че за да запишете данни в сектор, където някои данни вече са записани, трябва напълно да преформатирате цялото устройство. Поради това производителите започнаха да преминават към нов тип блокова флаш памет (eMMC), на която можете да поставите обикновена файлова система ext4 и да се отървете от това ограничение. защото Показвам примерен файлinit.rcза емулатор, където цялата работа се емулира, след което по подразбиране се използва файловата система YAFFS2 (мисля, че това е реликва от миналото, защото YAFFS2 се използва за всички устройства преди Android 2.2). В реално устройство (това е само един от примерите, когато трябва да използвате файлаinit.rcза определен хардуер), тези команди ще бъдат презаписани. Например, в случая на устройствотоherring(Google Nexus S), във файлаinit.herring.rcтози раздел изглежда така:

Къдетоfstab.herringе файл, чието съдържание изглежда така:

Имайте предвид, че/systemе монтиран само за четене. Това означава, че съдържанието на този раздел не се променя, докато устройството работи, а само когато например актуализирате системата на вашето устройство (чрез системни актуализации).

">