setuid和setgid
生活随笔
收集整理的這篇文章主要介紹了
setuid和setgid
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
setuid 和 setgid (全稱分別是:set user ID upon execution 和 set group ID upon execution)是Unix的訪問權限標志位,它允許
用戶以可執行文件owner或group的權限來運行這個可執行文件。它們經常適用于:為了運行特定的任務,可以允許用戶暫時的提高權限。用處:
暫時的權限提升。
什么情況下需要setuid 和 setgid呢?當task需要的權限高于用戶的權限時,比如修改用戶的登錄密碼。有些任務需要更高的權限可能不會立刻表現出來,比如ping,它需要發送和監聽某個網絡接口的控制包。
1. setuid作用于可執行文件
當一個二進制可執行文件被設置了setuid屬性之后,在所創建的進程內部,有權限執行此文件的用戶將會獲得這個可執行文件的owner的權限(通常是root)。在進程內部,用戶獲取root權限之后,這個用戶將可以做一下常規用戶被限制做的事情,當然有些事情是禁止的:比如使用ptrace 、LD_LIBRARY_PATH, 或者給自己發送信號(但是從終端發送的信號是可以的)。由于潛在競爭條件,如果setuid 作用于shell 腳本,很多操作系統將會忽略掉setuid.
雖然setuid在很多場合是很有用的,但是如果一個可執行程序設計的不夠好并被設置了setuid將會帶來潛在的風險。人們能夠利用有漏洞的程序獲取永久的權限提升,或者讓用戶在無意之間運行一個特洛伊木馬。
setgid能夠改變group的權限,正如setuid改變user權限一樣。
setuid作用于可執行文件解釋了為什么系統調用chroot對于非root用戶是不可用的。
可以通過chmod 來設置setuid 和 setguid的標志位(最高位),
4: for setuid
另外還多系統也支持 “chmod ug+s"命令來設置.
下面的演示代碼用來獲取并顯示出進程的real 和 effective 的用戶(user)和組(group)的ID:
1.顯示printid.c的代碼,這段代碼就是打印real/effective user/group ID
2.編譯程序printid
3.運行程序printid,打印出了real/effective user/group ID
4.修改printid的owner為root
5.給文件printid添加setuid和setgid標志位
6.取消文件printid其它用戶(other)的讀r和執行x權限
7.顯示文件printid屬性
8.重新運行printid,
我們發現printid權限:
owner:root, rws
group:staff, r-s
other:??????? ---
雖然other沒有任何權限,但以用戶bobie(對于問價printerid,bobie不是owner,也不是group,屬于other)運行printid,依然可以運行,顯然是添加了setuid的原因。
通過打印信息可以看到effective id 是0,正好是root的id,可以參考/etc/passwd(里面有每個用戶/組對應的id)
//備注:如果這個程序是在volumn上運行且mounte時添加了'nosuid'選項,這個程序將會失敗,沒有打印信息;
//volumn: 可以再磁盤上創建卷(volumn),物理卷(PV)=》邏輯卷(LV)=>卷組(VG),最后將這卷組mounte到指定路徑
[bobie]$ cat printid.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void) {
??? printf(
??????? "???????? UID?????????? GID? \n"
??????? "Real????? %d? Real????? %d? \n"
??????? "Effective %d? Effective %d? \n",
???????????? getuid (),???? getgid (),
???????????? geteuid(),???? getegid()
??? );
??? return getegid() ;?????? /* always good to return something */
}
[bobie]$ cc printid.c -o printid
[bobie]$ ./printid
????????? UID?????????? GID ?
Real????? 1008? Real????? 1008
Effective 1008? Effective 1008 ?
?
[bobie]$? sudo chown root printid?? # to change the owner you need to sudo
Password:
[bobie]$ sudo chmod ug+s printid???? # SetUID and SetGID flags
[bobie]$ sudo chmod o-rx printid???? # Don't let Others read or execute it
[bobie]$ ls -l
-rwsr-s--- 1 root staff 6944 2011-10-06 10:22 printid
[bobie]$ ./printid
??????? UID????????????? GID ?
Real????? 1008? Real????? 1008
Effective 0?? Effective? 20
2.setuid/setgid作用于路徑
setuid和setgid作用于路徑時,有完全不同的含義。
給路徑設置set gid(chmod g+s),會導致路徑下 新建的文件和子文件夾繼承它的group id, 而不創建文件或文件夾的用戶的primary group id.【只有group id 受影響,owner id 不受影響】。另外,新創建的子文件夾還將繼承setgid位。注意:給路徑設置setgid,僅僅影響新建的文件和文件夾的group id, 已經存在的文件和文件夾不受影響。
給已經存在的子文件夾設置setgid,必須手動來做,用如下命令:
[root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;
給路徑設置set uid,將會被Unix 和 Linux系統 忽略。
3.安全
被設置setuid/setgid的程序必須小心的設計防止緩存區溢出攻擊。緩存區溢出攻擊成功的后果是:能夠使攻擊者利用進程的權限執行任意的代碼。如果一個有漏洞的程序被設置了setuid,權限提升以root運行,攻擊成功就會使攻擊者獲得root權限,這太可怕了。
4.歷史
setuid 是 Dennis Ritchie發明的,他所在的公司AT&T, 于1972年申請專利,1979年專利獲批,專利號:US 4135240 "Protection of data file contents".
什么情況下需要setuid 和 setgid呢?當task需要的權限高于用戶的權限時,比如修改用戶的登錄密碼。有些任務需要更高的權限可能不會立刻表現出來,比如ping,它需要發送和監聽某個網絡接口的控制包。
1. setuid作用于可執行文件
當一個二進制可執行文件被設置了setuid屬性之后,在所創建的進程內部,有權限執行此文件的用戶將會獲得這個可執行文件的owner的權限(通常是root)。在進程內部,用戶獲取root權限之后,這個用戶將可以做一下常規用戶被限制做的事情,當然有些事情是禁止的:比如使用ptrace 、LD_LIBRARY_PATH, 或者給自己發送信號(但是從終端發送的信號是可以的)。由于潛在競爭條件,如果setuid 作用于shell 腳本,很多操作系統將會忽略掉setuid.
雖然setuid在很多場合是很有用的,但是如果一個可執行程序設計的不夠好并被設置了setuid將會帶來潛在的風險。人們能夠利用有漏洞的程序獲取永久的權限提升,或者讓用戶在無意之間運行一個特洛伊木馬。
setgid能夠改變group的權限,正如setuid改變user權限一樣。
setuid作用于可執行文件解釋了為什么系統調用chroot對于非root用戶是不可用的。
可以通過chmod 來設置setuid 和 setguid的標志位(最高位),
4: for setuid
2: for setguid
1: 這個是粘滯位 //可以參考:http://blog.csdn.net/hzgdiyer/article/details/6788275
"chmod 6711 file" 將會設置setuid 和setguid, bits(6) 即位最高位。另外還多系統也支持 “chmod ug+s"命令來設置.
下面的演示代碼用來獲取并顯示出進程的real 和 effective 的用戶(user)和組(group)的ID:
1.顯示printid.c的代碼,這段代碼就是打印real/effective user/group ID
2.編譯程序printid
3.運行程序printid,打印出了real/effective user/group ID
4.修改printid的owner為root
5.給文件printid添加setuid和setgid標志位
6.取消文件printid其它用戶(other)的讀r和執行x權限
7.顯示文件printid屬性
8.重新運行printid,
我們發現printid權限:
owner:root, rws
group:staff, r-s
other:??????? ---
雖然other沒有任何權限,但以用戶bobie(對于問價printerid,bobie不是owner,也不是group,屬于other)運行printid,依然可以運行,顯然是添加了setuid的原因。
通過打印信息可以看到effective id 是0,正好是root的id,可以參考/etc/passwd(里面有每個用戶/組對應的id)
//備注:如果這個程序是在volumn上運行且mounte時添加了'nosuid'選項,這個程序將會失敗,沒有打印信息;
//volumn: 可以再磁盤上創建卷(volumn),物理卷(PV)=》邏輯卷(LV)=>卷組(VG),最后將這卷組mounte到指定路徑
[bobie]$ cat printid.c
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void) {
??? printf(
??????? "???????? UID?????????? GID? \n"
??????? "Real????? %d? Real????? %d? \n"
??????? "Effective %d? Effective %d? \n",
???????????? getuid (),???? getgid (),
???????????? geteuid(),???? getegid()
??? );
??? return getegid() ;?????? /* always good to return something */
}
[bobie]$ cc printid.c -o printid
[bobie]$ ./printid
????????? UID?????????? GID ?
Real????? 1008? Real????? 1008
Effective 1008? Effective 1008 ?
?
[bobie]$? sudo chown root printid?? # to change the owner you need to sudo
Password:
[bobie]$ sudo chmod ug+s printid???? # SetUID and SetGID flags
[bobie]$ sudo chmod o-rx printid???? # Don't let Others read or execute it
[bobie]$ ls -l
-rwsr-s--- 1 root staff 6944 2011-10-06 10:22 printid
[bobie]$ ./printid
??????? UID????????????? GID ?
Real????? 1008? Real????? 1008
Effective 0?? Effective? 20
2.setuid/setgid作用于路徑
setuid和setgid作用于路徑時,有完全不同的含義。
給路徑設置set gid(chmod g+s),會導致路徑下 新建的文件和子文件夾繼承它的group id, 而不創建文件或文件夾的用戶的primary group id.【只有group id 受影響,owner id 不受影響】。另外,新創建的子文件夾還將繼承setgid位。注意:給路徑設置setgid,僅僅影響新建的文件和文件夾的group id, 已經存在的文件和文件夾不受影響。
給已經存在的子文件夾設置setgid,必須手動來做,用如下命令:
[root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;
給路徑設置set uid,將會被Unix 和 Linux系統 忽略。
3.安全
被設置setuid/setgid的程序必須小心的設計防止緩存區溢出攻擊。緩存區溢出攻擊成功的后果是:能夠使攻擊者利用進程的權限執行任意的代碼。如果一個有漏洞的程序被設置了setuid,權限提升以root運行,攻擊成功就會使攻擊者獲得root權限,這太可怕了。
4.歷史
setuid 是 Dennis Ritchie發明的,他所在的公司AT&T, 于1972年申請專利,1979年專利獲批,專利號:US 4135240 "Protection of data file contents".
總結
以上是生活随笔為你收集整理的setuid和setgid的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mg3多少钱啊?
- 下一篇: 求一个找女朋友个性签名。