Android (V30) Selinux Politikasını İnceleyin


13

Selinux kullanarak telefonum tarafından gerçekte hangi politikanın uygulandığını bulmaya çalışıyorum. Bunun kolay olacağını düşünürdün. Sonuçta, güvenlik için politikanızın beklentilere uygun olduğunu doğrulamak iyidir. Ne yazık ki, bunu şok edici bir şekilde zor buldum, çünkü A) android çatallı bir politika sürümü 30 kullanıyor ve B) politika araç zinciri çok düşük kaliteli bir oluşturma sürecine sahip görünüyor (çok sayıda kodlanmış yol vb. .).

İşte denediğim iki şey işe yaramadı. Hazır setools araçlarını (fedora için paketlenmiş olarak gelebilir veya arch linux ile AUR'dan yüklenebilir) kullanmaya çalışırsam, aşağıdakileri elde ederim ( /sepolicytelefonun kök dizininden veya fabrika resminden çekildikten sonra ):

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

Tamam, bu selinux kütüphanelerinin android versiyonunu oluşturmam gerektiğini gösteriyor. AOSP kaynak ağacı, bazı araçların önceden derlenmiş sürümleriyle birlikte gelir, ancak bunlar sahip olmadığım eski paylaşılan kitaplıklara (libpcre3 gibi) bağlıdır. Her neyse, güvenlik politikanızı kontrol etmenin tek yolunun internetten aldığınız bazı ikili paylaşılan kütüphanelere güvenmektir.

İşte android selinux kütüphanelerini oluşturmak için yaptığım şey. Arch üzerinde, ustr-selinuxAUR'dan yüklemek zorunda kaldım , çünkü ustr inlineartık kullanmak için gerekli olan yeri kullanıyor static inline. Tamam, şimdiye kadar çok iyi. Ne yazık ki, inşa süreci gerçekten iğrenç, ama bununla derlenmiş ve aşağıdakileri yükleyebildim:

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"

Bu noktada, sedispolsıradan bir SElinux politikası (fedora'dan 29 sürümü gibi policy.29) çalışır, ancak yine de bana android ile neler olduğunu göstermez:

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

Ayrıca setools3Android kütüphanelerine karşı vanilya araçlarını derlemeyi denedim . Yine, o kadar kolay değil, ama ile çalışmayı başardım:

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

Bu tam olarak inşa edilmez, ancak yürütebileceğim kaynak ağacın yeterli bir kısmını oluşturur secmds/sesearch. Bir vanilya eserlerin Bu tür policy.29dosya (ı arayabilir -Ave -Tfakat --allbana verir operation not supported). Ancak, bir android sürüm 30 dosyasını incelemeye çalışırken benzer bir hatayla tamamen başarısız olur:

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

Bu noktada zihnim, sistem güvenliği politikası kadar kritik bir şeyin etrafındaki araçların inşa edilmesinin gerçekten zor olması gibi bir şey. Elbette yanlış bir şey yapmalıyım. Dışarıdan dağıtılmış ikili paylaşılan kütüphanelere güvenmeden bir android güvenlik politikasını gerçekten inceleyen biri var mı?

Tüm önceden oluşturulmuş araçları ( ndk/build/tools/download-toolchain-sources.shve ndk/build/tools/rebuild-all-prebuilt.sh) yeniden oluşturmak için önerilen teknikleri de denediğimi eklemeliyim . Ancak download-toolchain-sources.shkomut dosyası şu anda bozuk. Artık depolarda bulunmayan eski sürüm dizinlerini kontrol etmeye çalışır ve selinux ile prebuilts/pythonilgili kodu içeren gerçeğe rağmen, herhangi bir selinux ile ilgili aracı indirmiyor gibi görünüyor . Yine, bu inşa sistemlerinin ne kadar acımasız olduğuna şaşırdım ve daha kolay bir yol olması gerektiğini düşünüyorum. Android selinux politikamı kontrol etmeme izin veren araçları nasıl alabilirim?

Yanıtlar:


8

Her şeyden önce, "Bunu şok edici bir şekilde zor buldum" ifadenize tamamen katıldığımı itiraf etmeliyim . Google, Android'i ileri düzey kullanıcılar için değil, yalnızca tüketici açısından tasarlamıştır. Sonuç olarak, en son Facebook uygulamasını kullanmak veya Candy Crush ile oynamak dışında bir şey yapmak istediğinizde, kendinizi geliştirici benzeri bir bilginin değişmesi gerektiğinde 2000'lerin başında Linux bölgesinde çok hızlı bir şekilde bulacaksınız. basit ayarlar ne olmalı. Android sistemi daha olgunlaştıkça durumun hızla gelişeceğine inanıyorum, ancak şimdilik sahip olduklarımızla ilgili olmalıyız ...

Söylediğiniz gibi, kendi SELinux araç setinizi derlemenizin iki nedeni vardır:

  • Sistem tarafından sağlanan araç takımı genellikle bir sürümdür. Android'in SELinux ilkesi DB sürüm 30'a dayanırken, mevcut Linux kutuları genellikle yalnızca 29'a kadar olan sürümü işler.
  • Daha yeni olsa bile, yardımcı olmayacaktır, aslında yukarı akış kodundan SELinux oluşturmak (en azından yukarı yönlü önerileri takip eden Fedora makinelerinde kolayca yapılır) sistemin politika DB sürümünü 30 ele almasına etkili bir şekilde izin verir, ancak Android'in SELinux'u yoğun şekilde değiştirildi ( Google dokümantasyonu birkaç değişikliği vurgulamaktadır), bu nedenle Android'in SELinux'unu işlemeye çalışmak sözdizimi ve ayrıştırma hataları nedeniyle başarısız oluyor.

Bu nedenle, Android'in SELinux analiz görevine devam etmek için ellerimizi kirlere ... mümkün olan en temiz şekilde koymamız gerekecek:

  • Önce aklı başında bir ortam kuracağız,
  • Bu yapıldıktan sonra Android'in SELinux kütüphanelerini ve ilk araçlarını derleyeceğiz,
  • Üstelik SELinux araçları üreteceğiz,
  • Birkaç yardımcı program ekleyerek bitireceğiz.

Uygun bir ortam oluşturun

Çevre özellikleri

En temiz önerilen, belki de sadece güvenilir bir şekilde çalışan bir yol, Android çalışmanıza bir ortam ayırmaktır:

  • Sanal bir makine gayet iyi (en iyi seçenek değilse). Telefonunuzu USB üzerinden konuk sisteme bağlamanız gerekeceğinden, bir VMware kullanmayı tercih edin. Ücretsiz alternatif Qemu bu görevi çok iyi yerine getirmiyor gibi görünüyor. Diğer virualizasyon yazılımlarını denemedim.

  • 64 bitlik bir sistem olması gerekir, aksi takdirde tamsayı yanlış boyutta olduğu için kod derlenmez.

  • Edilir kuvvetle bir Ubuntu sistemi kullanmak için, muhtemelen zorunlu önerilir. XFCE'nin daha hafif masaüstü ortamını tercih ederseniz bunun yerine Xubuntu'yu kullanmaktan çekinmeyin, bu sistemin çekirdeğini ve mevcut paketini değiştirmez ve Android ile ilgili çalışmanız üzerinde bir etkisi olmaz (bu prosedürde Ubuntu hakkında söylediklerim Xubuntu için de geçerlidir). Android'in SELinux kaynak ağacında, Fedora'nın kullanılmasını öneren bazı ReadMe dosyalarını bulabilirsiniz, bu dosyalar akış yukarı NSA'nın SELinux projesinden miras alınır ve içerikleri Google'ın Android'iyle eşleşmez.

  • Kullanılacak Unbuntu'nun tam sürümü, oluşturmak istediğiniz Android sürümüne bağlıdır. Android 6.0 için Ubuntu 14.04 (Trusty) önerilir. Kontrol Google gereksinimleri sayfasına Daha fazla bilgi için.

  • Çok fazla disk alanına ihtiyacınız olacak (yalnızca SELinux ile ilgili bir araştırma planlıyorsanız en az 50 GB, eksiksiz bir Android oluşturmayı planlıyorsanız en az 100 GB). CPU ve bellek daha az ilgili, sadece tam bir yapı için zamanı etkiler ve SELinux ile ilgili görevler için gerçek bir etkisi olmaz.

Ubuntu kullanmanın iki ana avantajı vardır:

  • Önerilen sistemi kullanarak, iyi bilinen ve iyi test edilmiş bir ortamda çalışıyorsunuz: sistem kütüphaneleri, araçlar ve paketler proje tarafından beklenen sürümde ve konumda.

  • Daha özel olarak şu anki durumumuzda: Ubuntu'nun kendisi SELinux alternatifi olan AppArmor'a güveniyor, SELinux kullanmıyor. İyi haber şu ki, sistem güvenilirliğini değiştirme riski olmadan Android'in SELinux araçlarını ve ikili dosyalarını sistem genelinde kurabileceksiniz.

Ortam kurulum prosedürü

Tam teşekküllü bir canlı DVD'den başlayarak Ubuntu'yu geleneksel yolla yükleyebilirsiniz, ancak daha hızlı bir alternatif, bir netboot kurulumu (metin modu kurulumu) kullanmak ve sonunda tercih ettiğiniz masaüstü ortamını seçmektir. Bunu yaptığınızda, ilk önce kullanılmayan paketleri yüklemek yerine güncel paket sürümlerini doğrudan yükleyip ardından ilk önyüklemede 389 bekleyen güncellemenin uygulanmasını isteyerek ilk güncelleme zamanından tasarruf edersiniz.

Ubuntu / Xubuntu 14.04 (aynı ISO) netboot yükleyicisi için ISO'ya buradan ulaşabilirsiniz .

VMware'in zahmetli "Kolay Kurulum" özelliğini atlamak için, "İşletim sistemini daha sonra kuracağım" seçeneğini seçerek başlamak iyi bir alışkanlıktır .

Linux'u ve ardından konuk işletim sistemi olarak Ubuntu 64 bit'i seçtiğinizden emin olun .

Sanal Makinenin aşağıdaki kaynaklara ihtiyacı olacaktır:

  • Zorunlu: disk alanı olmalıdır en azından 40GB (20 GB varsayılan değil yeterli, kaynak kodu bile bundan daha fazla yer alır), yüksek önerilir. Tam bir yapı minimum 100 GB disk gerektirir, bu genellikle aldığım değerdir. Bu ayarın yalnızca bir maksimum sınır olduğunu unutmayın: VM tarafından alınan gerçek boyut, konukların istekleriyle dinamik olarak büyür.
  • Fakültatif: RAM'i 1024'ten en az 2048 veya daha yükseğe artırın (ana makine kapasitenize bağlı olarak 4096 kullanıyorum),
  • Etkileyici: İşlemci çekirdeği sayısını 1'den 2'ye veya daha fazla artırın (ana bilgisayar kapasitenize bağlı olarak 3 kullanıyorum).
  • CD-Rom kurulum ISO dosyasını göstermelidir.
  • Cihazınızı bağladığınızda birincisi uyarı verebileceğinden, USB'yi varsayılan 1.1'den 2.0'a geçirmek isteyebilirsiniz. Kullanımınıza bağlı olarak, "Yeni USB aygıtlarını otomatik olarak bağla" ve "Bluetooth aygıtlarını sanal makineyle paylaş " seçeneklerinin işaretini de kaldırabilirsiniz .
  • Ortamınıza bağlı olarak, ekran ayarlarını da değiştirmeniz gerekebilir (3D'yi devre dışı bırakın, ekran boyutunu zorunlu kılın).

Dikkat:

  • Netboot kurulumunu seçtiyseniz , Yazılım seçim ekranına ulaşırken masaüstü ortamınızı ( Ubuntu masaüstü veya Xubuntu masaüstü ) seçmeyi unutmayın , aksi takdirde minimum metin içeren bir ortam elde edersiniz!
  • İlk önyüklemede, en son sürüme yükseltmeyi reddedin : burada tüm mesele 14.04'te kalmak!

İlk önyüklemede, yapmak isteyebileceğiniz ilklerden biri Linux konuk araçlarını yüklemektir:

sudo apt-get install open-vm-tools

Bu paket önyükleme zamanı tetikleyicileri oluşturur, bu nedenle kurulumu yalnızca konuk yeniden başlatıldıktan sonra tamamlanır.

Android kaynak kodunu getir

Benzer olsa da, prosedür ayrıntıları seçilen ROM'a bağlıdır:

  • CyanogenMod için cihazınızı arayın (önce satıcıyı seçin), ardından cihazınıza uyarlanmış talimatları almak için "CyanogenMod nasıl kurulur" bağlantısını tıklayın.
  • AOSP için, burada başlayan prosedürü takip edin .

CyanogeMod'un kaynak ağacında boot.imgdosyaları açmanıza izin veren bir araç paketlediğini belirtmek gerekir . Farklı bir şekilde söylemek gerekirse, CyanogenMod size sepolicycihazlarda ve ROM arşivlerinde saklanan dosyaya erişmenizi sağlayacak bir araç sunar . Google'ın AOSP'si bu tür bir araç sağlamaz, bu nedenle CyanogenMod'un kaynak ağacını kullanarak başka bir zorunluluk yoksa en uygun seçim olabilir, aksi takdirde appart'ı yüklemeniz gerekir (bu hızlı ve kolay bir işlemdir, bu yüzden burada endişelenmenize gerek yoktur).

İşte CyanogenMod 13.0 (Android 6.0) prosedürünü takip ediyorum. Kullanılan komutlara ilişkin açıklama yukarıda bağlantılı sayfalarda mevcuttur. Lütfen bunları okuyun, aşağıdaki yazı sadece referans amaçlı verilmiştir.

İpucu: Ben kullanırkenapt-getdüşük ortak payda sopa ve herkes mutlu tutmak için bu yazı, kullanmak tercih edebilirsinizaptitudedaha iyi bir şekilde bağımlılıkları ilgilenir yana bazı bağımlılıkları kurulumu gerekli bir paket çıkarılırken (yerine , bu bağımlılıklar da sisteminizi temiz bırakarak kaldırılacaktır). AFAIKaptitudekomutu Ubuntu'ya kurulmalıdır, ancak varsayılan olarak Xubuntu'da kullanılabilir.

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

Artık temiz ve neredeyse eksiksiz bir kaynak ağacınız var. Tescilli lekeler eksik, ancak SELinux ile ilgili görevler için bunlara ihtiyacınız yok.

İpucu: Kaynakları getirmek sıkıcı bir işlemdir, şimdi VM'nizin anlık görüntüsünü veya yedeklemesini yapmaya değebilir.

Android'in SELinux araç setini ve kitaplıklarını derleyin ve yükleyin

Şimdi gezinin komik kısmı başlıyor;)!

Şimdiye kadar prosedür oldukça basit olmalıydı. Amaç esas olarak benimle aynı ortama sahip olmanızı sağlamaktı. Bunu yaparsanız, devam filmi de açık kalmalıdır.

Başlıklar altında Google, Android'in kaynak koduna sürümler arasında derin değişiklikler uygulamaktan çekinmeyin, bu nedenle tam derleme adımları kesinlikle sürüme bağlı olacaktır (örneğin AOSP yöneticisi sepolicy/dizinin taşınacağını gösterir ).

İlk olarak Android'in SElinux kitaplıklarını ve araç setini derlemek ve yüklemek için tam prosedürümü paylaşacağım, ancak zamanla bu yazının alaka düzeyini korumak için derleme sorunlarının çoğunu çözmek için takip edilecek genel yaklaşım hakkında bazı notlar ekleyeceğim.

Adım adım prosedür

Android'in SELinux kütüphaneleri, üst katman yazılımlarının Android'e özgü SELinux ilke dosyalarıyla baş etmesini sağlayacak soyutlama katmanı sağlar. Bu nedenle, önce bunları derlememiz ve yüklememiz gerekecek (bu, eğer yolunuzu bulana kadar, burada zorluklar varsa aslında çekirdeği temsil eder).

Daha sonra SELinux araçlarını kurabilir ve kurabiliriz. Göreceğimiz gibi, neyse ki bunların Android'e özel olması gerekmiyor, sadece SELinux kütüphane versiyonuyla eşleşmeleri gerekiyor.

Bu prosedür hem CyanogenMod hem de AOSP kaynak kodu ağaçları kullanılarak test edilmiştir.

Android SELinux kitaplıklarını ve ilk araçlarını derleyin ve yükleyin

İlk kurulum bağımlılıkları:

sudo apt-get install libapol-dev libaudit-dev libdbus-glib-1-dev libgtk2.0-dev \
libustr-dev python-dev python-networkx swig xmlto

Bu gönderide değişken $ANDROID_BUILD_TOPkaynak konumunuzu ( repo synckomutu verdiğiniz dizin) depolar . Adını istediğiniz gibi değiştirmekten çekinmeyin.

ANDROID_BUILD_TOP=~/android/system
cd $ANDROID_BUILD_TOP
source ./build/envsetup.sh

restorecond'Makefile' bazı kitaplıkları bulamaması nedeniyle ilke çekirdek araçları derlemesi başarısız olur . pkg-configSabit kodlu olanlar yerine dinamik olarak oluşturulan yolları kullanmak için bu Makefile'yi düzenlemeniz gerekir (backticks'i tek tırnaklarla karıştırmayın!):

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

Değişikliğin doğru bir şekilde dikkate alındığından emin olmak için Makefile'ı bazı metin düzenleyicileriyle açmaktan çekinmeyin.

Ve şimdi derleyin ve yükleyin:

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/

Dikkat:EMFLAGS=-fPIC Bina yaparken ortam değişkeni ayarınıkaçırmayınlibselinux. Henüz herhangi bir hata oluşturmayacak, ancak bir sonraki adımda SETools oluşturamayacaksınız. Bunu kaçırdıysanız veya yanlış bir şey yaptıysanız, sadece bir sorunmake cleançıkardıktan sonra derlemenizi yeniden başlatın.

SELinux araçlarını derleyin ve kurun

SELinux araçları aşağıdakileri içeren önceden oluşturulmuş bir biçimde sağlanır:

  • $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/Dizindeki Python komut dosyaları (ve kabuk komut dosyası sarmalayıcıları)
  • *.oAşağıdaki Python paketleri ( derlenmiş dosyalar dahil ) $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/.

Bu araçların kaynak kodunun aşağıda mevcut olmasını beklerdim $ANDROID_BUILD_TOP/external, ama öyle değil. Aslında, Google'ın kullandıkları SETools'un tam sürümünü paylaştığı bir yer bulamadım (FYI, GPL yalnızca değiştirilmişse kodu paylaşma zorunluluğudur), bu yüzden tahmin edebileceğimiz ve mümkün olduğunca elimizden geleni yapmamız gerekecek .

Araçların kendisi Python komut dosyalarıdır, bu SETools 4'ten yeni bir evrimdir (SETools 3'te sesearchC gibi ikili çalıştırılabilir kodlar gibi ). Ancak, araçların kendileri hala 3.3.8 sürümünü gösteriyor:

$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8

Tahminimce Google, SETools 4'ten bazı erken geliştirme anlık görüntüleri aldı. 4.0.0 beta SETools'a kadar sürüm 2.4'e dayanıyordu, libsepol4.0.0 sürümü ile kütüphanenin sürümüyle uyumlu olmayan 2.5 sürümüne güvenmeye başladılar. Android 6.0'da paketlenmiş SELinux (bunu derlemeyi deneyebilirsiniz, sadece başarısız olacaktır).

Bu yüzden en akıllıca seçim SETools 4.0.0 Beta ile devam ediyor gibi görünüyor.

Ek bağımlılıkları yükleyin:

sudo apt-get install python-setuptools

Kaynak kodu indirin ve çıkarın:

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'i etkileyen bir hata nedeniyle -Wredundant-decls, derleyicinin bayraklarından kaldırmamız gerekiyor :

sed -i '/-Wredundant-decls/d' ./setup.py

Ve son olarak derleyin ve kurun:

python ./setup.py build
sudo python ./setup.py install

Genel prosedür (veya "Kendinizi nasıl çıkarabilirsiniz")

Yukarıdaki prosedürün sizin durumunuzda işe yaramaması durumunda, işte nasıl ilerlemeye çalışılacağına dair daha üst düzey bir bakış.

Ne yazık ki burada sihir yok (ve yardımcı yok :(): Bu kodu derlemenin tek yolu klasik ama korkunç döngüsel "dene ve gör" yaklaşımıdır.

İlk kez derlemeye çalışın, büyük olasılıkla bazı *.hdosya bulunamadığı için başarısız olur :

  1. Android external/dizininde ara :

    find $ANDROID_BUILD_TOP/external -name filename.h
    

    İstenen dosyayı bulursanız, bu, ilgili kitaplığın veya aracın belirli bir sürümünün Android kaynak kodu içinde paketlendiği anlamına gelir. Bu nedenle, Ubuntu'nun paket sisteminden kurmaya çalışmamalı, bunun yerine Android kaynak kodunda paketlenmiş sürümü derleyip kurmalısınız.

    Bunun forumlarda bulabileceğiniz genel tavsiyelere aykırı olduğunu unutmayın: "Derlemeniz bu kitaplık eksik olduğu için başarısız oluyor mu? Bu paketi yükleyin, o zaman iyi olacak!" , bunu yaparak büyük olasılıkla daha kötü bir sorunla karşılaşırsınız: belirli bir sürüm paketlenmişse, büyük olasılıkla belirli bir sürüme ihtiyaç duyulduğundan (uyumluluk sorunları nedeniyle veya bu sürüm Google'dan belirli değişiklikler içerdiğinden) kaynaklanır.

    Eğer merak ediyorsanız BTW: tabii ki bu kütüphane ya da araç bazı *.hdosya bulunamadığı için hataları arttırarak bağımlılıklara sahip olabilir ve evet bu aynı döngüsel "dene ve gör" yaklaşımını uygulamanız gerekir.

  2. Sistem genelinde arama:

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

    Sisteminizde zaten var olan bir dosyayı standart paylaşılan kitaplık konumunda "eksik" bulursanız, bu bağımlılığın muhtemelen ortamınızda zaten karşılanmış olduğu anlamına gelir, ancak hatayı oluşturan Makefile dosyayı bulmak için çok aptal demektir.

    Bu Makefile öğesini doğrudan çağırırsanız, bunu düzelten bazı ortam değişkenleri ayarlamanız mümkün olabilir ( LIBDIR=/usr/lib makeörneğin), aksi takdirde Makefile'in kendisini değiştirmeniz pkg-configgerekebilir ( komut, eksik oluşturma parametrelerini otomatik olarak oluşturmak için değerli bir yardımcı olabilir) .

  3. Paketleme sisteminde arama:

    apt-cache search filename-dev
    

    Burada filename-deveksik dosyanın adını, küçük harfli .h, -devson ekin yerini alacak şekilde temsil eder (örneğin, Python.hbulunmazsa, arayın python-dev). Doğru paketi bulmak için tam adında bazı ayarlamalar gerekebilir.

  4. Sıkışıp kalırsanız ve internette hızlı bir arama bile net bir cevap vermediyse, apt-fileen iyi arkadaşınız olacaktır. apt-filevarsayılan olarak yüklenmezse, yüklemeniz ve veritabanını oluşturmanız gerekir:

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

    apt-filebelirli bir dosya sağlayan paketleri (kaldırılmış olanları bile) aramanıza olanak tanır. Çok fazla sonuç almaktan kaçınmak için grep, aşağıdaki ile ilişkilendirmenizi öneririz :

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

    Ubuntu'nun deposunda bu dosyayı sağlayan bir paket varsa, apt-fileonu bulabilmelidir.

    Doğru paketi bulduktan sonra , paketinizin adının apt-get install packagenamebulunduğu packagenameyeri kullanarak yükleyin .

İpucu: Eğer sisteminizde bir şeyler vidalı, komut bir paket bu biridir yeniden:apt-get reinstall pkg_name. Bağımlılık (sistem kitaplıkları için büyük olasılıkla olası) nedeniyle klasik bir kaldırma ve yükleme mümkün olmadığında bile çalışacaktır.

Yardımcı araçlar

Bu adımda, artık Android'in SELinux kurallarını derlenmiş ve kaynak formatlarında araştırmanıza izin veren temiz bir ortamınız olmalıdır.

Ancak, büyük olasılıkla, soruşturmanızın sonunda bir şeyler yapmak isteyeceksiniz. Geçerli şekliyle, ortamınız bir aygıtın sepolicydosyasını değiştirmenize izin vermeyecektir . Aslında, bu dosya kolayca değiştirilemez: aygıt kök dizininin bir parçasıdır ve kök dizinin içeriği bir RAM disk dosyasından önyükleme sırasında çıkarılır ve bu da aygıtın önyükleme görüntüsünde saklanır.

Böylece ortamınız tamamlanmadan iki şeyi kaçırıyorsunuz:

  • Cihazın önyükleme görüntüsüne erişmenin ve değiştirmenin bir yolu,
  • sepolicyDosyasını değiştirmenin bir yolu .

Neyse ki, bunlar tam olarak bu yazının son iki bölümünün konusu! :)

Cihazın önyükleme görüntüsünü getir ve güncelle

Aygıtların önyükleme görüntüsünü almak ve güncellemek için kullanılan araçlar, SELinux kurallarının kurcalanması dışında çok çeşitli şeyler için kullanılabilir. Bu nedenle özel bir cevap oluşturdum , lütfen bakın.

Cihazın SELinux kurallarını değiştirme

Burada iki ana olasılık var:

  • sepolicyKaynak ağacınızdaki kurallardan yeni bir dosya oluşturun ( .tedosyaları bulmak için arayın : find $ANDROID_BUILD_TOP -name \*.tebirkaç klasöre yayılırlar).
  • sepolicyAygıt tarafından kullanılmakta olan dosyayı değiştirin .

Kurallarınızı sıfırdan geliştirmeniz gerekmedikçe, bu daha çok gelişmeyle ilgili bir görevdir ve bu nedenle burada kapsam dışıdır, ikinci seçenek çok güvenli görünmektedir, çünkü tek değişiklik sizin açıkça yapılmış.

Bir sepolicydosyayı yeniden derlenebilir bir forma dönüştürmenize ve aradaki kuralları serbestçe düzenlemenize izin veren bir araç yapmak için bir proje olmuştur . Ancak bu proje kavram kanıtı durumunda terk edilmiştir. Bu blog gönderisinin sonunda tüm bilgileri bulacaksınız , makalenin geri kalanı ilgilenen herkesin devralmasına izin vermek için yeterli ayrıntı içeriyor.

sepolicyKuralları değiştirmenin şu anda önerilen yolu başka bir rotaya gider: sepolicyikili dosyayı doğrudan değiştirerek . sepolicy enjekte aracı sadece buna izin verir ve aktif olarak korunur.

Tamlık uğruna, bu aracın bir çatalı olduğunu unutmayın . Bazıları orijinal yazarın yapılacaklar listesinde yer alan (bir kuralı kaldırma olasılığı gibi) birkaç özellik ekliyor, bana neden katkıda bulunmak yerine neden çatal kullanmayı seçtiklerini sorma ...

Derlemek ve yüklemek sepolicy-injectiçin aşağıdaki adımları izleyin:

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/

Kullanım örneği

Diyelim ki, aşağıdaki hata mesajıyla eşleşen otomatikleştirmeyi eklemek istiyorsunuz:

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

Cihazın önyükleme görüntüsünü almanız ve ardından sepolicydosyaya erişmek için paketini açmanız gerekir .

Kullanarak hızlı bir kontrol sesearch, gerçekten izin verme kuralının olmadığını gösterir (henüz!):

$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
$

Komutun çıktısı yok.

Ardından, gerekli kuralı eklemek için aşağıdaki komutu kullanın ( sesearchve sepolicy-injectparametreler arasındaki benzerliğe dikkat edin ):

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

Şimdi sesearchkomutumuzu geri arayabiliriz :

$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
allow kernel media_rw_data_file:file read;
$

sesearch output, politikanın doğru şekilde güncellendiğini gösterir.

Artık aygıtın boot.imgdosyasını yeniden paketleyebilir ve aygıta geri döndürebilirsiniz. /sepolicyDosyanın son değişiklik zamanını kontrol etmek , cihazınızın şimdi yeni güncellenen sepolicydosyayı çalıştırdığından emin olmanın kolay bir yoludur .

Sonuç

Artık Android cihazların SELinux politikalarını özgürce incelemenize ve değiştirmenize izin veren eksiksiz bir ortama sahip olmalısınız. Zevk almak! :)

Bir yan not olarak, SELinux politikasını doğrudan cihazdan analiz etmeye ve değiştirmeye izin veren araçlar da vardır .


1
sadece bir not - bol bol kahve içmediğiniz sürece asla "repo sync" yapmayın;) Bunun yerine "repo sync -q -f --force-sync -c" kullanın - tonlarca zaman ve sabit disk alanından tasarruf etmenizi sağlar . -q sessizdir, -f ve --force-sync geçici ağ hataları durumunda ilerlemenize yardımcı olur, -c yalnızca geçerli dalı getirir. PS Ben de herhangi bir yerel değişiklikleri tamamen silmek ve manifest sürümüne geçmek gerektiğinde geliştirme sırasında "-d --prune" bayrakları kullanın.
Oleksandr

@Oleksandr: Bilginiz için teşekkürler, bunu bilmek faydalıdır. -cBayrağı test ettim , ancak büyük bir fark fark etmedim: Bilgisayarın indirmesi için hala çok fazla veri (25 GB), hala içmem için çok fazla kafein;). -fBayrağa biraz ihtiyatlıyım, anlayışım repogereği bu, kaynak kodunun bir bölümünü indiremediğinde görmezden gelmeye zorlayacak ve hala nihai sonucu bir başarı olarak görecek . Ben "başarı" durumunu tam bir getirme için ayırmak ve kendimi dosyaları rastgele eksik olabilir bilinmeyen bir durumda bulmaktan kaçının.
WhiteWinterWolf

2

Önce AOSP kodundan (6.0 sürümüne karşılık gelen gibi) daha eski bir libsepol sürümü oluşturmalı, ardından sepolicy-inject, dispol, vs. Bu tarif benim için debian jessie'de çalıştı:

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

sistemin libsepolüne bağlı sepolicy enjeksiyonundan farklı olarak, bu, android sdk'de bulunan 6.0 görüntüsünün / sepolicy ile iyi çalışır:

$ 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 dağıtımında yer alan araçlar için püf noktası, bunları aynı DESTDIR ile oluşturmaktır:

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

Teşekkürler. Bu bana işe yarayan bir sedispol versiyonu verdi, ama yine de sesearch'i derleyemiyorum. Sesearch, içerme dosyasını aradığında ölür <apol/policy.h>(başka bir policy.hdosyadan). Hangi modülün içerdiğini biliyor musunuz apol?
user3188445

@ user3188445: Dosya apol/policy.hpaket tarafından sağlanır libapol-dev(en azından Ubuntu sistemlerinde budur). Daha ayrıntılı bilgi için lütfen cevabıma bakın.
WhiteWinterWolf

1

Sorunla karşılaşan kişilere:

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

AOSP kodu ile çalışırken.

AOSP kodunuzun ~ / android / source dir:

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

Ve şimdi paketli audit2allow yardımcı programını kullanmakta özgürsünüz :

./external/selinux/prebuilts/bin/audit2allow

PS Ayrıca, yorum ele almak istiyorum İncelemek android (v30) selinux politikası

Sesearch, içerme dosyasını aradığında ölür (başka bir policy.h dosyasından). Hangi modülün apol içerdiğini biliyor musunuz?

Kaynaklardan selinux araç seti oluşturmak https://github.com/SELinuxProject/selinux (Fedora kullanmadığınız sürece) çok önemsiz değildir. Ubuntu'da, (bison ve C derleyicisi gibi temel geliştirici araçlarını zaten yüklediğinizi varsayarak) libglib2.0-dev, libcap-ng-dev, xmlto, libsemanage1-dev, libustr-dev, libaudit-dev, libsepol1 -dev

Ama sonunda https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155 yüzünden hala derleyemedim ve nasıl çözeceğimi bilmiyorum


1
Ayrıca yazının glibconfig.hsonunda bağladığınız bu hatayla karşılaştım , restorecondyanlış yollar zor kodlanmış olduğu için Makefile tarafından büyütüldü . Kullanarak yolları dinamik olarak çözümleyebilmesi için bunu değiştirmeniz gerekir pkg-config. Daha fazla ayrıntı için cevabıma bakın.
WhiteWinterWolf


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.