馮濟舟 劉洪喜
(1中國電子科技集團公司38所;2空軍駐安徽地區(qū)軍事代表室,安徽合肥,230088)
隨著軟件測試技術(shù)不斷發(fā)展,軟件在各產(chǎn)品中的比重也不斷增加,這對軟件測試技術(shù)提出了更高的要求。軟件代碼是組成軟件可運行系統(tǒng)的最小單元,也是軟件測試的基礎(chǔ)。軟件代碼組合成具有某種用途的軟件系統(tǒng),通過充分的軟件測試可以有效提高軟件系統(tǒng)的安全性、可靠性和穩(wěn)定性,以保證客戶的正常使用。
目前,軟件測試技術(shù)已經(jīng)形成一整套比較系統(tǒng)、完善且又嚴密的體系,包括文檔審查、代碼審查、靜態(tài)分析、單元測試、集成測試、軟件配置項測試和系統(tǒng)測試等。同時對每項工作的內(nèi)容進行了具體規(guī)范和要求,并相應(yīng)地制定了一套度量方法,以保障各工作執(zhí)行的有效性。
然而遺憾的是,經(jīng)過如此周密的測試過程,軟件依然會出現(xiàn)一些意想不到的問題,這些問題往往是可以避免的。筆者歸納和總結(jié)了軟件測試無法發(fā)現(xiàn)且具有一定規(guī)律性且易被忽視的軟件代碼安全性設(shè)計問題。
在命令行shell和SQL解釋器中的元字符是指不被解釋為數(shù)據(jù)的字符。這些字符包括如 “:{&;`'" |*?~<>^ () [] {}$ }.”。這些字符可能是命令,也可能是從命令或其它數(shù)據(jù)中分隔出來的數(shù)據(jù)。當程序調(diào)用其它系統(tǒng)并允許攻擊者插入這些元字符時,通常的結(jié)果是攻擊者可以通過插入的元字符來完全控制運行的應(yīng)用程序。對于具有較高安全性需求的系統(tǒng)應(yīng)避免在命令行shell中使用popen函數(shù)、system函數(shù)、execlp函數(shù)和execvp函數(shù)。
在開發(fā)過程中,研發(fā)人員習慣使用catch函數(shù)打印輸出程序出現(xiàn)的異常,以發(fā)現(xiàn)、捕獲并解決系統(tǒng)可能出現(xiàn)的問題。然而在實際使用的應(yīng)用系統(tǒng)中,當使用catch函數(shù)在其塊中打印消息時,應(yīng)避免由于系統(tǒng)錯誤導致異常而產(chǎn)生的潛在敏感信息的泄漏,因為惡意用戶可以根據(jù)泄漏的敏感信息來攻擊應(yīng)用系統(tǒng),給系統(tǒng)造成安全隱患。對于具有較高安全性需求的系統(tǒng)應(yīng)避免在catch塊中打印消息,以防止由于某些來自應(yīng)用程序的出錯,造成應(yīng)用程序敏感信息的泄漏。
當使用標準C庫gets函數(shù)獲取字符數(shù)據(jù)時,由于gets函數(shù)事先不知道需要讀取多少數(shù)據(jù),且gets函數(shù)是將獲取的字符不斷傳入存儲,直至緩沖區(qū)填滿,這可能會導致緩沖區(qū)溢出,造成系統(tǒng)安全的隱患。該函數(shù)已經(jīng)被用來破壞電腦的安全性,應(yīng)禁止使用gets函數(shù),相應(yīng)的使用fgets函數(shù)來代替,這樣可以預(yù)防使用gets函數(shù)時可能造成的緩存溢出隱患。
當傳遞給exec函數(shù)的參數(shù)變量不是常量時,那么攻擊者就有可能插入一段惡意字符串片段到一個動態(tài)創(chuàng)建的字符串中。這些惡意字符串片段有可能允許攻擊者執(zhí)行一個指定的命令,給系統(tǒng)造成安全隱患。對于具有較高安全性需求的系統(tǒng)應(yīng)避免使用非常量參數(shù)或變量傳遞給exec函數(shù)。
競爭條件是指由于對事件的相對時間具有特別嚴重依賴性的異常行為。競爭條件通常涉及一個或多個進程訪問一個共享資源 (如同一個文件或同一內(nèi)存),那么這種多重訪問就很難得到妥善的控制,導致具有競爭關(guān)系函數(shù)的異常行為。標準庫中可能產(chǎn)生資源競爭關(guān)系函數(shù), 如 access、creat、pathconf、 opendir、 dirname、 scandir、 open、 lstat、stat、 open、 rename、 remove、 lexecve、 execl、execlp、execle、execv、 execvp、 freopen、 mktemp、link和unlink。應(yīng)禁止使用可能產(chǎn)生資源競爭關(guān)系的函數(shù)。
當使用標準庫mbstowcs函數(shù)時,其內(nèi)部堆棧分配的緩沖區(qū)可能在某些版本中導致緩沖區(qū)溢出,造成系統(tǒng)安全隱患,破壞電腦的安全性。因此,在軟件開發(fā)過程中應(yīng)禁止使用mbstowcs函數(shù),以防止使用不安全的mbstowcs函數(shù)給系統(tǒng)帶來的危害。
當使用GetTempPath函數(shù)返回當前目錄或窗口目錄函數(shù)時,GetTempPath的函數(shù)功能是返回到臨時目錄的文件路徑。當?shù)脚R時目錄的路徑大于分配給存儲這些信息的緩沖區(qū)時就可能造成緩沖區(qū)溢出;或者返回到的臨時目錄的文件路徑可能是不安全的目錄路徑,且在Windows操作系統(tǒng)環(huán)境下,操作系統(tǒng)不能保證對臨時文件返回的路徑是有效的或可用的,如此會給系統(tǒng)帶來安全隱患。攻擊者可以利用GetTempPath函數(shù)功能中的弱點,如在Windows操作系統(tǒng)中返回一個攻擊者可以讀取或?qū)懭氲穆窂?(如,c: emp),這樣攻擊者將能夠讀取或修改在臨時文件中的任何數(shù)據(jù);或者如果在緩沖區(qū)長度沒有正確設(shè)置的情況下,攻擊者可以指定一個環(huán)境變量及其長度比路徑緩沖區(qū)的長度長。當程序在這種環(huán)境下運行時,路徑緩沖區(qū)就會出現(xiàn)溢出問題。對于具有較高安全性需求且具有類似情境的系統(tǒng)應(yīng)避免使用GetTempPath函數(shù)返回當前目錄或窗口目錄函數(shù)。
軟件測試是軟件能力成熟度模型集成的重要活動。近年來,各軟件企業(yè)不僅對質(zhì)量保障的投入不斷加大,而且作為保障軟件質(zhì)量最有效的測試也不斷發(fā)展和完善,形成了一套比較系統(tǒng)而又嚴密的體系。但是經(jīng)過如此周密的測試過程,軟件依然會出現(xiàn)一些意想不到的問題。本文根據(jù)實際項目經(jīng)驗,歸納和總結(jié)了軟件測試無法發(fā)現(xiàn)、具有一定規(guī)律性、易被忽視的軟件代碼安全性設(shè)計問題。此問題的歸納和總結(jié),不僅可以幫助開發(fā)人員在編碼過程中避免一些由于誤解或者開發(fā)習慣給系統(tǒng)造成的安全性風險,而且可以幫助測試人員結(jié)合語境分析,提高在代碼檢查過程中識別存在安全性隱患的風險代碼的能力,對提高軟件質(zhì)量具有積極意義。