Прежде всего, я должен признать, что полностью согласен с вашим утверждением «я нашел это поразительно трудным» . 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
По умолчанию ядро политики использует компиляцию, потому что 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
введите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
файла:
Поиск в external/
каталоге Android :
find $ANDROID_BUILD_TOP/external -name filename.h
Если вы найдете запрошенный файл, то это означает, что в исходный код Android включена определенная версия соответствующей библиотеки или инструмента. Поэтому вам не следует пытаться установить его из системы пакетов Ubuntu, а вместо этого скомпилировать и установить версию, связанную с исходным кодом Android.
Имейте в виду, что это противоречит общему совету, который вы можете найти на форумах: «Ваша компиляция не удалась из-за отсутствия этой библиотеки? Установите этот пакет, тогда все будет хорошо!» Делая это, вы, скорее всего, просто перейдете к худшей проблеме: если конкретная версия связана, это, скорее всего, потому, что нужна конкретная версия (из-за проблем совместимости или потому что эта версия содержит определенные изменения от Google).
Кстати, если вам интересно: конечно, у этой библиотеки или инструмента также могут быть зависимости, приводящие к ошибкам из-за того, что какой-то *.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
файл устройства . Фактически этот файл нельзя легко заменить: он является частью корневого каталога устройства, и содержимое корневого каталога извлекается во время загрузки из файла 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 непосредственно с устройства .