日韩成人黄色,透逼一级毛片,狠狠躁天天躁中文字幕,久久久久久亚洲精品不卡,在线看国产美女毛片2019,黄片www.www,一级黄色毛a视频直播

一種LinuxC中shell防注入的方法與流程

文檔序號:39722753發(fā)布日期:2024-10-22 13:16閱讀:2來源:國知局
一種Linux C中shell防注入的方法與流程

本發(fā)明涉及信息安全,尤其涉及一種linux?c中shell防注入的方法。


背景技術(shù):

1、應(yīng)用程序有時需要調(diào)用一些系統(tǒng)命令的函數(shù),如linux?c中的system()、popen()等等,當用戶能夠控制這些函數(shù)中的參數(shù)時,就可以將惡意系統(tǒng)命令拼接到正常命令中,從而造成命令注入攻擊設(shè)備系統(tǒng)。這些命令注入能夠繼承應(yīng)用程序的權(quán)限去執(zhí)行系統(tǒng)命令讀寫執(zhí)行文件,導(dǎo)致系統(tǒng)有可能會被惡意攻擊或者泄露系統(tǒng)用戶信息。

2、當前在linux?c中沒有通用完善的方法應(yīng)對shell注入攻擊,大多數(shù)情況下需要開發(fā)人員針對用戶輸入的參數(shù)有針對性地進行過濾、轉(zhuǎn)義,才能防止shell注入的發(fā)生,而需要過濾、轉(zhuǎn)義的內(nèi)容還會根據(jù)命令執(zhí)行的上下文、輸入?yún)?shù)的類型等情況發(fā)生變化。這不僅依賴開發(fā)人員的經(jīng)驗,還會在正常代碼邏輯之外引入額外的代碼處理邏輯,增加代碼復(fù)雜度。

3、另外一種防shell注入的方法是通過exec族函數(shù)來運行命令,完全繞過shell,這種方法不存在shell注入的風險,但運行一個命令最少需要幾十行代碼支持,并且由于它缺少可用的封裝,如果需要用到管道和重定向等shell常用特性時還需要自己單獨實現(xiàn),使用起來繁瑣,普及性不高。


技術(shù)實現(xiàn)思路

1、本發(fā)明的目的是克服上述現(xiàn)有技術(shù)的缺點,提供一種linux?c中shell防注入的方法,該方法可使命令完全繞開shell的方式來執(zhí)行并提供管道、重定向、邏輯運算符、后臺運行等常用特性的支持,方便使用。

2、本發(fā)明是通過以下技術(shù)方案來實現(xiàn)的:

3、一種linux?c中shell防注入的方法,包括如下步驟:

4、s1、構(gòu)建一個實現(xiàn)exec函數(shù)族運行命令的封裝庫,該封裝庫對外主要提供以下接口:secure_exec函數(shù)、secure_system函數(shù)、secure_popen函數(shù)、secure_pclose函數(shù)。

5、secure_exec:該函數(shù)為本封裝庫的核心函數(shù),其內(nèi)部實現(xiàn)了本封裝庫除后臺執(zhí)行和邏輯運算符以外的所有功能,其他幾個函數(shù)都是在它的基礎(chǔ)上做的二次封裝。該函數(shù)主要通過定義一個結(jié)構(gòu)體數(shù)組secure_exec_process_t來運行一組命令,這一組命令形成一個連通的管道,其中的每個命令都是單獨fork一個進程并在子進程中通過execvp函數(shù)運行,secure_exec按照結(jié)構(gòu)體數(shù)組的順序?qū)⑶耙粋€進程的標準輸出作為后一個進程的標準輸入,或指定文件描述符通過pipe+dup2函數(shù)連接,實現(xiàn)類似于shell管道和重定向的功能。secure_exec函數(shù)最終會返回管道中最后一個進程的pid和可選的傳出與管道中第一個進程標準輸入綁定的文件描述符。

6、secure_system:該函數(shù)的功能類似于linux?c中的system函數(shù),其支持管道、重定向、邏輯運算符和后臺執(zhí)行,同時支持以格式化字符串+可變參數(shù)的方式傳入?yún)?shù)列表,如secure_system("echo-n%s:%d|md5sum>%s",username,id,filename)。secure_system函數(shù)將以字符串表示的命令和參數(shù)列表轉(zhuǎn)化為secure_exec_process_t結(jié)構(gòu)體數(shù)組,然后調(diào)用secure_exec函數(shù)運行命令,等待管道中最后一個進程執(zhí)行結(jié)束后返回它的進程退出狀態(tài)。

7、secure_popen:該函數(shù)的功能類似于linux?c中的popen函數(shù),其與secure_system一樣也支持管道、重定向、邏輯運算符,同時支持以格式化字符串+可變參數(shù)的方式傳入?yún)?shù)列表;該函數(shù)將以字符串表示的命令和參數(shù)列表轉(zhuǎn)化為secure_exec_process_t結(jié)構(gòu)體數(shù)組,然后調(diào)用secure_exec函數(shù)運行命令,返回一個結(jié)構(gòu)體,該結(jié)構(gòu)體中包含一個可讀的文件指針和執(zhí)行命令的子進程的pid,所述文件指針用于讀取命令輸出的數(shù)據(jù)linux?c中的popen函數(shù)返回值是一個文件指針,而secure_popen的返回值是一個結(jié)構(gòu)體其中包含了文件指針和執(zhí)行命令的子進程的pid等信息。

8、secure_pclose:該函數(shù)的功能類似于linux?c中的pclose函數(shù),其用于釋放secure_popen函數(shù)創(chuàng)建的資源,等待secure_popen執(zhí)行的命令結(jié)束并返回進程退出狀態(tài)。而linux?c中的pclose函數(shù)用于釋放popen創(chuàng)建的資源。

9、s2、當有命令傳入時,secure_system和secure_popen分別以格式化字符串的形式傳入命令(函數(shù)的command參數(shù)),將格式化字符需要的參數(shù)通過可變參數(shù)列表傳入,command參數(shù)描述了哪些是命令本身,哪些是命令需要的參數(shù)。secure_system將command根據(jù)邏輯運算符分成多個組,每一個組都是一個管道,管道上有多個可執(zhí)行的命令,將每個命令分別拆解成不同的部分(命令可執(zhí)行程序、參數(shù)列表、重定向目標),各部分分別通過vsnprintf進行填充格式化字符,然后使用解析后的結(jié)果創(chuàng)建secure_exec_process_t結(jié)構(gòu)體,這一過程確保了動態(tài)傳入的參數(shù)不會變成一條新的命令執(zhí)行。所以secure_system的可變參數(shù)列表中的參數(shù)最終都被命令視為普通參數(shù),不會保留有任何特殊含義,需要保留特殊含義的字符寫在command參數(shù)中,如管道、重定向、邏輯運算符、空格等。secure_system和secure_popen分別將傳入的命令解析成secure_exec_process_t結(jié)構(gòu)體數(shù)組后,再通過secure_exec函數(shù)執(zhí)行命令;命令執(zhí)行完成后,secure_system等待管道中最后一個進程執(zhí)行結(jié)束后返回其終止狀態(tài),secure_pclose等待secure_popen創(chuàng)建的進程結(jié)束并返回其終止狀態(tài)。

10、linux?c中的system和popen函數(shù)均通過sh運行傳入的命令,且需要在調(diào)用函數(shù)之前拼接好命令,這也是產(chǎn)生shell注入的原因之一;而本發(fā)明中的secure_system和secure_popen均將以字符串表示的命令和參數(shù)列表轉(zhuǎn)化為secure_exec_process_t結(jié)構(gòu)體數(shù)組然后傳入secure_exec中運行命令,secure_exec內(nèi)部封裝的execvp,在運行命令的過程中完全不經(jīng)過sh,函數(shù)內(nèi)部通過格式化字符串的形式組裝命令,這使得secure_system和secure_popen有機會判斷出哪些是命令本身,哪些是傳入的參數(shù),從而防止傳入的參數(shù)變成一條新的命令執(zhí)行,起到防注入的作用。

11、進一步地,所述結(jié)構(gòu)體數(shù)組(secure_exec_process_t[])中至少包括一個結(jié)構(gòu)體,每個結(jié)構(gòu)體均包括:必選的命令名稱、可選的命令參數(shù)列表、標準輸出、錯誤輸出的重定向方式和輸出方向。

12、進一步地,所述錯誤輸出的重定向方式包括重定向到文件描述符、文件或追加到文件,所述輸出方向包括輸出到文件或文件描述符。

13、進一步地,所述secure_exec的運行方法為:

14、s11、secure_exec函數(shù)在內(nèi)部遍歷傳入的secure_exec_process_t結(jié)構(gòu)體數(shù)組,為每個數(shù)組成員創(chuàng)建兩個管道,分別為連接子進程的標準輸出管道和標準輸入管道,分別連接子進程的標準輸入和標準輸出,同時fork一個子進程。

15、s12、如果子進程為secure_exec_process_t結(jié)構(gòu)體數(shù)組中的第一個進程(相當于shell管道中的第一個進程),且調(diào)用secure_exec時存在wfd參數(shù),則將該進程的標準輸入管道的讀端通過dup2重定向到父進程創(chuàng)建的連接子進程標準輸入的讀端,在父進程中將該管道的寫端通過wfd傳出,然后執(zhí)行s15步驟。wfd的作用是如果secure_exec_process_t結(jié)構(gòu)體數(shù)組第一個進程需要從標準輸入接收數(shù)據(jù)時,可以通過wfd來寫入,比如將base64作為第一個進程時,此時它需要從標準輸入中接收數(shù)據(jù)才能繼續(xù)往下執(zhí)行,此時可以通過wfd將數(shù)據(jù)傳遞給base64的標準輸入。

16、s13、如子進程為secure_exec_process_t結(jié)構(gòu)體數(shù)組中的第一個進程,但調(diào)用secure_exec時不存在wfd參數(shù),則直接執(zhí)行s15步驟。

17、s14、如果子進程不是secure_exec_process_t結(jié)構(gòu)體數(shù)組中的第一個進程,則將連接上一個子進程的標準輸出管道的讀端通過dup2重定向到當前子進程的標準輸入,然后執(zhí)行s15步驟。由此實現(xiàn)shell管道的功能。

18、s15、根據(jù)secure_exec_process_t中定義的標準輸出和標準錯誤重定向規(guī)則通過dup2對進程的標準輸出和標準錯誤進行重定向,如果當前子進程沒有指定重定向規(guī)則,默認情況下子進程的標準輸出重定向到父進程創(chuàng)建的用于連接子進程標準輸出管道的寫端,標準錯誤輸出不做任何處理。

19、s16、在各自子進程中,將需要執(zhí)行的命令和參數(shù)列表傳入到execvp函數(shù)中,根據(jù)secure_exec_process_t指定的command和params執(zhí)行命令;

20、s17、遍歷完secure_exec_process_t結(jié)構(gòu)體數(shù)組后,如仍存在wfd參數(shù),則傳出管道中第一個子進程標準輸入管道的寫端,然后退出函數(shù),返回管道中最后一個子進程的pid;如遍歷完所有的secure_exec_process_t結(jié)構(gòu)體數(shù)組后,不存在wfd參數(shù),則直接退出函數(shù),返回管道中最后一個子進程的pid。

21、進一步地,所述secure_system的運行方法為:

22、s21、secure_system函數(shù)首先判斷command命令是否為后臺執(zhí)行,如為后臺執(zhí)行,則先fork一個子進程,后續(xù)處理全部在該子進程中進行;如不是后臺執(zhí)行,則直接在本進程完成后續(xù)處理。

23、s22、根據(jù)命令中的邏輯運算符將command命令分解為多個命令組,每個命令組包含當前需要運行的一組命令和下一組命令運行的先決條件。例如:命令cmd1|cmd2&&cmd3||cmd4會被分解為三組,第一組命令cmd1|cmd2它的下一組命令運行的先決條件為true,表示這一組命令的最終執(zhí)行結(jié)果為成功時運行下一組命令。第二組命令cmd3它的下一組命令運行先決條件為false,表示這一組命令最終的執(zhí)行結(jié)果為失敗時運行下一組命令。第三組命令cmd4它是最后一組命令所以沒有下一組命令運行的先決條件。

24、s23、按管道執(zhí)行順序遍歷命令組,并分別以管道描述符“|”分割,得到至少一個命令,再按空格遍歷命令中的每一部分,分割得到命令中的可執(zhí)行程序名稱、參數(shù)列表和重定向操作符;分別檢測可執(zhí)行程序名稱、參數(shù)列表和重定向操作符中是否包含格式化符號“%”,如有,則通過vsnprintf和secure_system接收到的可變參數(shù)列表valist填充格式化字符,將這些參數(shù)轉(zhuǎn)化為secure_exec_process_t結(jié)構(gòu)體;

25、s24、按照s23步驟的方法將命令組中的所有命令轉(zhuǎn)化為secure_exec_process_t結(jié)構(gòu)體后,得到一個secure_exec_process_t結(jié)構(gòu)體數(shù)組,以該結(jié)構(gòu)體數(shù)組作為參數(shù)傳入到secure_exec函數(shù)中運行命令,secure_exec函數(shù)會返回這一組命令中最后一個命令進程的pid,通過waitpid等待進程結(jié)束,再通過wexitstatus獲取進程的退出狀態(tài);

26、s25、將s24步驟執(zhí)行后的進程退出狀態(tài)與下一組命令執(zhí)行的先決條件進行比對,如果能匹配,則按照s22-s24步驟的方法運行下一組命令,如果不匹配則跳過下一組命令,獲取再下一組命令的執(zhí)行先決條件并進行對比,重復(fù)這一過程直到執(zhí)行完所有命令。

27、進一步地,所述secure_popen運行方法為:

28、s31、secure_popen首先通過pipe函數(shù)創(chuàng)建一個連接子進程的管道,然后fork一個子進程;

29、s32、主進程將管道的讀端文件描述符通過fdopen轉(zhuǎn)換成文件指針,并將文件指針和子進程的pid構(gòu)造成一個secure_popen_fp_t結(jié)構(gòu)體返回給函數(shù)調(diào)用者;子進程中將子進程自身的標準輸出重定向到管道的寫端,用于將后續(xù)命令執(zhí)行中的內(nèi)容輸出傳遞給父進程;

30、s33、根據(jù)命令中的邏輯運算符將command命令分解為多個命令組,每個命令組包含當前需要運行的一組命令和下一組命令運行的先決條件;

31、s34、按管道執(zhí)行順序遍歷命令組,并分別以管道描述符“|”分割,得到至少一個命令,再按空格遍歷命令中的每一部分,分割得到命令中的可執(zhí)行程序名稱、參數(shù)列表和重定向操作符;分別檢測可執(zhí)行程序名稱、參數(shù)列表和重定向操作符中是否包含格式化符號“%”,如有,則通過vsnprintf和secure_system接收到的可變參數(shù)列表valist填充格式化字符,將這些參數(shù)轉(zhuǎn)化為secure_exec_process_t結(jié)構(gòu)體;

32、s35、按照s34步驟的方法將命令組中的所有命令轉(zhuǎn)化為secure_exec_process_t結(jié)構(gòu)體后,得到一個secure_exec_process_t結(jié)構(gòu)體數(shù)組,以該結(jié)構(gòu)體數(shù)組作為參數(shù)傳入到secure_exec函數(shù)中運行命令,secure_exec函數(shù)會返回這一組命令中最后一個命令進程的pid,通過waitpid等待進程結(jié)束,再通過wexitstatus獲取進程的退出狀態(tài);

33、s36、將s35步驟執(zhí)行后的進程退出狀態(tài)與下一組命令執(zhí)行的先決條件進行對比,如果能匹配,則按照s33-s35步驟的方法運行下一組命令,如果不匹配則跳過下一組命令,獲取再下一組命令的執(zhí)行先決條件并進行對比,重復(fù)這一過程直到執(zhí)行完所有命令。

34、進一步地,所述secure_pclose運行方法為:secure_pclose函數(shù)首先從從efp中獲得關(guān)聯(lián)子進程的pid,通過waitpid等待子進程退出,然后通過wexitstatus獲取進程退出狀態(tài),關(guān)閉efp中關(guān)聯(lián)的文件指針后,退出函數(shù)并返回進程退出的狀態(tài)碼。

35、本發(fā)明構(gòu)建了一個實現(xiàn)exec函數(shù)族運行命令的封裝庫,該封裝庫對外主要提供四個接口secure_exec函數(shù)、secure_system函數(shù)、secure_popen函數(shù)、secure_pclose函數(shù),通過這些函數(shù),使得命令可完全繞開shell的方式執(zhí)行,并提供管道、重定向、邏輯運算符、后臺運行等常用特性的支持,可防止額外生成注入命令,起到防注入的功能,以彌補linux?c中應(yīng)對shell注入攻擊缺少通用方法的空白。

當前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1