劉莉
遼寧錦州渤海大學(xué)信息科學(xué)與技術(shù)學(xué)院
基于C語言的程序安全性分析
劉莉
遼寧錦州渤海大學(xué)信息科學(xué)與技術(shù)學(xué)院
安全問題一直都是軟件系統(tǒng)的最大難題,也是大部分系統(tǒng)軟件中都存在的。我們在使用軟件時,經(jīng)常會出現(xiàn)無法預(yù)料的問題。漏洞是系統(tǒng)性語言,指的是系統(tǒng)安全問題,它包含的是大部分會造成計算機(jī)發(fā)生危險可能性的要素。本文以安全漏洞的涵義、類型和應(yīng)用作為切入點,主要是對C語言中安全漏洞情況進(jìn)行介紹。緩沖區(qū)溢出成為安全漏洞較為普遍的威脅手法,在C語言里大部分的緩沖區(qū)溢出的根源都在于規(guī)范的C庫,最嚴(yán)重的問題是沒有檢查自變量的存在問題的字符串操作函數(shù)。同時,C語言里面的getenv()、getopt()等系統(tǒng)都不同程度上有著一樣的不可靠因素。通過分析存在的不安全因素,能夠在很大程度上降低發(fā)生錯誤的可能性,從而可以編寫出安全性更高的程序。
緩沖區(qū)溢出 安全漏洞 系統(tǒng)調(diào)用 攻擊
有關(guān)計算機(jī)的安全性的研究,目前在研究領(lǐng)域已形成新的門類,即計算機(jī)安全學(xué)。對于計算機(jī)安全的概念,要怎么進(jìn)行界定,國際標(biāo)準(zhǔn)化委員會認(rèn)為,計算機(jī)安全主要是指通過采取定的手段和措施,來保證計算機(jī)在應(yīng)用過程中不受或減少受到不安全因素影響的幾率,其目的是為了維護(hù)數(shù)據(jù)處理系統(tǒng)的正常運(yùn)行。根據(jù)對這個概念的界定我們可以得出計算機(jī)安全涉及的范圍是綜合性的、復(fù)雜性的,不只是簡單的技術(shù)處理及管理,還是將各門學(xué)科的綜合運(yùn)用。根據(jù)概念的闡述,對其從四方面來理解,也就是實體、軟件、數(shù)據(jù)及運(yùn)行四個方面的安全性保障。以其涵蓋的內(nèi)容而言,它體現(xiàn)的范圍更廣,與計算機(jī)相關(guān)的一切技術(shù)、管理、產(chǎn)品、相關(guān)政策、法律等都為計算機(jī)安全的內(nèi)容。
2.1 安全編程語言的定義
安全語言一直以來的概念的都沒有形成,如果想確切了解這個概念,可以利用下面幾個涵義來理解。程序在進(jìn)行的過程里遇到的問題叫做執(zhí)行錯誤。部分執(zhí)行錯誤對于計算機(jī)的威脅是最直接的,當(dāng)這些錯誤出現(xiàn)的時候,計算機(jī)系統(tǒng)當(dāng)時便無法工作,所反饋的報告得出這個問題出現(xiàn)在哪里及屬于什么問題。這樣的錯誤也叫做可以獲取的錯誤。另外還存在著部分錯誤是無法預(yù)料的,這樣的錯誤發(fā)生時,系統(tǒng)的數(shù)據(jù)也受到損害,不過系統(tǒng)卻沒有發(fā)現(xiàn),這樣就不會馬上產(chǎn)生反饋。
舉個例子來說,在無越界檢查的前提下訪問超越數(shù)組邊界的數(shù)據(jù)。還有一個實例為程序運(yùn)行時未按原來地址運(yùn)行,但是它到的新的地址的內(nèi)存可以承載這個程序的運(yùn)行,這樣在一定時期內(nèi)導(dǎo)致系統(tǒng)就無法發(fā)現(xiàn)程序運(yùn)行出現(xiàn)了問題,像出現(xiàn)這樣的錯誤就是不可捕獲的錯誤。假設(shè)程序運(yùn)行得好,是不會出現(xiàn)上面闡述的錯誤情況的。根據(jù)以上分析可以看出,C語言具有非安全性,這是因為在C程序運(yùn)行的時候,也會出現(xiàn)那些不會被系統(tǒng)發(fā)現(xiàn)的錯誤。
確保語言安全采取最為普遍的措施是給語言有針對性的設(shè)計某個類型系統(tǒng)。它是由一組定型規(guī)則組成的,用這些規(guī)則來規(guī)范和約束語言結(jié)構(gòu)。在這些規(guī)則中,定型主要指的是兩個獨立的整型,結(jié)合之后還是以整型的形式來體現(xiàn)。按照語言的類型體系,編譯器和別的程序分析工具主要是借助各種檢查的方式來規(guī)避類型錯誤程序,檢查的方式?jīng)]有限制,可以是靜態(tài)的、動態(tài)的,也可以是兩者的結(jié)合。
像含表達(dá)式3+true。假設(shè)是良類型程序(也就是所有類型的錯誤都沒有的程序,還叫做合法程序),它就必須為良行為,那么就叫做這種語言為可靠的。類型的可靠語言從性質(zhì)上來說它就屬于安全語言的范圍。
基于以上分析可以知道,C語言屬于類型化,但它卻是不安全的。它的不安全性體現(xiàn)在多個方面,還可以從聯(lián)合體類型、含靈活數(shù)組結(jié)構(gòu)體類型等類型都可以看出。
2.2 從別名角度設(shè)計安全C語言
編程語言里,從語法和語義的層面來說,符號名字在C語言里的名稱為訪問路徑及變量。如果指針類型的變量那么就叫做指針變量,也叫做指針。假設(shè)它們同時應(yīng)用于一個內(nèi)存單元里,那么就叫做他們的另外的名字。在這個單元里,如果對一個變量的名稱進(jìn)行修改,那么相應(yīng)的,與之對應(yīng)的另一個變量的名字也會發(fā)生變化,一般情況下程序員都不愿意面對這樣的問題。所以別名會給程序員帶來一定的困擾,制約其進(jìn)行理解與分析。一般我們說的別名分析就是利用已經(jīng)產(chǎn)生的信息來判斷這個變量的名字。通常情況下,對于同一類型的變量所對應(yīng)的指針名稱也是一致的,不過,根據(jù)已有信息對別名進(jìn)行判斷,一般都不會采用。
3.1 緩沖區(qū)溢出
近十年以來,緩沖區(qū)溢出成為了產(chǎn)生安全漏洞的最普遍存在的一種攻擊類型。而且讓人更為棘手的是,這種漏洞威脅在遠(yuǎn)程網(wǎng)絡(luò)的攻擊性中占有很大的比例。在發(fā)生這種攻擊行為時,得到的結(jié)果是一名不記名的Internet用戶可以輕松地掌控一臺計算機(jī)。這種攻擊性由于其獲得控制權(quán)的人具有隨意性,因此它也成為目前世界上最具攻擊性的不安全因素。
我們之所以把緩沖區(qū)溢出作為最大的威脅因素,最關(guān)鍵的就是因為它具有普遍性,而且操作簡單,很輕松就會造成威脅和攻擊。同時,它在遠(yuǎn)程網(wǎng)絡(luò)上具有很強(qiáng)的攻擊性,是因為這種攻擊能夠讓攻擊者為所欲為,想得到什么就得到什么。緩沖區(qū)漏洞在進(jìn)行程序攻擊時,以植入代碼的形式來行使對計算機(jī)的操縱權(quán)。他們控制計算機(jī)后,就可以進(jìn)行完全操作。接下來將具體闡述緩沖區(qū)溢出相關(guān)概念。
3.2 緩沖區(qū)溢出的概念
緩沖區(qū)是計算機(jī)用來存儲數(shù)據(jù)的,為程序運(yùn)行過程中計算機(jī)里存儲的數(shù)據(jù),計算機(jī)的存儲空間是一定的,當(dāng)程序進(jìn)行數(shù)據(jù)輸入的過程中,假設(shè)計算機(jī)的空間已滿,不能再存儲新的數(shù)據(jù),那么這些數(shù)據(jù)將會產(chǎn)生緩沖區(qū)溢出。攻擊者想要進(jìn)行攻擊時,就可以在這個區(qū)域植入一定字符串,來修改程序。在這個溢出區(qū)如果植入字符串,會造成兩樣后果:其一是字符串太長旁邊的存儲單元也無法儲存,造成程序終止;其二是借助這個漏洞能夠執(zhí)行所有指令,嚴(yán)重的情況下能夠獲得系統(tǒng)root特權(quán)。通常會出現(xiàn)緩沖區(qū)溢出最主要是由于程序里未認(rèn)真查看客戶錄入?yún)?shù)導(dǎo)致的,其實質(zhì)也是對于錄入?yún)?shù)的一個錯誤判斷和分析。
4.1 典型字符串處理函數(shù)的安全性分析
4.1.1 什么是系統(tǒng)調(diào)用
系統(tǒng)調(diào)用是連接用戶與核心層的一個層級。它用部分即定的模塊,它們創(chuàng)造了路徑,這個路徑主要是滿足用戶與應(yīng)用程序之間連接的需要。很多的數(shù)據(jù)操作系統(tǒng)里,普通用戶與應(yīng)用程序完全實現(xiàn)不了對硬件設(shè)備的訪問,具備這個權(quán)限的就是操作系統(tǒng),那是由于它掌握著系統(tǒng)的操作權(quán)限。因此如果要保證應(yīng)用程序可以沒有風(fēng)險地訪問硬件系統(tǒng)及別的也很關(guān)鍵的軟件,一般操作系統(tǒng)在進(jìn)行程序操作前,都會借助于系統(tǒng)調(diào)用這個功能。
4.2 C環(huán)境下系統(tǒng)調(diào)用的安全問題
編寫C語言代碼的過程中,針對于系統(tǒng)調(diào)用這點也尤其要關(guān)注,通常會涉及到2個安全問題,寫程序的過程里要考慮到進(jìn)去:
其一,保證你所新建的所有臨時文件都沒有保密的數(shù)據(jù),假設(shè)有這樣的數(shù)據(jù),在文件設(shè)置上定性為限本人讀/寫,這樣識別的文件只有本人能操作。
其二,明確對于運(yùn)行的命令都是本人要進(jìn)行的操作,(分別為system(),popen(),Systemout(),Systemin()),對于不識別的命令一律不能進(jìn)行操作,特別是本人的程序要是匿名的Internet用戶允許時一定要注意。
在進(jìn)行安全C語言設(shè)計時重點側(cè)重兩個問題:一方面是制約C程序本身,另一方面是利用程序標(biāo)注進(jìn)行程序?qū)傩缘慕榻B,這樣做的目的是用來提示程序驗證系統(tǒng),從而對程序進(jìn)行正確的判定。本文為了使闡述更為明確,將各個概念進(jìn)行了明確的界定,將變量根據(jù)其分配及函數(shù)動態(tài)、靜態(tài)等區(qū)域的不同劃分為巧變量、堆變量及靜態(tài)區(qū)變量。靜態(tài)區(qū)分為兩個區(qū)域,一個區(qū)域是只讀的,也就是對數(shù)據(jù)只能進(jìn)行讀,不能更改、刪除。像程序里有的字符串常量。相對應(yīng)的指針分別為找指針、堆指針及靜態(tài)區(qū)指針。在相應(yīng)的變量與指針進(jìn)行對比時,都統(tǒng)稱為巧變量。通常來說,將指向變量V指針叫做V指針。
5.1 對程序的約束
結(jié)合避免出現(xiàn)無法推斷別名及限制可推斷別名的原則,在對程序約束進(jìn)行設(shè)計時考慮以下幾方面:
其一,堆分配類型和指針不能同時出現(xiàn)在一個程序里,最好是不要在程序里有這兩個的共有的類型或指針。
其二,堆區(qū)與別的數(shù)據(jù)區(qū)聯(lián)系不大,最好不要有從堆區(qū)指向別的數(shù)據(jù)區(qū)里的指針,同時指針利用要科學(xué)合理,不能亂用。
其三,只能對在數(shù)組區(qū)內(nèi)的數(shù)據(jù)及指針進(jìn)行運(yùn)算。
從本質(zhì)上來說,編程都會按照這幾點進(jìn)行操作,像指針類型方面的,都是最為基本的。在實際操作中,還會呈現(xiàn)現(xiàn)以下特征:
①不能將堆變量和別的變量混亂連接形成易變數(shù)據(jù)結(jié)構(gòu)。
②有時候會出現(xiàn)把堆變量當(dāng)作靜態(tài)區(qū)指針的情況。
③通常情況下,不可能出現(xiàn)在某個概念里包含本身引用的結(jié)構(gòu)體類型(是類型與指針的類型都是同一種)構(gòu)造多種類型的易變數(shù)據(jù)結(jié)構(gòu)。
④用取地址算符&取巧變量、靜態(tài)區(qū)變量及堆變量的地址通常用于下面目的。
結(jié)語:Internet對于人類發(fā)展的重要程度越來越高,應(yīng)用程序連接越來越緊密,鏈條越來越長,安全問題也越來越復(fù)雜,相應(yīng)地給網(wǎng)絡(luò)帶來的不安全隱患越來越大,程序問題是互聯(lián)網(wǎng)健康發(fā)展的關(guān)鍵,需要高度重視。C語言在目前的應(yīng)用性語言中應(yīng)用最為廣泛,它的安全性直接關(guān)系到大部分網(wǎng)絡(luò)的安全性。所以,C語言的安全問題受到了廣泛關(guān)注。由此可見,針對該程序安全漏洞的研究與探索,對于網(wǎng)絡(luò)的健康發(fā)展至關(guān)重要。本文主要從C語言安全性分析展開,探討了C語言的不安全因素,C語言的安全性問題,其中C語言安全性問題介紹了安全編程語言的定義以及安全C語言的設(shè)計。
[1]司華友,趙蕓,羅顯貴.基于C語言的程序設(shè)計能力培養(yǎng)探析[J].計算機(jī)時代,2008(3):68-69
[2]蔡志遠(yuǎn),馬石城,蔡志堅.基于C語言程序的簡布法邊坡穩(wěn)定分析[J].長沙大學(xué)學(xué)報,2012,26(5):20-22
[3]王曉妍,蘇愛玲,張蕾妮.基于C語言程序設(shè)計課程在CDIO模式下實踐教學(xué)的探討[J].當(dāng)代教育實踐與教學(xué)研究:電子刊,2016(5):23-25
[4]高雅俠,鄒海榮.基于C語言程序設(shè)計的常見錯誤分析[J].電腦知識與技術(shù):學(xué)術(shù)交流,2009,5(35):69-70