[UNIX] ว่าด้วยเรื่อง Set-UID Privileged Program
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 สามารถเข้าไปอ่านได้จากลิงก์ด้านล่างครับ
อ้างอิง
https://www.handsonsecurity.net/resources.html by Kevin Du
https://www.udemy.com/course/du-computer-security
https://www.handsonsecurity.net/files/problems/Set-UID_ex.pdf
https://seedsecuritylabs.org/Labs_16.04/Software/Environment_Variable_and_SetUID/
[01204554] Data Encryption & Security by Paruj Ratanaworabhan