Перш за все, я мушу визнати, що я повністю згоден з вашою заявою "Я вважаю це приголомшливо важким" . Google розробила Android в основному з погляду споживачів, а не для споживачів енергії. Результат полягає в тому, що, як тільки ви хочете зробити щось поза межами використання найновішої програми Facebook або грати з Candy Crush, ви дуже швидко опинитесь у царині Linux 2000 року, коли потрібні знання для розробника, щоб змінити якими мають бути прості налаштування. Я вірю, що ситуація швидко розвиватиметься, коли система Android стає більш зрілою, але поки що ми маємо справу з тим, що у нас є ...
Як ви вже говорили, є дві причини, з яких необхідно скласти власний набір інструментів SELinux:
- Зазвичай набір інструментів надається системою. Хоча Android SELinux покладається на БД версії 30 версії, поточні вікна Linux зазвичай обробляють лише версію до 29.
- Навіть якщо це було б нещодавніше, це не допоможе, адже побудова SELinux з висхідного коду (що легко робиться, принаймні на машинах Fedora, виконуючи рекомендації вище), ефективно дозволяє системі обробляти DB версії 30 політики, проте SELinux Android був сильно модифікований ( документація Google виділяє кілька модифікацій), тому спроба впоратися з системою Android SELinux не вдається через помилки синтаксису та розбору.
Отже, щоб продовжувати квест SELinux для Android, нам доведеться вкласти бруд в найчистіший спосіб:
- Спочатку ми встановимо здорове середовище,
- Після цього ми складемо бібліотеки SELinux та перші інструменти Android,
- Поверх них ми побудуємо інструменти SELinux,
- Закінчимо, додавши кілька додаткових утиліт.
Створіть належне середовище
Властивості навколишнього середовища
Найчистіший рекомендований, можливо, єдино надійно працюючий спосіб - присвятити середовище роботі Android:
Віртуальна машина - це прекрасно (якщо не найкращий варіант). Віддайте перевагу використовувати VMware, оскільки вам доведеться підключити телефон через USB до гостьової системи. Вільна альтернатива Qemu, здається, не дуже добре справляється з таким завданням. Я не пробував з іншим програмним забезпеченням для віртуалізації.
Потрібно мати 64-бітну систему, інакше код просто не складеться через те, що цілі числа мають неправильний розмір.
Він настійно рекомендується, можливо , обов'язково, щоб використовувати систему Ubuntu. Не соромтесь використовувати Xubuntu, якщо ви віддаєте перевагу більш легкому середовищу робочого столу XFCE, це не змінює ядро та доступний пакет системи і не матиме впливу на вашу роботу, пов'язану з Android (все, що я кажу про Ubuntu в цій процедурі, також стосується Xubuntu). Ви можете знайти в дереві вихідного дерева SELinux Android деякі файли ReadMe, які рекомендують використовувати Fedora, замість цього ці файли успадковуються від проекту SELinux NSA Nstream, і їх вміст не обов'язково відповідає Android Google.
Точна версія Unbuntu для використання залежить від версії Android, яку ви хочете створити. Для Android 6.0 рекомендується Ubuntu 14.04 (Trusty). Перегляньте сторінку вимог Google для отримання додаткової інформації.
Вам знадобиться достатньо місця на диску (принаймні 50 Гб, якщо ви плануєте лише розслідування, пов’язане з SELinux, принаймні 100 ГБ, якщо плануєте повністю скласти Android). Процесор і пам’ять менш релевантні, вони впливають лише на час повноцінного збирання і не матимуть реального впливу на завдання, пов'язані з SELinux.
Використання Ubuntu має дві основні переваги:
Використовуючи рекомендовану систему, ви працюєте у добре відомій і перевіреній обстановці: системні бібліотеки, інструменти та пакети знаходяться у тій версії та місці, яке очікується проектом.
А точніше в нашому випадку: Ubuntu сам покладається на AppArmor, який є альтернативою SELinux, він не використовує SELinux. Хороша новина полягає в тому, що ви зможете встановити інструменти та бінарні файли Android SELinux у всій системі, не ризикуючи змінити надійність системи.
Процедура установки середовища
Ви можете встановити Ubuntu традиційним способом, починаючи з повноцінного живого DVD-диска, але більш швидкою альтернативою є використання встановлення netboot (встановлення textmode) та вибору середовища, яке ви віддаєте перевагу в кінці. Це дозволить заощадити початковий час оновлення, встановивши безпосередньо оновлену версію пакунків замість того, щоб спочатку встановити застарілі версії, а потім попросити застосувати 389 очікуючих оновлень під час першого завантаження.
ISO для Ubuntu / Xubuntu 14.04 ( той же ISO) установника мережевий завантаження доступний тут .
Щоб пропустити неспокійну функцію "Легка установка" VMware, корисно почати з вибору параметра "Я встановлю операційну систему пізніше" .
Обов’язково виберіть Linux , тоді Ubuntu 64 біт як гостьова ОС.
ВМ потребуватимуть таких ресурсів:
- Обов'язково: дисковий простір повинен бути принаймні 40GB (за замовчуванням 20 ГБ буде НЕ достатньо, вихідний код в поодинці займає більше місця , ніж), рекомендується вище. Для повноцінного складання потрібен мінімум 100 Гб диска, це зазвичай значення, яке я приймаю. Не забувайте, що цей параметр є лише максимальною межею: фактичний розмір, прийнятий VM, динамічно зростає із запитами гостей.
- Факультативно: збільшити оперативну пам’ять з 1024 до принаймні 2048 або вище (залежить від вашої ємності хоста, я використовую 4096),
- Факультативний: збільшити кількість процесорних ядер від 1 до 2 або вище (залежить від вашої ємності хоста, я використовую 3).
- CD-Rom повинен вказувати на інсталяційний файл ISO.
- Можливо, ви захочете переключити USB з типових 1,1 на 2,0, оскільки перший може наводити попередження під час підключення пристрою. Залежно від використання, ви також можете зняти прапорець "Автоматично підключати нові USB-пристрої" та "Обмінюватися пристроями Bluetooth з віртуальною машиною" .
- Залежно від вашого оточення, вам може знадобитися налаштувати параметри дисплея (відключити 3D, застосувати розмір екрана).
Увага:
- Якщо ви вибрали встановлення netboot, не забудьте вибрати середовище робочого столу ( робочий стіл Ubuntu або робочий стіл Xubuntu ), доїхавши до екрана вибору програмного забезпечення , інакше ви отримаєте мінімальне середовище лише для тексту!
- Після першого завантаження відмовтеся від оновлення до останнього випуску: вся справа в тому, щоб зупинитися на 14.04!
Після першого завантаження одним із перших, що ви можете зробити, це встановити гостьові інструменти Linux:
sudo apt-get install open-vm-tools
Цей пакет ставить тригери часу завантаження, тому його встановлення буде завершено лише після гостьового перезапуску.
Отримати вихідний код Android
Хоча аналогічні, деталі процедури залежать від обраного ПЗУ:
- Для CyanogenMod знайдіть свій пристрій (спочатку виберіть постачальника), потім натисніть посилання "Як створити CyanogenMod", щоб отримати інструкцію, адаптовану для вашого пристрою.
- Для AOSP дотримуйтесь процедури, яка починається тут .
Можна відзначити, що CyanogeMod поєднує у своєму вихідному дереві інструмент, що дозволяє розпаковувати boot.img
файли. Якщо сказати інакше, CyanogenMod надає вам інструмент, який дозволить отримати доступ до sepolicy
файлів, що зберігаються в пристроях та архівах ROM. Google AOSP не надає такого інструменту, тому якщо у вас немає іншого необхідного використання джерельного дерева CyanogenMod, може бути найбільш зручним вибором, інакше вам доведеться встановити його appart (що швидко і легко зробити, тому тут не хвилюйтесь).
Тут я дотримуюся процедури CyanogenMod 13.0 (Android 6.0). Пояснення використаних команд доступне на сторінках, пов’язаних вище. Будь ласка, прочитайте їх, введений нижче машинопис подається лише для довідки.
Порада: Хоча яapt-get
в цій публікації використовую найменший загальний знаменник і радую всіх, ви можете скористатисьaptitude
замість цього, оскільки він краще піклується про залежності (при видаленні пакета, який вимагав встановлення деяких залежностей , ці залежності також будуть усунені, залишивши вашу систему чистішою). aptitude
КомандаAFAIKповинна бути встановлена в Ubuntu, але доступна за замовчуванням на Xubuntu.
sudo apt-get install bison build-essential curl flex git gnupg gperf \
libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 \
libxml2-utils lzop maven openjdk-7-jdk pngcrush schedtool squashfs-tools \
xsltproc zip zlib1g-dev g++-multilib gcc-multilib lib32ncurses5-dev \
lib32readline-gplv2-dev lib32z1-dev
mkdir -p ~/bin
mkdir -p ~/android/system
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod u+x ~/bin/repo
cd ~/android/system/
git config --global user.name "Your Name"
git config --global user.email "you@example.com
repo init -u https://github.com/CyanogenMod/android.git -b cm-13.0
repo sync
# Coffee time: around 20GB are being downloaded, this may take several hours.
source ./build/envsetup.sh
breakfast
Тепер у вас є чисте і майже повне дерево-джерело. Власні краплі відсутні, але вони вам не потрібні для завдань, пов’язаних із SELinux.
Порада: Вибір джерел - це копіткий процес, можливо, варто зробити знімок або створити резервну копію вашого віртуального комп'ютера зараз.
Скомпілюйте та встановіть набір інструментів і бібліотеки Android SELinux
Зараз починається кумедна частина подорожі;)!
До цього часу процедура мала бути досить простою. Основна мета полягала у тому, щоб у вас було таке саме середовище, як у мене. Якщо це зробити, продовження теж має залишатися прямим.
Під капотом Google не соромтеся застосовувати глибокі зміни до вихідного коду Android між версіями, тому точні етапи компіляції цілком неодмінно залежать від версії (наприклад, майстер AOSP показує, що sepolicy/
каталог буде переміщено ).
Спочатку я поділюсь моєю точною процедурою збирання та встановлення бібліотек та інструментальних інструментів SElinux для Android, але для того, щоб зберегти актуальність цієї публікації з часом, я потім додам кілька приміток про загальний підхід, який слід дотримуватися, щоб вирішити більшість проблем компіляції.
Покрокова процедура
Бібліотеки SELinux Android надають шар абстракції, який дозволить програмному забезпеченню верхнього шару працювати з файлами політик SELinux, характерними для Android. Тому нам потрібно буде спочатку обчислити та встановити їх (що саме по собі насправді являє собою ядро, якщо складнощі тут, поки ви не знайдете свій шлях).
Тоді ми зможемо створити та встановити інструменти SELinux. Як ми побачимо, на щастя, вони не повинні бути специфічними для Android, вони лише повинні відповідати версії бібліотеки SELinux.
Ця процедура була перевірена як із використанням дерев вихідного коду CyanogenMod, так і AOSP.
Скомпілюйте та встановіть бібліотеки та перші інструменти Android SELinux
Спочатку встановіть залежності:
sudo apt-get install libapol-dev libaudit-dev libdbus-glib-1-dev libgtk2.0-dev \
libustr-dev python-dev python-networkx swig xmlto
У цій публікації змінна $ANDROID_BUILD_TOP
зберігає ваше вихідне місце (каталог, в якому ви видали repo sync
команду). Не соромтеся змінювати свою назву як завгодно.
ANDROID_BUILD_TOP=~/android/system
cd $ANDROID_BUILD_TOP
source ./build/envsetup.sh
За замовчуванням компіляція основних утиліт політики не вдається через те restorecond
, що Makefile не в змозі знайти деякі бібліотеки. Ви повинні відредагувати цей Makefile, щоб використовувати шляхи, динамічно генеровані pkg-config
замість твердо кодованих (не плутайте задні посилання з одинарними лапками!):
sed -i 's/^CFLAGS ?= -g -Werror -Wall -W$/& `pkg-config --cflags --libs dbus-1 gtk+-2.0`/' \
$ANDROID_BUILD_TOP/external/selinux/policycoreutils/restorecond/Makefile
Не соромтесь відкривати Makefile разом з деяким текстовим редактором, щоб переконатися, що модифікація була правильно врахована.
А тепер компілюйте та встановіть:
cd $ANDROID_BUILD_TOP/external/bzip2/
make -f Makefile-libbz2_so
sudo make install
cd $ANDROID_BUILD_TOP/external/libcap-ng/libcap-ng-0.7/
./configure
make
sudo make install
cd $ANDROID_BUILD_TOP/external/selinux/
make -C ./libsepol/
sudo make -C /libsepol/ install
EMFLAGS=-fPIC make -C ./libselinux/
sudo make -C ./libselinux/ install
make -C ./libsemanage/
sudo make -C ./libsemanage/ install
make
sudo make install
make swigify
sudo make install-pywrap
sudo cp ./checkpolicy/test/{dispol,dismod} /usr/bin/
Увага: Не забудьтеEMFLAGS=-fPIC
налаштувати змінну оточення під час будівництваlibselinux
. Це ще не призведе до помилок, але на наступному кроці ви не зможете створити SETools. У випадку, якщо ви пропустили це чи зробили щось інше не так, просто опублікуйтеmake clean
і перезапустіть компіляцію.
Скомпілюйте та встановіть інструменти SELinux
Інструменти SELinux надаються у попередньо складеній формі, яка включає:
- Сценарії Python (та їх обгортки для оболонок) в
$ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/
каталозі
- Пакети Python (включаючи
*.o
компільовані файли) нижче $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/
.
Я б очікував, що вихідний код цих інструментів буде доступний нижче $ANDROID_BUILD_TOP/external
, але це не так. Насправді я не знайшов жодного місця, де Google поділився б точною версією SETools, яку вони використовували (FYI, GPL надає лише спільний доступ до коду, якщо він був змінений), тому нам доведеться здогадуватися і намагатися робити все якнайкраще. .
Самі інструменти - це сценарії Python, це нова еволюція від SETools 4 (у SETools 3 такі команди, як sesearch
кодовані у C двійковій версії ). Однак самі інструменти все ще містять версію 3.3.8:
$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8
Тому я здогадуюсь, що Google зробив деякий знімок ранньої розробки з SETools 4. До 4.0.0 бета SETools спирався на libsepol
версію 2.4, з випуском 4.0.0 вони почали покладатися на версію 2.5 бібліотеки, яка не сумісна з версією SELinux в комплекті з Android 6.0 (ви можете спробувати це скомпілювати, це просто не вдасться).
Тож наймудріший вибір, здається, йде разом із SETools 4.0.0 Beta.
Встановити додаткові залежності:
sudo apt-get install python-setuptools
Завантажте та витягніть вихідний код:
cd ~/android/
wget https://github.com/TresysTechnology/setools/archive/4.0.0-beta.tar.gz
tar xzf 4.0.0-beta.tar.gz
cd ./setools-4.0.0-beta/
Через помилку, що впливає на Flex 2.5, нам потрібно видалити -Wredundant-decls
з прапорів компілятора:
sed -i '/-Wredundant-decls/d' ./setup.py
І нарешті компілюйте та встановіть:
python ./setup.py build
sudo python ./setup.py install
Загальна процедура (або "Як відклеїти себе")
Якщо вищезгадана процедура не працювала у вашому випадку, ось подання вищого рівня щодо того, як намагатися просуватися.
На жаль, тут немає ніякої магії (і жодного помічника :(): єдиний спосіб збору цього коду - це класичний, але жахливий циклічний підхід "спробувати".
Спробуйте скомпілювати перший раз, це, швидше за все, не вдасться через те, що якийсь *.h
файл не знайдений:
Шукати в external/
каталозі Android :
find $ANDROID_BUILD_TOP/external -name filename.h
Якщо ви знайдете запитуваний файл, це означає, що певна версія відповідної бібліотеки чи інструменту була вбудована у вихідний код Android. Тому не слід намагатися встановлювати його з пакетної системи Ubuntu, а натомість компілювати та встановлювати версію, що входить у вихідний код Android.
Майте на увазі, що це суперечить загальним порадам, які ви можете знайти на форумах: "Ваша компіляція не вдається через відсутність цієї бібліотеки? Встановіть цей пакет, тоді це буде добре!" , зробивши це, ви, швидше за все, просто ввійдете в гіршу проблему: якщо в комплекті є певна версія, це, швидше за все, потрібна певна версія (через проблеми сумісності або тому, що ця версія містить конкретні зміни від Google).
BTW, якщо вам цікаво: звичайно, у цій бібліотеці чи інструменті можуть бути помилки, що викликають залежності, оскільки якийсь *.h
файл не знайдений, і так, ви повинні застосувати цей самий циклічний підхід "спробувати і побачити".
Шукати в усьому світі:
find / -name filename.h 2>/dev/null
Якщо ви виявили, що файл "відсутній" вже присутній у вашій системі в якомусь стандартному розташуванні спільної бібліотеки, це означає, що ця залежність, ймовірно, вже зустрічається у вашому середовищі, але Makefile, який підняв помилку, занадто німий, щоб її знайти.
Якщо ви вручну безпосередньо викликаєте цей Makefile, можливо, ви зможете встановити певну змінну середовища, що фіксує це ( LIBDIR=/usr/lib make
наприклад), інакше вам може знадобитися змінити сам Makefile ( pkg-config
команда може бути корисною допомогою для автоматичного генерування відсутніх параметрів збірки) .
Пошук в системі упаковки:
apt-cache search filename-dev
Де filename-dev
представлено ім'я відсутнього файлу в малому регістрі з .h
розширенням, заміненим -dev
суфіксом (наприклад, якщо Python.h
його не знайти, знайдіть python-dev
). Для того, щоб знайти потрібний пакет, може знадобитися певна настройка точної назви.
Якщо ви залишаєтеся застряглими і навіть швидкий пошук в Інтернеті не дав чіткої відповіді, то apt-file
буде найкращим другом. apt-file
не встановлено за замовчуванням, вам потрібно встановити його та створити його базу даних:
sudo apt-get apt-file
sudo apt-file update
apt-file
дозволяє шукати пакети (навіть видалені), що надають певний файл. Щоб уникнути занадто великого результату, рекомендую пов’язати його grep
як нижче:
apt-file search filename.h | grep -w filename.h
Якщо в сховищі Ubuntu є пакет, що надає цей файл, то його apt-file
слід знайти.
Після того, як ви знайшли потрібний пакет, встановіть його , використовуючи , apt-get install packagename
де packagename
це ім'я вашого пакета.
Порада: Якщо ви угвинчуватися щото в вашій системі, то команда перевстановити пакет це один:apt-get reinstall pkg_name
. Вона працюватиме навіть тоді, коли класичне видалення та встановлення неможливо було б через порушення залежностей (що, швидше за все, для бібліотек системи).
Додаткові інструменти
На цьому кроці тепер у вас має бути чисте середовище, що дозволяє досліджувати правила SELinux для Android як у компільованому, так і у вихідному форматах.
Однак, найімовірніше, що наприкінці розслідування ви захочете вжити певних дій. У його поточній формі ваше оточення не дозволить вам змінювати файл пристрою sepolicy
. Насправді цей файл неможливо легко замінити: він є частиною кореневого каталогу пристрою, а вміст кореневої каталоги під час завантаження витягується з файлу диска ОЗУ, який, в свою чергу, зберігається у завантажувальному зображенні пристрою.
Отже, ви все одно пропускаєте дві речі, перш ніж ваше середовище буде завершено:
- Спосіб доступу та зміни зображення завантажувального пристрою пристрою,
- Спосіб зміни свого
sepolicy
файлу.
На щастя, це саме тематика двох останніх розділів цієї публікації! :)
Отримання та оновлення завантажувального зображення пристрою
Інструменти для отримання та оновлення завантажувального зображення пристроїв можуть використовуватися для найрізноманітніших речей, крім підробки правил SELinux. Тому я створив спеціальну відповідь , будь ласка, зверніться до неї.
Змінення правил SELinux пристрою
Тут у вас є дві основні можливості:
- Створіть новий
sepolicy
файл із правил у своєму вихідному дереві (шукайте .te
файли, щоб знайти їх: find $ANDROID_BUILD_TOP -name \*.te
вони поширюються в декілька каталогів).
- Змініть
sepolicy
файл, який наразі використовується пристроєм.
Якщо вам справді не потрібно будувати свої правила з нуля, що є більшою задачею, що стосується розвитку, і, отже, поза рамками тут, другий вибір здається найбезпечнішим, оскільки ви впевнені, що єдиними змінами будуть саме ваші чітко зроблено.
Був проект, щоб створити інструмент, який дозволяє декомпілювати sepolicy
файл у рекомпіляційну форму, що дозволяє вільно редагувати правила між ними. Однак цей проект був залишений у стані підтвердження концепції. Ви знайдете всю інформацію в кінці цієї публікації в блозі , решта статті містить достатньо деталей, щоб будь-хто інший зацікавлений міг взяти на себе її участь.
Наразі рекомендований спосіб зміни sepolicy
правил - це інший шлях: шляхом прямого зміни sepolicy
бінарного файлу. інструмент sepolicy-injection дозволяє саме це і активно підтримується.
Для повноти зауважте, що виделка цього інструменту існує. Він додає кілька функцій, деякі з яких є у списку справ оригіналу автора (наприклад, можливість видалити правило), не запитуйте мене, чому вони вибрали форк, а не внести внесок ...
Для компіляції та встановлення sepolicy-inject
просто виконайте наступне:
cd ~/android/
git clone https://bitbucket.org/joshua_brindle/sepolicy-inject.git
cd ./sepolicy-inject/
LIBDIR=/usr/lib make
sudo cp ./sepolicy-inject /usr/bin/
Приклад використання
Скажімо, наприклад, ви хочете додати авторизацію, яка відповідає такому повідомленню про помилку:
avc: denied { read } for pid=128 comm="file-storage"
path="/data/media/0/path/to/some/file"
dev="mmcblk0p28" ino=811035 scontext=u:r:kernel:s0
tcontext=u:object_r:media_rw_data_file:s0 tclass=file permissive=0
Вам потрібно буде завантажити завантажувальний пристрій пристрою, а потім розпакуйте його, щоб отримати доступ до sepolicy
файлу.
Швидка перевірка за допомогою sesearch
показує, що дійсно немає правила дозволу (поки!):
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
$
Команда не має виходу.
Потім скористайтесь командою нижче, щоб додати потрібне правило (зверніть увагу на схожість параметрів sesearch
та sepolicy-inject
параметрів):
sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy
Тепер ми можемо передзвонити нашу sesearch
команду:
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
allow kernel media_rw_data_file:file read;
$
sesearch
Результат показує, що політика правильно оновлена.
Тепер ви можете перепакувати boot.img
файл пристрою та передати його назад на пристрій. Перевірка часу останньої модифікації /sepolicy
файлу - це простий спосіб переконатися, що ваш пристрій зараз працює із оновленим sepolicy
файлом.
Висновок
Тепер у вас має бути повноцінне середовище, яка дозволяє вам вільно перевіряти та змінювати політику пристроїв Android SELinux. Насолоджуйтесь! :)
В якості додаткової примітки також є інструменти, що дозволяють аналізувати та змінювати політику SELinux безпосередньо з пристрою .