Sprawdź zasady selinux dla Androida (v30)


12

Próbuję znaleźć, jakie zasady są faktycznie egzekwowane przez mój telefon za pomocą selinux. Można by pomyśleć, że to będzie łatwe. W końcu dla bezpieczeństwa dobrze jest sprawdzić, czy twoja polisa odpowiada oczekiwaniom. Niestety, okazało się to szokująco trudne, ponieważ A) Android wydaje się korzystać z rozwidlonej wersji polityki 30, a B) łańcuch narzędzi polityki wydaje się mieć bardzo niską jakość procesu kompilacji (wiele zakodowanych ścieżek itp. .).

Oto dwie rzeczy, które próbowałem, ale nie zadziałały. Jeśli spróbuję użyć gotowych narzędzi setools (takich jak pakiet dostarczany do fedory lub można go zainstalować z AUR przy pomocy arch linux), otrzymam następujące informacje (po pobraniu /sepolicyz katalogu głównego telefonu lub obrazu fabrycznego):

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

Okej, to sugeruje, że muszę zbudować wersję Androida bibliotek selinux. Drzewo źródeł AOSP zawiera wstępnie skompilowane wersje niektórych narzędzi, ale zależą one od starych bibliotek współdzielonych, których nie mam (takich jak libpcre3). W każdym razie, jest to dość szokujące, jeśli jedynym sposobem na sprawdzenie swojej polityki bezpieczeństwa jest zaufanie do binarnej biblioteki współdzielonej, którą dostajesz z sieci.

Oto co zrobiłem, aby zbudować biblioteki selinux dla Androida. Na łuku musiałem zainstalować ustr-selinuxz AUR, ponieważ ustr używa inlinetam, gdzie jest teraz wymagane static inline. W porządku, jak dotąd tak dobrze. Niestety proces kompilacji jest naprawdę obrzydliwy, ale udało mi się go skompilować i zainstalować z następującymi elementami:

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"

W tym momencie sedispoldziała zwykła polityka SElinux (jak wersja 29 policy.29z Fedory), ale nadal nie pokazuje mi, co się dzieje z Androidem:

$ ~/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
$ 

Próbowałem też skompilować setools3narzędzia waniliowe z bibliotekami Androida. Ponownie, nie jest to takie proste, ale udało mi się pracować z:

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

Nie buduje się to w pełni, ale buduje tyle drzewa źródłowego, że mogę wykonać secmds/sesearch. Ten rodzaj działa na policy.29pliku waniliowym (mogę wyszukiwać -Ai -T, ale --alldaje mi operation not supported). Jednak całkowicie nie udaje się z podobnym błędem podczas próby sprawdzenia pliku w wersji 30 dla Androida:

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

W tym momencie myślę trochę oszałamiająco, że oprzyrządowanie wokół czegoś tak krytycznego, jak polityka bezpieczeństwa systemu, jest naprawdę trudne do zbudowania. Z pewnością muszę robić coś złego. Czy komukolwiek udało się zbadać politykę bezpieczeństwa Androida bez polegania na zewnętrznych binarnych bibliotekach współdzielonych?

Powinienem dodać, że wypróbowałem również techniki sugerowane do przebudowy wszystkich gotowych narzędzi ( ndk/build/tools/download-toolchain-sources.shi ndk/build/tools/rebuild-all-prebuilt.sh). Jednak download-toolchain-sources.shskrypt jest obecnie zepsuty. Próbuje sprawdzić katalogi starej wersji, których już nie ma w repozytoriach, a mimo to nie wydaje się, aby pobierało żadnych narzędzi związanych z selinux, pomimo tego, że prebuilts/pythonzawiera kod związany z selinux. Ponownie jestem zszokowany tym, jak kruche są te systemy kompilacji i myślę, że musi być łatwiejszy sposób. Pytanie, w jaki sposób mogę uzyskać narzędzia, które pozwalają mi sprawdzić moją politykę Android selinux?

Odpowiedzi:


8

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.imgplików. Mówiąc inaczej, CyanogenMod zapewnia narzędzie, które pozwoli ci uzyskać dostęp do sepolicypliku 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-gettego wpisu, aby trzymać się najniższego wspólnego mianownika i zapewnić wszystkim zadowolenie, możesz raczej użyćaptitudezamiast 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). AFAIKaptitudepolecenie 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 "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

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_TOPprzechowuje twoją lokalizację źródłową (katalog, w którym wydałeś repo syncpolecenie). 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ż restorecondMakefile nie może zlokalizować niektórych bibliotek. Musisz edytować ten plik Makefile, aby używać ścieżek generowanych dynamicznie przez pkg-configzamiast 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=-fPICustawienia 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 cleani 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 *.oskompilowane 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 sesearchbinarne 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 libsepolwersji 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-declsz 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 *.hbraku pliku:

  1. 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 *.hnie znalezienia jakiegoś pliku, i tak, powinieneś zastosować to samo cykliczne podejście „spróbuj i zobacz”.

  2. 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 makena przykład), w przeciwnym razie może być konieczna modyfikacja samego pliku Makefile ( pkg-configpolecenie może być cenną pomocą w automatycznym generowaniu brakujących parametrów kompilacji) .

  3. Wyszukaj w systemie pakowania:

    apt-cache search filename-dev
    

    Gdzie filename-devreprezentuje nazwę brakującego pliku małymi literami z .hrozszerzeniem zastąpionym -devsufiksem (na przykład, jeśli Python.hnie zostanie znaleziony, wyszukaj python-dev). Konieczne może być poprawienie dokładnej nazwy, aby znaleźć odpowiednią paczkę.

  4. Jeśli utkniesz, a nawet szybkie wyszukiwanie w Internecie nie dało jednoznacznej odpowiedzi, to apt-filebędziesz najlepszym przyjacielem. apt-filenie jest instalowany domyślnie, musisz go zainstalować i wygenerować bazę danych:

    sudo apt-get apt-file
    sudo apt-file update
    

    apt-filepozwala na wyszukiwanie pakietów (nawet odinstalowanych) dostarczających określony plik. Aby uniknąć zbyt dużego wyniku, zalecamy skojarzenie go z grepponiższym opisem:

    apt-file search filename.h | grep -w filename.h
    

    Jeśli w repozytorium Ubuntu znajduje się pakiet zapewniający ten plik, apt-filepowinien on być w stanie go znaleźć.

    Po znalezieniu odpowiedniego pakietu, należy zainstalować go przy użyciu apt-get install packagenamegdzie packagenamejest 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 sepolicypliku 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 sepolicypliku.

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 sepolicyplik z reguł w drzewie źródłowym (wyszukaj .tepliki, aby je znaleźć: find $ANDROID_BUILD_TOP -name \*.tesą one podzielone na kilka katalogów).
  • Zmodyfikuj sepolicyplik 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ę sepolicypliku 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 sepolicyreguł jest inna droga: poprzez bezpośrednią modyfikację sepolicypliku 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 sepolicypliku.

Szybkie sprawdzenie za pomocą sesearchpokazuje, ż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 sesearchi sepolicy-inject):

sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy

Teraz możemy oddzwonić do naszego sesearchpolecenia:

$ 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.imgplik urządzenia i przywrócić go z powrotem do urządzenia. Sprawdzanie czasu ostatniej modyfikacji /sepolicypliku jest łatwym sposobem na upewnienie się, że na urządzeniu jest teraz uruchomiony nowo zaktualizowany sepolicyplik.

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 .


1
tylko jedna uwaga - nigdy nie rób „repo sync”, chyba że masz dużo kawy do picia;) Zamiast tego użyj „repo sync -q -f - force-sync -c” - zaoszczędziłoby to mnóstwo czasu i miejsca na dysku twardym . -q jest cichy, -f i --force-sync pomógłby ci postępować w przypadku tymczasowych błędów sieci, -c pobierałby tylko bieżącą gałąź. PS Używam także flag „-d --prune” podczas programowania, kiedy muszę w pełni usunąć wszelkie lokalne zmiany i przejść do wersji manifestu.
Oleksandr

@Oleksandr: Dziękujemy za informacje, warto wiedzieć. Testowałem z -cflagą, 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 -fflagi, ponieważ według mojego zrozumienia będzie to zmuszać repodo 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.
WhiteWinterWolf

2

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:

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

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:

$ 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

W przypadku narzędzi zawartych w dystrybucji selinux sztuczką jest zbudowanie ich przy użyciu tego samego DESTDIR:

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

Dzięki. To dało mi wersję sedispol, która wydaje się działać, ale nadal nie mogę skompilować wyszukiwania. Sesearch umiera, szukając pliku dołączania <apol/policy.h>(z innego policy.hpliku). Czy wiesz, który moduł zawiera apol?
user3188445

@ user3188445: Plik apol/policy.hjest dostarczany przez pakiet libapol-dev(przynajmniej ten jest w systemach Ubuntu). Proszę odnieść się do mojej odpowiedzi, aby uzyskać bardziej szczegółowe informacje.
WhiteWinterWolf

1

Do osób, które mają problem z:

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

podczas pracy z kodem AOSP.

Zakładając, że Twój kod AOSP został wypisany do katalogu ~ / android / source :

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

A teraz możesz swobodnie korzystać z dołączonego narzędzia audit2allow :

./external/selinux/prebuilts/bin/audit2allow

PS Chciałbym również odnieść się do komentarza Zbadaj zasady selinux dla Androida (v30)

Sesearch umiera, szukając pliku dołączanego (z innego pliku policy.h). Czy wiesz, który moduł zawiera apol?

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ć


1
Napotkałem również glibconfig.hbłąd, który łączysz na końcu swojego postu, został zgłoszony przez restorecondMakefile, 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.
WhiteWinterWolf


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.