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.img
file. Untuk mengatakannya secara berbeda, CyanogenMod memberi Anda alat yang akan memungkinkan Anda untuk mengakses sepolicy
file 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-get
dalam posting ini untuk tetap menggunakan penyebut umum terendah dan membuat semua orang senang, Anda dapat memilih untuk menggunakannyaaptitude
karena 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). AFAIKaptitude
perintah 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_TOP
menyimpan lokasi sumber Anda (direktori tempat Anda mengeluarkan repo sync
perintah). 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 restorecond
Makefile tidak dapat menemukan beberapa perpustakaan. Anda harus mengedit Makefile ini untuk menggunakan jalur yang dihasilkan secara dinamis oleh pkg-config
alih-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=-fPIC
pengaturan 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 clean
dan 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
*.o
file 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 sesearch
biner 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 libsepol
versoin 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-decls
dari 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 *.h
file tidak ditemukan:
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 *.h
file tidak ditemukan, dan ya Anda harus menerapkan pendekatan "coba-dan-lihat" siklik yang sama ini.
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 make
misalnya), jika tidak, Anda mungkin perlu memodifikasi Makefile itu sendiri ( pkg-config
perintah ini mungkin sangat membantu untuk secara otomatis menghasilkan parameter build yang hilang) .
Cari di sistem pengemasan:
apt-cache search filename-dev
Mana filename-dev
mewakili nama file yang hilang dalam huruf kecil dengan .h
ekstensi diganti dengan -dev
akhiran (misalnya, jika Python.h
tidak ditemukan, cari python-dev
). Beberapa penyesuaian dalam nama yang tepat mungkin diperlukan untuk menemukan paket yang tepat.
Jika Anda tetap terjebak dan bahkan pencarian cepat di Internet tidak memberikan jawaban yang jelas, maka apt-file
akan menjadi teman terbaik Anda. apt-file
tidak terinstal secara default, Anda harus menginstalnya dan menghasilkan databasenya:
sudo apt-get apt-file
sudo apt-file update
apt-file
memungkinkan Anda untuk mencari paket (bahkan yang dihapus) yang menyediakan file tertentu. Untuk menghindari hasil yang terlalu banyak, saya sarankan untuk mengaitkannya dengan grep
seperti di bawah ini:
apt-file search filename.h | grep -w filename.h
Jika ada paket di repositori Ubuntu yang menyediakan file ini, maka apt-file
seharusnya dapat menemukannya.
Setelah Anda menemukan paket yang tepat, menginstalnya menggunakan apt-get install packagename
mana packagename
adalah 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 sepolicy
file 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
sepolicy
file -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
sepolicy
file baru dari aturan di pohon sumber Anda (cari .te
file untuk menemukannya:, find $ANDROID_BUILD_TOP -name \*.te
mereka tersebar ke beberapa direktori).
- Ubah
sepolicy
file 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 sepolicy
file 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 sepolicy
aturan menggunakan rute lain: dengan secara langsung memodifikasi sepolicy
file 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 sepolicy
file itu.
Pemeriksaan cepat menggunakan sesearch
menunjukkan 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 sesearch
dan sepolicy-inject
parameter):
sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy
Sekarang kita dapat memanggil kembali sesearch
perintah 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.img
file perangkat dan mem-flash-nya kembali ke perangkat. Memeriksa waktu modifikasi terakhir /sepolicy
file 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 .
-c
bendera, tetapi tidak melihat perbedaan besar: masih banyak data untuk diunduh komputer (25 GB), masih banyak kafein yang harus saya minum;). Saya agak waspada terhadap-f
bendera, karena menurut pemahaman saya ini akan memaksarepo
untuk 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.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:
tidak seperti injeksi sepolicy yang dikaitkan dengan libsepol sistem, yang ini berfungsi dengan baik / sepolicy dari gambar 6.0 yang termasuk dalam sdk android:
Untuk alat yang termasuk dalam distribusi selinux, triknya adalah membangunnya dengan DESTDIR yang sama:
sumber
<apol/policy.h>
(dari dalampolicy.h
file lain ). Apakah Anda tahu modul mana yang berisiapol
?apol/policy.h
ini disediakan oleh paketlibapol-dev
(setidaknya ini yang ada di sistem Ubuntu). Silakan merujuk ke jawaban saya untuk informasi lebih rinci.Untuk orang-orang yang menghadapi masalah dengan:
saat bekerja dengan kode AOSP.
Dengan asumsi, kode AOSP Anda diperiksa ke ~ / android / source dir:
Dan sekarang Anda bebas menggunakan utilitas audit2allow yang dibundel :
PS Juga, saya ingin membahas komentar Memeriksa kebijakan selinux android (v30)
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
sumber
glibconfig.h
kesalahan ini yang Anda tautkan di akhir posting Anda, itu dibangkitkan olehrestorecond
Makefile karena jalur yang salah telah dikodekan dengan keras di dalamnya. Anda harus memodifikasinya agar secara dinamis menyelesaikan jalur yang digunakanpkg-config
. Lihat jawaban saya untuk lebih jelasnya.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
audit2allow, audit2why, dan sesearch semuanya rusak dengan pembaruan kebijakan hulu AOSP ke v.30.
Anda harus menerapkan tambalan di bawah ini dan membangun kembali pohon Android Anda untuk memperbarui kebijakan db. Tambalan ini sudah digabung ke cabang utama dan tersedia mulai dari Android N.
https://android-review.googlesource.com/187140 https://android-review.googlesource.com/187111
sumber