“讓開發(fā)者愛上安全測試”系列之“源碼安全測試”——開發(fā)者之傷
源代碼安全測試不再是新鮮話題,在很多的企業(yè)已經(jīng)開展了相關(guān)工作,對(duì)于已經(jīng)開展此項(xiàng)目工作的企業(yè)來說,我想問的問題則是“在你的源代碼安全測試工作中所面臨的最大阻力是什么?” 這個(gè)問題不同的企業(yè)可能有不同的答案,且各有各的道理。
其實(shí),據(jù)我總結(jié)來看,很多的阻力表象最終都可以歸結(jié)為“開發(fā)人員不配合”的問題。那為什么開發(fā)人員不配合源代碼安全的相關(guān)工作呢?換句話說:如何讓開發(fā)者愛上安全測試呢?
“源代碼安全測試”——想說愛你不容易
對(duì)于開發(fā)者而言,源代碼安全測試不是我們不想做,也不是我們不愿意配合工作,而是總有這樣那樣的問題,讓我們實(shí)在愛不起來。原因歸納總結(jié)如下:
1. 測試的范圍不清楚
對(duì)于安全,我們都知道一個(gè)道理,沒有絕對(duì)的安全只有相對(duì)的安全。在很多企業(yè)中,源代碼安全測試的范圍和標(biāo)準(zhǔn)都是由安全部門一手“包辦”的。確定哪些漏洞需要修復(fù),哪些漏洞建議修復(fù),哪些漏洞可以暫緩修復(fù)等范圍和標(biāo)準(zhǔn)都是由安全部門人員說了算。這樣一來,安全部門人員由于職責(zé)所在,同時(shí)加上現(xiàn)在的安全漏洞層出不窮,花樣頗多的“壓力”,安全范圍和標(biāo)準(zhǔn)大都定的高一些,甚至一個(gè)項(xiàng)目一個(gè)標(biāo)準(zhǔn),能改盡量要求改。而且由于“語言上的不通”(安全人員不懂開發(fā),無法用編程的語言與開發(fā)者溝通),這些范圍和要求也很少與開發(fā)人員進(jìn)行溝通。這樣就導(dǎo)致開發(fā)人員總是感覺“安全人員老是挑刺,總是雞蛋里挑骨頭! 他們能查到什么就讓我們改什么!”等等這樣的感受。好像怎樣做都無法滿足安全上的要求。進(jìn)而產(chǎn)生不愿意配合漏洞的測試和修復(fù)工作,甚至是 “對(duì)抗”的情緒。久而久之,源代碼安全測試工作就很難再推動(dòng)下去。
2. 測試的結(jié)果不準(zhǔn)確
無論是安全性測試還是其他類型的測試,我想所有的測試人員都希望測試出來的問題即全面又準(zhǔn)確。這也是我們所有從事測試工具研究人員的理想,而現(xiàn)實(shí)卻總是有些“骨感”。面對(duì)目前市面上的所有源代碼安全測試產(chǎn)品,沒有任何一家可以說自己的產(chǎn)品即沒有誤報(bào)也沒有漏報(bào)。由于在安全測試的概念中,漏報(bào)的后果比誤報(bào)嚴(yán)重,所以大多數(shù)產(chǎn)品廠商會(huì)選擇“寧可錯(cuò)報(bào),不可漏報(bào)”的設(shè)計(jì)原則。這些原本作為輔助工具的測試產(chǎn)品在進(jìn)入用戶企業(yè)中后,卻被不科學(xué)地當(dāng)成了“裁判”,并且將其測試出來的原始結(jié)果在沒有經(jīng)過任何專業(yè)安全審計(jì)的情況下直接遞交到開發(fā)人員手中。
即使有專人專崗的安全審計(jì)人員,他們?cè)诎踩┒磳徲?jì)過程中由于缺乏有效的溝通方式,很少與開發(fā)人員進(jìn)行技術(shù)溝通,審計(jì)出來的結(jié)果也會(huì)被當(dāng)著“一面之詞”。(這里我們且不討論純?nèi)斯みM(jìn)行的源代碼安全審計(jì),因?yàn)榈侥壳盀橹刮乙矝]有看到一家用戶這么干,自己寫點(diǎn)兒小工具或者腳本輔助人工審計(jì)的到是有一些,只是那些自己寫的小工具或者腳本誤漏報(bào)更是一堆。)開發(fā)人員在面對(duì)這些“漏洞信息”時(shí),加之本身都不愿意相信自己的“作品”有問題的心理,便會(huì)對(duì)安全測試結(jié)果從相信到懷疑,再到完全的不信任,最后就會(huì)抱怨“全是誤報(bào)!”,便再也沒有配合修復(fù)漏洞的想法了。
3. 測試的時(shí)間不及時(shí)
做過軟件開發(fā)的人都知道,即便是自己寫的代碼,如果隔上一兩個(gè)月的時(shí)間,想再看明白為什么這么編寫都比較困難。如果隔上一年半載,加之別人寫的代碼,那維護(hù)起來就難上加難了。這也是程序猿們所提倡的“敏捷開發(fā)”和“快速迭代”理念的原由。在源代碼安全測試中,我們也應(yīng)該提出“敏捷安全測試”的理念,要盡量在開發(fā)人員每一個(gè)小的迭代時(shí),就要完成一個(gè)安全測試,修復(fù)起來也更加容易。
但現(xiàn)實(shí)中的源代碼安全測試是什么樣子呢?絕大多數(shù)的企業(yè)把源代碼安全測試和安全滲透測試基本都放到了“驗(yàn)收測試”階段中。項(xiàng)目只有在上線、發(fā)布或者交付之前才做一次安全測試。而這些開發(fā)周期少則半年多則幾年的項(xiàng)目,到了驗(yàn)收階段時(shí),這些開發(fā)人員再對(duì)修改幾個(gè)月幾年前的代碼,那是多么郁悶呀!另外,由于平時(shí)沒有測試,漏洞量和代碼一樣會(huì)積少成多,這個(gè)階段檢測出來的漏洞往往會(huì)很多,很復(fù)雜。這怎么能讓開發(fā)人員欣然接受、積極配合呢?恐怕只剩下“能推就推,能不承認(rèn)就不承認(rèn)”了吧!
4. 測試的成本太高昂
這個(gè)原因,我們可以接上一個(gè)原因往下講。當(dāng)聰明的開發(fā)人員發(fā)現(xiàn)項(xiàng)目最終總是會(huì)被動(dòng)地被“安全驗(yàn)收測試”,那時(shí)再修復(fù)起來會(huì)手忙腳亂,不如功在平時(shí),在開發(fā)過程中主動(dòng)地、自主地先對(duì)源代碼安全測試一下,將漏洞化整為零,及時(shí)測試,及時(shí)修復(fù)。這樣的想法是非常好的,可以在實(shí)施的時(shí)候就會(huì)發(fā)現(xiàn)有這樣那樣的問題,要么由于安全測試工具License的限制,只能由專門的安全人員或者測試人員才能使用,而他們本身忙于對(duì)企業(yè)內(nèi)眾多項(xiàng)目的“安全驗(yàn)收”測試,沒有時(shí)間和精力來為您“開小灶”。要么安全測試工具使用起來較麻煩,沒有受過專業(yè)的產(chǎn)品使用培訓(xùn)還真不太能玩得轉(zhuǎn),且要準(zhǔn)備這樣那樣的測試環(huán)境等等。要么就是安全測試工具很消耗系統(tǒng)的資源,不能實(shí)現(xiàn)較大的吞吐量,無法滿足每一個(gè)項(xiàng)目在開發(fā)過程的多輪次的源代碼安全測試。這就使得開發(fā)人員自主主動(dòng)地源代碼安全測試變得很難,甚至是不可能進(jìn)行下去。
5. 修復(fù)的方法不明確
在生活中我們通常都明的一個(gè)道理:“己所不欲,忽施于人”,自己做不到的事情,也不能要求別人要做到。在源代碼安全測試或者說安全編程這件事上,恰恰違背了這一點(diǎn)。在大多數(shù)的情況下,安全漏洞從發(fā)現(xiàn)到確認(rèn)都是由安全人員來完成的,開發(fā)人員都是在為修復(fù)安全漏洞而努力。目前,開發(fā)人員缺乏安全漏洞的修復(fù)經(jīng)驗(yàn)和相關(guān)的安全編程知識(shí),這是普遍存在的現(xiàn)狀,即使有十幾年開發(fā)經(jīng)驗(yàn)的“老司機(jī)”在一些安全漏洞面前,也都還是“小學(xué)生”。所以,開發(fā)人員勢(shì)必要詢問安全人員如何對(duì)這些漏洞進(jìn)行修復(fù),如何避免這些安全上的“坑”。
但是,這些安全人員雖可以對(duì)這些漏洞如數(shù)家珍,安全滲透玩得有模有樣,可在代碼開發(fā)和安全編碼方面著實(shí)是個(gè)“門外漢”。站在有著十幾年開發(fā)經(jīng)驗(yàn)的老手面前,若只是根據(jù)測試工具給出的那些“標(biāo)準(zhǔn)答案”,可能也不好交差。最后會(huì)讓開發(fā)人員感覺到很無奈,想配合進(jìn)行安全修復(fù)都沒有一個(gè)具體明確的方法,還要一點(diǎn)點(diǎn)地自行研究和嘗試。還有一點(diǎn),即便是開發(fā)人員經(jīng)過一段時(shí)間的積累和總結(jié),有了一些安全開發(fā)和修復(fù)的經(jīng)驗(yàn),也都因?yàn)闆]有一個(gè)經(jīng)驗(yàn)共享和傳承的平臺(tái),這些寶貴的經(jīng)驗(yàn)只能散落在各個(gè)項(xiàng)目中,個(gè)別開發(fā)人員手上,沒有形成統(tǒng)一的修復(fù)方法,是非??上У氖虑?。最終因項(xiàng)目的不斷交替,人員的頻繁流動(dòng)。新的開發(fā)人員不斷地抱怨著,且不斷地重復(fù)地走在研究各個(gè)漏洞修復(fù)方法的路上。
(注意: 以上原因皆為筆者自己在工作中歸納總結(jié)出來的,請(qǐng)勿對(duì)號(hào)入座!)
如何讓開發(fā)者愛上“源代碼安全測試”?
既然我們已經(jīng)了解了開發(fā)人員不是很配合源代碼安全測試這件事的原因,我們要想順利地開展此項(xiàng)目工作就應(yīng)該盡量避免這些問題。以我這些年為用戶服務(wù)的經(jīng)驗(yàn),我總結(jié)了一些基本方法,或許可以幫助大家將這些問題一一克服,讓開發(fā)人員能夠接受源代碼安全測試,甚至是愛上安全測試?;痉椒ㄈ缦拢?/p>
1. 建立明確的安全測試范圍和標(biāo)準(zhǔn)。明確地讓開發(fā)人員知道要檢測的內(nèi)容和標(biāo)準(zhǔn),當(dāng)然這個(gè)安全測試標(biāo)準(zhǔn),一定是要安全部門和開發(fā)部門一起進(jìn)行討論和協(xié)商而來的,讓大家都能夠明白這些漏洞的危害,造成的影響等。
2. 建立安全審計(jì)團(tuán)隊(duì),總結(jié)安全漏洞審計(jì)指南。安全測試本身可以盡量地自動(dòng)化實(shí)現(xiàn),但測試工具測試出來的漏洞,仍然需要大量的人員安全審計(jì)才行。因此要培養(yǎng)相關(guān)人員,建立有效的安全審計(jì)團(tuán)隊(duì),確保測試結(jié)果的相對(duì)準(zhǔn)確性,來減少開發(fā)人的員的不必要的修復(fù)工作。同時(shí),可以在工作中總結(jié)一些安全審計(jì)的方法,編寫出審計(jì)指南,方便分享和傳遞。
3. 建立企業(yè)安全測試私云,形成敏捷源代碼安全測試模式。企業(yè)在選擇測試工具時(shí),一定要盡可能地考慮一些有企業(yè)級(jí)測試私有云的測試解決方案,這樣可以在企業(yè)內(nèi)部建立一個(gè)統(tǒng)一的私有測試云平臺(tái),擴(kuò)大使用范圍,最好讓開發(fā)人員在開發(fā)過程中實(shí)現(xiàn)迭代測試,當(dāng)然,這還有一個(gè)前提就是把源代碼安全測試做得一定要方便,簡單,易操作,成本小。
4. 建立企業(yè)安全知識(shí)交流和分享平臺(tái),形成企業(yè)自有的安全編碼庫。這一個(gè)方面是開發(fā)人員最為關(guān)心,做好了也是最為喜歡的部分,就是可以在企業(yè)內(nèi)部建立一個(gè)安全知識(shí)交流,學(xué)習(xí),分享的平臺(tái)。大家可以共同研究和學(xué)習(xí)漏洞知識(shí)以及修復(fù)方案。最終可以形式企業(yè)自有的安全編碼沒庫。這是最理想的。
5. 定期組織軟件安全知識(shí)培訓(xùn)和講座,提高整體人員安全水平。我常常聽到開發(fā)人員給安全測試人員說:”我們不怕測出安全漏洞多,只要告訴我們準(zhǔn)確的修復(fù)方法,我們來改就行;你們最好給我們一個(gè)安全的編程方法,以后我們能就盡量避免漏洞”。”修復(fù)方法”、”安全編程”。就是軟件安全開發(fā)知識(shí)中的基本內(nèi)容了。所以,企業(yè)應(yīng)該定期或者不定期地給相關(guān)技術(shù)人員,特別是開發(fā)人員進(jìn)行安全知識(shí)培訓(xùn),針對(duì)安全漏洞進(jìn)行集中式安全編程培訓(xùn),這樣就可以從開發(fā)意識(shí)和開發(fā)習(xí)慣上杜絕安全漏洞。另一方面,技術(shù)人員能夠在工作中不斷地學(xué)習(xí)和成長,也是企業(yè)應(yīng)盡的義務(wù)。
結(jié)語
“讓開發(fā)者愛上安全測試”,這是一個(gè)統(tǒng)籌的理念,它包括諸多的意義。尤如前文所說的,在通常的安全測試過程中,問題表象好像是“開發(fā)人員的不配合和不支持”,但實(shí)質(zhì)則是整體軟件安全體系建設(shè)的不全面和不完整所導(dǎo)致的。只能通過疏通每一個(gè)環(huán)節(jié)上的問題,建立一個(gè)整體的軟件安全開發(fā)管理體系才能讓各個(gè)部門,各個(gè)角色的人員都能積極配合起來,才能“讓大家愛上安全測試”。