กระบวนการ Android Zygote: กุญแจสำคัญในการบูต ประสิทธิภาพการทำงาน และความปลอดภัย

  • Zygote คือกระบวนการพื้นฐานที่กระบวนการแอปพลิเคชันทั้งหมดใน Android เกิดขึ้น โดยช่วยเร่งความเร็วในการเริ่มต้นระบบและเพิ่มประสิทธิภาพการใช้หน่วยความจำ
  • ประสิทธิภาพและความปลอดภัยของระบบปฏิบัติการ Android ขึ้นอยู่กับการแยกกระบวนการและการป้องกันของ Zygote ต่อภัยคุกคามหรือการดัดแปลงที่เป็นอันตรายเป็นอย่างมาก
  • ภัยคุกคามเช่น Triada Trojan ได้ใช้ประโยชน์จากช่องโหว่ใน Zygote เพื่อติดเชื้อกระบวนการต่างๆ มากมาย แสดงให้เห็นถึงความสำคัญของการดูแลรักษาระบบให้อัปเดตและปลอดภัย
  • ด้วย Zygote ระบบ Android ช่วยให้คุณเปิดแอปได้อย่างรวดเร็ว แชร์ทรัพยากรหน่วยความจำ และรักษาประสบการณ์ผู้ใช้ที่ราบรื่นและปลอดภัย

ตัวอ่อน

ระบบนิเวศของระบบปฏิบัติการ Android ถูกสร้างขึ้นจากกระบวนการภายในและโครงสร้างพื้นฐานชุดหนึ่งที่รับรองการทำงาน ประสิทธิภาพการทำงาน และความปลอดภัย หนึ่งในสิ่งที่สำคัญที่สุดแต่บางทีอาจเป็นที่รู้จักน้อยที่สุดนอกขอบเขตของนักพัฒนาและผู้เชี่ยวชาญระบบคือสิ่งที่เรียกว่า กระบวนการไซโกต- มันเป็นเรื่องของอะไรกันแน่? กระบวนการไซโกต, มันแทรกแซงสถาปัตยกรรมภายในของ Android อย่างไร มีความเกี่ยวข้องกับระบบและแอพพลิเคชั่นอย่างไร และเหตุใดจึงเป็นจุดสนใจสำหรับการเพิ่มประสิทธิภาพการทำงานและภัยคุกคามความปลอดภัยขั้นสูง เช่น Triada Trojan? ในบทความต่อไปนี้ คุณจะพบกับข้อมูลเชิงลึก เชิงเทคนิค และเชิงปฏิบัติเกี่ยวกับองค์ประกอบหลักของ Android และทุกแง่มุมที่เกี่ยวข้องที่เกิดขึ้นนับตั้งแต่เริ่มก่อตั้ง

หากคุณเคยสงสัย แอปต่างๆ เปิดบนโทรศัพท์ของคุณได้เร็วมากได้อย่างไร หรือมีอะไรเกิดขึ้นเบื้องหลัง? เมื่อคุณเปิดอุปกรณ์ Android คำตอบจะพาคุณไปที่หัวใจของระบบ: กระบวนการ Zygote และวิธีที่ Android จัดการการเริ่มต้นระบบ หน่วยความจำ ความปลอดภัย และการทำงานของแอพ การทำความเข้าใจกระบวนการนี้ไม่เพียงแต่เกี่ยวข้องกับการทำความเข้าใจเทคโนโลยีระบบเท่านั้น แต่ยังรวมถึงความเสี่ยงด้านความปลอดภัยที่อาจเกิดขึ้นซึ่งผู้ใช้อย่างเราๆ เผชิญในปัจจุบัน และความท้าทายที่นักพัฒนาและผู้ผลิตต้องพิจารณาเพื่อให้แน่ใจว่าอุปกรณ์จะทำงานได้รวดเร็ว ปลอดภัย และยืดหยุ่นต่อการโจมตีที่ซับซ้อน

กระบวนการ Zygote บน Android คืออะไรกันแน่?

ในภาษาแสลงของ Android กระบวนการไซโกต เป็นเทมเพลตฐาน (หรือเทมเพลตหลัก) ที่ใช้สร้างกระบวนการแอปพลิเคชันทั้งหมดในระบบปฏิบัติการ หน้าที่หลักคือการเร่งความเร็วและเพิ่มประสิทธิภาพการสร้างกระบวนการใหม่เมื่อเปิดแอปโดยใช้เทคนิคที่มีประสิทธิภาพมากที่เรียกว่า ส้อมซึ่งมาจากโลก Linux/Unix ชื่อ 'ไซโกต' เองก็อ้างอิงถึงบทบาทของมัน ซึ่งก็คือเซลล์เริ่มต้นที่กระบวนการย่อยต่างๆ จะเกิดขึ้นทุกครั้งที่มีการเปิดใช้แอปพลิเคชันในระบบ

กระบวนการ Zygote ไม่ใช่เพียงกระบวนการใดๆ ใน Android นี่เป็นกระบวนการพิเศษที่เริ่มต้นเร็วมากเมื่ออุปกรณ์กำลังบูตทันทีหลังจากนั้น เคอร์เนลลินุกซ์ (เคอร์เนลระบบปฏิบัติการ) โหลดเสร็จสิ้นแล้ว และกระบวนการ 'init' (กระบวนการแรกที่เคอร์เนลรัน) ได้เตรียมสภาพแวดล้อมพื้นฐานไว้ ไซโกตถูกปล่อยออกมาโดย init เป็นหนึ่งในบริการแรกๆ ของระบบ และเมื่อดำเนินการดังกล่าว จะโหลดข้อมูลทั้งหมดลงในหน่วยความจำ (RAM) ร้านหนังสือ จากชวาและ ทรัพยากรส่วนกลาง ซึ่งจะจำเป็นสำหรับการทำงานของแอปพลิเคชั่น Android ซึ่งรวมถึงไลบรารีระบบ เฟรมเวิร์ก และสิ่งที่ต้องพึ่งพาสำคัญอื่นๆ ที่แอปส่วนใหญ่ใช้ร่วมกัน

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

การเดินทางสู่ระบบปฏิบัติการ Android: Zygote ในบริบท

บูตแอนดรอยด์

เพื่อทำความเข้าใจตำแหน่งที่แน่นอนของไซโกต จำเป็นต้องทำความเข้าใจระยะต่างๆ ของ บูตเข้าระบบ Android- การบูตระบบประกอบด้วยขั้นตอนสำคัญหลายขั้นตอน: Boot ROM (การเริ่มต้นใช้งานฮาร์ดแวร์) Bootloader (บูตโหลดเดอร์ที่เริ่มเคอร์เนล Linux) เมล็ด (โหลดฟังก์ชั่นระบบพื้นฐานและไดร์เวอร์) ในนั้น (กระบวนการรูทที่เริ่มการกำหนดค่าและบริการที่จำเป็น) จากนั้น กระบวนการไซโกต- นี่เป็นช่วงเวลาที่ความมหัศจรรย์ของ Android Runtime (ART) หรือในเวอร์ชันเก่ากว่าคือเครื่องเสมือน Dalvik เริ่มต้น

ตัวอ่อน ไม่ได้อยู่คนเดียว: หลังจากเริ่มต้นและเมื่อติดตั้งระบบไฟล์แล้ว กระบวนการ init เปิดตัวบริการที่สำคัญและเดมอน (กระบวนการพื้นหลัง) หลายรายการ เช่น 'servicemanager' (ตัวจัดการบริการระบบ) 'logd' (ตัวจัดการบันทึก) 'vold' (ตัวจัดการปริมาณการจัดเก็บข้อมูล) และเปิดใช้งานโครงสร้างพื้นฐานการสื่อสารระหว่างกระบวนการ (IPC) ของ Binder อย่างไรก็ตาม Zygote ยังคงรับผิดชอบในการเปิดตัวเครื่องเสมือน Android และเตรียมสภาพแวดล้อมสำหรับกระบวนการของผู้ใช้และส่วนประกอบระดับสูงอื่น ๆ

เมื่อ Zygote เริ่มทำงานแล้ว งานต่อไปคือการเริ่มกระบวนการ เซิร์ฟเวอร์ระบบซึ่งเป็นเสาหลักพื้นฐานอีกประการหนึ่งของระบบปฏิบัติการ กระบวนการนี้ซึ่งเป็น 'ลูก' โดยตรงของ Zygote จะเปิดใช้งานและบำรุงรักษาชุดบริการหลักทั้งหมดตัวจัดการกิจกรรม, ตัวจัดการแพ็คเกจ, ตัวจัดการหน้าต่าง และอื่นๆ อีกมากมายที่เป็นส่วนประกอบในชีวิตประจำวันของโทรศัพท์ Android ทุกเครื่อง และถ้าหากว่ายังไม่พอ Zygote ยังจะเป็นจุดเริ่มต้นทุกครั้งที่จำเป็นต้องเปิดแอปพลิเคชันของผู้ใช้ใหม่ เพื่อให้แน่ใจว่ากระบวนการย่อยแต่ละกระบวนการสืบทอดสภาพแวดล้อมที่สอดคล้องและปลอดภัย โดยมีไลบรารีและกรอบงานทั้งหมดที่พร้อมใช้งาน

กลไกของส้อม: ประสิทธิภาพและความปลอดภัย

ความลับของการแสดงของไซโกตอยู่ที่เทคนิคของ ส้อม- เมื่อจำเป็นต้องเริ่มแอปใหม่ กระบวนการ Zygote จะไม่สร้างสภาพแวดล้อมใหม่ตั้งแต่เริ่มต้น แต่จะดำเนินการแทน ส้อม จากตัวมันเอง สร้างกระบวนการย่อยที่รวมส่วนประกอบที่ใช้ร่วมกันทั้งหมดที่โหลดไว้ในหน่วยความจำแล้ว ซึ่งมีข้อดีหลายประการ:

  • ประหยัดเวลา: กระบวนการย่อยมีไลบรารีทั่วไปใน RAM อยู่แล้ว จึงไม่จำเป็นต้องโหลดซ้ำหรือคอมไพล์ไบต์โค้ดใหม่ ซึ่งจะช่วยเพิ่มความเร็วในการเปิดแอป
  • ลดการใช้ทรัพยากร: การแบ่งปันหน่วยความจำระหว่างกระบวนการ (เช่น ด้วย mmapping) จะทำให้การใช้ทรัพยากรโดยรวมต่ำลงและหลีกเลี่ยงการซ้ำซ้อนที่ไม่จำเป็น
  • ความสม่ำเสมอและการแยกตัว: กระบวนการย่อยที่สืบทอดโดย Zygote แต่ละกระบวนการเริ่มต้นในสภาพแวดล้อมที่ได้รับการกำหนดไว้ล่วงหน้าอย่างสอดคล้องกันแต่แยกจากกัน โดยอาศัยระบบแซนด์บ็อกซ์ของ Android ซึ่งช่วยลดความเสี่ยงของการเสียหายของหน่วยความจำและปรับปรุงเสถียรภาพโดยรวม

เป็นสิ่งที่ควรกล่าวถึงว่าในการดำเนินการเช่นนี้ ความปลอดภัยถือเป็นสิ่งสำคัญที่สุด แอปพลิเคชั่นแอนดรอยด์ การอนุญาตที่เข้มงวด, UID และกลุ่มผู้ใช้ แตกต่างกันสำหรับแต่ละแอปพลิเคชัน โดยให้แน่ใจว่าข้อมูลและทรัพยากรของแอปพลิเคชันหนึ่งไม่สามารถเข้าถึงได้โดยตรงจากอีกแอปพลิเคชันหนึ่ง ยกเว้นข้อยกเว้นที่มีการกำหนดและจัดการอย่างชัดเจน เมื่อ Zygote 'แยก' กระบวนการแอปพลิเคชันใหม่ มันจะกำหนด UID ที่ไม่ซ้ำใคร และดำเนินการในสภาพแวดล้อมที่ควบคุมของตัวเอง ดังนั้น แม้ว่าไลบรารีและเฟรมเวิร์กจะมีการแบ่งปันกันในหน่วยความจำ แต่ทรัพยากรสำคัญอื่นๆ ยังคงได้รับการปกป้อง

หน่วยความจำที่จัดการและแชร์: บทบาทของ Zygote และ Android Runtime

การจัดการหน่วยความจำใน Android เชื่อมโยงอย่างลึกซึ้งกับการออกแบบของ Zygote ทั้ง Android Runtime (ART) และเครื่องเสมือน Dalvik รุ่นเก่าจัดการหน่วยความจำในลักษณะที่บริหารจัดการได้โดยใช้การรวบรวมขยะและเทคนิคการสร้างเพื่อจัดสรรและปล่อยทรัพยากรโดยอัตโนมัติตามความต้องการของระบบและแอป เมื่อแอปแยกตัวออกมาจาก Zygote แอปจะสืบทอดไม่เพียงแต่ไลบรารี แต่ยังรวมถึงฮีปหน่วยความจำที่ตั้งไว้ล่วงหน้าด้วย ซึ่งช่วยควบคุมการใช้และเพิ่มประสิทธิภาพการแบ่งปันหน้า RAM

Android ใช้กลไกเช่นหน่วยความจำร่วม (ashmem, gralloc) และ การแมปไฟล์แบบคงที่ (เช่น .odex, .so หรือไฟล์ทรัพยากรระบบ) เพื่อให้กระบวนการแอปไม่ทำซ้ำข้อมูลที่จำเป็นในหน่วยความจำ ไซโกตมีบทบาทสำคัญในที่นี้ เนื่องจากรับผิดชอบในการเริ่มต้นและโหลดทรัพยากรทั่วไปเหล่านี้ก่อนที่จะสร้างกระบวนการย่อยตัวแรก ด้วยวิธีนี้ แอปใดๆ ที่เปิดใช้ในภายหลังก็สามารถได้รับประโยชน์จากสถาปัตยกรรมนี้ได้โดยไม่ต้องเสียภาระในการโหลดหรือรอคอย

สถาปัตยกรรมภายใน: ทุกสิ่งเชื่อมต่อกันอย่างไรใน Android

แอป exe

Android ถูกสร้างขึ้นเป็นชั้นๆ โดยแต่ละชั้นจะทำหน้าที่หลักและสื่อสารกับชั้นอื่นๆ ผ่านอินเทอร์เฟซที่มีการกำหนดไว้อย่างชัดเจน ที่ฐานเป็น เคอร์เนลลินุกซ์รับผิดชอบการจัดการกระบวนการ ผู้ใช้ หน่วยความจำ และอุปกรณ์ทางกายภาพ (ไดรเวอร์) เหนือเขาขึ้นไป ฮาร์ดแวร์นามธรรมเลเยอร์ (HAL) เป็นสะพานเชื่อมที่สม่ำเสมอในการโต้ตอบกับฮาร์ดแวร์ ช่วยให้อุปกรณ์ต่างๆ สามารถรัน Android ได้โดยไม่ต้องกังวลมากเกินไปเกี่ยวกับความแตกต่างทางเทคนิคในชิปหรือเซ็นเซอร์แต่ละตัว

ชั้นถัดไปประกอบด้วยชุดของ ห้องสมุดพื้นเมือง (ส่วนมากอยู่ใน C/C++) ซึ่ง libc, SSL, SQLite และเครื่องเสมือน Android เองก็โดดเด่นออกมา ทั้งหมดนี้ถูกโหลดล่วงหน้าโดย Zygote และประกอบเป็น "สภาพแวดล้อมมาตรฐาน" สำหรับแอป ข้างต้นดำเนินการ รันไทม์ของ Android (ART) หรือในระบบเก่ากว่าคือ Dalvik Virtual Machine (DVM) ซึ่งรับผิดชอบในการดำเนินการไบต์โค้ดของแอปพลิเคชัน (ในรูปแบบ .dex) โดยใช้กลยุทธ์การคอมไพล์ทั้งแบบ Just-in-Time (JIT) และแบบ Ahead-of-Time (AOT)

เหนือรันไทม์เราพบ กรอบงานบริการระบบสามารถเข้าถึงได้จากแอปพลิเคชัน Java/Kotlin ผ่านทาง API ระดับสูง ที่นี่เป็นที่ตั้งของ Activity Manager, Package Manager, Content Provider, Window Manager และบริการสำคัญอื่น ๆ โดยส่วนใหญ่จะเริ่มต้นจากกระบวนการ System Server ที่แยกโดย Zygote ในที่สุด ชั้นบนสุดจะถูกครอบครองโดยแอปพลิเคชันของผู้ใช้ ซึ่งทำงานภายในกระบวนการที่ควบคุมโดยระบบของตนเอง และไม่เคยอยู่บนเคอร์เนลโดยตรง

วงจรชีวิตของแอปพลิเคชันและบทบาทของไซโกต

วงจรชีวิตของแอพ Android ใดๆ ก็ตามมีความเชื่อมโยงอย่างใกล้ชิดกับวิธีที่ Zygote จัดการการเปิด การทำงาน และการปิดกระบวนการ เมื่อผู้ใช้เปิดแอป ระบบจะตรวจสอบว่ามีกระบวนการกำลังทำงานส่วนประกอบใด ๆ ของแอปนั้นอยู่หรือไม่ หากไม่เป็นเช่นนั้น ให้ขอให้ Zygote ดำเนินการแยกสาขาและสร้างกระบวนการใหม่ เมื่อดำเนินการเสร็จแล้ว ระบบจะโหลดโค้ดและทรัพยากรเฉพาะแอป เริ่มกิจกรรมหลัก และเริ่มวงจรชีวิตปกติ (onCreate, onResume เป็นต้น)

หากผู้ใช้สลับแอปหรือปิดแอป กระบวนการนั้นโดยทั่วไปจะยังคงแคชไว้ชั่วขณะเพื่อเร่งความเร็วในการเปิดแอปใหม่อีกครั้ง แต่ระบบสามารถหยุดการทำงานได้ตลอดเวลาหากตรวจพบว่ามีความจำเป็นต้องปลดทรัพยากร ด้วยมรดกของ Zygote การเปิดแอปใหม่อีกครั้งจึงรวดเร็วมาก แม้จะอยู่ในสถานะเย็น เนื่องจากจำเป็นต้องเริ่มต้นเฉพาะโค้ดที่เฉพาะเจาะจงเท่านั้น

ในส่วนของการแยกตัว แอปแต่ละตัวจะทำงานด้วยตัวของมันเอง โพสต์ และการอนุญาตถูกจำกัดโดยระบบความปลอดภัยของ Android การดำเนินการนี้จะช่วยป้องกันไม่ให้แอปหนึ่งได้รับการเข้าถึงข้อมูลหรือทรัพยากรของแอปอื่นโดยไม่ได้รับอนุญาต ยกเว้นในสถานการณ์ที่ควบคุม (เช่น การใช้ SharedUserId หรือการอนุญาตที่ชัดเจนใน Manifest) การป้องกันได้รับการเสริมความแข็งแกร่งด้วยเคอร์เนล Linux และนโยบายความปลอดภัยเช่น SELinux หากต้องการเจาะลึกลงไปว่าสถาปัตยกรรมระบบ Android ทั้งหมดเชื่อมต่อกันอย่างไร อาจเป็นประโยชน์หากตรวจสอบดู โครงการ Android x86.

ความปลอดภัยของ Android และ Zygote: ความเสี่ยงและมาตรการ

สถาปัตยกรรมการรักษาความปลอดภัยของ Android มีพื้นฐานอยู่บนหลายชั้น โดยที่ Zygote และแซนด์บ็อกซ์เป็นองค์ประกอบหลัก แอปแต่ละรายการทำงานในแซนด์บ็อกซ์ของตัวเองโดยมีผู้ใช้เพียงรายเดียว และการโต้ตอบกับระบบหรือแอปอื่น ๆ จะถูกควบคุมโดยกรอบงาน นโยบายการอนุญาต และการใช้ UID/GID ที่กำหนดไว้ในไฟล์ android_filesystem_config.h

อย่างไรก็ตาม ความจริงที่ว่า Zygote เป็นเทมเพลตสำหรับแอปพลิเคชันทั้งหมด หมายความว่าช่องโหว่หรือการจัดการใดๆ ในกระบวนการนี้สามารถก่อให้เกิดผลกระทบด้านความปลอดภัยที่ร้ายแรงอย่างยิ่ง ในความเป็นจริงกระบวนการไซโกตเป็นเป้าหมายของบางส่วน มัลแวร์ ที่ซับซ้อนที่สุดที่ตรวจพบในโลก Android เช่น โครงการรีมิกซ์โอเอส.

กรณี Triada: เมื่อมัลแวร์โจมตี Zygote

ในด้านความปลอดภัยทางไซเบอร์ การโจมตีที่ฉาวโฉ่ที่สุดที่กำหนดเป้าหมายไปที่กระบวนการ Zygote ดำเนินการโดยโทรจัน ได้รับการแต่งตั้ง- มัลแวร์นี้ซึ่งค้นพบโดย Kaspersky Lab ถือเป็นจุดเปลี่ยนสำคัญในวิวัฒนาการของภัยคุกคามบนอุปกรณ์พกพา ด้วยการใช้ประโยชน์จากการเข้าถึงระบบเพื่อปรับเปลี่ยน Zygote เอง และฉีดโค้ดที่เป็นอันตรายเข้าไปด้วยวิธีนี้ ในทุกกระบวนการสมัคร.

Triada โดดเด่นด้วยเหตุผลหลายประการ:

  • การได้รับสิทธิ์ root: มันใช้โทรจันอื่นเพื่อเข้าถึงรูท ซึ่งละเมิดข้อจำกัดด้านความปลอดภัยปกติของ Android
  • การติดเชื้อไซโกต: เมื่อได้รับการยกระดับแล้ว จะปรับเปลี่ยนหน่วยความจำของ Zygote เพื่อฝังโมดูลที่เป็นอันตราย โดยกลายเป็นส่วนหนึ่งของเทมเพลตของกระบวนการย่อยทั้งหมด ดังนั้น แอปทั้งหมดที่เปิดตัวตั้งแต่นั้นเป็นต้นมาจะสืบทอดฟังก์ชันที่เป็นอันตราย ทำให้แทบจะมีอยู่ทุกที่และตรวจจับได้ยากมาก
  • ฟังก์ชันแบบโมดูลาร์และต่อเนื่อง: Triada ได้รับการออกแบบมาให้มีความยืดหยุ่น ดาวน์โหลดและดำเนินการโมดูลตามต้องการ โดยมีเป้าหมายหลักเพื่อแฮ็กธุรกรรมทางการเงินผ่านทาง SMS ขโมยข้อมูลส่วนบุคคล ติดตั้งแอพที่เป็นอันตรายอื่นๆ ซ่อนการมีอยู่ และแม้แต่เอาชีวิตรอดจากการรีบูตระบบ
  • ความยากในการถอดออก: เนื่องจากโค้ดส่วนใหญ่อยู่ในหน่วยความจำ (RAM) เท่านั้นและไม่อยู่ในดิสก์ จึงแทบไม่สามารถถูกซอฟต์แวร์ป้องกันไวรัสแบบเดิมตรวจพบได้ และสามารถกำจัดได้ด้วยการล้างอุปกรณ์ทั้งหมดเท่านั้น
EFIDroid คืออะไรและทำงานอย่างไร?
บทความที่เกี่ยวข้อง:
EFIDroid: บูต Android หลายระบบโดยไม่ต้องแก้ไขการกู้คืน