一個Unix SUID程序
Unix操作系統(tǒng)有很多值得學(xué)習(xí)的地方,這里我們主要介紹Unix操作系統(tǒng)中的一個Unix SUID程序,大家一起來學(xué)習(xí)下吧!希望對大家對Unix操作系統(tǒng)的學(xué)習(xí)有所幫助。
下面的程序是用來演示Unix文件的Unix SUID,取名為parent.c
- QUOTE:
- #include 〈stdio.h〉
- #include 〈stdlib.h〉
- #include 〈unistd.h〉
- #include 〈sys/types.h〉
- int
- main(int argc,char **argv)
- {
- int i;
- char **argu;
- uid_t uid;
- uid=geteuid(); //獲取調(diào)用進(jìn)程的有效用戶ID
- if(argc<2){
- fprintf(stderr,"usage: %s \n",argv[0]);
- exit(0);
- }
- if(setuid(uid)<0){
- fputs("setuid error.\n",stderr);
- exit(1);
- } //將調(diào)用進(jìn)程的實際用戶ID設(shè)置為有效用戶ID
- if((argu=(char**)malloc(argc*sizeof(char*)))==NULL){
- fputs("malloc error.\n",stderr);
- exit(1);
- } //為execvp的參數(shù)指針數(shù)組分配內(nèi)存空間
- for(i=0;i argu[argc-1]=(char *)0; //參數(shù)指針數(shù)組以空指針結(jié)尾
- if(execvp(argv[1],argu)<0){
- fputs("exec error.\n",stderr);
- exit(1);
- } //用execvp調(diào)用命令行參數(shù)指定的程序
- exit(0);
- }
該程序?qū)⒁粋€Unix SUID的進(jìn)程轉(zhuǎn)變?yōu)橐粋€超級用戶進(jìn)程。將此程序編譯成可執(zhí)行目標(biāo)文件parent ,用另一個簡單的程序進(jìn)行檢驗
- int main(void){
- printf("real uid=%d, effective uid=%d\n",getuid(),geteuid());
- exit(0);
- }
編譯為printuids。運行程序得到下列結(jié)果:
- $ ./parent printuids //正常執(zhí)行,無特權(quán)
- real uid=506, effective uid=506
- $ su root
- Password:
- # chown root parent //更改所有者
- # chmod u+s parent //添加SUID
- # exit
- $ ./parent printuidsv real uid=0, effective uid=0 //該進(jìn)程轉(zhuǎn)變?yōu)槌売脩暨M(jìn)程
某一進(jìn)程一旦轉(zhuǎn)變?yōu)槌売脩暨M(jìn)程,將擁有系統(tǒng)的完全控制權(quán)。比如,我們可以這樣執(zhí)行演示程序:
- $ ./parent useradd hacker
- $ ./parent passwd hacker
故而,Unix SUID的程序往往伴隨著一定的安全問題。在早期的Unix環(huán)境中,Unix SUID/SGID的程序調(diào)用system()函數(shù)就存在著安全性漏洞。
【編輯推薦】