Android, Tech

[Android] Systemless root คืออะไร ทำงานยังไง

ก่อนอื่นขอแจ้งไว้หน่อยว่าเอนทรี่นี้เป็นแค่การจดบันทึกในเรื่องที่ได้ศึกษามา เกี่ยวกับหลักการทำงานของ systemless root ใน Android ว่ามันคืออะไร ทำงานยังไง แต่อาจจะไม่ได้ลงรายละเอียดแบบลึกมาก และคงไม่ได้เขียนในลักษณะเป็นบทความที่เป็นทางการมากนัก เพราะหลายอย่างยังต้องใช้เวลาศึกษาเพิ่มเติมต่ออีก แต่ก็จะแปะลิงก์ไว้เผื่อใครสนใจก็ตามไปอ่านต่อได้ อีกอย่างตอนนี้ผมยังไม่มีอุปกรณ์ Android 6.0 ให้ลองใช้เลยไม่สามารถ proof บางอย่างได้ ก็คงเอาแค่หลักการทำงานแบบ overview ไปก่อนละกัน

root คืออะไร

เนื่องจากหัวข้อนี้มีคนเขียนไว้เยอะแล้ว งั้นก็ขอข้ามไปเลยดีกว่า เอาเป็นว่าใครที่เข้ามาอ่านบล็อกนี้คงมีความรู้พื้นฐานเรื่องการ root Android อยู่แล้ว แต่ถ้ายังไม่รู้ว่ามันคืออะไรก็ไป Google โลด

รูปแบบและวิธีที่ใช้ในการ root

หลักๆ รูปแบบการ root มี 2 แบบคือแบบชั่วคราว (non-permanent หรือ temporary) กับแบบถาวร (permanent) ซึ่งส่วนใหญ่เมื่อพูดถึงการ root เครื่องเรามักจะหมายถึง root แบบ permanent กันมากกว่า

การ root แบบ non-permanent คือการ exploit ช่องโหว่ของตัว Android เพื่อให้ได้สิทธิ์ root อย่างเช่นใช้พวกช่องโหว่ประเภท remote code execution ร่วมกับช่องโหว่ privilege escalation ซึ่งการ root ด้วยวิธีนี้อาจไม่จำเป็นต้องไปแก้ไขไฟล์ระบบเลย ข้อเสียของวิธีนี้คือถ้าปิด process หรือ restart เครื่อง สิทธิ์ root ก็จะหายไป

ส่วนอีกแบบคือการ root แบบ permanent ก็จะเป็นการแก้ไขข้อมูลในพาร์ทิชัน /system เพื่อเอาไฟล์ su binary ใส่เข้าไป รวมถึงการแก้ไขไฟล์ init เพื่อให้เวลาบู๊ตเครื่องขึ้นมาใหม่จะมีการโหลด daemon สำหรับใช้เป็น super user manager ขึ้นมาทำงานด้วย

โดยปกติแล้วในการใช้งาน Android เราจะไม่สามารถแก้ไขข้อมูลใน /system ได้ แต่ถ้าเกิดใช้วิธีการ exploit ช่องโหว่ของระบบเพื่อให้ได้สิทธิ์ root ก็สามารถทำได้ ซึ่งพวกแอปประเภท universal root อย่างเช่น towelroot หรือ Kingo root ก็ใช้วิธีนี้กัน

หรือถ้าจะใช้วิธีที่ง่ายสุด ก็แค่ unlock bootloader แล้ว flash custom recovery จากนั้นก็แค่ flash ไฟล์ .zip ที่มี su binary เข้าไปก็จบ แต่ข้อเสียคือการ unlock bootloader จำเป็นต้อง factory reset เครื่องก่อน อีกอย่างบางยี่ห้อ (เช่น Sony) ถ้า unlock bootloader แล้วฟีเจอร์หลายๆ อย่างจะไม่สามารถใช้งานได้ เช่น ฟีเจอร์ถ่ายภาพในที่แสงน้อย หรือการอัปเดตซอฟต์แวร์เฉพาะ

อีกวิธีการนึงที่ทำได้คือการ flash firmware ที่มีไฟล์ su binary ยัดใส่ไว้แล้ว (เรียกว่า pre-rooted firmware) ซึ่งมือถือหลายๆ รุ่นอย่างเช่น Samsung, Sony ก็มีคนทำ firmware ลักษณะนี้ไว้ให้ สามารถหาดาวน์โหลดได้จาก xda ซึ่งวิธีนี้ข้อดีคือไม่ต้อง factory reset เครื่องเหมือนวิธี unlock bootloader และยังสามารถ root firmware รุ่นใหม่ๆ ที่ยังไม่มี root exploit ได้ด้วย

ปัญหาของ Permanent root

เนื่องจากการ root แบบ permanent จำเป็นต้องแก้ไขข้อมูลใน system partition ซึ่งก็มีข้อจำกัดบางอย่าง เช่น ถ้าเป็นการอัปเดต OS แบบที่ต้องมีการ format /system ก็จะทำให้ root หาย หรือถ้าเกิด root ไปแล้วอยาก unroot บางทีก็มีปัญหาว่าถอนออกได้ไม่สมบูรณ์ ยังเหลือไฟล์ขยะอยู่ใน /system เป็นต้น

อีกอย่าง เนื่องจากใน Android 6.0 Marshmallow ทาง Google ได้มีการปรับรูปแบบการทำงานของ SELinux ใหม่ คือตัว SELinux นี่มีมาตั้งแต่สมัย Android 4.3 แล้วแหละ แต่ว่าตั้งแต่เวอร์ชัน 4.3 – 5.5.1 การทำงานของ SELinux เป็นแบบ Permissive คือมีแค่การบันทึก log แต่ไม่ได้บล็อคการทำงานของอะไรที่ผิดไปจาก security policy พอ Android 6.0 มีการเพิ่มระบบ App Permission Management เข้ามา Google ก็เลยปรับให้ SELinux ทำงานในแบบ Enforcing ด้วย นั่นทำให้การ root Android 6.0 แบบ permanent ทำได้ยากขึ้น คือถ้าจะ root ต้อง flash custom kernel ที่แก้ไขค่า SELinux policy จาก Enforcing เป็น Permissive ซึ่งหมายความว่ามันจะทำให้ระบบโดยรวมมีความปลอดภัยลดลงมาก

Systemless root

เนื่องจากการ root โดยเข้าไปแก้ไขข้อมูลใน /system มีปัญหาหลายอย่าง นักพัฒนาเครื่องมือ root ชื่อดังอย่าง Chainfire ก็เลยคิดว่า ถ้ามันยุ่งยากนักก็เข้าไปแก้ไขที่ตัว boot image มันซะเลย

การ root ด้วยวิธีแบบใหม่นี้เป็นการแก้ไขไฟล์ boot.img แล้ว flash เข้าไปทับของเดิม ซึ่งมีข้อดีคือเป็น permanent root ได้โดยไม่ต้องไปแก้ไขอะไรใน /system เลย (ถึงได้เรียกว่า systemless) และไม่มีปัญหาเวลาอัปเดต firmware รวมถึงไม่ต้องไป flash custom kernel ซึ่งมีโอกาสทำให้เครื่อง brick ได้

หลักการทำงานแบบคร่าวๆ คือเป็นการเอาไฟล์ boot.img จาก stock firmware มาแก้ไข ramdisk โดยแทนที่จะไปแก้ไขการตั้งค่า SELinux policy ที่ kernel ก็มาแก้ไขที่ ramdisk แทน ส่วน path ของไฟล์ su ก็แก้ปัญหาโดยการสร้างไดเรกทอรีที่มีไฟล์ su binary ใน /data แล้ว mount ไปเป็น /system/xbin

เนื่องจากตอนนี้ผมยังไม่มีอุปกรณ์ที่เป็น Andriod 6.0 มาลองเล่น แถมไฟล์ที่มีให้โหลดใน forum ก็มีเฉพาะ boot.img ของ Nexus เลยอดทดสอบว่ามันทำงานยังไง ทำได้ขนาดไหน แต่เดี๋ยวถ้ามีข้อมูลมากกว่านี้จะมาอัปเดตอีกที

จะศึกษาอะไรต่อ?

เนื่องจากเรารู้แล้วว่ากระบวนการ root แบบ systemless มันคือการแก้ไขไฟล์ boot.img ซึ่งเป็นไฟล์ boot image ที่มีส่วนประกอบหลักๆ คือ kernel กับ ramdisk ซึ่งตัว ramdisk นี่ใน Linux มันใช้เก็บพวกสคริปต์ที่เกี่ยวข้องกับกระบวนการ boot (เช่นพวก init) แต่ใน Android มันมีอะไรเพิ่มเข้ามาอีกบ้างคงต้องไปไล่ศึกษาดูอีกที (ผมแปะลิงก์เรื่องนี้ไว้ด้านล่างเผื่อใครสนใจ)

เนื่องจากตอนนี้การจะศึกษาว่าเค้าแก้ไข ramdisk ยังไงให้สามารถ root แบบ systemless ได้ จำเป็นต้องมีความรู้พื้นฐานอีกหลายอย่างซะก่อน ดังนั้นสิ่งที่จะศึกษาต่อก็คงมีประมาณนี้:

  • ศึกษากระบวนการ boot ของ Linux และ Android ว่าขั้นตอนการทำงานเป็นยังไง มีความแตกต่างอะไรบ้าง
  • ศึกษาโครงสร้างของไฟล์ boot.img (คร่าวๆ คือมันเป็น gzip สามารถ gunzip ออกมาดูได้)
  • ทดลอง unpack, edit, repack ไฟล์ boot image
  • (ถ้าเป็นไปได้) อยากลองโหลด source code ของ Android มาลอง build ดู จะได้รู้ว่ามันทำงานยังไง
  • … เก็บตังไว้ซื้อ Nexus ละกัน
Android-Boot-Process
ที่มาภาพ: MIUI

References

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s