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