การเรียกระบบ SELinux และ chroot


21

TL; DR: นี่เป็นคำถามเกี่ยวกับขั้นตอนสุดท้ายในกระบวนการรูทแบบพกพาที่เน้นนักพัฒนาซึ่งทำงานได้กับเครื่อง Android ทั้งหมด มันไม่ได้ขึ้นอยู่กับการหาประโยชน์ใด ๆ - เป็นสิ่งที่เราได้รับอนุญาตอย่างถูกกฎหมายและถูกต้องตามกฎหมายในฐานะนักพัฒนาของเครื่องของเราเอง ถ้าฉันได้รับคำตอบและจัดการกับ chroot ภายใน Debian ของฉันฉันจะทำโพสต์บล็อกที่รัดกุมโดยละเอียดทุกขั้นตอนของกระบวนการนี้สำหรับนักพัฒนาเพื่อนทั้งหมดที่ต้องการเข้าถึงรูทไปยังแท็บเล็ตของพวกเขา - และไม่ต้องการเชื่อใจ "one-click-root" ที่ทำสิ่งที่พระเจ้ารู้ - สิ่งที่เครื่องของพวกเขา (สมาชิก botnet?) ... การอ้างอิงเท่านั้นจะเป็นแหล่งเคอร์เนลของเครื่อง (ซึ่งผู้ผลิตมีภาระผูกพันตามกฎหมายที่จะต้องให้) และอิมเมจพาร์ติชันสำหรับบูตboot.img) ซึ่งเป็น 99% ของจำนวนครั้งในการอัพเดตแบบ over-the-air ที่ผู้ผลิตให้มาหรือสามารถดาวน์โหลดแยกต่างหากเป็นภาพแฟลชแบบสแตนด์อโลน

หนึ่งสัปดาห์ผ่านไปเมื่อฉันใช้เวลาว่างบนแท็บเล็ต Android ใหม่

และฉันก็เกือบจะประสบความสำเร็จอย่างสมบูรณ์ - ในการสร้างกระบวนการพกพาที่มุ่งเน้นนักพัฒนาเพื่อบรรลุรูตในแท็บเล็ต Android 5.0.2

แต่มีสิ่งหนึ่งที่ขาดหายไป - ฉันไม่สามารถ chroot (ซึ่งฉันต้องเรียกใช้debootstrapเดเบียนของฉัน!)

สิ่งที่ฉันทำจนถึงตอนนี้

  1. ครั้งแรกผมได้แพทช์เล็ก ๆ น้อย ๆ ในแหล่งที่มา (ผู้ผลิตให้) เคอร์เนลแท็บเล็ตของฉันและจากนั้นรวบรวมเคอร์เนลของตัวเอง - ที่ฉันปิดการใช้งานการตรวจสอบสำหรับการเปลี่ยนSELINUX โหมดการบังคับใช้ โดยเฉพาะ ...

ใน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. จากนั้นฉันเปลี่ยนรูปภาพเริ่มต้นของฉันเป็น/default.prop: ro.secure=0และro.debuggable=1

  2. เนื่องจากผู้ผลิตของฉันinitrd.imgหายไปฉันจึงรวบรวมsu.cจากhttps://android.googlesource.com/platform/system/extras/+/master/su/และวางไบนารีผลลัพธ์ภายใต้/sbin/suตรวจสอบให้แน่ใจว่าได้ตั้งค่าเป็นรูท SUID ( chmod 04755 /sbin/su) .

หลังจากนั้นฉันก็บรรจุเคอร์เนลใหม่และ initrd ใหม่ดังที่ฉันได้อธิบายไว้ในตอนที่ 2 ของโพสต์ก่อนหน้าของฉัน - และบูตจากรูปภาพของตัวเอง:

adb reboot boot-loader ; fastboot boot myboot.img

แล้วคุณรูทหรือเปล่า

ใช่ในตอนแรกดูเหมือนว่าจะประสบความสำเร็จ:

$ 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

และตอนนี้ฉันได้บรรลุความสำเร็จแล้ว:

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

ฉันมั่นใจ 100% ว่าฉันรูท - ไม่เพียงเพราะidพูดอย่างนั้น แต่เพราะฉันสามารถทำสิ่งต่าง ๆ ที่กระบวนการปกติไม่สามารถทำได้:

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)

ทองหล่อและดูเถิด - ในที่สุดฉันก็สามารถอ่านพาร์ติชั่นออกมาจากแท็บเล็ต

และ SELinux นั้นอยู่ในโหมด "down, dog":

root@K01E_2:/ # getenforce                                                     
Permissive

แต่ ... มียังคงสิ่งที่ฉันไม่สามารถทำ:

root@K01E_2:/ # mkdir /my_mnt

root@K01E_2:/ # mount -t ext4 /dev/block/mmcblk1p2 /my_mnt
mount: Operation not permitted

นั่นคือฉันไม่สามารถเมานต์พาร์ติชันที่ 2 ที่จัดรูปแบบ EXT4-fs ของการ์ด SD ภายนอกของฉันได้

ฉันยังไม่สามารถ chroot กับdebootstrapDebian ที่น่ารักของฉัน:

root@K01E_2:/ # chroot /data/debian/ /bin/bash                             
chroot() fail
Operation not permitted

เป็นเพราะ SELinux หรือไม่

ฉันไม่รู้ - ฉันใหม่ (ใหม่มาก - หนึ่งสัปดาห์) กับ SELinux ฉันคิดว่าเมื่อคุณทำให้มันเข้าสู่โหมดสลีป ( getenforceรายงานว่า "อนุญาต") จะไม่รบกวนอีกต่อไป ...

เห็นได้ชัดว่าฉันผิด เราลงไปที่โพรงกระต่ายอีกครั้ง ...

อาจเป็นเพราะบริบทกระบวนการของฉัน

จำไว้ว่าidส่งคืน ... "uid = 0 (root) gid = 0 (root) ... context = u: r: shell: s0 "

ฉันสามารถเปลี่ยนบริบทนั้นได้หรือไม่ เมื่อเป็นรากและทั้งหมดฉันสามารถย้ายออกจากได้shellหรือไม่ และถ้าเป็นเช่นนั้นย้ายไปที่อะไร

คำตอบสำหรับคำถามแรกคือ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

ดี. แต่สิ่งที่บริบทจะช่วยให้ฉันmountและchroot?

อ่านเพิ่มเติมเกี่ยวกับ SELinux กลับมาในเครื่องหลักของฉันฉันแยก/sepolicyไฟล์ในรากของ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 ...
...

ตกลงจำนวนของความเป็นไปได้! โดยเฉพาะอย่างยิ่งที่kernelดูเหมือนว่ามีแนวโน้ม:

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

ยี้

ใครห่ากสกัดฉันจากchrootไอเอ็นจี

คำแนะนำใด ๆ ยินดีต้อนรับมากที่สุด ...

คำตอบ:


12

ใครคือคนที่ขัดขวางฉันจากการ chrooting?

ไม่ใช่ SELinux - นั่นคือการไล่ล่าห่านป่า (การgetenforceส่งคืน "การอนุญาต" หมายความว่า SELinux ไม่ได้อยู่ในรูปภาพอีกต่อไป)

ผู้ร้าย - หลังจากที่เพิ่มจำนวนมากของprintkในเคอร์เนลที่มาของความล้มเหลวในการติดตามของทั้งสองchrootและmount- เปิดออกมาเป็นความสามารถในการ โดยเฉพาะอย่างยิ่ง "ชุดขอบเขตความสามารถ" ของ Android - คุณสามารถอ่านทั้งหมดเกี่ยวกับพวกเขาผ่านทางman( man 7 capabilities) และฉันขอสารภาพว่าฉันไม่เคยสนใจที่จะมองพวกเขามาก่อน - งาน UNIX ประจำวันของฉันขึ้นอยู่กับพวกเขา กล่อง linux ของคุณเพื่อดูตัวคุณเอง:

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

ดู? Ping ไม่ใช่รูท SUID อีกต่อไป - ใช้ข้อมูลที่เก็บไว้ในแอตทริบิวต์เพิ่มเติมของระบบไฟล์เพื่อให้รู้ว่าสามารถเข้าถึงเลเยอร์ซ็อกเก็ตดิบได้ (เพื่อให้สามารถทำสิ่งนั้นได้คือ ICMP - ที่ระดับ IP)

อย่างไรก็ตามฉันพูดนอกเรื่อง - จุดผ่าตัดในเคอร์เนลของฉันที่ฉันหยุด "วางความสามารถของฉันตั้ง" - ในน่าขยะแขยง arguably "ให้พวกเขาทั้งหมดเดินขบวน" - นี่คือ ( 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;
}

ซึ่งหมายความว่าความสามารถไม่เคยลดลง - การกำหนดค่าที่ปลอดภัยมากแน่นอน :-)

$ 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

สวัสดี Debian แสนหวานของฉัน :-)

โอ้และ "ตัวตรวจสอบรูท" ก็ใช้งานได้เช่นกัน - ฉันคัดลอก "su.c" เพื่อให้ทุกคนในแท็บเล็ตของฉันกลายเป็นรูตได้:

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;
  //}

ตอนนี้ที่ทำงานผมต้องทำให้มันทำงานได้อย่างถูกต้อง - คือให้มีเพียงฉันtermuxและTerminal Emulatorผู้ใช้สามารถเรียกใช้suและchrootและไม่ปล่อยให้ทุกคนและคุณยายของพวกเขาใน :-)


วิธีรูทนี้ไม่ต้องการความสามารถในการกะพริบเคอร์เนลของคุณเองใช่ไหม และในการทำนั้นต้องใช้ bootloader ที่ปลดล็อค ณ จุดนี้คุณก็สามารถกู้คืนข้อมูลที่กำหนดเองและเข้าสู่รูทดังกล่าวได้
1110101001

@ 1110101001 สำหรับ bootloader: ชัดใช่ สำหรับการกู้คืนที่กำหนดเอง: ไม่มีสิ่งนั้น (ยัง) สำหรับแท็บเล็ตของฉัน - ฉันอยู่ในตำแหน่งที่จะสร้างมันขึ้นมาแม้ว่า ;-)
ttsiodras

1
@ 1110101001: และสิ่งหนึ่งที่เพิ่มเติม - คุณกล่าวว่า "ความสามารถในการแฟลช" - ฉันไม่ได้ประกายภาพบูตของฉันไปที่แท็บเล็ต, fastboot boot my.imgฉันเพียงแค่บูตจากมัน ฉันเชื่อว่าชุมชนการรูตเรียกสิ่งนี้ว่าการรูทการเชื่อมโยงกับอินเทอร์เน็ตและแน่นอนว่าฉันสามารถฉายได้หากต้องการ
ttsiodras
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.