setuid和setgid
生活随笔
收集整理的這篇文章主要介紹了
setuid和setgid
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
setuid 和 setgid (全稱分別是:set user ID upon execution 和 set group ID upon execution)是Unix的訪問權(quán)限標(biāo)志位,它允許
用戶以可執(zhí)行文件owner或group的權(quán)限來運行這個可執(zhí)行文件。它們經(jīng)常適用于:為了運行特定的任務(wù),可以允許用戶暫時的提高權(quán)限。用處:
暫時的權(quán)限提升。
什么情況下需要setuid 和 setgid呢?當(dāng)task需要的權(quán)限高于用戶的權(quán)限時,比如修改用戶的登錄密碼。有些任務(wù)需要更高的權(quán)限可能不會立刻表現(xiàn)出來,比如ping,它需要發(fā)送和監(jiān)聽某個網(wǎng)絡(luò)接口的控制包。
1. setuid作用于可執(zhí)行文件
當(dāng)一個二進(jìn)制可執(zhí)行文件被設(shè)置了setuid屬性之后,在所創(chuàng)建的進(jìn)程內(nèi)部,有權(quán)限執(zhí)行此文件的用戶將會獲得這個可執(zhí)行文件的owner的權(quán)限(通常是root)。在進(jìn)程內(nèi)部,用戶獲取root權(quán)限之后,這個用戶將可以做一下常規(guī)用戶被限制做的事情,當(dāng)然有些事情是禁止的:比如使用ptrace 、LD_LIBRARY_PATH, 或者給自己發(fā)送信號(但是從終端發(fā)送的信號是可以的)。由于潛在競爭條件,如果setuid 作用于shell 腳本,很多操作系統(tǒng)將會忽略掉setuid.
雖然setuid在很多場合是很有用的,但是如果一個可執(zhí)行程序設(shè)計的不夠好并被設(shè)置了setuid將會帶來潛在的風(fēng)險。人們能夠利用有漏洞的程序獲取永久的權(quán)限提升,或者讓用戶在無意之間運行一個特洛伊木馬。
setgid能夠改變group的權(quán)限,正如setuid改變user權(quán)限一樣。
setuid作用于可執(zhí)行文件解釋了為什么系統(tǒng)調(diào)用chroot對于非root用戶是不可用的。
可以通過chmod 來設(shè)置setuid 和 setguid的標(biāo)志位(最高位),
4: for setuid
另外還多系統(tǒng)也支持 “chmod ug+s"命令來設(shè)置.
下面的演示代碼用來獲取并顯示出進(jìn)程的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標(biāo)志位
6.取消文件printid其它用戶(other)的讀r和執(zhí)行x權(quán)限
7.顯示文件printid屬性
8.重新運行printid,
我們發(fā)現(xiàn)printid權(quán)限:
owner:root, rws
group:staff, r-s
other:??????? ---
雖然other沒有任何權(quán)限,但以用戶bobie(對于問價printerid,bobie不是owner,也不是group,屬于other)運行printid,依然可以運行,顯然是添加了setuid的原因。
通過打印信息可以看到effective id 是0,正好是root的id,可以參考/etc/passwd(里面有每個用戶/組對應(yīng)的id)
//備注:如果這個程序是在volumn上運行且mounte時添加了'nosuid'選項,這個程序?qū)?#xff0c;沒有打印信息;
//volumn: 可以再磁盤上創(chuàng)建卷(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作用于路徑時,有完全不同的含義。
給路徑設(shè)置set gid(chmod g+s),會導(dǎo)致路徑下 新建的文件和子文件夾繼承它的group id, 而不創(chuàng)建文件或文件夾的用戶的primary group id.【只有g(shù)roup id 受影響,owner id 不受影響】。另外,新創(chuàng)建的子文件夾還將繼承setgid位。注意:給路徑設(shè)置setgid,僅僅影響新建的文件和文件夾的group id, 已經(jīng)存在的文件和文件夾不受影響。
給已經(jīng)存在的子文件夾設(shè)置setgid,必須手動來做,用如下命令:
[root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;
給路徑設(shè)置set uid,將會被Unix 和 Linux系統(tǒng) 忽略。
3.安全
被設(shè)置setuid/setgid的程序必須小心的設(shè)計防止緩存區(qū)溢出攻擊。緩存區(qū)溢出攻擊成功的后果是:能夠使攻擊者利用進(jìn)程的權(quán)限執(zhí)行任意的代碼。如果一個有漏洞的程序被設(shè)置了setuid,權(quán)限提升以root運行,攻擊成功就會使攻擊者獲得root權(quán)限,這太可怕了。
4.歷史
setuid 是 Dennis Ritchie發(fā)明的,他所在的公司AT&T, 于1972年申請專利,1979年專利獲批,專利號:US 4135240 "Protection of data file contents".
什么情況下需要setuid 和 setgid呢?當(dāng)task需要的權(quán)限高于用戶的權(quán)限時,比如修改用戶的登錄密碼。有些任務(wù)需要更高的權(quán)限可能不會立刻表現(xiàn)出來,比如ping,它需要發(fā)送和監(jiān)聽某個網(wǎng)絡(luò)接口的控制包。
1. setuid作用于可執(zhí)行文件
當(dāng)一個二進(jìn)制可執(zhí)行文件被設(shè)置了setuid屬性之后,在所創(chuàng)建的進(jìn)程內(nèi)部,有權(quán)限執(zhí)行此文件的用戶將會獲得這個可執(zhí)行文件的owner的權(quán)限(通常是root)。在進(jìn)程內(nèi)部,用戶獲取root權(quán)限之后,這個用戶將可以做一下常規(guī)用戶被限制做的事情,當(dāng)然有些事情是禁止的:比如使用ptrace 、LD_LIBRARY_PATH, 或者給自己發(fā)送信號(但是從終端發(fā)送的信號是可以的)。由于潛在競爭條件,如果setuid 作用于shell 腳本,很多操作系統(tǒng)將會忽略掉setuid.
雖然setuid在很多場合是很有用的,但是如果一個可執(zhí)行程序設(shè)計的不夠好并被設(shè)置了setuid將會帶來潛在的風(fēng)險。人們能夠利用有漏洞的程序獲取永久的權(quán)限提升,或者讓用戶在無意之間運行一個特洛伊木馬。
setgid能夠改變group的權(quán)限,正如setuid改變user權(quán)限一樣。
setuid作用于可執(zhí)行文件解釋了為什么系統(tǒng)調(diào)用chroot對于非root用戶是不可用的。
可以通過chmod 來設(shè)置setuid 和 setguid的標(biāo)志位(最高位),
4: for setuid
2: for setguid
1: 這個是粘滯位 //可以參考:http://blog.csdn.net/hzgdiyer/article/details/6788275
"chmod 6711 file" 將會設(shè)置setuid 和setguid, bits(6) 即位最高位。另外還多系統(tǒng)也支持 “chmod ug+s"命令來設(shè)置.
下面的演示代碼用來獲取并顯示出進(jìn)程的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標(biāo)志位
6.取消文件printid其它用戶(other)的讀r和執(zhí)行x權(quán)限
7.顯示文件printid屬性
8.重新運行printid,
我們發(fā)現(xiàn)printid權(quán)限:
owner:root, rws
group:staff, r-s
other:??????? ---
雖然other沒有任何權(quán)限,但以用戶bobie(對于問價printerid,bobie不是owner,也不是group,屬于other)運行printid,依然可以運行,顯然是添加了setuid的原因。
通過打印信息可以看到effective id 是0,正好是root的id,可以參考/etc/passwd(里面有每個用戶/組對應(yīng)的id)
//備注:如果這個程序是在volumn上運行且mounte時添加了'nosuid'選項,這個程序?qū)?#xff0c;沒有打印信息;
//volumn: 可以再磁盤上創(chuàng)建卷(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作用于路徑時,有完全不同的含義。
給路徑設(shè)置set gid(chmod g+s),會導(dǎo)致路徑下 新建的文件和子文件夾繼承它的group id, 而不創(chuàng)建文件或文件夾的用戶的primary group id.【只有g(shù)roup id 受影響,owner id 不受影響】。另外,新創(chuàng)建的子文件夾還將繼承setgid位。注意:給路徑設(shè)置setgid,僅僅影響新建的文件和文件夾的group id, 已經(jīng)存在的文件和文件夾不受影響。
給已經(jīng)存在的子文件夾設(shè)置setgid,必須手動來做,用如下命令:
[root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;
給路徑設(shè)置set uid,將會被Unix 和 Linux系統(tǒng) 忽略。
3.安全
被設(shè)置setuid/setgid的程序必須小心的設(shè)計防止緩存區(qū)溢出攻擊。緩存區(qū)溢出攻擊成功的后果是:能夠使攻擊者利用進(jìn)程的權(quán)限執(zhí)行任意的代碼。如果一個有漏洞的程序被設(shè)置了setuid,權(quán)限提升以root運行,攻擊成功就會使攻擊者獲得root權(quán)限,這太可怕了。
4.歷史
setuid 是 Dennis Ritchie發(fā)明的,他所在的公司AT&T, 于1972年申請專利,1979年專利獲批,專利號:US 4135240 "Protection of data file contents".
總結(jié)
以上是生活随笔為你收集整理的setuid和setgid的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mg3多少钱啊?
- 下一篇: shell中引号的使用方法