TP; DR: Bu, tüm Android makinelerde çalışan taşınabilir, geliştirici odaklı bir köklendirme sürecindeki son adım hakkında bir soru. Herhangi bir sömürüye dayanmaz - yasal olarak ve ahlaki olarak geliştiriciler olarak kendi makinelerimize yapmamıza izin verilen bir şeydir. Bir cevap alır ve Debian'ımın içine girmeyi başarırsam, tabletlerine kök erişimi isteyen ve şüpheli kökene güvenmek istemeyen tüm diğer geliştiriciler için bu sürecin tüm adımlarını ayrıntılı olarak anlatan özlü bir blog yazısı yapacağım. Tanrı'nın makinelerine (botnet üyeleri?) ne bildiğini bilen "tek tıklama kökleri" ... Tek bağımlılıklar makinenin çekirdek kaynakları (üreticinin yasal olarak sağlamakla yükümlü olduğu) ve önyükleme bölümü görüntüsü (boot.img
) içerir; bu, üretici tarafından sağlanan Kablosuz güncellemelerin içindeki sürelerin% 99'udur veya bağımsız bir flash özellikli resim olarak tek tek indirilebilir.
Böylece, tüm boş zamanımı yeni Android tabletimde geçirdiğim bir hafta geçti.
Ve neredeyse tamamen başarılı oldum - Android 5.0.2 tabletimde root elde etmek için taşınabilir, geliştirici odaklı bir süreç oluşturmada.
Ama henüz bir şey eksik - bir chroot yapamam (ki benim debootstrap
-ed Debian'ımı çalıştırmam gerekiyor !)
Şimdiye kadar ne yaptım
- İlk olarak, tabletimin (üretici tarafından sağlanan) çekirdek kaynaklarında küçük bir yama yaptım ve sonra kendi çekirdeğimi derledim - burada SELINUX zorlama modunu değiştirme kontrollerini devre dışı bıraktım . Özellikle ...
İçinde security/selinux/selinuxfs.c
:
...
if (new_value != selinux_enforcing) {
/* Commented out by ttsiodras.
length = task_has_security(current, SECURITY__SETENFORCE);
if (length)
goto out;
*/
audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_STATUS,
"enforcing=%d old_enforcing=%d auid=%u ses=%u",
new_value, selinux_enforcing,
Sonra initrd resmimi
/default.prop
içerecek şekilde değiştirdim:ro.secure=0
vero.debuggable=1
Benim üreticinin yana
initrd.img
onu eksikti, ben de derlenmişsu.c
gelen https://android.googlesource.com/platform/system/extras/+/master/su/ ve elde edilen ikili altından yerleştirilen/sbin/su
hale emin SUID köküne ayarlanır (chmod 04755 /sbin/su
) .
Bundan sonra, önceki yazımın 2. Bölümünde açıkladığım gibi yeni çekirdeği ve yeni initrd'i paketledim ve kendi görüntümden önyükledim:
adb reboot boot-loader ; fastboot boot myboot.img
Yani, kök müsün?
Evet, başlangıçta başarılı görünüyordu:
$ adb shell
shell@K01E_2:/ $ id
uid=2000(shell) gid=2000(shell) groups=1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),
3003(inet),3006(net_bw_stats)
context=u:r:shell:s0
shell@K01E_2:/ $ ls -l /sbin/su /sbin/_su
-rwxr-xr-x root root 131 2015-10-03 10:44 su
-rwsr-xr-x root root 9420 2015-10-03 01:31 _su
(the _su is the binary I compiled, set to SUID root, and "su" is
a script I wrote to tell "su" to add me to all these groups...)
shell@K01E_2:/ $ cat /sbin/su
#!/system/bin/sh
export PATH=/system/bin:$PATH
exec /sbin/_su 0,0,1000,1028,2000,2001,1004,1007,1011,1015,\
1028,3001,3002,3003,3006
Ve şimdi kök elde ettim:
shell@K01E_2:/ $ su
root@K01E_2:/ # id
uid=0(root) gid=0(root)
groups=1000(system),1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),1028(sdcard_r),2000(shell),2001(cache),
3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats)
context=u:r:shell:s0
Kök olduğumdan% 100 eminim - sadece id
söylediği için değil, aynı zamanda normal işlemlerin kesinlikle yapamadığı şeyleri de yapabildiğim için:
root@K01E_2:/ # ls -l /dev/block/platform/msm_sdcc.1/by-name/boot
lrwxrwxrwx root root 2015-10-03 10:47 boot -> /dev/block/mmcblk0p16
root@K01E_2:/ # dd if=/dev/block/mmcblk0p16 of=/dev/null bs=1M
16+0 records in
16+0 records out
16777216 bytes transferred in 0.569 secs (29485441 bytes/sec)
Bakın ve sonunda tabletimdeki ham bölümleri okuyabilirim!
SELinux gerçekten de "aşağı, köpek" modunda:
root@K01E_2:/ # getenforce
Permissive
Ama ... hala yapamayacağım şeyler var:
root@K01E_2:/ # mkdir /my_mnt
root@K01E_2:/ # mount -t ext4 /dev/block/mmcblk1p2 /my_mnt
mount: Operation not permitted
Yani, harici SD kartımın EXT4-fs formatlı 2. bölümünü bağlayamıyorum.
Ben de benim güzel- debootstrap
ed Debian benim chroot olamaz :
root@K01E_2:/ # chroot /data/debian/ /bin/bash
chroot() fail
Operation not permitted
SELinux yüzünden mi?
Bilmiyorum - SELinux'a yeniyim (çok yeni - bir haftalık). Uykuya daldığınızda ( getenforce
"İzin Verici" bildirerek) artık müdahale etmediğini düşündüm ...
Görünüşe göre yanılmışım. Tavşan deliğinden tekrar başlıyoruz ...
Süreç bağlamım yüzünden olabilir mi?
Bunun id
döndürdüğünü unutmayın ... "uid = 0 (kök) gid = 0 (kök) ... context = u: r: shell: s0 "
Bu bağlamı değiştirebilir miyim? Kök ve her şey olmaktan uzaklaşabilir miyim shell
? Ve eğer öyleyse, neye geçelim?
İlk sorunun cevabı runcon
:
shell@K01E_2:/ $ runcon u:r:debuggerd:s0 /sbin/su
root@K01E_2:/ # id
uid=0(root) gid=0(root)... context=u:r:debuggerd:s0
İyi. Ama hangi bağlam bana izin verecek mount
ve chroot
?
SELinux hakkında biraz daha okumaya başlayarak, ana makineme geri döndüğümde, /sepolicy
dosyanın kökündeki dosyayı ayrıştırıyorum initrd.img
:
linuxbox$ $ sesearch -A sepolicy | grep chroot
allow init_shell init_shell : capability { chown sys_chroot ...
allow init init : capability { chown dac_read_search sys_chroot ...
allow kernel kernel : capability { chown dac_override sys_chroot ...
allow asus-dbug-d asus-dbug-d : capability { chown sys_chroot ...
...
Tamam, birkaç olasılık! Özellikle bu kernel
umut verici görünüyor:
shell@K01E_2:/ $ runcon u:r:kernel:s0 /sbin/su
root@K01E_2:/ # id
uid=0(root) gid=0(root)... context=u:r:kernel:s0
root@K01E_2:/ # chroot /data/debian/ /bin/bash
chroot() fail
Operation not permitted
Lanet.
Beni kim engelliyor chroot
?
Herhangi bir tavsiye en hoş geldiniz ...