TL; DR: นี่เป็นคำถามเกี่ยวกับขั้นตอนสุดท้ายในกระบวนการรูทแบบพกพาที่เน้นนักพัฒนาซึ่งทำงานได้กับเครื่อง Android ทั้งหมด มันไม่ได้ขึ้นอยู่กับการหาประโยชน์ใด ๆ - เป็นสิ่งที่เราได้รับอนุญาตอย่างถูกกฎหมายและถูกต้องตามกฎหมายในฐานะนักพัฒนาของเครื่องของเราเอง ถ้าฉันได้รับคำตอบและจัดการกับ chroot ภายใน Debian ของฉันฉันจะทำโพสต์บล็อกที่รัดกุมโดยละเอียดทุกขั้นตอนของกระบวนการนี้สำหรับนักพัฒนาเพื่อนทั้งหมดที่ต้องการเข้าถึงรูทไปยังแท็บเล็ตของพวกเขา - และไม่ต้องการเชื่อใจ "one-click-root" ที่ทำสิ่งที่พระเจ้ารู้ - สิ่งที่เครื่องของพวกเขา (สมาชิก botnet?) ... การอ้างอิงเท่านั้นจะเป็นแหล่งเคอร์เนลของเครื่อง (ซึ่งผู้ผลิตมีภาระผูกพันตามกฎหมายที่จะต้องให้) และอิมเมจพาร์ติชันสำหรับบูตboot.img
) ซึ่งเป็น 99% ของจำนวนครั้งในการอัพเดตแบบ over-the-air ที่ผู้ผลิตให้มาหรือสามารถดาวน์โหลดแยกต่างหากเป็นภาพแฟลชแบบสแตนด์อโลน
หนึ่งสัปดาห์ผ่านไปเมื่อฉันใช้เวลาว่างบนแท็บเล็ต Android ใหม่
และฉันก็เกือบจะประสบความสำเร็จอย่างสมบูรณ์ - ในการสร้างกระบวนการพกพาที่มุ่งเน้นนักพัฒนาเพื่อบรรลุรูตในแท็บเล็ต Android 5.0.2
แต่มีสิ่งหนึ่งที่ขาดหายไป - ฉันไม่สามารถ chroot (ซึ่งฉันต้องเรียกใช้debootstrap
เดเบียนของฉัน!)
สิ่งที่ฉันทำจนถึงตอนนี้
- ครั้งแรกผมได้แพทช์เล็ก ๆ น้อย ๆ ในแหล่งที่มา (ผู้ผลิตให้) เคอร์เนลแท็บเล็ตของฉันและจากนั้นรวบรวมเคอร์เนลของตัวเอง - ที่ฉันปิดการใช้งานการตรวจสอบสำหรับการเปลี่ยน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,
จากนั้นฉันเปลี่ยนรูปภาพเริ่มต้นของฉันเป็น
/default.prop
:ro.secure=0
และro.debuggable=1
เนื่องจากผู้ผลิตของฉัน
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 กับdebootstrap
Debian ที่น่ารักของฉัน:
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
ไอเอ็นจี
คำแนะนำใด ๆ ยินดีต้อนรับมากที่สุด ...