[UNIX] ว่าด้วยเรื่อง Set-UID Privileged Program

Thanwa Jindarattana
3 min readSep 13, 2020

--

Set-UID Privileged Program หรือภาษาไทยใช้คำว่า โปรแกรมอภิสิทธิ์แบบใช้กลไก Set-UID

TL;DR:
คำถาม: ทำไมต้องมี Privileged Program?
คำตอบ: ต้องการจำกัดสิทธิ์ในการใช้สิทธิ์พิเศษ (เช่น root) เพียงชั่วขณะ

ลองมาดู use case ของโปรแกรม passwd (/usr/bin/passwd) สำหรับเปลี่ยน password

ก่อนอื่น มาดู permission ของไฟล์ /etc/shadow กันก่อน (ไฟล์สำหรับเก็บ encrypted password ของ user ทุกคน)

จะเห็นว่า owner สามารถที่จะเขียนไฟล์ได้เท่านั้น ส่วนกลุ่ม shadow สามารถอ่านได้อย่างเดียว

แล้วทำไมเราสามารถใช้สิทธิ์ user ในการเปลี่ยน password ของตัวเองได้โดยไม่ต้องใช้คำสั่ง sudo?

คำตอบก็คือ โปรแกรม passwd เป็น Set-UID program ไงล่ะ

ผู้ใช้งานที่ไม่มีสิทธิ root จะเปลี่ยน password ได้อย่างไร?

เนื่องจากข้อมูลที่เล็กที่สุดที่ OS จะมองเห็นจะเป็นแค่เพียงระดับของไฟล์ หากจะทำ access control ในระดับที่ละเอียดกว่าไฟล์ (ในกรณีของ /etc/shadow คือบรรทัดที่เกี่ยวของกับ user นั้น) จะต้องใช้ extension บางอย่าง ซึ่งตัวอย่างของ extension ที่จะพูดถึงในวันนี้คือ Privileged program

ชนิดของ Privileged Program

Daemons

  • โปรแกรมที่ทำงานบน background
  • มีสิทธิเท่าเทียมกับ root หรือ user ที่มี privilege เท่าเทียมกับ root

Set-UID Program (เราจะพูดถึงตัวนี้)

  • ใช้งานกันมากในระบบปฏิบัติการ UNIX
  • ใช้บิทพิเศษ Set-UID บอกความเป็น privileged program

แนวคิดของกลไก Set-UID

  • อนุญาตให้ user รันโปรแกรมโดยใช้สิทธิของ owner
  • สิทธิพิเศษนี้มีอยู่เฉพาะช่วงเวลาที่โปรแกรมทำงาน

ตัวอย่างโปรแกรม passwd

จะเห็นว่ามี bit ตัว “s” เพิ่มเข้ามาในส่วน permission ของ owner ซึ่งเราอาจคุ้นเคยกับ bit ปกติ เช่น read(r), write(r), excecute(x)

สามารถเรียนรู้กลไกของ setuid, setgid, และ sticky bit ได้จาก https://linuxconfig.org/how-to-use-special-permissions-the-setuid-setgid-and-sticky-bits

แนวคิดของ Set-UID

  • แต่ละ process มี user ID สองตัว
    Real UID (RUID) คือ UID ของ user ที่สั่งรันโปรแกรม
    Effective UID (EUID): คือ UID เจ้าของสิทธิที่สามารถรันโปรแกรมนั้นได้​ (Access control จะกระทำบนพื้นฐานของ EUID)
  • โปรแกรมทั่วไป RUID จะเท่ากับ EUID
  • โปรแกรม Set-UID นั้น RUID จะไม่เท่ากับ EUID

มาลองสร้างโปรแกรม Set-UID กัน

จะเห็นว่า permission ทั้ง owner และ group เป็นของ seed

ต่อไปให้เปลี่ยน owner ของ mycat เป็น root

ก่อนที่จะ set bit ของ Set-UID เราลอง cat /etc/shadow ผ่าน mycat ดูซิ

จะเห็นว่าติด Permission denied

งั้นเราลอง set bit ของ Set-UID กัน ใช้ คำสั่ง chmod 4755 โดยเลข 4 คือ setuid (setuid, setgid, และ sticky bit แทนด้วย 4, 2, และ 1 ตามลำดับ)

จะเห็นว่ามี bit “s” เพิ่มเข้ามาแล้ว ไหนลองรัน mycat ดูใหม่ซิ

จะเห็นว่าเราสามารถที่จะอ่านไฟล์ /etc/shadow ซึ่ง owner เป็นของ root โดยใช้ user ธรรมดา ได้ ด้วยหลักการนี้สามารถนำไปประยุกต์ใช้กับโปรแกรมอื่น ๆ เช่น passwd ได้

สรุป

  • Set-UID เป็นการจำกัดของเขตการใช้สิทธิพิเศษให้ใช้ได้เพียงชั่วขณะ (ขณะรันโปรแกรม)

ข้อควรระวัง

  • การให้โปรแกรมที่มี “อำนาจ” มากได้สิทธิ์เป็น Set-UID จะอันตรายมาก เช่น
    /bin/sh หรือ vi (vi สามารถรัน shell ภายในตัวมันได้) เพราะโปรแกรมเหล่านี้สามารถที่จะรันคำสั่งใด ๆ ก็ได้

แถม

เรามาดูการโจมตีที่เกิดขึ้นในอดีตผ่านช่องโหว่ของ Set-UID กัน

โปรแกรม change shell (chsh) เป็นโปรแกรมที่เปลี่ยน default shell ให้เป็นไปตามที่เรากำหนด โดยสามารถดูรายชื่อของ trusted shell ได้จากคำสั่ง cat /etc/shells และแน่นอนว่าโปรแกรมนี้เป็น Set-UID Privileged Program

ผู้โจมตีสามารถที่จะใช้ chsh ในการแก้ไขไฟล์ /etc/passwd ได้ ซึ่งโดยปกติจะมีแค่ root ที่สามารถ แก้ไขไฟล์นี้ได้เท่านั้น โดยหน้าตาของไฟล์จะเป็นประมาณนี้

จะเกิดอะไรขึ้นหากเราเพิ่ม new line แล้วตามด้วยข้อมูล entry ใหม่ของ user ใด ๆ โดยให้สิทธิ์พิเศษเช่น GID = 0 ?

วิธีแก้คือต้องทำการ sanitize input ซึ่งจะไม่ขอกล่าวในที่นี้

บทความต่อไป เรื่อง การ fork process และโปรแกรม shell สามารถเข้าไปอ่านได้จากลิงก์ด้านล่างครับ

--

--