防患于未然:強(qiáng)化選擇編程語(yǔ)言時(shí)的安全意識(shí)
在軟件安全中,編程語(yǔ)言的選擇是一個(gè)重要因素。在許多情況下,老代碼、開(kāi)發(fā)團(tuán)隊(duì)中的可用技術(shù)或者客戶需求、環(huán)境等都可能限制編程語(yǔ)言的選擇。在評(píng)估和選擇編程語(yǔ)言時(shí),你應(yīng)當(dāng)關(guān)注下面這些與安全相關(guān)的問(wèn)題:
1、你的程序員用過(guò)哪些語(yǔ)言?在程序員使用自己基本沒(méi)有開(kāi)發(fā)經(jīng)驗(yàn)的語(yǔ)言進(jìn)行編碼時(shí),就更有可能犯錯(cuò)誤。
2、該語(yǔ)言有助于或有礙于安全代碼的開(kāi)發(fā)嗎?
3、該語(yǔ)言有可用的安全編碼標(biāo)準(zhǔn)嗎?
4、該語(yǔ)言存在哪些安全問(wèn)題?有哪些策略可以減輕其威脅?其有效性如何?
權(quán)衡語(yǔ)言的選擇:在許多情況下,語(yǔ)言的選擇會(huì)直接影響到系統(tǒng)的安全性。最顯著的例子是C語(yǔ)言和Java語(yǔ)言中數(shù)組邊界檢查的影響。雖然多數(shù)現(xiàn)代的C編譯器支持運(yùn)行時(shí)的邊界檢查,但該特性會(huì)造成Web服務(wù)器、操作系統(tǒng)、應(yīng)用程序等的緩沖區(qū)溢出漏洞,但對(duì)于性能等因素非常重要的環(huán)境(如嵌入式設(shè)備和智能卡)來(lái)說(shuō),就不是那么回事兒了。Java虛擬機(jī)可能會(huì)帶來(lái)太多的性能問(wèn)題,導(dǎo)致潛在的服務(wù)被拒絕。類似的安全問(wèn)題使得設(shè)計(jì)者或編碼者理解某種計(jì)算機(jī)語(yǔ)言存在哪些弱點(diǎn)非常重要。如果選擇了某種編程語(yǔ)言,設(shè)計(jì)者或編碼者知道哪些弱點(diǎn)更容易出現(xiàn)也很重要。
“安全”的語(yǔ)言:多數(shù)“安全的”語(yǔ)言(或語(yǔ)言的變種)都是用緩沖區(qū)、指針和內(nèi)存管理來(lái)避免安全問(wèn)題。由微軟開(kāi)發(fā)的邊界檢查接口以及類似的接口都可以減輕由現(xiàn)有C程序中不正確的串管理所造成的漏洞。如果你要編制的程序?qū)⒁谝粋€(gè)特定的暴露環(huán)境、手機(jī)、Web頁(yè)面中運(yùn)行,就應(yīng)當(dāng)使用一種包含其自身安全模式和自我保護(hù)特性的語(yǔ)言(例如,Java)。還有一種選擇,即在主機(jī)系統(tǒng)上實(shí)現(xiàn)一種虛擬機(jī),以包含和隔離所編制的程序。
靜態(tài)類型的好處:支持靜態(tài)類型的語(yǔ)言,如Java、F#等,都可以確保操作僅能應(yīng)用于適當(dāng)?shù)念愋汀VС诸愋统橄蟮念愋拖到y(tǒng)可以讓程序員指定新的抽象類型和簽名。這種類型可以防止沒(méi)有經(jīng)過(guò)授權(quán)的代碼對(duì)特定的值實(shí)施操作。在這個(gè)方面,類型系統(tǒng)就超越了操作系統(tǒng),因?yàn)樗梢员挥糜趶?qiáng)化更為廣泛的訪問(wèn)策略類型。靜態(tài)的類型系統(tǒng)還可以通過(guò)靜態(tài)的檢查來(lái)支持離線強(qiáng)化,而不是根據(jù)特定的操作實(shí)例來(lái)檢查。這就使得類型檢查器可以強(qiáng)化難以通過(guò)在線技術(shù)強(qiáng)化的規(guī)則。
內(nèi)建的安全機(jī)制:較新的語(yǔ)言,如C#,擁有內(nèi)建到語(yǔ)言中的許多安全機(jī)制,其中包括類型安全元素、代碼訪問(wèn)安全和基于角色的安全,這些安全機(jī)制都包括在.NET框架中。雖然.NET框架和C#包含許多有助于安全開(kāi)發(fā)的要素,開(kāi)發(fā)團(tuán)隊(duì)仍有責(zé)任正確地開(kāi)發(fā)和使用這些要素。注意,計(jì)算機(jī)語(yǔ)言仍有某些特性可以提供更多的安全性;不過(guò),其它方面有可能打開(kāi)新的安全漏洞。因而,對(duì)開(kāi)發(fā)團(tuán)隊(duì)而言,有必要知道由所選擇的語(yǔ)言導(dǎo)致的任何漏洞或問(wèn)題。
有些語(yǔ)言可以通過(guò)限制程序能夠激發(fā)的系統(tǒng)調(diào)用,來(lái)減少一些不可信的程序可能帶來(lái)的破壞。Perl通過(guò)其“污染模式”來(lái)實(shí)現(xiàn)此功能,僅允許程序員明確設(shè)置為“清潔”的用戶輸入。 Java提供了JVM作為沙盒,并且不允許不受信任的程序在JVM之外運(yùn)行。例如,一個(gè)不可信的Java小程序就不能創(chuàng)建新過(guò)程或者讀寫(xiě)本地磁盤(pán)。
不要僅依賴語(yǔ)言的選擇:雖然選擇一種安全的編程語(yǔ)言很重要,但許多開(kāi)發(fā)者者會(huì)錯(cuò)誤地認(rèn)為安全語(yǔ)言是安全漏洞的萬(wàn)能藥。不過(guò),如果沒(méi)有一個(gè)安全的開(kāi)發(fā)過(guò)程,如果沒(méi)有知道如何安全編碼的開(kāi)發(fā)人員,在將用一種語(yǔ)言編寫(xiě)的軟件改為用另外一種語(yǔ)言編碼時(shí),就很容易出現(xiàn)問(wèn)題。
選擇健全的編程語(yǔ)言是編制安全程序的一個(gè)重要條件,但并非唯一要素。開(kāi)發(fā)團(tuán)隊(duì)?wèi)?yīng)當(dāng)根據(jù)項(xiàng)目特點(diǎn)、具體操作環(huán)境、開(kāi)發(fā)團(tuán)隊(duì)的人員素質(zhì)等要素選擇合適的編程語(yǔ)言。























