日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

setuid和setgid

發布時間:2023/11/27 生活经验 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。