SELinux ve chroot sistem çağrısı


21

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

  1. İ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,
  1. Sonra initrd resmimi /default.propiçerecek şekilde değiştirdim: ro.secure=0vero.debuggable=1

  2. Benim üreticinin yana initrd.imgonu eksikti, ben de derlenmiş su.cgelen https://android.googlesource.com/platform/system/extras/+/master/su/ ve elde edilen ikili altından yerleştirilen /sbin/suhale 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 idsö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- debootstraped 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 iddö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 mountve chroot?

SELinux hakkında biraz daha okumaya başlayarak, ana makineme geri döndüğümde, /sepolicydosyanı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 kernelumut 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 ...

Yanıtlar:


12

Kim beni aldatmamý engelliyor?

SELinux değildi - vahşi bir kaz kovalamacıydı ( getenforce"Permissive" i döndürmek, SELinux'un artık resimde olmadığı anlamına gelir).

Suçlu printk, çekirdeğin kaynağına her ikisinin de başarısızlıklarını izlemek için bir dizi ekledikten sonra chrootve mount- yetenekler olduğu ortaya çıktı . Daha spesifik olarak, Android'in "yetenek sınırlayıcı seti" - man( man 7 capabilities) aracılığıyla onlar hakkında her şeyi okuyabilirsiniz ve itiraf etmedim daha önce onlara bakmaktan rahatsız olmadım - günlük UNIX görevlerim onlara bağlıydı ve hiçbir fikrim yoktu ... bunu deneyin linux kutunuzu kendiniz görün:

$ getfattr -d -m - /sbin/ping
getfattr: Removing leading '/' from absolute path names
# file: sbin/ping
security.capability=0s......

Görmek? Ping artık SUID kökü değildir - ham yuva katmanına erişimi olduğunu bilmek için dosya sisteminin genişletilmiş özniteliklerinde depolanan bilgileri kullanır (böylece ICMP işini yapabilir - IP düzeyinde).

Her neyse, çektiğim - çekirdekteki "yeteneklerimi düşür" setini durdurduğum ameliyat noktası - tartışmalı iğrenç bir şekilde, "hepsini yürütsünler" - bu ( security/commoncap.c):

static long cap_prctl_drop(struct cred *new, unsigned long cap)
{
    if (!capable(CAP_SETPCAP))
        return -EPERM;
    if (!cap_valid(cap))
        return -EINVAL;

    // ttsiodras: come in, everyone, the water's fine!
    //cap_lower(new->cap_bset, cap);
    return 0;
}

Bu, yeteneklerin ASLA düşürülmediği anlamına gelir - gerçekten çok güvenli bir yapılandırma, :-)

$ adb shell

shell@K01E_2:/ $ su

root@K01E_2:/ # chroot /data/debian/ /bin/bash

root@localhost:/# export PATH=/bin:/sbin:/usr/bin:/usr/sbin:\
     /usr/local/bin:$PATH

root@localhost:/# cat /etc/issue
Debian GNU/Linux 8 \n \l

Merhaba tatlı Debian :-)

Oh, ve "Kök denetleyicisi" de çalışıyor - "su.c" yi kırptım, böylece tabletimdeki herkes kök olabilir:

int main(int argc, char **argv)
{
  struct passwd *pw;
  uid_t uid, myuid;
  gid_t gid, gids[50];

  /* Until we have something better, only root and shell can use su. */
  myuid = getuid();
  //
  // ttsiodras - Oh no, you don't :-)
  //
  //if (myuid != AID_ROOT && myuid != AID_SHELL) {
  //    fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
  //    return 1;
  //}

Şimdi çalıştığını, bunu düzgün çalışması yapmalıdır - yani sadece benim izin termuxve Terminal Emulatorkullanıcıların çağırmak için suve chrootherkesi ve büyük annesini izin değil, :-)


Bu kök yöntemi, kendi çekirdeğinizi flaşlama yeteneğini gerektirmez mi? Bunun için kilidi açılmış bir bootloader gerekir. Hangi noktada sadece özel bir kurtarma flaş ve bu şekilde kök kazanabilirsiniz.
1110101001

@ 1110101001 Bootloader için: tabii ki evet. Özel kurtarma için: tabletim için böyle bir şey (henüz) yok - şimdi bir tane oluşturmak için bir pozisyondayım ;-)
ttsiodras

1
1110101001 @: Ve bir şey daha - sen "flaş yeteneği" dedi -, ben sadece ondan önyükleme ediyorum ben tablete benim askeri görüntüyü parladı değil: fastboot boot my.img. Köklü toplumun buna bağlı köklendirme adını verdiğine inanıyorum :-) Ve tabii ki flaş edebilirim - eğer istersem.
ttsiodras
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.