banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Một chút về SUID/SGID  XML
  [Question]   Một chút về SUID/SGID 07/11/2007 10:03:02 (+0700) | #1 | 95852
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
1. Khái niệm
Thông thường khi một lệnh được thi hành, nó sẽ thi hành với quyền của user đang chạy nó. Ví dụ khi bạn thay đổi password của bạn với lệnh passwd, password mới của bạn được lưu trong /etc/shadow. Với người dùng bình thường, bạn không thể có quyền đọc và ghi file này vì lý do bảo mật, nhưng khi bạn thay đổi password bạn cần phải có quyền ghi file này. Điều này có nghĩa là chương trình passwd sẽ gửi thêm quyền cho bạn và bạn có thể “write” /etc/shadow

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 25604 2007-04-05 15:54 /usr/bin/passwd
 

SUID và SGID sẽ xuất hiện với chữ “s” nếu quyền được gán.
Trong lệnh này, bạn sẽ thấy là SUID bit được gán, và lệnh này được owned bởi root

Những quyền được gửi thêm đưa tới cho chương trình là một cơ chế được biết đến với tên gọi: Set User ID (SUID) và Set Group ID (SGID). Khi bạn thi hành một chương trình với SUID bit được enables, bạn sẽ được kế thừa quyền của user hoặc group sở hữu chương trình đó mà không phải là quyền của user đang chạy nó
Để thực hiện SUID/SGID cho một file, bạn có thể:
Code:
chmod u+s /full/path/to/filename
chmod g+s /full/path/to/filename


2. Định danh SUID=root
Cách đơn giản nhất để định danh những file nào có SUID và SGID bit được set, là sử dụng lệnh find. Để tìm tất cả các regular file có root owner, bạn có thể sử dụng lệnh sau:
Code:
find / -perm +4000 -user root -type f -print
find / -perm +2000 -group root -type f -print

Nếu bạn muốn một file không cần thiết phải chạy với SUID hoặc SGID nữa bạn có thể sử dụng:
Code:
chmod u-s /full/path/to/filename
chmod g-s /full/path/to/filename
Lệnh này sẽ replace quyền SUID/SGID bằng quyền x (execute) thông thường – file này sẽ vẫn được thi hành nhưng không phải với quyền của owner/group của nó.
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Re: Một chút về SUID/SGID 07/11/2007 11:14:18 (+0700) | #2 | 95867
pearltran
Member

[Minus]    0    [Plus]
Joined: 15/08/2007 13:10:08
Messages: 33
Offline
[Profile] [PM]
Em bổ sung 1 tí cơ chế suid,sgid chỉ được ứng hiệu khi euid=0,nếu euid #0 thì dù file đó có bật bit suid thì cũng không ứng hiệu(cái này em học được từ bài viết của anh conmale)
[Up] [Print Copy]
  [Question]   Một chút về SUID/SGID 03/11/2012 10:52:43 (+0700) | #3 | 270704
[Avatar]
heroandtn3
Member

[Minus]    0    [Plus]
Joined: 20/02/2010 08:47:46
Messages: 182
Location: /home
Offline
[Profile] [PM] [WWW]
Chào anh quanta,

Em đã đọc một số bài viết về SUID và SGID cũng như bài viết của anh và biết được rằng khi 1 file được gán SUID thì lúc thực thi, file đó sẽ được thực thi y như khi thực thi dưới quyền ower của nó.

Em cũng đọc thử một vài ví dụ nhưng khi làm theo thì không thành công.

Em có 2 file như sau:

Code:
-rw-r--r-- 1 root       root        56 Nov  3 11:01 abc
-rwsr-sr-x 1 root       root       294 Nov  3 11:13 root.sh


Nội dung của file root.sh chứa lệnh: echo `date` >> abc

Tuy nhiên khi em thực thi file root.sh với quyền người dùng bình thường thì không sửa thành công file abc mà báo lỗi:

Code:
$ ./root.sh 
./root.sh: 8: ./root.sh: cannot create abc: Permission denied


Em hiện đang dùng HĐH Ubuntu 12.04.

Anh và mọi người có thể giải thích tại sao khi em chạy file root.sh nó lại không thực thi thành công không ạ?
Sống là thương nhưng lòng chẳng vấn vương...
br
[Up] [Print Copy]
  [Question]   Một chút về SUID/SGID 03/11/2012 11:44:45 (+0700) | #4 | 270705
[Avatar]
LNH
Member

[Minus]    0    [Plus]
Joined: 26/10/2012 03:21:31
Messages: 26
Location: Việt Nam
Offline
[Profile] [PM] [WWW] [Yahoo!]

heroandtn3 wrote:
Chào anh quanta,

Em đã đọc một số bài viết về SUID và SGID cũng như bài viết của anh và biết được rằng khi 1 file được gán SUID thì lúc thực thi, file đó sẽ được thực thi y như khi thực thi dưới quyền ower của nó.

Em cũng đọc thử một vài ví dụ nhưng khi làm theo thì không thành công.

Em có 2 file như sau:

Code:
-rw-r--r-- 1 root       root        56 Nov  3 11:01 abc
-rwsr-sr-x 1 root       root       294 Nov  3 11:13 root.sh


Nội dung của file root.sh chứa lệnh: echo `date` >> abc

Tuy nhiên khi em thực thi file root.sh với quyền người dùng bình thường thì không sửa thành công file abc mà báo lỗi:

Code:
$ ./root.sh 
./root.sh: 8: ./root.sh: cannot create abc: Permission denied


Em hiện đang dùng HĐH Ubuntu 12.04.

Anh và mọi người có thể giải thích tại sao khi em chạy file root.sh nó lại không thực thi thành công không ạ?
 


File root.sh của bạn là một file script, không phải file binary, do đó nó cần interpreter để thực thi kịch bản bên trong nó. Nghĩa là khi bạn ./root.sh thì thực ra lệnh đó sẽ được run như sau:
Code:
/bin/sh root.sh

hoặc

/bin/bash root.sh


Bật SUID cho sh/bash và thử lại xem smilie
[Up] [Print Copy]
  [Question]   Một chút về SUID/SGID 03/11/2012 11:48:11 (+0700) | #5 | 270706
[Avatar]
LNH
Member

[Minus]    0    [Plus]
Joined: 26/10/2012 03:21:31
Messages: 26
Location: Việt Nam
Offline
[Profile] [PM] [WWW] [Yahoo!]
Dupe !! Mấy nay HVA sao thế nhỉ, rất chập chờn dù cái homepage vào rất nhanh smilie
Mod xoá hộ bài dupe này nhé !
Thanks.
[Up] [Print Copy]
  [Question]   Một chút về SUID/SGID 03/11/2012 12:10:36 (+0700) | #6 | 270707
[Avatar]
heroandtn3
Member

[Minus]    0    [Plus]
Joined: 20/02/2010 08:47:46
Messages: 182
Location: /home
Offline
[Profile] [PM] [WWW]
Cảm ơn anh, em đã tìm hiểu và được biết là SUID không được áp dụng cho bash script http://www.linuxquestions.org/questions/linux-security-4/suid-bit-on-executables-doesnt-work-247215/#post1259013) mà chỉ được áp dụng cho các file binary hoặc (hình như cả) Perl Script.

Em đã thử gọi ./root.sh trong 1 chương trình C, sau đó biên dịch và set SUID cho file thực thi được dịch ra và nó đã làm việc.
Code:
#include <stdio.h>
/* Filename: root.c */
int main() {
	system("./root.sh");
	return 0;
}


$ gcc root.c
$ chown root a.out
$ chmod u+s a.out
$ ./a.out
Sống là thương nhưng lòng chẳng vấn vương...
br
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|