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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux setuid函数_setuid函数解析

發布時間:2024/9/27 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux setuid函数_setuid函数解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在討論這個setuid函數之前,我們首先要了解的一個東西就是內核為每個進程維護的三個UID值。這三個UID分別是實際用戶ID(real uid)、有效用戶ID(effective uid)、保存的設置用戶ID(saved set-user-ID)。

首先說這個實際用戶ID,就是我們當前以哪個用戶登錄了,我們運行的程序的實際用戶ID就是這個用戶的ID。有效用戶ID就是當前進程是以哪個用戶ID來運行的,一般情況下是實際用戶ID,如果可執行文件具有了SUID權限,那么它的有效用戶ID就是可執行文件的擁有者。保存的設置用戶ID就是有效用戶ID的一個副本,與SUID權限有關。

關于那個SUID,最經典的例子莫過于passwd命令。passwd這個可執行文件的所有者是root,但是其他用戶對于它也有執行權限,并且它自身具有SUID權限。那么當其他用戶來執行passwd這個可執行文件的時候,產生的進程的就是以root用戶的ID來運行的。如下圖所示:

這個passwd的所有者是root,并且在權限那一欄中s代表的是SUID權限。我以普通用戶michael來運行這個命令,產生的進程如下:

大家可以看到,倒數第二行這個進程其命令是passwd,但是其USER卻是root。這就是SUID權限。

接下來,我們開始扯正題,setuid函數。這是setuid函數的聲明和返回值:

如果成功返回0,如果失敗返回-1,并將errno設置為合適的值。

關于這個函數的功能,APUE(《UNIX環境高級編程》,下面的APUE為相同的意思,不再贅述)上面是這樣寫的:

這樣光講概念可能有點干巴巴了,下面我來舉幾個分別說明一下:

開始講之前,我先驗證一下我的電腦是支持"保存的設置用戶ID"這個功能的,在電腦上運行以下代碼:

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #define BUFSIZE 512

8 void err_exit(char *fmt,...);9 int main(int argc,char *argv[])10 {11 if(sysconf(_SC_SAVED_IDS) > 0)12 printf("_POSIX_SAVED_IDS effective!\n");13

14 return 0;15 }

程序的運行結果如下:

首先說一下我用到的用戶,一共使用了三個用戶,root(UID=0),michael(UID=500),xiaojie(UID=501)如下圖所示:

先講第一點,如果進程具有超級用戶特權,那么這三個UID都被設置成了uid(setuid函數的參數)的值。比如下面這段代碼:

1 #include

2 #include

3 #include

4 int main(int argc,char *argv[])5 {6 uid_t ruid,euid,suid;7 //這三個uid分別是實際用戶ID,有效用戶ID,保存的設置用戶ID

8

9 setuid(500);10 getresuid(&ruid,&euid,&suid);11 printf("real:%d\teffective:%d\tset-user-id:%d\n",ruid,euid,suid);12

13 return 0;14 }

我用root用戶來運行這個程序,那么剛開始這個進程的有效用戶ID為0,然后這個進程中調用setuid(500),這三個UID的值都會被設置成500(在程序中通過getresuid函數來獲取進程的三個UID的值),運行結果如下圖:

接下來我們再來討論第二種情況,如果函數的參數uid等于進程的實際用戶ID或者保存的設置用戶ID,那么就將有效用戶ID設置為uid,其他的兩個(實際用戶ID和保存的設置用戶ID)保持不變。比如下面這個程序:

1 #include

2 #include

3 #include

4 void err_exit(char *fmt,...);5 int main(int argc,char *argv[])6 {7 uid_t ruid,euid,suid;8

9 printf("Before:\n");10 if(-1 == getresuid(&ruid,&euid,&suid))11 err_exit("[getresuid]:");12 printf("real:%d\teffective:%d\tset-user:%d\n",ruid,euid,suid);13 setuid(500);14 printf("After:\n");15 if(-1 == getresuid(&ruid,&euid,&suid))16 err_exit("[getresuid]:");17 printf("real:%d\teffective:%d\tset-user:%d\n",ruid,euid,suid);18

19 return 0;20 }

關于這段代碼生成的可執行文件,我讓它的擁有者變成了xiaojie(UID=501),并且給它加上了SUID權限,如下圖所示:

然后我用michael用戶(UID=500)來運行這個程序,那么這個程序的實際用戶ID=500,而有效用戶ID和保存的設置用戶ID都為501。接著,在這個程序中調用setuid函數,傳入的參數為500,大家可以猜想到,最終應該只有有效用戶ID受到影響,而保存的設置用戶ID保持不變。運行結果如下圖所示:

這就符合了我們的預期,僅僅只有有效用戶ID受到了影響,而實際用戶ID和保存的設置用戶ID并沒有改變。(這里我僅僅是驗證了保存的設置用戶ID不受影響,大家也可以自己寫一個程序,來驗證實際用戶ID并不受影響。)

最后一點,如果setuid函數的參數的uid的值即不等于實際用戶ID,也不等于保存的設置用戶ID,而且這個進程的有效用戶ID也不是0(非特權進程)。那么這個程序就會出錯,并將errno設置為EPERM。比如下面這個程序:

1 #include

2 #include

3 #include

4 #include

5 #include

6 int main(int argc,char *argv[])7 {8 uid_t ruid,euid,suid;9

10 getresuid(&ruid,&euid,&suid);11 printf("real:%d\teffective:%d\tset-user:%d\n",ruid,euid,suid);12

13 if(-1 == setuid(500))14 {15 printf("%s\n",strerror(errno));16 if(errno ==EPERM)17 {18 printf("Error number is EPERM!\n");19 }20 }21 else

22 {23 getresuid(&ruid,&euid,&suid);24 printf("real:%d\teffective:%d\tset-user:%d\n",ruid,euid,suid);25 }26

27 return 0;28 }

我以xiaojie用戶(UID=501)來運行這個程序,那么這個程序的三個用戶ID都為501,然后在這個程序中,調用setuid(500)。于是程序就會報錯,并將errno設置為EPERM,如下圖所示:

OK,這就是APUE上關于setuid函數的解釋,講了這么多,綜合成一句話就是,root是神,想怎么干就怎么干,沒人管得了。而普通用戶呢,只能管自己分內的事(把進程的有效ID改成自己的ID),不能胡亂來。

OK,that‘s all。希望這篇文章對大家能夠有幫助。

總結

以上是生活随笔為你收集整理的linux setuid函数_setuid函数解析的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 爱豆国产剧免费观看大全剧集 | 在线播放亚洲 | 婷婷激情六月 | 久久精品无码Av中文字幕 | 国产亚洲精品美女久久久 | 中文字幕第9页 | av一级在线 | 免费a在线观看播放 | 亚洲av无码精品一区二区 | 亚洲第一成年人网站 | 1000部啪啪未满十八勿入超污 | 曰曰操| 青青草国内自拍 | 午夜精品久久久久久久96蜜桃 | 黄色动漫在线免费观看 | 精品视频一区二区 | 免费欧美大片 | 伊人一二三 | 免费裸体视频女性 | 日本精品一区二区三区视频 | 少妇流白浆 | 美女啪啪无遮挡 | 成人影片在线播放 | 丰满双乳秘书被老板狂揉捏 | 国产视频手机在线 | 国产视频分类 | 蜜桃精品视频在线观看 | 亚洲成人av电影网站 | 日批视频免费在线观看 | 亚洲黄色影院 | 黑鬼大战白妞高潮喷白浆 | 国产欧美一区二区视频 | 亚洲综合激情网 | 久久精品国产亚洲a | 先锋影音av资源在线观看 | 按摩ⅹxxx性hd中国 | 精品一区三区 | 人人干人人模 | 国产精品91一区 | 久久精品免费观看 | 女人张开腿让男人桶爽 | 曰本丰满熟妇xxxx性 | 欧洲一区在线 | 国产欧美精品久久 | いいなり北条麻妃av101 | 中文字幕亚洲无线码在线一区 | 国产成人无码精品久久久性色 | 免费古装一级淫片潘金莲 | 少妇特黄一区二区三区 | 国产精品欧美久久久久天天影视 | 国产精品一区麻豆 | 亚洲AV成人精品 | 天天综合网久久 | 久久综合久色欧美综合狠狠 | 嫩草一区二区三区 | 日本成人一区二区三区 | 欧美黑人多人双交 | 秋霞二区| 美女黄视频在线观看 | 少妇高潮21p| 欧美精品系列 | 色老头在线观看 | 91精品视频在线 | 欧美国产综合视频 | 成年人在线播放视频 | 婷婷6月天 | 国产精品99久久久 | 人与禽性7777777| 夜夜艹| 图片区 小说区 区 亚洲五月 | 伊人春色在线 | 一区二区三区视频在线播放 | 欧美成人免费在线 | 免费精品视频在线观看 | 一区二区三区精品视频在线观看 | 久操伊人网 | 国产视频一区二区三区在线播放 | 久热中文| 熟女俱乐部一区二区视频在线 | 国产精品九九九 | 国产亚洲欧美在线视频 | 97精品人妻一区二区 | 狠狠爱五月婷婷 | 欧美动态视频 | 爱爱免费小视频 | 国产原创视频在线观看 | 一本色道久久亚洲综合精品蜜桃 | 精品久久久久久久免费人妻 | 岛国av免费在线观看 | 欧美一区二区三区国产 | 私人影院毛片 | 成人综合久久 | 亚洲精品一区二区三区蜜桃久 | 人人玩人人干 | 韩国三级hd中文字幕的背景音乐 | 久久久免费毛片 | 久久久久无码国产精品一区李宗瑞 | 欧洲一区二区 | 在线免费观看成人 |