亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

SUID或SGID程序中能不能用system函數

2024-06-28 13:22:23
字體:
來源:轉載
供稿:網友
SUID或SGID程序中能不能用system函數

  system()函數的聲明和說明如下:

  

  注意它的描述那里,system()執行一個由command參數定義的命令,通過調用/bin/sh -c命令來實現這個功能。也就是說它的邏輯是這樣的!

  進程調用system函數,system函數調用fork創建一個子進程,然后再調用exec函數來把這個子進程的正文段替換成/bin/sh命令的正文段。然后再由sh來執行exec將程序的正文段替換成command參數所代表的命令的正文段,例如,我的一個程序a.out來調用system函數來執行sleep 20命令,它的進程示意圖如下所示:

  

  可以參考下面這個例子,如下圖所示:

  這里我執行了一個system文件,產生了兩個進程,3994和3995(右邊那個終端所示,第一列是PPID,第二列是PID),這兩個進程是父子關系,值得注意的是這兩個進程進程ID是連著的,也就是說在這兩個進程執行的時候沒有新的進程產生。

  接下來開始扯正題,在《APUE》(UNIX環境高級編程,下文不再贅述)的8.13節中,作者強調SUID和SGID程序中不應該調用system函數。為什么呢,我個人的理解是這樣的。

  以SUID權限為例,SUID這種權限設立的目的是什么,就是提供一種可控的超級權限。比如passwd命令,運行passwd這個程序后,進程的有效用戶ID是root,理論上可以為所欲為(即對shadow這個文件想怎么改就怎么改),但是passwd程序的代碼已經被寫死了,用戶所做的操作都要經過passwd這個程序的檢驗,符合標準了才能夠進行,否則程序就會提示出錯?。ㄒ簿褪钦f不能像vim那樣隨意對shadow文件進行更改,只能在某種規范下進行更改)。

  同時,這種權限應該是有限制的,不能夠進行任意傳播。比如,像man這種能夠執行shell命令的程序,它執行shell命令就是通過fork-exec機制來執行了,在某些distribution中有一個man用戶,man程序屬于這個用戶,并且設置了SUID位。也就是說我任意一個普通用戶運行man程序后的有效用戶都是man,如果此時這個普通用戶在man程序中執行shell命令的話,這個shell命令進程的有效用戶應不應該是man呢,設置用戶ID應不應該繼續保留呢,當然不行啦,這樣的話一個普通用戶不就能夠通過這種方式來具有了man用戶的權限了?。ㄈ绻A袅嗽O置用戶ID,那么在子進程中可以調用setuid函數來使進程的有效用戶ID變成設置用戶ID,同樣能達到上面所說的目的)

  OK,上面說的這么一大串,就是為啥SUID或者SGID程序不應該調用system函數來執行一個shell命令,因為這樣會傳播進程的設置用戶ID和有效用戶ID,將它傳遞給子進程,這樣就會產生bug了。理論上是這樣的,但是實際中我發現貌似不行,我的centos6.6上就不能模擬出這個bug來,比如我有這么一段程序:

  getresuid程序的代碼如下:

 1 /*  這個程序的作用是獲取進程的三個用戶ID,它的可執行文件被做了一個軟鏈接到/home/michael/bin下面 2  * */ 3 #include<errno.h> 4 #include<string.h> 5 #include<stdlib.h> 6 #include<stdarg.h> 7 #include<stdio.h> 8 #include<sys/types.h> 9 #include<unistd.h>10 #define BUFSIZE 51211 void err_exit(char *fmt,...);12 int main(int argc,char *argv[])13 {14     uid_t ruid,euid,suid;15 16     if(-1 == getresuid(&ruid,&euid,&suid))17     err_exit("[getresuid]: ");18     PRintf("real:%d/teffective:%d/tset-user:%d/n",ruid,euid,suid);19 20     return 0;21 }

  system程序的代碼如下:

 1 #include<stdlib.h> 2 #include<stdio.h> 3 int main(int argc,char *argv[]) 4 { 5     uid_t ruid,euid,suid; 6  7     if(-1 == getresuid(&ruid,&euid,&suid)) 8     err_exit("[getresuid]: "); 9     printf("real:%d/teffective:%d/tset-user:%d/n",ruid,euid,suid);10 11     system("getresuid");12     return 0;13 }

  這個system程序的功能就是首先輸出進程的real uid,effective uid,和set-user id,然后再來通過system函數調用getresuid程序再來把這三個uid輸出一遍,我把system這個可執行文件變成root所有,并加上suid權限,執行的結果如下圖:

  

  第一個uid的輸出結果是符合預期的,即由于SUID權限位的設置,有效用戶ID是0。但是后面第二個uid的輸出卻和想象的有點不同,理論上,system函數應該是能夠傳遞set-user ID和有效用戶ID給子進程的,但是這里三個UID全部都變成了500,沒一個是root,這個可能是因為system函數在exec之前將所有三個UID都變成了實際用戶ID,或者是sh命令在exec之前將所有三個UID都變成了實際用戶ID。

  照這么看來,貌似在SUID程序中調用system函數也未嘗不可,但是為了保險起見,還是自己通過fork和exec動手來實現一個system吧,然后在exec之前把三個UID都設置成實際用戶ID。


上一篇:主引導記錄MBR

下一篇:git教程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品18videos性欧美| 国内精品一区二区三区| 丰满岳妇乱一区二区三区| 欧美第一淫aaasss性| 日韩精品在线第一页| 欧美精品一本久久男人的天堂| 日韩在线观看网址| 久久中文字幕在线视频| 欧美精品在线观看| 欧美激情视频网站| 在线一区二区日韩| 欧美电影在线观看网站| 久久久国产一区| 青青草国产精品一区二区| 日韩av日韩在线观看| 在线观看日韩www视频免费| 91牛牛免费视频| 中文字幕亚洲一区二区三区五十路| 欧美激情在线一区| 色爱av美腿丝袜综合粉嫩av| 国产在线高清精品| 日韩高清欧美高清| 国产精品久久99久久| 欧美裸身视频免费观看| 国产精品视频公开费视频| 成人h片在线播放免费网站| 亚洲国产成人久久综合一区| 久久精品国产视频| 欧美激情精品久久久久久蜜臀| 久久精品中文字幕免费mv| 亚洲丝袜在线视频| 亚洲成人网在线| 欧美丰满片xxx777| 色综合亚洲精品激情狠狠| 亚洲最大福利视频网站| 欧美国产日韩视频| 亚洲人午夜色婷婷| 亚洲人成欧美中文字幕| 国产精品视频网站| 国产精品视频一| 国产亚洲精品久久久| 国产精品白丝jk喷水视频一区| 精品成人久久av| 久久久久99精品久久久久| 久久影院在线观看| 国产九九精品视频| 欧美激情视频一区二区三区不卡| 中文字幕欧美在线| 亚洲精品二三区| 亚洲第一区在线| 在线观看日韩专区| 日韩av在线一区二区| 少妇激情综合网| 国产精品夫妻激情| 久久91亚洲人成电影网站| 欧美激情国产日韩精品一区18| 亚洲精品久久视频| 性亚洲最疯狂xxxx高清| 亚洲性av在线| 久久久亚洲国产天美传媒修理工| 136fldh精品导航福利| 日韩人体视频一二区| 国产欧美久久久久久| 久久99热精品这里久久精品| 日韩hd视频在线观看| 国产精品爽爽ⅴa在线观看| 欧美一区二区三区四区在线| 国产91色在线免费| 97精品视频在线观看| 亚洲视频在线观看视频| 91精品国产91久久久久久久久| 中文字幕久久久av一区| 欧美大片免费观看在线观看网站推荐| 性色av一区二区三区红粉影视| 538国产精品一区二区在线| 精品五月天久久| 亚洲免费一在线| 久久人人爽人人爽人人片av高清| 91经典在线视频| 91久久久久久国产精品| 亚洲精品白浆高清久久久久久| 精品中文视频在线| 亚洲网站在线播放| 国产成人精品日本亚洲| 日产精品99久久久久久| 青青在线视频一区二区三区| 2019中文字幕在线观看| 精品亚洲va在线va天堂资源站| 亚洲精品视频在线播放| 国产小视频91| 精品二区三区线观看| 国产精品久久久av久久久| 欧美精品久久久久a| 狠狠躁天天躁日日躁欧美| 亚洲国产第一页| 亚洲欧美日本伦理| 亚洲老板91色精品久久| 日韩欧美在线国产| 日韩欧美亚洲综合| 日本精品一区二区三区在线| 欧美疯狂做受xxxx高潮| 久久免费视频观看| 欧美亚洲午夜视频在线观看| 久久中文久久字幕| 亚洲成人精品在线| 日韩电影视频免费| 日韩视频免费中文字幕| 日韩在线免费高清视频| 日韩亚洲欧美成人| 成人黄色免费在线观看| 国产精品亚洲第一区| www.亚洲天堂| 黄色一区二区三区| 久久精品一区中文字幕| 欧美成人免费全部| 96pao国产成视频永久免费| 国产精品老女人精品视频| 国产精品揄拍一区二区| 日韩在线视频导航| 欧美精品激情视频| 91在线观看免费观看| 国产精品视频久久久久| 国产精品久久久亚洲| 亚洲va欧美va国产综合久久| 亚洲男人天堂视频| 成人免费激情视频| 福利一区福利二区微拍刺激| 亚洲精品之草原avav久久| 欧美理论电影在线观看| 国产精品普通话| 久久精品国产一区二区电影| 国产精品吊钟奶在线| 在线视频中文亚洲| 久久精品国产2020观看福利| 精品久久久久久久久久久久| 国产成人精品视| 奇米一区二区三区四区久久| 国产亚洲精品综合一区91| 日韩美女中文字幕| 亚洲qvod图片区电影| 伊人亚洲福利一区二区三区| 亚洲第一区中文字幕| 日韩av网址在线观看| 国产精品扒开腿做爽爽爽视频| 欧美性猛交xxxxx免费看| 欧美美最猛性xxxxxx| 久久久精品国产一区二区| 亚洲一区av在线播放| 日韩欧美第一页| 91在线视频导航| 国产欧美欧洲在线观看| 欧美日韩视频免费播放| 亚洲自拍av在线| 都市激情亚洲色图| 精品国产自在精品国产浪潮| 国产精品热视频| 国产成人a亚洲精品| 亚洲人成电影在线观看天堂色| 欧美最顶级丰满的aⅴ艳星| 91国偷自产一区二区三区的观看方式| 91色琪琪电影亚洲精品久久| 91精品视频在线| 国产成+人+综合+亚洲欧洲| 日韩av在线一区|