Изучите политику Android (v30) selinux

12

Я пытаюсь выяснить, какая политика на самом деле применяется моим телефоном с использованием selinux. Вы думаете, это будет легко. В конце концов, для безопасности хорошо убедиться, что ваша политика соответствует ожиданиям. К сожалению, я нашел это невероятно трудным для выполнения, потому что A) android, кажется, использует раздвоенную политику версии 30, и B) набор инструментов политики, кажется, имеет очень низкое качество процесса сборки (много жестко заданных путей и т. Д.). .).

Вот две вещи, которые я пробовал, которые не сработали. Если я пытаюсь использовать готовые инструменты 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 для Android. Дерево исходного кода 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инструменты vanilla для библиотек 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?

user3188445
источник

Ответы:

8

Прежде всего, я должен признать, что полностью согласен с вашим утверждением «я нашел это поразительно трудным» . Google разработал Android в основном для потребителей, а не для опытных пользователей. В результате, как только вы захотите сделать что-то вне использования новейшего приложения Facebook или поиграть с Candy Crush, вы очень быстро окажетесь в царстве Linux начала 2000 года, когда для изменения потребовалось знание, похожее на разработчика какие должны быть простые настройки. Я верю, что ситуация будет быстро развиваться по мере того, как система Android станет более зрелой, но сейчас мы должны делать то, что получили ...

Как вы сказали, есть две причины, по которым необходимо скомпилировать свой собственный набор инструментов SELinux:

  • Предоставленный системой набор инструментов обычно является версией. В то время как Android SELinux опирается на политику БД версии 30, современные Linux-боксы обычно обрабатывают только версию до 29.
  • Даже если бы это было более недавно, это не помогло бы, фактически сборка SELinux из вышестоящего кода (что легко делается, по крайней мере на машинах Fedora, следуя рекомендациям вышестоящего) эффективно позволяет системе обрабатывать версию 30 БД политики, однако SELinux для Android был сильно изменено ( документация Google выделяет несколько модификаций), поэтому попытка обработать SELinux в Android не удалась из-за синтаксиса и ошибок синтаксического анализа.

Итак, чтобы продолжить аналитический квест Android по SELinux, нам придется положить руки в грязь ... самым чистым способом:

  • Сначала мы настроим нормальную среду,
  • Как только это будет сделано, мы скомпилируем Android-библиотеки SELinux и первые инструменты,
  • Помимо них мы будем строить инструменты SELinux,
  • Мы закончим, добавив несколько дополнительных утилит.

Настройте правильную среду

Свойства окружающей среды

Самый чистый рекомендуемый, возможно, возможно, только надежный способ работы - это выделить среду для работы Android:

  • Виртуальная машина прекрасно (если не лучший вариант). Предпочитайте использовать VMware один, так как вам придется подключить телефон через USB к гостевой системе. Похоже, бесплатная альтернатива Qemu не очень хорошо справляется с такой задачей. Я не пробовал с другими программами виртуализации.

  • Это должна быть 64-битная система, иначе код просто не будет компилироваться из-за неправильного размера целых чисел.

  • Он настоятельно рекомендуется, возможно , обязательно, чтобы использовать систему Ubuntu. Вместо этого не стесняйтесь использовать Xubuntu, если вы предпочитаете более легкую рабочую среду XFCE, это не изменит ядро ​​системы и доступный пакет и не повлияет на работу, связанную с Android (все, что я скажу об Ubuntu в этой процедуре, также применимо к Xubuntu). В дереве исходных кодов SELinux для Android вы можете найти некоторые файлы ReadMe, в которых рекомендуется использовать Fedora. Эти файлы унаследованы от проекта SELinux вышестоящего АНБ, и их содержание не обязательно соответствует 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 традиционным способом, начав с полноценного live-DVD, но более быстрой альтернативой является установка по сети (загрузка по текстовому режиму) и выбор среды рабочего стола, которую вы предпочитаете в конце. Это позволит вам сэкономить время первоначального обновления, установив непосредственно обновленную версию пакетов, вместо того, чтобы сначала устанавливать устаревшие, а затем запросить 389 ожидающих обновлений при первой загрузке.

Установщик сетевой загрузки ISO для Ubuntu / Xubuntu 14.04 (тот же ISO) доступен здесь .

Чтобы пропустить неудобную функцию VMware «Простая установка», рекомендуется начать с выбора опции «Я установлю операционную систему позже» .

Обязательно выберите Linux , а затем Ubuntu 64 бит в качестве гостевой ОС.

ВМ потребуются следующие ресурсы:

  • Обязательно: дисковое пространство должно быть по крайней мере 40GB (по умолчанию 20 ГБ будет не достаточно, исходный код в одиночку занимает больше места , чем), рекомендуется выше. Полная сборка требует минимум 100 ГБ диска, это значение, которое я обычно принимаю. Не забывайте, что этот параметр является лишь максимальным пределом: фактический размер, принимаемый виртуальной машиной, динамически увеличивается с запросами гостя.
  • Факультативно: увеличить объем оперативной памяти с 1024 до 2048 или выше (зависит от емкости вашего хоста, я использую 4096),
  • Факультативно: Увеличьте количество ядер процессора с 1 до 2 или выше (зависит от емкости вашего хоста, я использую 3).
  • CD-Rom должен указывать на установочный файл ISO.
  • Возможно, вы захотите переключить USB со стандартного 1.1 на 2.0, так как первый может выдавать предупреждения при подключении вашего устройства. В зависимости от вашего использования вы также можете снять флажки «Автоматически подключать новые USB-устройства» и «Совместно использовать устройства Bluetooth с виртуальной машиной» .
  • В зависимости от вашей среды вам также может понадобиться настроить параметры экрана (отключить 3D, установить размер экрана).

Внимание:

  • Если вы выбрали установку сетевой загрузки, не забудьте выбрать среду рабочего стола ( рабочий стол 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вместо этого, так как он позаботится о зависимостях лучше (при удалении пакета, который требовал установки некоторых зависимостей). эти зависимости тоже будут удалены, оставляя вашу систему чище). AFAIKaptitudeкоманда должна быть установлена ​​в 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

Теперь у вас есть чистое и почти полное дерево исходных текстов. Запатентованные BLOB-объекты отсутствуют, но они вам не нужны для задач, связанных с 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

По умолчанию ядро ​​политики использует компиляцию, потому что restorecondMakefile не может найти некоторые библиотеки. Вы должны отредактировать этот 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введитеaи перезапустите сборку.

Скомпилируйте и установите инструменты 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, которую они использовали (к вашему сведению, 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).

    Кстати, если вам интересно: конечно, у этой библиотеки или инструмента также могут быть зависимости, приводящие к ошибкам из-за того, что какой-то *.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файл устройства . Фактически этот файл нельзя легко заменить: он является частью корневого каталога устройства, и содержимое корневого каталога извлекается во время загрузки из файла RAM-диска, который, в свою очередь, сохраняется в загрузочном образе устройства.

Таким образом, вы все еще упускаете две вещи, прежде чем ваша среда будет завершена:

  • Способ доступа и изменения загрузочного образа устройства,
  • Способ изменить свой sepolicyфайл.

К счастью, именно об этом и говорится в двух последних разделах этого поста! :)

Выбрать и обновить загрузочный образ устройства

Инструменты для извлечения и обновления загрузочного образа устройств могут использоваться для самых разных целей, кроме подделки правил SELinux. Поэтому я создал специальный ответ , пожалуйста, обратитесь к нему.

Изменить правила SELinux устройства

У вас есть две основные возможности здесь:

  • Создайте новый sepolicyфайл из правил в вашем исходном дереве (ищите .teфайлы, чтобы найти их: find $ANDROID_BUILD_TOP -name \*.teони распределены по нескольким каталогам).
  • Измените sepolicyфайл, используемый в настоящее время устройством.

Если вам действительно не нужно создавать свои правила с нуля, что является в большей степени связанной с развитием задачей и, следовательно, выходит за рамки этого, второй вариант кажется самым безопасным, поскольку вы уверены, что единственными изменениями будут те, которые ваши точно сделано.

Был проект по созданию инструмента, позволяющего декомпилировать sepolicyфайл в перекомпилируемую форму, позволяя свободно редактировать промежуточные правила. Однако этот проект был заброшен в состоянии проверки концепции. Вы найдете всю информацию в конце этого поста в блоге , остальная часть статьи содержит достаточно деталей, чтобы позволить кому-либо еще заинтересованным принять участие.

В настоящее время рекомендуемый способ изменения sepolicyправил идет другим путем: путем непосредственного изменения sepolicyдвоичного файла. Инструмент sepolicy-inject позволяет только это и активно поддерживается.

Для полноты заметим, что существует форк этого инструмента. Он добавляет несколько функций, некоторые из которых находятся в первоначальном списке дел автора (например, возможность удалить правило), не спрашивайте меня, почему они выбрали форк, а не внесли свой вклад ...

Чтобы скомпилировать и установить 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файл.

Вывод

Теперь у вас должна быть полная среда, позволяющая свободно проверять и изменять политики SELinux для устройств Android. Наслаждайтесь! :)

Как примечание, есть также инструменты, позволяющие анализировать и изменять политику SELinux непосредственно с устройства .

WhiteWinterWolf
источник
1
только одно примечание - никогда не делайте «repo sync», если у вас нет большого количества кофе для питья;) Вместо этого используйте «repo sync -q -f --force-sync -c» - это сэкономит вам массу времени и места на жестком диске , -q тихий, -f и --force-sync помогут вам продолжить работу в случае временных сетевых ошибок, -c выберет только текущую ветку. PS Я также использую флаги "-d --prune" во время разработки, когда мне нужно полностью стереть все локальные изменения и переключиться на версию манифеста.
Александр
@ Александр: Спасибо за вашу информацию, это полезно знать. Я проверил с -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-inject, связанного с системным libsepol, этот прекрасно работает с / 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
pizdelect
источник
Благодарю. Это дало мне версию sedispol, которая, кажется, работает, но я все еще не могу скомпилировать sesearch. Sesearch умирает в поисках включаемого файла <apol/policy.h>(из другого policy.hфайла). Вы знаете, какой модуль содержит apol?
user3188445
@ 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 Также хотелось бы обратиться к комментарию Examine android (v30) selinux policy

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 -dev

Но в конце я все еще не смог скомпилировать его из-за https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155 и не знаю, как его решить

Александр
источник
1
Я также столкнулся с этой glibconfig.hошибкой, которую вы связываете в конце вашего поста, она restorecondвозникла в Makefile, потому что в ней были жестко запрограммированы неправильные пути. Вы должны изменить его, чтобы он мог динамически разрешать пути, используя 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, чтобы обновить политику базы данных. Эти патчи уже объединены с основной веткой и доступны начиная с Android N.

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

Анатолий Шуба
источник