Przede wszystkim muszę przyznać, że w pełni zgadzam się z twoim stwierdzeniem „Uważam, że to szokująco trudne do zrobienia” . Google zaprojektował Androida głównie z perspektywy konsumenta, a nie dla zaawansowanych użytkowników. Powoduje to, że gdy tylko chcesz zrobić coś poza używaniem najnowszej aplikacji na Facebooku lub graniem w Candy Crush, bardzo szybko powracasz do świata Linuksa z początku 2000 roku, kiedy to do zmiany wymagała znajomości programisty jakie powinny być proste ustawienia. Wierzę, że sytuacja szybko się rozwinie, gdy system Android stanie się bardziej dojrzały, ale na razie mamy do czynienia z tym, co mamy ...
Jak powiedziałeś, istnieją dwa powody, dla których konieczne jest skompilowanie własnego zestawu narzędzi SELinux:
- Zestaw narzędzi dostarczonych przez system jest zwykle opóźniony. Podczas gdy SELinux Androida opiera się na politycznej wersji DB w wersji 30, obecne Linux-y zazwyczaj obsługują tylko wersje do 29.
- Nawet gdyby był nowszy, to nie pomogłoby, w rzeczywistości budowanie SELinuksa z kodu źródłowego (co jest łatwe, przynajmniej na komputerach Fedory zgodnie z zaleceniami wstępnymi) skutecznie pozwala systemowi obsługiwać politykę DB w wersji 30, jednak SELinux dla Androida mocno zmodyfikowany ( dokumentacja Google podkreśla kilka modyfikacji), więc próba obsługi SELinuksa Androida kończy się niepowodzeniem z powodu błędów składniowych i parsowania.
Aby więc kontynuować misję analizy SELinuksa na Androida, będziemy musieli położyć ręce na ziemi ... w najczystszy możliwy sposób:
- Najpierw skonfigurujemy zdrowe środowisko,
- Po wykonaniu tej czynności skompilujemy biblioteki SELinux dla systemu Android i pierwsze narzędzia,
- Na ich podstawie zbudujemy narzędzia SELinux,
- Na koniec dodamy kilka dodatkowych narzędzi.
Ustaw odpowiednie środowisko
Właściwości środowiska
Najczystszym zalecanym, być może tylko niezawodnie działającym sposobem jest poświęcenie środowiska pracy na Androida:
Maszyna wirtualna jest całkowicie w porządku (jeśli nie najlepsza opcja). Wolisz używać VMware, ponieważ będziesz musiał podłączyć telefon przez USB do systemu gościa. Darmowa alternatywa Qemu nie radzi sobie zbyt dobrze z takim zadaniem. Nie próbowałem z innym oprogramowaniem do wirtualizacji.
Musi to być system 64-bitowy, w przeciwnym razie kod po prostu nie zostanie skompilowany z powodu nieprawidłowego rozmiaru liczb całkowitych.
Jest mocno zalecane, ewentualnie obowiązkowe, aby korzystać z systemu Ubuntu. Zamiast tego możesz użyć Xubuntu, jeśli wolisz lżejsze środowisko pulpitu XFCE, nie zmienia to rdzenia i dostępnego pakietu systemu i nie będzie miało wpływu na pracę związaną z Androidem (cokolwiek powiem o Ubuntu w tej procedurze dotyczy również Xubuntu). W drzewie źródeł SELinuksa Androida możesz znaleźć niektóre pliki ReadMe, które zalecają użycie Fedory. Pliki te są dziedziczone z projektu SELinux NSA, a ich zawartość niekoniecznie musi być zgodna z Androidem Google.
Dokładna wersja Unbuntu do użycia zależy od wersji Androida, którą chcesz zbudować. W systemie Android 6.0 zalecany jest Ubuntu 14.04 (Trusty). Sprawdź stronę z wymaganiami Google , aby uzyskać więcej informacji.
Będziesz potrzebował dużo miejsca na dysku (co najmniej 50 GB, jeśli planujesz tylko dochodzenie związane z SELinux, co najmniej 100 GB, jeśli planujesz pełną wersję Androida). Procesor i pamięć są mniej istotne, wpływają jedynie na czas pełnej kompilacji i nie będą miały rzeczywistego wpływu na zadania związane z SELinux.
Korzystanie z Ubuntu ma dwie główne zalety:
Korzystając z zalecanego systemu, pracujesz w dobrze znanym i przetestowanym środowisku: biblioteki systemowe, narzędzia i pakiety są w wersji i lokalizacji oczekiwanej przez projekt.
A dokładniej w naszym obecnym przypadku: sam Ubuntu opiera się na AppArmor, który jest alternatywą dla SELinuksa, nie używa SELinuksa. Dobrą wiadomością jest to, że dzięki temu będziesz mógł instalować narzędzia SELinuksa i pliki binarne dla systemu Android bez ryzyka zmiany niezawodności systemu.
Procedura instalacji środowiska
Możesz zainstalować Ubuntu w tradycyjny sposób, zaczynając od pełnoprawnej płyty DVD na żywo, ale szybszą alternatywą jest użycie instalacji Netboot (instalacja w trybie tekstowym) i wybranie preferowanego środowiska pulpitu. Dzięki temu zaoszczędzisz czas pierwszej aktualizacji, bezpośrednio instalując aktualne wersje pakietów zamiast instalując przestarzałe, a następnie prosząc o zastosowanie 389 oczekujących aktualizacji przy pierwszym uruchomieniu.
ISO dla Ubuntu / Xubuntu 14.04 (ten sam ISO) instalator netboot jest dostępny tutaj .
Aby pominąć kłopotliwą funkcję łatwej instalacji VMware, warto zacząć od wybrania opcji „Zainstaluję system operacyjny później” .
Pamiętaj, aby wybrać Linux , a następnie Ubuntu 64 bity jako system operacyjny gościa.
Maszyna wirtualna będzie potrzebować następujących zasobów:
- Obowiązkowe: miejsce na dysku musi wynosić co najmniej 40 GB (domyślnie 20 GB nie wystarczy, sam kod źródłowy zajmuje więcej miejsca), zaleca się zwiększenie. Pełna wersja wymaga minimum 100 GB dysku, to wartość, którą zwykle przyjmuję. Nie zapominaj, że to ustawienie jest tylko maksymalnym limitem: rzeczywisty rozmiar przyjmowany przez maszynę wirtualną rośnie dynamicznie wraz z żądaniami gościa.
- Fakultatywnie: Zwiększ RAM z 1024 do co najmniej 2048 lub wyższej (zależy od pojemności twojego hosta, używam 4096),
- Fakultatywne: Zwiększ liczbę rdzeni procesora z 1 do 2 lub więcej (zależy od pojemności twojego hosta, używam 3).
- Płyta CD-ROM musi wskazywać na instalacyjny plik ISO.
- Możesz przełączyć USB z domyślnej wersji 1.1 na 2.0, ponieważ ta pierwsza może wyświetlać ostrzeżenia po podłączeniu urządzenia. W zależności od zastosowania możesz również bezpiecznie odznaczyć opcję „Automatycznie podłącz nowe urządzenia USB” i „Udostępnij urządzenia Bluetooth na maszynie wirtualnej” .
- W zależności od środowiska konieczne może być również dostosowanie ustawień wyświetlania (wyłączenie 3D, wymuszenie rozmiaru ekranu).
Uwaga:
- Jeśli wybrałeś instalację netboot, nie zapomnij wybrać środowiska pulpitu ( Ubuntu lub Xubuntu ) po przejściu do ekranu wyboru oprogramowania , w przeciwnym razie skończy się na minimalnym środowisku tekstowym!
- Przy pierwszym uruchomieniu odmów aktualizacji do najnowszej wersji: chodzi o to, aby zostać w 14.04!
Przy pierwszym uruchomieniu jednym z pierwszych, które możesz chcieć zrobić, jest zainstalowanie narzędzi gościa systemu Linux:
sudo apt-get install open-vm-tools
Ten pakiet uruchamia wyzwalacze czasu rozruchu, dlatego jego instalacja zostanie zakończona dopiero po ponownym uruchomieniu gościa.
Pobierz kod źródłowy Androida
Chociaż podobne, szczegóły procedury zależą od wybranej pamięci ROM:
- W przypadku CyanogenMod wyszukaj swoje urządzenie (najpierw wybierz dostawcę), a następnie kliknij link „Jak zbudować CyanogenMod”, aby uzyskać instrukcje dostosowane do urządzenia.
- W przypadku AOSP wykonaj procedurę, która zaczyna się tutaj .
Warto zauważyć, że CyanogeMod zawiera w swoim drzewie źródłowym narzędzie umożliwiające rozpakowywanie boot.img
plików. Mówiąc inaczej, CyanogenMod zapewnia narzędzie, które pozwoli ci uzyskać dostęp do sepolicy
pliku przechowywanego w urządzeniach i archiwach ROM. Google AOSP nie zapewnia takiego narzędzia, więc jeśli nie masz innej konieczności korzystania z drzewa źródłowego CyanogenMod, może być najwygodniejszym wyborem, w przeciwnym razie będziesz musiał go zainstalować (co jest szybkie i łatwe do zrobienia, więc nie martw się tutaj).
Tutaj śledzę procedurę CyanogenMod 13.0 (Android 6.0). Objaśnienie używanych poleceń jest dostępne na stronach, do których łącza znajdują się powyżej. Proszę je przeczytać, poniższy maszynopis podano jedynie w celach informacyjnych.
Wskazówka: chociaż używamapt-get
tego wpisu, aby trzymać się najniższego wspólnego mianownika i zapewnić wszystkim zadowolenie, możesz raczej użyćaptitude
zamiast tego, ponieważ lepiej zajmie się zależnościami (przy usuwaniu pakietu wymagającego instalacji niektórych zależności , te zależności również zostaną usunięte, pozostawiając system czystszy). AFAIKaptitude
polecenie musi być zainstalowane w Ubuntu, ale jest domyślnie dostępne na 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 "[email protected]
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
Teraz masz czyste i prawie pełne drzewo źródłowe. Brakuje zastrzeżonych obiektów blob, ale nie są one potrzebne do zadań związanych z SELinux.
Wskazówka: Pobieranie źródeł jest żmudnym procesem, warto teraz zrobić migawkę lub kopię zapasową maszyny wirtualnej.
Skompiluj i zainstaluj zestaw narzędzi i bibliotek SELinux dla systemu Android
Teraz zaczyna się zabawna część podróży;)!
Do tej pory procedura powinna być dość prosta. Celem było przede wszystkim zapewnienie, że masz takie samo środowisko jak ja. Jeśli to zrobisz, kontynuacja również powinna pozostać prosta.
Pod maską Google nie waha się zastosować głębokich zmian w kodzie źródłowym Androida między wersjami, dlatego dokładne kroki kompilacji będą z pewnością zależne od wersji (na przykład AOSP master pokazuje, że sepolicy/
katalog zostanie przeniesiony ).
Najpierw podzielę się swoją dokładną procedurą kompilacji i instalacji bibliotek i zestawu narzędzi systemu Android SElinux, ale w celu zachowania aktualności tego postu dodam kilka uwag na temat ogólnego podejścia, które należy zastosować w celu rozwiązania większości problemów z kompilacją.
Procedura krok po kroku
Biblioteki SELinuksa w systemie Android zapewniają warstwę abstrakcji, która pozwoli oprogramowaniu wyższej warstwy radzić sobie z specyficznymi dla Androida plikami zasad SELinuksa. Dlatego najpierw musimy je skompletować i zainstalować (co samo w sobie stanowi rdzeń, jeśli trudności tutaj, dopóki nie znajdziesz swojej drogi).
Będziemy wtedy mogli zbudować i zainstalować narzędzia SELinux. Jak zobaczymy, na szczęście nie muszą one być specyficzne dla Androida, muszą tylko pasować do wersji biblioteki SELinux.
Ta procedura została przetestowana zarówno przy użyciu drzew kodów źródłowych CyanogenMod, jak i AOSP.
Skompiluj i zainstaluj biblioteki SELinux dla Androida i pierwsze narzędzia
Zależności od pierwszej instalacji:
sudo apt-get install libapol-dev libaudit-dev libdbus-glib-1-dev libgtk2.0-dev \
libustr-dev python-dev python-networkx swig xmlto
W tym poście zmienna $ANDROID_BUILD_TOP
przechowuje twoją lokalizację źródłową (katalog, w którym wydałeś repo sync
polecenie). Możesz dowolnie zmieniać jego nazwę.
ANDROID_BUILD_TOP=~/android/system
cd $ANDROID_BUILD_TOP
source ./build/envsetup.sh
Domyślnie kompilacja podstawowych narzędzi narzędzi kończy się niepowodzeniem, ponieważ restorecond
Makefile nie może zlokalizować niektórych bibliotek. Musisz edytować ten plik Makefile, aby używać ścieżek generowanych dynamicznie przez pkg-config
zamiast zakodowanych na stałe (nie mylić odwrotności z pojedynczymi cudzysłowami!):
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
Otwórz plik Makefile za pomocą edytora tekstu, aby upewnić się, że modyfikacja została poprawnie uwzględniona.
A teraz skompiluj i zainstaluj:
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/
Uwaga: Nie przegapEMFLAGS=-fPIC
ustawienia zmiennej środowiskowej podczas budowanialibselinux
. Nie wygeneruje jeszcze żadnego błędu, ale w następnym kroku nie będzie można zbudować SETools. W przypadku, gdy coś przeoczyłeś lub zrobiłeś coś innego, po prostu wydajmake clean
i ponownie uruchom kompilację.
Skompiluj i zainstaluj narzędzia SELinux
Narzędzia SELinux są dostarczane w postaci gotowej do użycia, która obejmuje:
- Skrypty w języku Python (i ich opakowania skryptów powłoki) w
$ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/
katalogu
- Pakiety Python (w tym
*.o
skompilowane pliki) poniżej $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/
.
Spodziewałbym się, że kod źródłowy tych narzędzi będzie dostępny poniżej $ANDROID_BUILD_TOP/external
, ale tak nie jest. Właściwie nie znalazłem żadnego miejsca, w którym Google udostępniłoby dokładną wersję SEToolów, z których korzystali (FYI GPL upoważnia tylko do udostępnienia kodu, jeśli został zmodyfikowany), więc będziemy musieli zgadywać i starać się jak najlepiej .
Same narzędzia to skrypty Pythona, to nowa ewolucja od SETools 4 (w SETools 3 polecenia takie jak sesearch
binarne pliki wykonywalne kodowane w C). Jednak same narzędzia nadal pokazują wersję 3.3.8:
$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8
Domyślam się, że Google wykonał migawkę wczesnego programowania z SETools 4. Do wersji 4.0.0 SETools polegał na libsepol
wersji 2.4, w wersji 4.0.0 zaczęli polegać na wersji 2.5 biblioteki, która nie jest kompatybilna z wersją SELinux w pakiecie z Androidem 6.0 (możesz spróbować to skompilować, to po prostu się nie powiedzie).
Tak więc najmądrzejszy wybór wydaje się w przypadku wersji SETools 4.0.0 Beta.
Zainstaluj dodatkowe zależności:
sudo apt-get install python-setuptools
Pobierz i rozpakuj kod źródłowy:
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/
Ze względu na błąd wpływający na Flex 2.5 musimy usunąć -Wredundant-decls
z flag kompilatora:
sed -i '/-Wredundant-decls/d' ./setup.py
Na koniec skompiluj i zainstaluj:
python ./setup.py build
sudo python ./setup.py install
Ogólna procedura (lub „Jak się odblokować”)
Jeśli powyższa procedura nie zadziałała w twoim przypadku, oto widok wyższego poziomu na temat tego, jak spróbować postępować.
Niestety nie ma tu magii (i pomocnika :(): jedynym sposobem na skompilowanie tego kodu jest klasyczne, ale budzące grozę cykliczne podejście typu „spróbuj i zobacz”.
Spróbuj skompilować za pierwszym razem, najprawdopodobniej zakończy się niepowodzeniem z powodu *.h
braku pliku:
Szukaj w external/
katalogu Androida :
find $ANDROID_BUILD_TOP/external -name filename.h
Jeśli znajdziesz żądany plik, oznacza to, że konkretna wersja odpowiedniej biblioteki lub narzędzia została dołączona do kodu źródłowego Androida. Dlatego nie powinieneś próbować instalować go z systemu pakietów Ubuntu, ale zamiast tego skompiluj i zainstaluj wersję zawartą w kodzie źródłowym Androida.
Należy pamiętać, że jest to sprzeczne z ogólną radą, którą można znaleźć na forach: „Kompilacja kończy się niepowodzeniem z powodu braku tej biblioteki? Zainstaluj ten pakiet, a potem będzie dobrze!” , robiąc to, najprawdopodobniej wpadniesz w gorszy problem: jeśli konkretna wersja jest w pakiecie, najprawdopodobniej dlatego, że potrzebna jest konkretna wersja (z powodu problemów ze zgodnością lub ponieważ ta wersja zawiera określone zmiany od Google).
BTW, jeśli zastanawiasz się: oczywiście w tej bibliotece lub narzędziu mogą również występować błędy powodujące błędy z powodu *.h
nie znalezienia jakiegoś pliku, i tak, powinieneś zastosować to samo cykliczne podejście „spróbuj i zobacz”.
Szukaj w całym systemie:
find / -name filename.h 2>/dev/null
Jeśli okaże się, że „brakuje” pliku, który jest już obecny w systemie w jakiejś standardowej lokalizacji biblioteki współużytkowanej, oznacza to, że ta zależność prawdopodobnie jest już spełniona w twoim środowisku, ale Makefile, który zgłosił błąd, jest zbyt głupi, aby go znaleźć.
Jeśli ręcznie wywołasz bezpośrednio ten plik Makefile, może być możliwe ustawienie pewnej zmiennej środowiskowej, która to naprawi ( LIBDIR=/usr/lib make
na przykład), w przeciwnym razie może być konieczna modyfikacja samego pliku Makefile ( pkg-config
polecenie może być cenną pomocą w automatycznym generowaniu brakujących parametrów kompilacji) .
Wyszukaj w systemie pakowania:
apt-cache search filename-dev
Gdzie filename-dev
reprezentuje nazwę brakującego pliku małymi literami z .h
rozszerzeniem zastąpionym -dev
sufiksem (na przykład, jeśli Python.h
nie zostanie znaleziony, wyszukaj python-dev
). Konieczne może być poprawienie dokładnej nazwy, aby znaleźć odpowiednią paczkę.
Jeśli utkniesz, a nawet szybkie wyszukiwanie w Internecie nie dało jednoznacznej odpowiedzi, to apt-file
będziesz najlepszym przyjacielem. apt-file
nie jest instalowany domyślnie, musisz go zainstalować i wygenerować bazę danych:
sudo apt-get apt-file
sudo apt-file update
apt-file
pozwala na wyszukiwanie pakietów (nawet odinstalowanych) dostarczających określony plik. Aby uniknąć zbyt dużego wyniku, zalecamy skojarzenie go z grep
poniższym opisem:
apt-file search filename.h | grep -w filename.h
Jeśli w repozytorium Ubuntu znajduje się pakiet zapewniający ten plik, apt-file
powinien on być w stanie go znaleźć.
Po znalezieniu odpowiedniego pakietu, należy zainstalować go przy użyciu apt-get install packagename
gdzie packagename
jest nazwa Twojego pakietu.
Wskazówka: Jeśli coś wkręca w systemie, polecenie, aby ponownie zainstalować pakiet jest taki:apt-get reinstall pkg_name
. Działa nawet wtedy, gdy klasyczne usunięcie i instalacja nie byłoby możliwe z powodu przełamania zależności (co jest najprawdopodobniej w przypadku bibliotek systemu).
Narzędzia dodatkowe
Na tym etapie powinieneś mieć czyste środowisko umożliwiające badanie reguł SELinuksa w Androidzie zarówno w formacie skompilowanym, jak i źródłowym.
Jednak istnieje duże prawdopodobieństwo, że pod koniec dochodzenia będziesz chciał podjąć pewne działania. W obecnym kształcie środowisko nie zezwala na modyfikowanie sepolicy
pliku urządzenia . W rzeczywistości tego pliku nie można łatwo zastąpić: jest on częścią katalogu głównego urządzenia, a zawartość katalogu głównego to ekstraktor w czasie uruchamiania z pliku dysku RAM, który z kolei jest przechowywany w obrazie rozruchowym urządzenia.
Więc nadal brakuje Ci dwóch rzeczy, zanim środowisko zostanie ukończone:
- Sposób na dostęp i modyfikację obrazu rozruchowego urządzenia,
- Sposób na zmodyfikowanie
sepolicy
pliku.
Na szczęście są to dokładnie dwa ostatnie rozdziały tego postu! :)
Pobierz i zaktualizuj obraz rozruchowy urządzenia
Narzędzia do pobierania i aktualizacji obrazu rozruchowego urządzeń mogą być używane do wielu różnych rzeczy oprócz manipulacji regułami SELinux. Dlatego stworzyłem dedykowaną odpowiedź , proszę odnieść się do niej.
Zmodyfikuj reguły SELinux w urządzeniu
Masz tutaj dwie główne możliwości:
- Zbuduj nowy
sepolicy
plik z reguł w drzewie źródłowym (wyszukaj .te
pliki, aby je znaleźć: find $ANDROID_BUILD_TOP -name \*.te
są one podzielone na kilka katalogów).
- Zmodyfikuj
sepolicy
plik aktualnie używany przez urządzenie.
O ile naprawdę nie musisz budować reguł od zera, co jest bardziej zadaniem związanym z programowaniem, a zatem poza tym zakresem, drugi wybór wydaje się zdecydowanie najbezpieczniejszy, ponieważ masz pewność, że jedynymi zmianami będą te, które Twoje wyraźnie wykonane.
Pojawił się projekt stworzenia narzędzia pozwalającego na dekompilację sepolicy
pliku do postaci umożliwiającej ponowną kompilację, umożliwiając dowolną edycję reguł pomiędzy nimi. Jednak projekt ten został porzucony w stanie potwierdzenia koncepcji. Wszystkie informacje znajdziesz na końcu tego postu na blogu , reszta artykułu zawiera wystarczającą liczbę szczegółów, aby umożliwić wszystkim zainteresowanym przejęcie.
Aktualnie zalecanym sposobem zmiany sepolicy
reguł jest inna droga: poprzez bezpośrednią modyfikację sepolicy
pliku binarnego. Narzędzie sepolicy-inject pozwala na to i jest aktywnie utrzymywane.
Ze względu na kompletność należy pamiętać, że istnieje rozwidlenie tego narzędzia. Dodaje kilka funkcji, niektóre z nich znajdują się na liście rzeczy do zrobienia oryginalnego autora (np. Możliwość usunięcia reguły), nie pytaj mnie, dlaczego zdecydowali się na rozwidlenie zamiast przyczynić się ...
Aby skompilować i zainstalować sepolicy-inject
, wykonaj następujące czynności:
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/
Przykład zastosowania
Załóżmy na przykład, że chcesz dodać autoryzację pasującą do następującego komunikatu o błędzie:
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
Musisz pobrać obraz rozruchowy urządzenia, a następnie rozpakować go, aby uzyskać dostęp do jego sepolicy
pliku.
Szybkie sprawdzenie za pomocą sesearch
pokazuje, że rzeczywiście nie ma jeszcze reguły zezwolenia (jeszcze!):
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
$
Polecenie nie ma danych wyjściowych.
Następnie użyj poniższego polecenia, aby dodać wymaganą regułę (zwróć uwagę na podobieństwo między parametrami sesearch
i sepolicy-inject
):
sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy
Teraz możemy oddzwonić do naszego sesearch
polecenia:
$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
allow kernel media_rw_data_file:file read;
$
sesearch
Dane wyjściowe pokazują, że zasady zostały poprawnie zaktualizowane.
Możesz teraz ponownie spakować boot.img
plik urządzenia i przywrócić go z powrotem do urządzenia. Sprawdzanie czasu ostatniej modyfikacji /sepolicy
pliku jest łatwym sposobem na upewnienie się, że na urządzeniu jest teraz uruchomiony nowo zaktualizowany sepolicy
plik.
Wniosek
Powinieneś teraz mieć kompletne środowisko umożliwiające swobodne sprawdzanie i modyfikowanie zasad SELinuksa na urządzeniach z Androidem. Cieszyć się! :)
Na marginesie, istnieją również narzędzia pozwalające analizować i modyfikować politykę SELinux bezpośrednio z urządzenia .
-c
flagą, ale nie zauważyłem żadnej dużej różnicy: wciąż tyle danych do pobrania dla komputera (25 GB), wciąż tyle kofeiny do picia;). Jestem trochę nieufny w stosunku do-f
flagi, ponieważ według mojego zrozumienia będzie to zmuszaćrepo
do zignorowania, gdy nie uda się pobrać części kodu źródłowego i nadal będzie uważać końcowy wynik za sukces. Wolę rezerwować stan „sukces” na pełne pobieranie i unikam sytuacji, w której losowo brakuje plików.Powinieneś najpierw zbudować starszą wersję libsepol z kodu AOSP (jak ten odpowiadający wersji 6.0), a następnie połączyć z nim link sepolicy-inject, dispol itp. Ten przepis zadziałał dla mnie w debian jessie:
w przeciwieństwie do sepolicy-inject połączonego z libsepolem systemu, ten działa dobrze z / sepolicy z obrazu 6.0 zawartego w sdk Androida:
W przypadku narzędzi zawartych w dystrybucji selinux sztuczką jest zbudowanie ich przy użyciu tego samego DESTDIR:
źródło
<apol/policy.h>
(z innegopolicy.h
pliku). Czy wiesz, który moduł zawieraapol
?apol/policy.h
jest dostarczany przez pakietlibapol-dev
(przynajmniej ten jest w systemach Ubuntu). Proszę odnieść się do mojej odpowiedzi, aby uzyskać bardziej szczegółowe informacje.Do osób, które mają problem z:
podczas pracy z kodem AOSP.
Zakładając, że Twój kod AOSP został wypisany do katalogu ~ / android / source :
A teraz możesz swobodnie korzystać z dołączonego narzędzia audit2allow :
PS Chciałbym również odnieść się do komentarza Zbadaj zasady selinux dla Androida (v30)
Budowanie zestawu narzędzi selinux ze źródeł https://github.com/SELinuxProject/selinux nie jest bardzo trywialne (chyba że używasz Fedory). Na Ubuntu musisz zainstalować (zakładając, że już zainstalowałeś podstawowe narzędzia programistyczne, takie jak Bison i kompilator C) libglib2.0-dev, libcap-ng-dev, xmlto, libsemanage1-dev, libustr-dev, libaudit-dev, libsepol1 -dev
Ale na koniec nadal nie udało mi się go skompilować z powodu https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155 i nie mam pojęcia, jak to rozwiązać
źródło
glibconfig.h
błąd, który łączysz na końcu swojego postu, został zgłoszony przezrestorecond
Makefile, ponieważ źle wpisano w nim ścieżki. Musisz go zmodyfikować, aby dynamicznie rozpoznawał ścieżki za pomocąpkg-config
. Zobacz moją odpowiedź, aby uzyskać więcej informacji.Powinieneś spróbować zastosować tę łatkę do źródeł libsepol, a następnie stopniowo odbudowywać wszystkie te rzeczy. To zadziałało dla mnie w numerze sam
Możesz spróbować użyć klonu libsepol z zastosowaną łatką z tego repozytorium https: //[email protected]/metizik/selinux_tools.git Używam go do budowania dispola pod Windows i działa mi dobrze (wciąż zauważam, że jestem używając do tego cygwina)
źródło
audit2allow, audit2why i sesearch są zepsute dzięki aktualizacji AOSP upstream do wersji 30.
Musisz zastosować łaty poniżej i odbudować drzewo Androida, aby zaktualizować db zasad. Łatki te zostały już scalone z gałęzią master i dostępne począwszy od Androida N.
https://android-review.googlesource.com/187140 https://android-review.googlesource.com/187111
źródło