Вивчіть політику Android (v30) для selinux


12

Я намагаюся знайти, яку політику насправді застосовує мій телефон за допомогою selinux. Ви думаєте, що це буде просто. Зрештою, для безпеки добре переконатися, що ваша політика відповідає очікуванням. На жаль, мені здається, що це приголомшливо важко зробити, оскільки на A) Android, здається, використовується роздвоєна політика версії 30, і В) схоже, що в ланцюжку інструментів політики є дуже низькоякісний процес збирання (багато твердо кодованих шляхів тощо) .).

Ось дві речі, які я спробував, які не спрацювали. Якщо я спробую скористатись позаштатними інструментами setools (такими як пачка для Fedora, або їх можна встановити з AUR з arch linux), то я отримаю наступне (після витягування /sepolicyз кореневого каталогу телефону або заводського зображення):

$ sedispol sepolicy 
Reading policy...
libsepol.policydb_read: policydb version 30 does not match my version range 15-29
sedispol:  error(s) encountered while parsing configuration
$ sesearch --all sepolicy 
ERROR: policydb version 30 does not match my version range 15-29
ERROR: Unable to open policy sepolicy.
ERROR: Success
$

Гаразд, так що говорить про те, що я повинен будувати версію Android для бібліотек selinux. Дерево джерела AOSP поставляється з попередньо складеними версіями деяких інструментів, але вони залежать від старих спільних бібліотек, яких у мене немає (наприклад, libpcre3). У будь-якому випадку, це досить шокує, якщо єдиний спосіб перевірити політику безпеки - це довіряти якійсь бінарній спільній бібліотеці, яку ви вийдете з мережі.

Отже, ось що я зробив для створення бібліотек android selinux. На арку мені довелося встановити ustr-selinuxз AUR, тому що ustr використовує inlineтам, де зараз це потрібно використовувати static inline. Гаразд, поки що добре. На жаль, процес збірки є дійсно грубим, але мені вдалося отримати достатньо його складеного та встановленого за допомогою наступного:

git clone https://android.googlesource.com/platform/external/selinux \
    android/external/selinux
export ANDROID_BUILD_TOP=$PWD/android
DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
cd android/external/selinux
sed -ie '/^LDLIBS.*(LIBDIR)/s/$/ ..\/lex.yy.o/' checkpolicy/test/Makefile
make install DESTDIR="$DESTDIR" \
     PREFIX='$(DESTDIR)/usr' \
     CFLAGS='-I$(PREFIX)/include' \
     -j20 -k
cp checkpolicy/test/dispol "$DESTDIR/usr/sbin/sedispol"
cp checkpolicy/test/dismod "$DESTDIR/usr/sbin/sedismod"

На даний момент sedispolпрацює звичайна політика SElinux (на зразок версії 29 policy.29від Fedora), але все одно не покаже мені, що відбувається з android:

$ ~/android_selinux/usr/sbin/sedispol sepolicy 
Reading policy...
libsepol.avtab_read_item: more than one specifier
libsepol.avtab_read: failed on entry 457 of 5582
/home/user/android_selinux/usr/sbin/dispol:  error(s) encountered while parsing configuration
$ 

Я також спробував скласти setools3інструменти ванілі проти бібліотек Android. Знову ж таки, не так просто, але я з цим працював:

DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
git clone https://github.com/TresysTechnology/setools3.git
cd setools3
./configure --prefix=$DESTDIR/usr --with-sepol-devel=$DESTDIR/usr CPPFLAGS="-I$DESTDIR/usr/include -L$DESTDIR/usr/lib"
make -k -j20

Це не повністю будується, але будує достатньо дерева-джерела, яке я можу виконати secmds/sesearch. Цей вид робіт на ванільний policy.29файл (я можу шукати -Aі -T, але --allдає мені operation not supported). Однак це повністю не вдається зі схожою помилкою при спробі вивчення файлу версії 30 для Android:

$ ./secmds/sesearch -A sepolicy 
ERROR: more than one specifier
ERROR: failed on entry 457 of 5582
ERROR: Unable to open policy sepolicy.
ERROR: Success
$ 

На даний момент мій погляд начебто хизується, що інструментарій навколо чогось такого критичного, як політику безпеки системи, справді такий важко побудувати. Звичайно, я повинен щось робити не так. Хтось насправді встиг перевірити політику безпеки Android, не покладаючись на бінарні спільні бібліотеки, що розподіляються зовні?

Слід додати, що я також спробував методи, запропоновані для відновлення всіх готових інструментів ( ndk/build/tools/download-toolchain-sources.shі ndk/build/tools/rebuild-all-prebuilt.sh). Однак download-toolchain-sources.shсценарій наразі зламаний. Він намагається перевірити каталоги старої версії, які вже не знаходяться у сховищах, і все одно не видається завантаження будь-яких інструментів, пов’язаних із selinux, незважаючи на той факт, що prebuilts/pythonмістить код, пов'язаний з selinux. Знову ж таки, я вражений тим, наскільки надійні ці системи побудови, і думаю, що повинен бути простіший спосіб. Питання, як я можу отримати інструменти, які дозволяють перевірити свою політику Android для selinux?

Відповіді:


8

Перш за все, я мушу визнати, що я повністю згоден з вашою заявою "Я вважаю це приголомшливо важким" . 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файл не знайдений:

  1. Шукати в external/каталозі Android :

    find $ANDROID_BUILD_TOP/external -name filename.h
    

    Якщо ви знайдете запитуваний файл, це означає, що певна версія відповідної бібліотеки чи інструменту була вбудована у вихідний код Android. Тому не слід намагатися встановлювати його з пакетної системи Ubuntu, а натомість компілювати та встановлювати версію, що входить у вихідний код Android.

    Майте на увазі, що це суперечить загальним порадам, які ви можете знайти на форумах: "Ваша компіляція не вдається через відсутність цієї бібліотеки? Встановіть цей пакет, тоді це буде добре!" , зробивши це, ви, швидше за все, просто ввійдете в гіршу проблему: якщо в комплекті є певна версія, це, швидше за все, потрібна певна версія (через проблеми сумісності або тому, що ця версія містить конкретні зміни від Google).

    BTW, якщо вам цікаво: звичайно, у цій бібліотеці чи інструменті можуть бути помилки, що викликають залежності, оскільки якийсь *.hфайл не знайдений, і так, ви повинні застосувати цей самий циклічний підхід "спробувати і побачити".

  2. Шукати в усьому світі:

    find / -name filename.h 2>/dev/null
    

    Якщо ви виявили, що файл "відсутній" вже присутній у вашій системі в якомусь стандартному розташуванні спільної бібліотеки, це означає, що ця залежність, ймовірно, вже зустрічається у вашому середовищі, але Makefile, який підняв помилку, занадто німий, щоб її знайти.

    Якщо ви вручну безпосередньо викликаєте цей Makefile, можливо, ви зможете встановити певну змінну середовища, що фіксує це ( LIBDIR=/usr/lib makeнаприклад), інакше вам може знадобитися змінити сам Makefile ( pkg-configкоманда може бути корисною допомогою для автоматичного генерування відсутніх параметрів збірки) .

  3. Пошук в системі упаковки:

    apt-cache search filename-dev
    

    Де filename-devпредставлено ім'я відсутнього файлу в малому регістрі з .hрозширенням, заміненим -devсуфіксом (наприклад, якщо Python.hйого не знайти, знайдіть python-dev). Для того, щоб знайти потрібний пакет, може знадобитися певна настройка точної назви.

  4. Якщо ви залишаєтеся застряглими і навіть швидкий пошук в Інтернеті не дав чіткої відповіді, то 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 безпосередньо з пристрою .


1
лише одна примітка - ніколи не робіть "репо синхронізацію", якщо ви не пиєте багато кави;) Замість цього використовуйте "repo sync -q -f --force-sync -c" - це заощадить ваші тони часу та місця на жорсткому диску . -q тихо, -f і --force-синхронізація допоможе вам продовжувати випадок у випадку тимчасових помилок мережі, -c отримає лише поточну гілку. PS Я також використовую прапорці "-d --prune" під час розробки, коли мені потрібно повністю стерти будь-які локальні зміни та перейти на маніфестну версію.
Олександр

@Oleksandr: Дякую за вашу інформацію, це корисно знати. Я тестував -cпрапор, але не помітив жодної великої різниці: все одно стільки даних для завантаження на комп’ютер (25 ГБ), ще стільки ж кофеїну, що мені потрібно випити;). Я трохи насторожено ставляться до цього -fпрапора, оскільки, наскільки я розумію, це змусить repoігнорувати, коли не вдалося завантажити частину вихідного коду і все ще вважати кінцевий результат успішним. Я вважаю за краще зарезервувати стан "успіху" для повного вибору і уникаю потрапляння в невідому ситуацію, коли файли можуть випадково відсутні.
WhiteWinterWolf

2

Спершу слід створити старішу версію libsepol з коду AOSP (наприклад, тієї, що відповідає версії 6.0), а потім пов’язати проти неї sepolicy-inject, dispol тощо. Цей рецепт працював для мене на debian jessie:

cd /to/the/aosp/dir 
[repo init, etc]
repo sync external/selinux
cd external/selinux
git checkout android-6.0.0_r1^
cd libsepol
make
libsepol=`pwd`
cd /to/the/selinux-inject-source-dir
make LIBDIR=$libsepol

На відміну від sepolicy-injection, пов'язаного з лібсеполем системи, цей відмінно працює з / sepolicy з зображення 6.0, включеного в android sdk:

$ sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_read: policydb version 30 does not match my version range 15-29
error(s) encountered while parsing configuration
Could not load policy
$ ./sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_index_others: security:  1 users, 2 roles, 525 types, 0 bools
libsepol.policydb_index_others: security: 1 sens, 1024 cats
libsepol.policydb_index_others: security:  87 classes, 4767 rules, 0 cond rules

Для інструментів, що входять до дистрибутива selinux, хитрість полягає в тому, щоб створити їх з тим же DESTDIR:

cd libsepol
make DESTDIR=/some/dir install
cd ../checkpolicy
make DESTDIR=/some/dir
# here you have a working 'dispol' in the 'test' subdir

Дякую. Це дало мені версію седісполу, яка, здається, працює, але я все ще не можу скласти пошук. Sesearch помирає, шукаючи файл включення <apol/policy.h>(з іншого policy.hфайлу). Чи знаєте ви, який модуль містить apol?
користувач3188445

@ user3188445: Файл apol/policy.hнадається пакетом libapol-dev(принаймні, цей він є в системах Ubuntu). Будь ласка, зверніться до моєї відповіді для отримання більш детальної інформації.
WhiteWinterWolf

1

Для людей, які стикаються з проблемою:

policydb version 30 does not match my version range 15-29

під час роботи з кодом AOSP.

Припустимо, ваш код AOSP перевіряється на ~ / android / source dir:

cd ~/android/source
source build/envsetup.sh
export ANDROID_BUILD_TOP=$(pwd)

А тепер ви можете використовувати пакетну утиліту audit2allow :

./external/selinux/prebuilts/bin/audit2allow

PS Також я хотів би звернутись до коментаря Політика щодо вивчення seroid для android (v30)

Sesearch помирає, шукаючи файл включення (з іншого файлу policy.h). Чи знаєте ви, який модуль містить apol?

Створення selinux інструментарію з джерел https://github.com/SELinuxProject/selinux не дуже тривіально (якщо ви не використовуєте Fedora). На Ubuntu вам потрібно встановити (припускаючи, що ви вже встановили основні інструменти розробників, такі як bison та компілятор C) libglib2.0-dev, libcap-ng-dev, xmlto, libsemanage1-dev, libustr-dev, libaudit-dev, libsepol1 -дев

Але наприкінці я все-таки не зміг її скласти через https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155 і не маю уявлення, як її вирішити.


1
Я також зіткнувся з цією glibconfig.hпомилкою, з якою ви посилаєтеся в кінці своєї публікації, її було піднято за допомогою restorecondMakefilefile, тому що в ній важко закодовані неправильні шляхи. Ви повинні змінити його, щоб дозволити динамічно вирішувати шляхи з використанням pkg-config. Дивіться мою відповідь для отримання більш детальної інформації.
WhiteWinterWolf

1

Спробуйте застосувати цей патч до джерел libsepol, а потім поступово відновити всі ці речі. Це працювало для мене у випуску «Сем»

Ви можете спробувати скористатися клоном libsepol із застосованим патчем з цього репорта https: //metizik@bitbucket.org/metizik/selinux_tools.git Я використовую його для створення dispol під Windows, і він працює добре для мене (все ж зауважте, що я використовуючи cygwin для цього)


0

audit2allow, audit2why та sesearch усі порушуються політикою оновлення AOSP вгору за течією до v.30.

Вам потрібно застосувати виправлення нижче та відновити дерево Android для оновлення db політики. Ці патчі вже об'єднані в головну галузь і доступні, починаючи з Android N.

https://android-review.googlesource.com/187140 https://android-review.googlesource.com/187111

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.