Setuid linux là gì

Nhận tiện làm CTF trong pwn.college module 1 nói về việc lạm dung SUID trong linux thì mình làm bài viết trình bày về cái này, có gì mong cao nhân chỉ giáo :)))

Nói về việc phân quyền cho file, thư mục trong linux thì google sẽ ra rất nhiều và đã trình bày rất rõ ràng nên mình không viết lại ở đây nữa, tóm tắt lại là nó sẽ có 3 quyền chính là read, write và execute tương ứng cho 3 nhóm người dùng là user (người tạo file – owner), group (của user tạo file đó), và các người dùng còn lại (other). Chúng ta có thể xem phần quyền bằng lệnh ls -l :

Setuid linux là gì

Việc thay đổi quyền của file hoặc thư mục ta sử dụng command chmod và thay đổi ownership ta dùng chown.

Như vậy nếu ta cấp quyền x cho other thì một user khác không phải owner user vẫn có thể thực thi file bình thường nhưng có một vấn đề đặt ra là nếu file đó thực hiện một số tác vụ mà user hiện tại không có quyền thì nó có thực thi được không? Lấy một ví dụ đơn giản là một chương trình A được tạo bởi root user có tác vụ là tạo một thư mục tmp trong thư mục /usr, user root sét quyền cho file thực thi chương trình này là tất cả other user vẫn có thể thực thi. Vậy khi user khác (ví dụ user tên là guess, không có quyền root) thực thi chương trình thì chương trình có thể tạo thư mục tmp trong /usr không? Câu trả lời là không vì user guess không có quền tạo thư mục trong thư mục /tmp này. Do đó, người ta mới cần tới một thứ gọi là SUID

SETUID là gì?

setuid (SET User ID upon execution), là một loại đặc quyền file (file permission) đặc biệt, có thể cho phép user tạm có quyền thực thi file bằng chính quyền của người sở hữu (owner) để thay đổi hành vi của file thực thi đó. Hay nói một cách đơn giản hơn: “Thông thường một file trong linux khi chạy thì sẽ được kế thừa quyền từ user đang login. SETUID sẽ cấp quyền “tạm thời” cho user chạy file quyền của user tạo ra file (owner user). Nói một cách khác, user chạy sẽ có UID và GID của người tạo ra file, khi chạy 1 file hay command.”

Mình tìm trên google thì thấy các trang định nghĩa là vậy, nhưng thực sự là khi mới đọc mình vẫn chưa hiểu rõ suid nó khác ở chỗ nào với việc sét quyền x cho một file thực thi. Mình thử set quyền x và s (s là setuid cho file thực thi) thì khi dùng user khác vẫn cho thực thi bình thường, cả 2 trường hợp đều không thể chown (thay đổi ownership) hay xóa, đổi tên file được. Do đó mình mới viết một chương trình bằng user root như sau:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

struct stat st = {0};

int main()
{
   if (stat("/usr/m0lw9re", &st) == -1)
   {
     mkdir("/usr/m0lw9re", 0700);
   }
   return 0;
}

Đây là một đoạn mã đơn giản dùng để tạo thư mục tmp trong /usr . Dùng gcc để biên dịch sau đó chạy file này, ta thấy chương trình sẽ tạo một thư mục trong /usr như dự định.

Tiến hành thêm quyền cho other user và copy file vào thư mực /tmp để user khác có thể nhìn thấy được:

Setuid linux là gì

Sau đó đăng nhập vào một tài khoản khác không có quyền root và thực thi chương trình

Setuid linux là gì

Ta thấy trong thư mục /usr sau khi thực thi chương trình không có xuất hiện thư mục m0lw9re. Bây giờ thử đổi quyền x thành s xem sao

Setuid linux là gì

OK! Bây giờ quay sang user khác rồi thực thi

Setuid linux là gì

Ta thấy nó đã tạo một thư mục mới với ownership là user root và group là m0lw9re (user hiện tại).

Như vậy có thể kết luận, việc setuid cho file thực thi thì khi chạy file này, nó sẽ sử dụng các quyền của user tạo ra nó (trong trường hợp này là các quyền của user root) thay vì sử dụng các quyền của user hiện tại đang thực thi chương trình (user m0lw9re). Các file và thư mục được tạo ra bởi chương trình sẽ có owner là user tạo ra chương trình (user root) và thuộc group của user thực thi (user m0lw9re) và được phân quyền rwx chỉ cho user owner (user root) như hình trên.