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這個程序的檢驗,符合標準了才能夠進行,否則程序就會提示出錯!(也就是說不能像vim那樣隨意對shadow文件進行更改,只能在某種規范下進行更改)。

  同時,這種權限應該是有限制的,不能夠進行任意傳播。比如,像man這種能夠執行shell命令的程序,它執行shell命令就是通過fork-exec機制來執行了,在某些distribution中有一個man用戶,man程序屬于這個用戶,并且設置了SUID位。也就是說我任意一個普通用戶運行man程序后的有效用戶都是man,如果此時這個普通用戶在man程序中執行shell命令的話,這個shell命令進程的有效用戶應不應該是man呢,設置用戶ID應不應該繼續保留呢,當然不行啦,這樣的話一個普通用戶不就能夠通過這種方式來具有了man用戶的權限了!(如果保留了設置用戶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 512
11 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。

轉載于:https://www.cnblogs.com/bwangel23/p/4239889.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375346.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375346.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

史上最全的maven pom.xml文件教程詳解

<project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd >; <!-- 父項目的坐標。如果項目中沒有規定某個元素的值&am…

Win32ASM學習[18]:串指令-MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE

-------------------------------------------------------------------------------------------------------------------------------------------------------- 一.字符串傳送指令 MOVSB/MOVSW/MOVSD 格式: MOVS OPD,OPS 功能: OPD<--OPS. 說明: 1. 其中OPS為源串符…

Xamarin iOS編寫第一個應用程序創建工程

Xamarin iOS編寫第一個應用程序創建工程 在Xcode以及Xamarin安裝好后&#xff0c;就可以在Xamarin Studio中編寫程序了。本節將主要講解在Xamarin Studio中如何進行工程的創建以及編寫代碼等內容XamariniOS編寫第一個應用程序創建工程本文選自Xamarin iOS開發實戰大學霸。 1.3.…

Jade之Extends

Extends jade允許多個jade文件繼承一個jade文件。 jade&#xff1a; //- layout.jade doctype html htmlheadblock titletitle Default titlebodyblock content //- index.jade extends ./layout.jadeblock titletitle Article Titleblock contenth1 My Article html&#xff1…

Win32ASM學習[19]:結構與聯合

結構和聯合分別用 struct、union 定義, 都是 ends 結束定義. 它們使用方法相同, 并可以互相嵌套; 主要區別是后者的各成員共用同一個地址. -------------------------------------------------------------------------------------------------------------------------------…

hdu 1257 最少攔截系統(貪心)

題意&#xff1a; 最少需要多少個攔截系統才能將所有的導彈攔截下來。 思路&#xff1a; 第1枚導彈一定需要第一個攔截系統&#xff0c;第2枚導彈如果比第1個高度高&#xff0c;則需要第二個攔截系統。 考慮第i枚導彈&#xff0c;如果前i-1枚導彈的高度都比它小&#xff0c;則需…

Birt使用總結

把report放到其他服務器要重新建立Data Source ,這是配置&#xff0c;拷貝項目時不會同時拷貝 (1)在EXTJs中利用Report實現報表的刷新 Ext.getCmp("showview").body.update("<iframe idshowviewframe src" "> </iframe>"…

Win32ASM學習[20]:子程序

關于函數調用約定 :函數調用約定 這是以前的一個求和函數的例子 ---------------------------------------------------------------------------------------------------------------- .386 .model flat, stdcall include windows.inc include kernel32.inc include …

Mac聯網恢復系統重新安裝Lion

Mac的Lion系統&#xff0c;雖然不像Windows那樣需要經常重裝&#xff0c;但也難免會有要重置的時候&#xff0c;比如更換硬盤。本文介紹如何利用Mac的聯網恢復系統進行Lion系統的在線恢復。Mac的在線恢復系統只在近幾年的機型上才有&#xff0c;在進行系統恢復前&#xff0c;請…

【線性代數公開課MIT Linear Algebra】 第二十三課 微分方程與exp(At)

本系列筆記為方便日后自己查閱而寫&#xff0c;更多的是個人見解&#xff0c;也算一種學習的復習與總結&#xff0c;望善始善終吧~ 一階常系數微分方程 Aududt 將一階常系數微分方程轉換為線性代數問題的關鍵在于常系數微分方程的解一定是指數形式的。那么我們的需要求解的東西…

Win32ASM學習[21]:宏匯編(1)

-------------------------------------------------------------------------------------------------------------------- 嗯 上個星期到現在 把Win32ASM基礎匯編復習了下 在網上找到了 這個不錯系列 于是就轉載過來了 其中 根據我自己的水平 刪減了一些內容 或…

ubunu安裝軟件的一個錯誤

http://tonychiu.blog.51cto.com/656605/654776/ 由于ubuntu/debian軟件庫中有時候不同的庫更新速度不一致&#xff0c;apt-get 出出現如下的錯誤提示 Some packages could not be installed. This may mean that you have requested an impossible situation or if you are us…

常用的基本Windows數據類型

常用的基本Windows數據類型 --------------------------------------------------------------------------------------------------------------------------------------------------------- 類 型 …

刪除空文件夾 清除CS擴展名文件 bat

刪除空文件夾。刪的干凈。刪的徹底。 將下列代碼復制到txt中保存。并把后綴.txt命成.bat。然后運行即可。 方案&#xff11;.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 刪除指定目錄及其子目錄下的空文件夾.bat 代碼&#xff1a;…

ios 坐標轉換

// 將像素point由point所在視圖轉換到目標視圖view中&#xff0c;返回在目標視圖view中的像素值 - (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view; // 將像素point從view中轉換到當前視圖中&#xff0c;返回在當前視圖中的像素值 - (CGPoint)convertPoint:(C…

80X86偽指令

8086 偽指令表 一、數據定義偽操作 偽 指 令 名 稱 語 句 格 式 功 能 定義字節類型的數據存儲區 [變量名] DB 表達式[&#xff0c;…] 定義一個以變量名為首址的字節類型數據存儲區&#xff0c;所含數據元素的個數由其后表達式的個數所決定&#xff0c;數據存儲單元…

jQuery慢慢啃之選擇器(二)

1.$("#myDiv");ID匹配一個元素 <span id"foo[bar]"></span> $("#foo\\[bar\\]);//轉義 2.$("div");//元素標簽名匹配 3.$(".myClass"); css類名匹配 4.$("*") 匹配所有元素&#xff0c;多用于結合上下文…

iOS學習之基本概念

學習iOS最重要的是態度和興趣&#xff0c;如果你對于學習始終抱有不斷的熱情和端正的態度&#xff0c;那么&#xff0c;無論是什么&#xff0c;你總會成功的&#xff01; 有一句話與大家共勉&#xff1a;過程中跌倒多少次都沒有關系&#xff0c;重要的是&#xff0c;跌倒后你能…

Win32ASM代碼基本模塊

;-------------------------------------------------------------------------------- ;程序環境設置 .386 .model flat,stdcall option casemap:none ;-------------------------------------------------------------------------------- ;頭文件與庫文件導入 include windo…

ORA-16038: log 3 sequence# 103 cannot be archived

[sizelarge]今天在自己機器做了個實驗&#xff0c;插入10萬條&#xff0c;由于空間少&#xff0c;重啟數據庫時出現&#xff1a; [sizex-large]SQL> startup ORACLE instance started. Total System Global Area 188743680 bytes Fixed Size 1218460 byte…