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