16 คะแนน โดย GN⁺ 2024-05-01 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

run0: เครื่องมือมาแทน sudo ของ systemd

  • เครื่องมือใหม่ที่รวมอยู่ใน v256 (จริง ๆ แล้วเป็น symlink ของ systemd-run ที่มีอยู่เดิม)
  • ทำงานคล้าย sudo แต่ไม่ใช่ SUID
  • ร้องขอให้ service manager เรียกคำสั่งหรือเชลล์ด้วย UID ของผู้ใช้เป้าหมาย
    • เรียกคำสั่งเป้าหมายใน execution context แบบแยกออกจากกัน ซึ่งถูก fork ขึ้นใหม่จาก PID 1 โดยไม่สืบทอด context จากฝั่งไคลเอนต์
  • run0 ไม่ได้มีการสร้างภาษา configuration ของตัวเอง แต่ใช้ polkit สำหรับการอนุญาตสิทธิ์
  • ระหว่างการยกระดับสิทธิ์ จะเปลี่ยนพื้นหลังของเทอร์มินัลเป็นโทนสีแดงเพื่อบอกว่ากำลังทำงานด้วยสิทธิ์พิเศษ และจะแสดงจุดสีแดงในชื่อหน้าต่างเพื่อระบุสถานะการยกระดับสิทธิ์ด้วย
  • รองรับสวิตช์ --property= ของ systemd-run จึงสามารถกำหนด service setting ตามต้องการสำหรับคำสั่ง/เซสชันสิทธิ์พิเศษที่ถูกเรียกใช้งานได้

ปัญหาของ sudo

  • sudo เป็นไบนารี SUID ที่ค่อนข้างใหญ่ เป็นโค้ดสิทธิ์พิเศษที่ผู้ใช้ไม่มีสิทธิ์สามารถเรียกใช้ได้จาก context ของตนเอง
  • มีพื้นผิวการโจมตีขนาดใหญ่จากภาษา configuration ที่ซับซ้อน, ปลั๊กอินที่โหลดได้ (เช่น LDAP), การจับคู่ชื่อโฮสต์ ฯลฯ
  • ประเด็นที่ใหญ่ที่สุดคือการเป็นไบนารี SUID มันถูกเรียกโดยโค้ดที่ไม่มีสิทธิ์ และสืบทอด execution context ที่โค้ดไม่มีสิทธิ์ควบคุมอยู่ (เช่น environment variable, คุณสมบัติการจัดตารางโปรเซส, การจัดสรร cgroup, security context, file descriptor ที่ส่งต่อมา ฯลฯ) ไบนารี SUID จึงต้องคอยล้างสิ่งเหล่านี้อย่างระมัดระวังมาก แต่หลายครั้งก็ทำได้ไม่ดีพอ

อื่น ๆ

  • run0 สามารถใช้รันได้ไม่เฉพาะเชลล์ แต่รวมถึงคำสั่งอื่น ๆ ด้วยสิทธิ์ root ได้เช่นกัน และเมื่อโปรแกรมจบการทำงาน สีของเทอร์มินัลจะกลับเป็นเหมือนเดิม
  • การเปลี่ยนสีพื้นหลังอัตโนมัติอาจทำให้ไม่สะดวก แต่สามารถเปลี่ยนหรือปิดได้ด้วยสวิตช์ --background=
  • ดูเหมือนจะสามารถแทนที่ sudo ด้วย run0 ได้ทั้งหมด แต่แต่ละดิสทริบิวชันอาจมีแนวทางที่ชอบต่างกัน
  • แนวทางปลั๊กอินของ sudo เช่นการรองรับ LDAP มีปัญหาหลายอย่าง ส่วน polkit สามารถขยายได้ในแนวทางที่ systemd จัดการได้อย่างปลอดภัย
  • การที่สคริปต์ bash จะตรวจสอบว่ารันผ่าน run0 หรือไม่ สามารถดูได้จาก environment variable SUDO_xxx ที่เข้ากันได้กับ sudo

ความเห็นของ GN⁺

  • น่าประทับใจที่มีการเสนอ run0 เป็นทางเลือกแทน sudo ซึ่งถูกใช้งานกันอย่างแพร่หลาย ดูเหมือนว่าจะยังคงข้อดีของ sudo ไว้ได้ พร้อมหลีกเลี่ยงความเสี่ยงของ SUID
  • การแจ้งสถานะการยกระดับสิทธิ์อย่างชัดเจนในเชิงภาพน่าจะช่วยลดความเสียหายจากความผิดพลาดได้ แม้การเปลี่ยนสีพื้นหลังเทอร์มินัลอาจกวนใจบ้าง แต่ก็ปรับได้ด้วยตัวเลือก จึงไม่น่าเป็นปัญหาใหญ่
  • การตั้งค่าสิทธิ์ผ่าน polkit อาจยืดหยุ่นน้อยกว่า sudo แต่ในทางกลับกันก็อาจทำให้เรียบง่ายขึ้นและลดพื้นผิวการโจมตีลงได้ การมีตัวอย่างการตั้งค่า polkit ที่จัดทำเอกสารไว้อย่างดีจึงดูสำคัญ
  • สำหรับการย้ายระบบจากสคริปต์เดิม ๆ ที่พึ่งพา sudo อยู่ ก็น่าจะยังต้องมี sudo ให้ใช้งานควบคู่ไปอีกระยะหนึ่ง แต่ถ้าเป็นสภาพแวดล้อมใหม่ก็น่าเริ่มใช้ run0 ตั้งแต่ต้น
  • ในระยะยาว หวังว่าการนำ run0 มาใช้จะเป็นจุดเริ่มให้กล้าตัด SUID ออกไป และเปลี่ยนไปสู่อาร์กิเทกเจอร์ที่รวมการจัดการสิทธิ์ของระบบไว้ที่ system service อย่างเป็นศูนย์กลาง ซึ่งถือเป็นทิศทางที่เหมาะสมในแง่ความปลอดภัยและความทนทานของระบบ

1 ความคิดเห็น

 
GN⁺ 2024-05-01
ความคิดเห็นจาก Hacker News
  • run0 ต่างจาก sudo ตรงที่ไม่รับช่วงคอนเท็กซ์ใด ๆ จากไคลเอนต์ และจะเรียกคำสั่งเป้าหมายภายใน exec context แบบแยกขาดที่ fork ขึ้นใหม่จาก PID 1 ซึ่งไม่สอดคล้องกับกรณีใช้งานทั่วไปของคำสั่ง shell จึงมีแนวโน้มว่าจะกลายเป็นต้นตอของปัญหาในทางปฏิบัติและยากจะถูกนำไปใช้แพร่หลาย
  • หาก run0 ถูกใช้อย่างกว้างขวาง ก็มีแนวโน้มว่าจะมีการเพิ่มแฟลกให้ทำงานแบบเดียวกับ sudo และผู้คนก็จะใช้แฟลกนั้นตลอดเวลา เมื่อสิ่งนี้ก่อปัญหา โปรเจกต์ systemd อาจพยายามถอด sudo ออก
  • run0 ใช้แนวทางที่ต่างจาก sudo โดยมีขอบเขต IPC ที่เข้มงวดระหว่างระดับสิทธิ์ จึงอาจเป็นวิธีที่ดีสำหรับคนที่ต้องการใช้ systemd
  • sudo ส่วนใหญ่ถูกดูแลโดยคนเพียงคนเดียว
  • พฤติกรรมของ run0 ในหลายด้านใกล้เคียงกับ ssh มากกว่า sudo และสามารถสร้างเครื่องมือที่คล้ายกันได้ด้วยการเชื่อมต่อ SSH ไปยัง localhost
  • ไอเดียคล้ายกันนี้เคยถูกทดสอบใน BSD โคลนเชิงทดลองของ Berkeley ช่วงกลางทศวรรษ 1980 แต่ถูกปฏิเสธเพราะความซับซ้อนของการส่งทุกอย่างผ่าน pipe และจึงหันไปเสริมความเข้มงวดของการตรวจสอบสภาพแวดล้อมที่สืบทอดมาแทน
  • ยังมีคำถามเกี่ยวกับ run0 ในเรื่องการบันทึกล็อก ตัวแปรสภาพแวดล้อมที่ถูกส่งต่อ การจัดการสัญญาณ และแนวทางทดแทน sudoedit
  • นอกจาก run0 แล้ว ยังมี implementation ของ sudo ที่เขียนด้วย Rust ซึ่งปลอดภัยด้านหน่วยความจำและมีบั๊กน้อยกว่า
  • ช่วงหลังมานี้มักมีผู้ใช้เพียงคนเดียวต่อเครื่องจริงหนึ่งเครื่อง จึงมีความจำเป็นต้องทำให้ระบบสิทธิ์ของ Unix เรียบง่ายขึ้น
  • การเปลี่ยนสีพื้นหลังของเทอร์มินัลเป็นสีแดงเมื่อมีการยกระดับสิทธิ์ไม่ใช่ส่วนสำคัญ