SUID là gì?
SUID (set-user-ID bit) là một permission bit thêm trên file thực thi trong Unix/Linux (ngoài ra còn GUID và Sticky). Khi được bật, process chạy chương trình sẽ nhận effective UID bằng owner của file (thường là root), bất kể người gọi là ai. Cơ chế nền tảng liên quan trực tiếp tới effective UID/saved set-user-ID và các syscall như setuid() trong Linux

Vì SUID cho phép chạy với quyền cao hơn bình thường, nên: SUID không tự động “nguy hiểm”, nhưng bất kỳ lỗi lập trình/cấu hình sai trong binary SUID có thể biến thành đường leo thang đặc quyền. Cách nhìn này cũng được mô tả trong tài liệu theo hướng detection/defense: kẻ tấn công thường “tận dụng misconfiguration hoặc lỗ hổng” trong SUID/SGID để lên root
Lỗi bảo mật
1. “Quyền thừa” và không hạ quyền đúng cách
Một lỗi thiết kế phổ biến: chương trình chạy với quyền cao lâu hơn mức cần thiết, hoặc không “drop privileges” sau khi hoàn tất tác vụ cần quyền. Đây là tư duy điển hình của CWE-250: Execution with Unnecessary Privileges
Hệ quả: chỉ cần có thêm một bug khác (đọc/ghi file, overflow, command injection…) là tác động trở nên nghiêm trọng vì nó chạy với quyền root
2. Môi trường
Setuid programs luôn là “điểm nóng” của các vấn đề liên quan biến môi trường. Ví dụ:
- Nhiều biến LD_* (như LD_PRELOAD, LD_LIBRARY_PATH) bị dynamic linker bỏ qua khi chạy setuid để giảm nguy cơ hijack thư viện. Điều này được thảo luận rõ ở các tài liệu/lab về Set-UID & environment variables và giải thích rằng chính dynamic linker chịu trách nhiệm “lọc” các biến nguy hiểm
- Tuy vậy, không phải mọi biến đều được bảo vệ tự động. Nếu lập trình viên dùng system(), gọi chương trình con, hoặc tin vào PATH, IFS, locale… mà không làm sạch môi trường, rủi ro vẫn rất lớn (đặc biệt khi kết hợp với “untrusted search path” bên dưới)
3. Untrusted Search Path / PATH hijacking
Nếu SUID binary gọi chương trình khác mà:
- system("..."), popen()
- execvp()/execlp() không chỉ rõ đường dẫn tuyệt đối
Cũng có thể phát sinh rủi ro tìm nhầm executable theo PATH (CWE-426)
Điểm mấu chốt: với SUID-root, “nhầm” 1 binary cũng có thể thành “chạy thứ attacker kiểm soát bằng quyền root”
4. Lỗi thao tác file
Các lỗi kinh điển của setuid programs nằm ở:
- Tạo file tạm không an toàn
- Kiểm tra rồi mới dùng (TOCTOU)
- Mở file theo đường dẫn có thể bị symlink trỏ hướng
- Set permission/owner sai thứ tự…
Đây là nhóm lỗi rất được nhấn mạnh trong tài liệu secure programming cho Unix/Linux (đặc biệt đối với chương trình chạy quyền cao).
5. Memory-safety
Nếu SUID binary viết bằng C/C++ có buffer overflow / format string / UAF, tác động thường tăng mạnh vì lỗi có thể dẫn tới thực thi mã với đặc quyền của owner (hay gặp nhất là root). Các lab/handout về Set-UID vulnerability thường dùng nhóm lỗi này để minh hoạ cơ chế “từ bug → privesc”
6. Misconfiguration
Một số tình huống “cấu hình sai” đủ để tạo đường leo thang:
- Bật SUID cho binary không cần thiết (nguyên nhân thường gặp nhất)
- Đặt SUID ở file nằm trong thư mục người dùng có thể ghi (hoặc pipeline build/deploy làm sai ownership/mode)
- Bật SUID trên các filesystem nên bị chặn bởi policy hardening
Khuyến nghị phòng thủ phổ biến là dùng mount option nosuid cho các mount point không cần setuid/setgid; STIG cũng mô tả rõ: nosuid khiến hệ thống không thực thi setuid/setgid với owner privileges, giảm cơ hội user thường lên admin/root