Periksa kebijakan selinux android (v30)

12

Saya mencoba mencari kebijakan apa yang sebenarnya diberlakukan oleh ponsel saya menggunakan selinux. Anda akan berpikir ini akan mudah. Lagi pula, untuk keamanan, baik untuk memverifikasi bahwa kebijakan Anda sesuai dengan harapan. Sayangnya, saya menemukan ini sangat sulit untuk dilakukan, karena A) android tampaknya menggunakan versi kebijakan bercabang 30, dan B) toolchain kebijakan tampaknya memiliki proses pembangunan yang sangat berkualitas rendah (banyak jalur hard-kode, dll. .).

Berikut adalah dua hal yang saya coba yang belum berhasil. Jika saya mencoba menggunakan alat setool di luar rak (seperti dikemas untuk fedora, atau dapat diinstal dari AUR dengan linux lengkung), maka saya mendapatkan yang berikut (setelah menarik /sepolicydari oleh direktori root ponsel atau gambar pabrik):

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

Oke, jadi itu menyarankan saya harus membangun versi android dari perpustakaan selinux. Pohon sumber AOSP datang dengan versi yang sudah dikompilasi dari beberapa alat tetapi ini tergantung pada pustaka bersama lama yang tidak saya miliki (seperti libpcre3). Bagaimanapun, ini cukup mengejutkan jika satu-satunya cara untuk memeriksa kebijakan keamanan Anda adalah dengan mempercayai beberapa perpustakaan biner yang Anda dapatkan dari internet.

Jadi, inilah yang saya lakukan untuk membangun perpustakaan selinux android. Pada lengkungan, saya harus menginstal ustr-selinuxdari AUR, karena ustr menggunakan inlinetempat yang sekarang harus digunakan static inline. Oke, sejauh ini bagus. Sayangnya, proses pembuatannya benar-benar kotor, tetapi saya bisa membuatnya cukup dikompilasi dan diinstal dengan yang berikut:

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"

Pada titik ini, sedispolmenjalankan kebijakan SElinux biasa (seperti versi 29 policy.29dari fedora), tetapi masih tidak akan menunjukkan kepada saya apa yang terjadi dengan android:

$ ~/android_selinux/usr/sbin/sedispol sepolicy 
Reading policy...
libsepol.avtab_read_item: more than one specifier
libsepol.avtab_read: failed on entry 457 of 5582
/home/user/android_selinux/usr/sbin/dispol:  error(s) encountered while parsing configuration
$ 

Saya juga mencoba mengompilasi setools3alat vanila terhadap pustaka android. Sekali lagi, tidak begitu mudah, tetapi saya membuatnya bekerja dengan:

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

Ini tidak sepenuhnya membangun, tetapi cukup membangun pohon sumber yang bisa saya jalankan secmds/sesearch. Semacam ini bekerja pada policy.29file vanilla (saya bisa mencari -Adan -T, tetapi --allmemberi saya operation not supported). Namun, itu benar-benar gagal dengan kesalahan serupa ketika mencoba memeriksa file versi Android 30:

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

Pada titik ini pikiran saya agak membingungkan bahwa perkakas di sekitar sesuatu yang sangat penting seperti kebijakan keamanan sistem benar-benar sulit untuk dibangun. Pasti saya melakukan sesuatu yang salah. Adakah yang benar-benar berhasil memeriksa kebijakan keamanan android tanpa mengandalkan perpustakaan bersama biner yang didistribusikan secara eksternal?

Saya harus menambahkan bahwa saya juga mencoba teknik yang disarankan untuk membangun kembali semua alat prebuilt ( ndk/build/tools/download-toolchain-sources.shdan ndk/build/tools/rebuild-all-prebuilt.sh). Namun download-toolchain-sources.shskrip saat ini rusak. Ia mencoba untuk memeriksa direktori versi lama yang tidak ada dalam repositori lagi, dan lagi pula sepertinya tidak mengunduh alat terkait selinux, meskipun fakta itu prebuilts/pythonmengandung kode yang terkait selinux. Sekali lagi, saya terkejut melihat betapa kasarnya sistem pembangunan ini, dan berpikir harus ada cara yang lebih mudah. Pertanyaannya bagaimana saya bisa mendapatkan alat yang memungkinkan saya untuk memeriksa kebijakan selinux android saya?

pengguna3188445
sumber

Jawaban:

8

Pertama-tama, saya harus mengakui bahwa saya sepenuhnya setuju dengan pernyataan "Saya merasa ini sangat sulit untuk dilakukan" . Google telah merancang Android terutama dari perspektif konsumen, dan bukan untuk pengguna yang kuat. Hasilnya adalah, begitu Anda ingin melakukan sesuatu di luar menggunakan aplikasi Facebook terbaru atau bermain dengan Candy Crush, Anda dengan cepat menemukan diri Anda kembali ke ranah awal-2000 Linux, ketika pengetahuan seperti pengembang diperlukan untuk mengubah apa yang seharusnya menjadi pengaturan sederhana. Saya percaya bahwa situasinya akan berkembang dengan cepat ketika sistem Android menjadi lebih matang, tetapi untuk sekarang kita harus melakukan dengan apa yang kita dapatkan ...

Seperti yang Anda katakan, ada dua alasan mengapa Anda perlu mengkompilasi perangkat SELinux Anda sendiri:

  • Toolset yang disediakan sistem biasanya merupakan versi di belakang. Sementara SELinux Android mengandalkan kebijakan DB versi 30, kotak Linux saat ini biasanya hanya menangani versi hingga 29.
  • Bahkan jika itu akan lebih baru itu tidak akan membantu, sebenarnya membangun SELinux dari kode hulu (yang mudah dilakukan, setidaknya pada mesin Fedora mengikuti rekomendasi hulu) secara efektif memungkinkan sistem untuk menangani kebijakan DB versi 30, namun SELinux Android telah modifikasi yang dimodifikasi ( dokumentasi Google menyoroti beberapa modifikasi) sehingga mencoba menangani SELinux Android gagal karena kesalahan sintaksis dan penguraian.

Jadi, untuk melanjutkan pencarian analisis SELinux Android, kita harus meletakkan tangan kita di tanah ... dengan cara terbersih yang mungkin:

  • Pertama kita akan mengatur lingkungan yang waras,
  • Setelah ini selesai kami akan mengkompilasi perpustakaan SELinux Android dan alat pertama,
  • Di atas mereka kita akan membangun alat SELinux,
  • Kami akan menyelesaikannya dengan menambahkan beberapa utilitas tambahan.

Siapkan lingkungan yang tepat

Sifat lingkungan

Disarankan paling bersih, cara yang mungkin hanya bisa diandalkan adalah dengan mendedikasikan lingkungan untuk pekerjaan Android Anda:

  • Mesin virtual baik-baik saja (jika bukan pilihan terbaik). Lebih suka menggunakan VMware karena Anda harus menghubungkan ponsel Anda melalui USB ke sistem tamu. Alternatif gratis Qemu sepertinya tidak menangani tugas seperti itu dengan baik. Saya tidak mencoba dengan perangkat lunak virualisasi lainnya.

  • Ini harus berupa sistem 64 bit, jika tidak maka kode tidak akan dikompilasi karena bilangan bulat berukuran salah.

  • Hal ini sangat dianjurkan, mungkin wajib, untuk menggunakan sistem Ubuntu. Jangan ragu untuk menggunakan Xubuntu sebagai gantinya jika Anda lebih memilih lingkungan desktop XFCE yang lebih ringan, ini tidak mengubah inti sistem dan paket yang tersedia dan tidak akan berdampak pada pekerjaan terkait Android Anda (apa pun yang saya katakan tentang Ubuntu dalam prosedur ini juga berlaku untuk Xubuntu). Anda dapat menemukan di pohon sumber SELinux Android beberapa file ReadMe merekomendasikan penggunaan Fedora sebagai gantinya, file-file ini diwarisi dari proyek SELinux NSA hulu dan kontennya tidak selalu cocok dengan Google Android Google.

  • Versi Unbuntu yang tepat untuk digunakan tergantung pada versi Android yang ingin Anda bangun. Untuk Android 6.0, Ubuntu 14.04 (Terpercaya) direkomendasikan. Periksa halaman persyaratan Google untuk informasi lebih lanjut.

  • Anda akan membutuhkan banyak ruang disk (setidaknya 50GB jika Anda hanya merencanakan penyelidikan terkait SELinux, setidaknya 100GB jika Anda berencana membangun Android secara lengkap). CPU dan memori kurang relevan, mereka hanya berdampak waktu untuk membangun penuh dan tidak akan berdampak nyata untuk tugas-tugas terkait SELinux.

Menggunakan Ubuntu memiliki dua keunggulan utama:

  • Dengan menggunakan sistem yang disarankan, Anda bekerja di lingkungan yang terkenal dan teruji: pustaka sistem, alat, dan paket berada pada versi dan lokasi yang diharapkan oleh proyek.

  • Dan lebih khusus dalam kasus kami saat ini: Ubuntu sendiri bergantung pada AppArmor yang merupakan alternatif SELinux, ia tidak menggunakan SELinux. Kabar baiknya adalah Anda karenanya dapat menginstal alat SELinux Android dan sistem biner di seluruh sistem tanpa risiko mengubah keandalan sistem.

Prosedur pemasangan lingkungan

Anda dapat menginstal Ubuntu dengan cara tradisional dengan memulai dari DVD live-fledged penuh, tetapi alternatif yang lebih cepat adalah dengan menggunakan instalasi netboot (instalasi textmode) dan pilih lingkungan desktop yang Anda sukai di bagian akhir. Melakukan hal itu akan menghemat waktu pembaruan awal Anda dengan langsung menginstal versi paket yang up-to-date daripada menginstal yang usang, kemudian meminta untuk menerapkan 389 pembaruan yang tertunda pada boot pertama.

Penginstal netboot ISO untuk Ubuntu / Xubuntu 14.04 (ISO yang sama) tersedia di sini .

Untuk melewatkan fitur "Easy Install" yang bermasalah dari VMware, adalah kebiasaan yang baik untuk memulai dengan memilih opsi "Saya akan menginstal sistem operasi nanti" .

Pastikan untuk memilih Linux , kemudian Ubuntu 64 bit sebagai OS tamu.

VM akan membutuhkan sumber daya berikut:

  • Wajib: ruang disk harus paling tidak 40GB (standar 20 GB tidak akan cukup, kode sumber sendiri membutuhkan lebih banyak ruang dari itu), lebih tinggi direkomendasikan. Pembangunan penuh membutuhkan disk minimal 100 GB, ini adalah nilai yang biasanya saya ambil. Jangan lupa bahwa pengaturan ini hanya batas maksimum: ukuran aktual yang diambil oleh VM tumbuh secara dinamis dengan permintaan tamu.
  • Facultative: Tingkatkan RAM dari 1024 menjadi setidaknya 2048 atau lebih tinggi (tergantung pada kapasitas host Anda, saya menggunakan 4096),
  • Facultative: Tingkatkan jumlah core prosesor dari 1 menjadi 2 atau lebih tinggi (tergantung pada kapasitas host Anda, saya menggunakan 3).
  • CD-Rom harus mengarah ke file ISO instalasi.
  • Anda mungkin ingin beralih USB dari standar 1.1 ke 2.0 karena yang sebelumnya dapat memberikan peringatan saat Anda menghubungkan perangkat Anda. Tergantung pada penggunaan Anda, Anda juga dapat menghapus centang dengan aman "Sambungkan perangkat USB baru secara otomatis" dan "Bagikan perangkat Bluetooth dengan mesin virtual" .
  • Tergantung pada lingkungan Anda, Anda mungkin juga perlu mengubah pengaturan tampilan (menonaktifkan 3D, menegakkan ukuran layar).

Perhatian:

  • Jika Anda memilih instalasi netboot, jangan lupa untuk memilih lingkungan desktop Anda ( desktop Ubuntu atau desktop Xubuntu ) ketika mencapai layar pemilihan Perangkat Lunak , atau Anda akan berakhir dengan lingkungan hanya teks yang minimal!
  • Setelah boot pertama, tolak untuk meng-upgrade ke rilis terbaru: intinya di sini adalah tetap di 14,04!

Saat boot pertama, salah satu hal pertama yang mungkin ingin Anda lakukan adalah menginstal alat tamu Linux:

sudo apt-get install open-vm-tools

Paket ini memicu boot-time, karena itu instalasinya akan selesai hanya setelah tamu restart.

Ambil kode sumber Android

Meskipun serupa, detail prosedur tergantung pada ROM yang dipilih:

  • Untuk CyanogenMod, cari perangkat Anda (pilih vendor terlebih dahulu) kemudian klik tautan "Cara membuat CyanogenMod" untuk mendapatkan instruksi yang disesuaikan untuk perangkat Anda.
  • Untuk AOSP, ikuti prosedur yang dimulai di sini .

Perlu dicatat bahwa bundel CyanogeMod di pohon sumbernya adalah alat yang memungkinkan Anda membongkar boot.imgfile. Untuk mengatakannya secara berbeda, CyanogenMod memberi Anda alat yang akan memungkinkan Anda untuk mengakses sepolicyfile yang disimpan dalam perangkat dan arsip ROM. Google AOSP tidak menyediakan alat seperti itu, jadi jika Anda tidak memiliki keharusan lain menggunakan pohon sumber CyanogenMod mungkin merupakan pilihan yang paling nyaman, jika tidak Anda harus menginstalnya appart (yang cepat dan mudah dilakukan, jadi jangan khawatir di sini).

Di sini saya mengikuti prosedur CyanogenMod 13.0 (Android 6.0). Penjelasan tentang perintah yang digunakan tersedia di halaman yang ditautkan di atas. Silakan baca, naskah di bawah ini diberikan hanya untuk tujuan referensi.

Kiat: Walaupun saya gunakanapt-getdalam posting ini untuk tetap menggunakan penyebut umum terendah dan membuat semua orang senang, Anda dapat memilih untuk menggunakannyaaptitudekarena itu akan menangani dependensi dengan cara yang lebih baik (saat menghapus paket yang membutuhkan instalasi beberapa dependensi , dependensi ini juga akan dihapus, meninggalkan sistem Anda lebih bersih). AFAIKaptitudeperintah harus diinstal di Ubuntu tetapi tersedia secara default di 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

Sekarang Anda memiliki pohon sumber yang bersih dan hampir lengkap. Gumpalan milik hilang, tetapi Anda tidak membutuhkannya untuk tugas terkait SELinux.

Tip: Mengambil sumber adalah proses yang membosankan, mungkin perlu melakukan snapshot atau cadangan VM Anda sekarang.

Kompilasi dan instal perangkat SELinux Android dan pustaka

Sekarang bagian lucu dari perjalanan dimulai;)!

Sampai sekarang prosedur seharusnya cukup mudah. Tujuannya terutama untuk memastikan bahwa Anda memiliki lingkungan yang sama dengan saya. Jika Anda melakukannya, sekuelnya harus tetap mudah juga.

Di bawah tenda Google tidak ragu untuk menerapkan perubahan mendalam pada kode sumber Android antara versi, oleh karena itu langkah kompilasi yang tepat akan sangat tergantung pada versi (misalnya master AOSP menunjukkan bahwa sepolicy/direktori akan dipindahkan ).

Saya pertama-tama akan membagikan prosedur persis saya untuk mengkompilasi dan menginstal perpustakaan dan toolset SElinux Android, tetapi untuk menjaga relevansi posting ini dari waktu ke waktu saya kemudian akan menambahkan beberapa catatan tentang pendekatan generik yang harus diikuti untuk menyelesaikan sebagian besar masalah kompilasi.

Prosedur langkah demi langkah

Perpustakaan SELinux Android menyediakan lapisan abstraksi yang akan memungkinkan perangkat lunak lapisan atas untuk menangani file kebijakan SELinux khusus Android. Karena itu kita perlu membuat dan menginstalnya terlebih dahulu (yang, dengan sendirinya, sebenarnya merupakan inti jika kesulitan di sini, sampai Anda menemukan jalan Anda).

Kami kemudian dapat membangun dan menginstal alat SELinux. Seperti yang akan kita lihat, untungnya ini tidak harus spesifik untuk Android, mereka hanya perlu mencocokkan versi pustaka SELinux.

Prosedur ini telah diuji baik menggunakan pohon kode sumber CyanogenMod dan AOSP.

Kompilasi dan instal pustaka SELinux Android dan alat pertama

Instal dependensi pertama:

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

Dalam posting ini variabel $ANDROID_BUILD_TOPmenyimpan lokasi sumber Anda (direktori tempat Anda mengeluarkan repo syncperintah). Jangan ragu untuk mengubah namanya sesuka Anda.

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

Secara default kompilasi core utilities kebijakan gagal karena restorecondMakefile tidak dapat menemukan beberapa perpustakaan. Anda harus mengedit Makefile ini untuk menggunakan jalur yang dihasilkan secara dinamis oleh pkg-configalih-alih yang dikodekan (jangan bingung backtick dengan tanda kutip tunggal!):

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

Jangan ragu untuk membuka Makefile dengan beberapa editor teks untuk memastikan bahwa modifikasi telah diperhitungkan dengan benar.

Dan sekarang kompilasi dan instal:

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/

Perhatian: Jangan lewatkanEMFLAGS=-fPICpengaturan variabel lingkungan saat membangunlibselinux. Itu belum akan menghasilkan kesalahan apa pun, tetapi pada langkah berikutnya Anda tidak akan dapat membangun SETools. Jika Anda melewatkannya atau melakukan kesalahan lain, cukup keluarkanmake cleandan mulai kembali kompilasi Anda.

Kompilasi dan instal alat SELinux

Alat SELinux disediakan dalam bentuk prebuilt yang meliputi:

  • Skrip python (dan pembungkus skrip shell mereka) dalam $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/direktori
  • Paket python (termasuk *.ofile yang dikompilasi) di bawah ini $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/.

Saya berharap kode sumber alat-alat ini tersedia di bawah $ANDROID_BUILD_TOP/external, tetapi tidak. Sebenarnya, saya tidak menemukan tempat di mana Google berbagi versi persis SETools yang mereka gunakan (FYI GPL hanya mandat untuk membagikan kode jika sudah dimodifikasi), jadi kami harus menebak dan mencoba dan melakukan yang terbaik yang kami bisa .

Alat itu sendiri adalah skrip Python, ini merupakan evolusi baru dari SETools 4 (dalam SETools 3, perintah seperti sesearchbiner yang dapat dieksekusi dikodekan dalam C). Namun, alat itu sendiri masih menunjukkan versi 3.3.8:

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

Jadi tebakan saya adalah bahwa Google mengambil beberapa snapshot pengembangan awal dari SETools 4. Sampai 4.0.0 beta SETools mengandalkan libsepolversoin 2.4, dengan rilis 4.0.0 mereka mulai mengandalkan versi 2.5 dari perpustakaan yang tidak kompatibel dengan versi dari SELinux yang dibundel dalam Android 6.0 (Anda dapat mencoba mengkompilasi ini, itu hanya akan gagal).

Jadi, pilihan paling bijak tampaknya adalah SETools 4.0.0 Beta.

Instal dependensi tambahan:

sudo apt-get install python-setuptools

Unduh dan ekstrak kode sumber:

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/

Karena bug yang mempengaruhi Flex 2.5, kami perlu menghapus -Wredundant-declsdari flag-flag compiler:

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

Dan akhirnya kompilasi dan instal:

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

Prosedur umum (atau "Cara melepaskan diri")

Jika prosedur di atas tidak berhasil dalam kasus Anda, berikut ini adalah tampilan tingkat yang lebih tinggi tentang cara mencoba untuk maju.

Sayangnya tidak ada sihir (dan tidak ada pembantu :() di sekitar sini: satu-satunya cara untuk mendapatkan kode ini untuk dikompilasi adalah pendekatan "coba-dan-lihat" yang klasik namun ditakuti.

Cobalah untuk mengkompilasi pertama kali, kemungkinan besar akan gagal karena beberapa *.hfile tidak ditemukan:

  1. Cari di external/direktori Android :

    find $ANDROID_BUILD_TOP/external -name filename.h
    

    Jika Anda menemukan file yang diminta, maka ini berarti bahwa versi tertentu dari pustaka atau alat terkait telah digabungkan dalam kode sumber Android. Karena itu Anda tidak boleh mencoba menginstalnya dari sistem paket Ubuntu, tetapi mengkompilasi dan menginstal versi yang dibundel dalam kode sumber Android.

    Perlu diketahui bahwa ini bertentangan dengan saran umum yang Anda temukan di forum: "Kompilasi Anda gagal karena pustaka ini hilang? Instal paket ini maka itu akan baik-baik saja!" , dengan melakukan ini, Anda kemungkinan besar hanya akan mengalami masalah yang lebih buruk: jika versi tertentu dibundel, kemungkinan besar karena versi tertentu diperlukan (karena masalah kompatibilitas atau karena versi ini berisi perubahan spesifik dari Google).

    BTW, jika Anda bertanya-tanya: tentu saja pustaka atau alat ini juga mungkin memiliki dependensi meningkatkan kesalahan karena beberapa *.hfile tidak ditemukan, dan ya Anda harus menerapkan pendekatan "coba-dan-lihat" siklik yang sama ini.

  2. Cari di seluruh sistem:

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

    Jika Anda menemukan "hilang" file tersebut sudah ada di sistem Anda di beberapa lokasi standar shared library, ini berarti bahwa ketergantungan ini mungkin sudah terpenuhi di lingkungan Anda tetapi Makefile yang mengangkat kesalahan terlalu bodoh untuk menemukannya.

    Jika Anda secara langsung memanggil Makefile ini, Anda mungkin dapat mengatur beberapa variabel lingkungan untuk memperbaikinya ( LIBDIR=/usr/lib makemisalnya), jika tidak, Anda mungkin perlu memodifikasi Makefile itu sendiri ( pkg-configperintah ini mungkin sangat membantu untuk secara otomatis menghasilkan parameter build yang hilang) .

  3. Cari di sistem pengemasan:

    apt-cache search filename-dev
    

    Mana filename-devmewakili nama file yang hilang dalam huruf kecil dengan .hekstensi diganti dengan -devakhiran (misalnya, jika Python.htidak ditemukan, cari python-dev). Beberapa penyesuaian dalam nama yang tepat mungkin diperlukan untuk menemukan paket yang tepat.

  4. Jika Anda tetap terjebak dan bahkan pencarian cepat di Internet tidak memberikan jawaban yang jelas, maka apt-fileakan menjadi teman terbaik Anda. apt-filetidak terinstal secara default, Anda harus menginstalnya dan menghasilkan databasenya:

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

    apt-filememungkinkan Anda untuk mencari paket (bahkan yang dihapus) yang menyediakan file tertentu. Untuk menghindari hasil yang terlalu banyak, saya sarankan untuk mengaitkannya dengan grepseperti di bawah ini:

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

    Jika ada paket di repositori Ubuntu yang menyediakan file ini, maka apt-fileseharusnya dapat menemukannya.

    Setelah Anda menemukan paket yang tepat, menginstalnya menggunakan apt-get install packagenamemana packagenameadalah nama paket Anda.

Tip: Jika Anda mengacaukan sesuatu pada sistem Anda, perintah untuk menginstal ulang paket yang satu ini:apt-get reinstall pkg_name. Ini akan berfungsi bahkan ketika penghapusan & pemasangan klasik tidak dimungkinkan karena melanggar dependensi (yang paling mungkin untuk pustaka sistem).

Alat pelengkap

Pada langkah ini, Anda sekarang harus memiliki lingkungan yang bersih yang memungkinkan Anda untuk menyelidiki aturan SELinux Android baik dalam format yang dikompilasi maupun sumber.

Namun, sebagian besar kemungkinan adalah bahwa pada akhir penyelidikan Anda, Anda akan ingin mengambil tindakan. Dalam bentuknya saat ini, lingkungan Anda tidak akan mengizinkan Anda untuk memodifikasi sepolicyfile perangkat . Sebenarnya, file ini tidak dapat dengan mudah diganti: ini adalah bagian dari direktori root perangkat, dan isi dari direktori root adalah extracter pada saat boot dari file disk RAM, yang pada gilirannya disimpan dalam image boot perangkat.

Jadi, Anda masih kehilangan dua hal sebelum lingkungan Anda selesai:

  • Cara untuk mengakses dan memodifikasi gambar boot perangkat,
  • Cara untuk memodifikasi sepolicyfile -nya .

Untungnya, ini adalah subjek dari dua bagian terakhir dari posting ini! :)

Ambil dan perbarui gambar boot perangkat

Alat untuk mengambil dan memperbarui image booting perangkat dapat digunakan untuk berbagai hal selain dari perusakan aturan SELinux. Karena itu saya telah membuat jawaban khusus , silakan merujuknya.

Ubah aturan SELinux perangkat

Anda memiliki dua kemungkinan utama di sini:

  • Bangun sepolicyfile baru dari aturan di pohon sumber Anda (cari .tefile untuk menemukannya:, find $ANDROID_BUILD_TOP -name \*.temereka tersebar ke beberapa direktori).
  • Ubah sepolicyfile yang saat ini digunakan oleh perangkat.

Kecuali Anda benar-benar perlu membuat aturan dari nol, yang lebih merupakan tugas yang berhubungan dengan pengembangan dan karena itu di luar ruang lingkup di sini, pilihan kedua tampaknya yang paling aman karena Anda yakin bahwa satu-satunya perubahan akan menjadi milik Anda. dibuat secara eksplisit.

Sudah ada proyek untuk membuat alat yang memungkinkan Anda untuk mendekompilasi sepolicyfile ke dalam bentuk kompilasi, memungkinkan untuk mengedit aturan di antaranya. Namun proyek ini telah ditinggalkan dalam keadaan proof-of-concept. Anda akan menemukan semua informasi di akhir posting blog ini , sisa artikel berisi cukup detail untuk memungkinkan orang lain yang tertarik untuk mengambil alih.

Cara yang disarankan saat ini untuk mengubah sepolicyaturan menggunakan rute lain: dengan secara langsung memodifikasi sepolicyfile biner. alat injeksi sepolicy memungkinkan hal itu dan dipelihara secara aktif.

Demi kelengkapan, perhatikan bahwa ada garpu alat ini. Ini menambahkan beberapa fitur, beberapa di antaranya ada dalam daftar tugas penulis asli (seperti kemungkinan untuk menghapus aturan), jangan tanya saya mengapa mereka memilih untuk bercabang daripada berkontribusi ...

Untuk mengkompilasi dan menginstal sepolicy-inject, cukup lakukan sebagai berikut:

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/

Contoh kasus penggunaan

Katakanlah misalnya Anda ingin menambahkan autorisasi yang cocok dengan pesan kesalahan berikut:

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

Anda harus mengambil gambar boot perangkat, lalu membukanya untuk mendapatkan akses ke sepolicyfile itu.

Pemeriksaan cepat menggunakan sesearchmenunjukkan bahwa memang tidak ada aturan perbolehkan (belum!):

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

Perintah tidak memiliki output.

Kemudian, gunakan perintah di bawah ini untuk menambahkan aturan yang diperlukan (perhatikan kesamaan antara sesearchdan sepolicy-injectparameter):

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

Sekarang kita dapat memanggil kembali sesearchperintah kita :

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

sesearch output menunjukkan bahwa kebijakan telah diperbarui dengan benar.

Anda sekarang dapat mengemas kembali boot.imgfile perangkat dan mem-flash-nya kembali ke perangkat. Memeriksa waktu modifikasi terakhir /sepolicyfile adalah cara mudah untuk memastikan bahwa perangkat Anda sekarang menjalankan file yang baru diperbarui sepolicy.

Kesimpulan

Anda sekarang harus memiliki lingkungan yang lengkap yang memungkinkan Anda untuk secara bebas memeriksa dan memodifikasi kebijakan perangkat SELinux Android. Nikmati! :)

Sebagai catatan tambahan, ada juga alat yang memungkinkan untuk menganalisis dan memodifikasi kebijakan SELinux langsung dari perangkat .

WhiteWinterWolf
sumber
1
hanya satu catatan - jangan pernah melakukan "repo sync" kecuali Anda memiliki banyak kopi untuk diminum;) Gunakan "repo sync -q -f --force-sync -c" sebagai gantinya - itu akan menghemat banyak waktu dan ruang hard drive . -q sepi, -f dan --force-sync akan membantu Anda melanjutkan jika terjadi kesalahan jaringan sementara, -c akan mengambil cabang saat ini saja. PS Saya juga menggunakan flag "-d --prune" selama pengembangan ketika saya harus menghapus semua perubahan lokal dan beralih ke versi manifes.
Oleksandr
@Olexandr: Terima kasih atas informasi Anda, ini berguna untuk diketahui. Saya diuji dengan -cbendera, tetapi tidak melihat perbedaan besar: masih banyak data untuk diunduh komputer (25 GB), masih banyak kafein yang harus saya minum;). Saya agak waspada terhadap -fbendera, karena menurut pemahaman saya ini akan memaksa repountuk mengabaikan ketika gagal mengunduh beberapa bagian dari kode sumber dan masih menganggap hasil akhir sebagai sebuah keberhasilan. Saya lebih memilih untuk mencadangkan status "sukses" ke pengambilan lengkap, dan menghindari menemukan diri saya dalam situasi yang tidak diketahui di mana file mungkin hilang secara acak.
WhiteWinterWolf
2

Pertama-tama Anda harus membuat versi libsepol yang lebih lama dari kode AOSP (seperti yang sesuai dengan versi 6.0), kemudian tautkan sepolicy-inject, dispol, dll. Resep ini bekerja untuk saya di 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

tidak seperti injeksi sepolicy yang dikaitkan dengan libsepol sistem, yang ini berfungsi dengan baik / sepolicy dari gambar 6.0 yang termasuk dalam sdk android:

$ 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

Untuk alat yang termasuk dalam distribusi selinux, triknya adalah membangunnya dengan DESTDIR yang sama:

cd libsepol
make DESTDIR=/some/dir install
cd ../checkpolicy
make DESTDIR=/some/dir
# here you have a working 'dispol' in the 'test' subdir
memilih pizza
sumber
Terima kasih. Ini memberi saya versi sedispol yang tampaknya berfungsi, tetapi saya masih tidak bisa mengkompilasi sesearch. Sesearch mati mencari file include <apol/policy.h>(dari dalam policy.hfile lain ). Apakah Anda tahu modul mana yang berisi apol?
user3188445
@ user3188445: File apol/policy.hini disediakan oleh paket libapol-dev(setidaknya ini yang ada di sistem Ubuntu). Silakan merujuk ke jawaban saya untuk informasi lebih rinci.
WhiteWinterWolf
1

Untuk orang-orang yang menghadapi masalah dengan:

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

saat bekerja dengan kode AOSP.

Dengan asumsi, kode AOSP Anda diperiksa ke ~ / android / source dir:

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

Dan sekarang Anda bebas menggunakan utilitas audit2allow yang dibundel :

./external/selinux/prebuilts/bin/audit2allow

PS Juga, saya ingin membahas komentar Memeriksa kebijakan selinux android (v30)

Sesearch mati mencari file include (dari dalam file policy.h lain). Apakah Anda tahu modul mana yang mengandung apol?

Membangun selinux toolkit dari sumber https://github.com/SELinuxProject/selinux tidak terlalu sepele (kecuali jika Anda menggunakan Fedora). Di Ubuntu, Anda perlu menginstal (dengan asumsi Anda telah menginstal alat dev dasar seperti bison dan kompiler C) libglib2.0-dev, libcap-ng-dev, xmlto, libsemanage1-dev, libustr-dev, libaudit-dev, libsepol1 -dev

Tetapi pada akhirnya saya masih gagal untuk mengkompilasinya karena https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155 dan tidak tahu cara mengatasinya

Oleksandr
sumber
1
Saya juga menjumpai glibconfig.hkesalahan ini yang Anda tautkan di akhir posting Anda, itu dibangkitkan oleh restorecondMakefile karena jalur yang salah telah dikodekan dengan keras di dalamnya. Anda harus memodifikasinya agar secara dinamis menyelesaikan jalur yang digunakan pkg-config. Lihat jawaban saya untuk lebih jelasnya.
WhiteWinterWolf
1

Anda harus mencoba menerapkan tambalan ini ke sumber libsepol, dan kemudian secara bertahap membangun kembali semua hal itu. Itu bekerja untuk saya dalam masalah sam

Anda dapat mencoba menggunakan klon libsepol dengan patch terapan dari repo ini https: //[email protected]/metizik/selinux_tools.git Saya menggunakannya untuk membuat dispol di Windows, dan berfungsi dengan baik (masih perhatikan bahwa saya menggunakan cygwin untuk ini)

Мокич Андрей
sumber