(圖1:安全漏洞趨勢(shì)圖)
今天軟件安全問題增長(zhǎng)的原因:
• Connectivity(互聯(lián)性):互聯(lián)網(wǎng)無處不在,系統(tǒng)全在上面?;ヂ?lián)網(wǎng)在使人們使用軟件變得方便的同時(shí),也給黑客們更好的機(jī)會(huì),給人們的軟件帶來了更多的風(fēng)險(xiǎn)?;ヂ?lián)網(wǎng)意味著,黑客隨時(shí)隨地都可以訪問我們的軟件系統(tǒng),公共的訪問平臺(tái)使我們不能夠分別出哪些是真正的用戶,哪些是黑客。這樣他們比過去有了更多的時(shí)間和空間來攻擊我們的系統(tǒng),如果我們的軟件中一點(diǎn)兒安全的缺陷,他們就能夠知道,并利用之來攻擊。
• Extensibility(擴(kuò)展性):使攻擊系統(tǒng)的方式變得不可預(yù)測(cè)?,F(xiàn)在的軟件應(yīng)用系統(tǒng)趨向可擴(kuò)展化,可擴(kuò)展的系統(tǒng)可以接受更新或擴(kuò)展,許多時(shí)候依賴于動(dòng)態(tài)的代碼,使得系統(tǒng)的功能得到擴(kuò)展,更好滿足人們的需求。如:Plug-In架構(gòu)的Web 瀏覽器使得我們可以隨意地安裝我們需要的文檔格式的閱讀器:Word, Excel, PDF等。今天操作系統(tǒng)通過動(dòng)態(tài)的裝載設(shè)備驅(qū)動(dòng)和模塊來支持可擴(kuò)展。今天的應(yīng)用系統(tǒng),如:word 文字處理,E-mail客戶端,Web瀏覽器等都通過scripting, controls, components和applets來支持可擴(kuò)展性。但擴(kuò)展性給軟件的安全帶來了,很大的挑戰(zhàn)。
• Complexity(復(fù)雜性)互聯(lián)網(wǎng),分布式,動(dòng)態(tài)的代碼?,F(xiàn)在的軟件應(yīng)用系統(tǒng)的變得越來越大,復(fù)雜性也越來越大,操作系統(tǒng)從DOS到今天的WindowsXP,XP的代碼最少4000億行。復(fù)雜度可想可知。而現(xiàn)在的基于網(wǎng)絡(luò)的應(yīng)用系統(tǒng),為了達(dá)到更高運(yùn)算速度,承載很大訪問量,就使用分布式,集群,可擴(kuò)展架構(gòu)。使我們軟件代碼數(shù)急劇增長(zhǎng)。復(fù)雜度也越來越大。軟件安全隱患也越來越大。
2. 傳統(tǒng)的軟件安全的解決方法:
在很多的公司或者企業(yè)里,系統(tǒng)安全一直依賴于硬件的防護(hù),主要就由基層的人員完成,他們?cè)谖覀兊膽?yīng)用系統(tǒng)上安裝并維護(hù)防火墻、入侵檢測(cè)系統(tǒng)和反病毒引擎。在我們應(yīng)用系統(tǒng)上增加一層又一層的保護(hù)層。使得系統(tǒng)得以安全。這些技術(shù)統(tǒng)稱:“Reactive Technologies”。同時(shí)通過限制一些網(wǎng)絡(luò)的端口,IP限制訪問等手段來防止黑客的攻擊。但是隨著軟件的發(fā)展,許多軟件是基于互聯(lián)網(wǎng)的,許多的業(yè)務(wù)和功能是通過互聯(lián)網(wǎng)完成的。這使得軟件應(yīng)用系統(tǒng)必須打破傳統(tǒng)的保護(hù)層,直接與外面的系統(tǒng)交互。如下圖2:從而使得系統(tǒng)沒有“內(nèi)”“外”之分了。這就使得傳統(tǒng)的防火墻所謂防止“外”來入侵的防御技術(shù)變得毫無意義了。這就是迫使我們一定要通過加強(qiáng)應(yīng)用軟件本身的質(zhì)量來防御黑客或惡意的內(nèi)部人員對(duì)應(yīng)用系統(tǒng)的攻擊。
(圖2:傳統(tǒng)的保護(hù)層被打破)
3. 軟件安全漏洞的分類:
由于傳統(tǒng)的安全防護(hù)方式日益變得不再有用。我們也知道軟件的安全問題主要來自于軟件的本身。安全漏洞產(chǎn)生主要是由不合理的軟件架構(gòu)和錯(cuò)誤的編碼所造成的。那么黑客到底利用我們軟件的什么樣的漏洞來攻擊我們軟件呢?換句話說,我們的軟件設(shè)計(jì)和編碼中,生產(chǎn)了什么樣的安全漏洞呢?那么將這些軟件安全的問題綜合起來,再進(jìn)行分類,這個(gè)價(jià)值是無庸致疑的。分類可以使人們更好地了解計(jì)算機(jī)安全缺陷產(chǎn)生的根源。于是早在70年代中期,軟件安全問題分類這一問題就受到了廣泛的關(guān)注。很多研究組織紛紛進(jìn)行研究。最早進(jìn)行計(jì)算機(jī)安全與機(jī)密研究的組織是RISOS(Research Into Secure Operating System).RISOS提出和描述了幾種操作系統(tǒng)安全的缺陷。它的目標(biāo)是了解在操作系統(tǒng)中存在的安全問題。RISOS提出的安全問題的種類包括:
• Incomplete Parameter Validation
• Inconsistent Parameter Validation
• Implicit Sharing of Privileges / Confidential Data
• Asynchronous Validation / Inadequate Serialization
• Inadequate Identification / Authentication / Authorization
• Violable Prohibition / Limit
• Exploitable Logic Error
這個(gè)研究表明在不同上下文的情況下,共同遇到的只有很少量的一些基礎(chǔ)性的缺陷。這個(gè)分類也只論述了很有限的幾個(gè)共有問題的類型,而且每個(gè)類型的限定也不是很清楚,許多情況下一個(gè)問題可以屬于一個(gè)或幾個(gè)類型,這樣的分類是不精確的。同時(shí),分類的命名,不夠直觀。雖然它對(duì)很多研究人員也說很有用,但是對(duì)于軟件開發(fā)人員,他們并不能在他們每天繁重的工作的情況下很快地通過直覺把它們區(qū)分開來。另外,這項(xiàng)研究只是關(guān)注操作系統(tǒng)一些安全問題的分類而沒有關(guān)注到企業(yè)級(jí)軟件的安全問題。而隨著軟件的不斷發(fā)展,應(yīng)用軟件形式也不斷變化,安全問題分類也有了新的研究。下面摘要著名的軟件安全專家Gary Mc Graw的2006年的新書《Software Security building security In》中提出的軟件安全問題的“7+1”個(gè)很高級(jí)別的大類。這幾個(gè)領(lǐng)域中七個(gè)大類都是關(guān)注于源代碼的安全,一個(gè)是與軟件的配置和環(huán)境有關(guān)的。大類中我們又分了很多的小類,這8個(gè)大類及每個(gè)大類中主要的分類分別是:
1. Input Validation and Representation
Buffer Overflows
Command Injection
Cross-Site Scripting(XSS) Flaws
Format String Problems
Integer Range Errors
SQL Injection
2. API Abuse
Trusting Network Address Information
Dangerous Function
Directory Restriction.
Heap Inspection
3. Security Features
Failing to Protect Network Traffic
Failing to Store and Protect Data
Failing to Use Cryptographically Strong Random
Numbers
Improper File Access
Improper Use of SSL
Use of Weak Password-Based Systems
Unauthenticated Key Exchange
4. Time and State
Signal Race Conditions
Use of “Magic” URLs and Hidden Forms
5. Errors
Failure to Handle Errors
Catch NullPointerException
Empty Catch Block
Overly-Broad Catch Block
Overly-Broad Throws Declaration.
6. Code Quality
Poor Usability
Double Free. Calling free()
Inconsistent Implementations
Memory Leak
Null Dereference
7. Encapsulation
Information Leakage
Comparing Classes by Name
Data Leaking Between Users
Leftover Debug Code
Trust Boundary Violation
8. Environment
Insecure Compiler Optimization
ASP .NET Misconfiguration: Creating Debug Binary ;Missing Custom Error Handling
Password in Configuration File
J2EE Misconfiguration: Insecure Transport ; Insufficient Session-ID Length
Missing Error Handling ; Unsafe Bean Declaration
Weak Access Permissions
這些分類包括了各種程序語言中遇到的源代碼的安全問題,它包括C,C++,JAVA,以及。NET家族的C#、ASP。在這里我只是大致描述一下。詳細(xì)的分類的描述在http://www.fortify.com/vulcat/。
4. 真實(shí)有效的解決方案:
所謂“知己知彼,百戰(zhàn)不殆”,通過對(duì)安全漏洞的分類,我們清楚的知道了軟件中可能產(chǎn)生的各種各樣的安全隱患,那么我們只要做好充分的主動(dòng)的預(yù)防工作,消除軟件中的安全隱患,這樣我們的軟件就可以抵御黑客或惡意的內(nèi)部人員的攻擊了。那么怎么做才可以徹底消除這些隱患呢?什么樣的方案才是真實(shí)有效的呢?
軟件安全涉及軟件工程、編程語言、網(wǎng)絡(luò)、數(shù)據(jù)庫、安全工程等各個(gè)領(lǐng)域各個(gè)層次。涉及面非常廣。這使得做好軟件安全防御工作需要有很深的專業(yè)知識(shí),管理技能,同時(shí)也要有非常豐富的實(shí)際經(jīng)驗(yàn)。著名的軟件安全專家,美國(guó)著名的軟件安全咨詢Cigital公司CTO Gary Mc Graw博士一直從事軟件安全的研究,可以說是軟件和應(yīng)用程序安全領(lǐng)域的世界級(jí)權(quán)威。他建議,解決軟件安全主要可以從如下幾個(gè)方面入手:
4.1.Applied Risk Management Framework(實(shí)用的風(fēng)險(xiǎn)管理框架)
我們常說的風(fēng)險(xiǎn)管理和風(fēng)險(xiǎn)分析都是在軟件設(shè)計(jì)的階段,軟件架構(gòu)級(jí)的風(fēng)險(xiǎn)分析。分析我們的設(shè)計(jì)可能給軟件帶來什么樣的風(fēng)險(xiǎn)。雖然它是風(fēng)險(xiǎn)管理框架中最為重要最實(shí)際的一個(gè)關(guān)鍵的階段,但它不是風(fēng)險(xiǎn)管理的全部。因?yàn)槲覀兊能浖踩L(fēng)險(xiǎn)是在整個(gè)軟件開發(fā)生命周期中慢慢地產(chǎn)生的。而不僅僅在設(shè)計(jì)階段。所以貫穿整個(gè)開發(fā)周期的風(fēng)險(xiǎn)管理才尤為重要。所以我們稱之為“風(fēng)險(xiǎn)管理框架”。
風(fēng)險(xiǎn)管理常常被人們叫做“black art” 。這是因?yàn)轱L(fēng)險(xiǎn)管理有部分像占卜、算命一樣,在那里對(duì)未來要發(fā)生的事進(jìn)行預(yù)測(cè)。又有部分像數(shù)學(xué),有著一定的邏輯推理。給人一空洞,沒有真憑實(shí)據(jù)的空談的感覺。然而一個(gè)成功的風(fēng)險(xiǎn)管理,它是比做任何一個(gè)業(yè)務(wù)級(jí)的決策需要的依據(jù)都要多的多。首先我們必須要收集充分的用來做決策的數(shù)據(jù),其次我們要有軟件缺陷、威脅、影響和可能性的知識(shí)作基礎(chǔ),還要有豐富的軟件風(fēng)險(xiǎn)管理的經(jīng)驗(yàn),綜合起來,這樣才能做好整個(gè)開發(fā)過程的風(fēng)險(xiǎn)。從而降低風(fēng)險(xiǎn)甚至消除風(fēng)險(xiǎn)??偤推饋盹L(fēng)險(xiǎn)管理也有五個(gè)階段的活動(dòng):
(1)Understand the Business Context(了解業(yè)務(wù)需求內(nèi)容)
(2)Identify the Business and Technical Risks(確認(rèn)業(yè)務(wù)風(fēng)險(xiǎn)和技術(shù)風(fēng)險(xiǎn))
(3)Synthesize and Rank the Risks(綜合風(fēng)險(xiǎn)并劃分等級(jí))
(4)Define the Risk Mitigation Strategy(確定降低風(fēng)險(xiǎn)策略)
(5)Carry out Fixes and Validate(實(shí)施修復(fù)并檢驗(yàn)結(jié)果)
4.2.Software Security Touchpoints(軟件安全開發(fā)切入點(diǎn))
提高軟件安全的最好的一個(gè)種方法就創(chuàng)建安全的軟件——“Building Security In”。今天的軟件都有明顯的安全需求的特征。我們?cè)谕瓿绍浖枨蟮墓δ艿耐瑫r(shí),也要建立安全需求。但是建立安全不等于就是簡(jiǎn)單地加入SSL(Security Socket Layer)就可以的。第一因?yàn)榘踩珕栴}是整個(gè)系統(tǒng)級(jí)的問題,它包括:安全機(jī)制(如:訪問控制)設(shè)計(jì)安全(如:堅(jiān)固的設(shè)計(jì)使攻擊變得困難)編碼安全(如:Buffer Overflows)等很多方面。有時(shí)候這些方面是相互重疊的,但有時(shí)候又不是。第二因?yàn)榘踩珕栴}是一個(gè)慢慢地連續(xù)不斷地出現(xiàn)的一個(gè)問題。在開發(fā)周期的每一個(gè)階段都有可能引入安全隱患,甚至是我們選擇的工具,選擇的實(shí)現(xiàn)技術(shù),數(shù)據(jù)庫等都可能引入新的問題。這也就是為什么安全問題是貫穿軟件開發(fā)整個(gè)生命周期的主要原因。所以要想解決安全問題從原來的被動(dòng)的救火方式轉(zhuǎn)換到主動(dòng)的防御式,就是時(shí)刻記
住——“Building Security In”。
(1)Code Review(代碼重審)
(2)Architecture risk analysis(軟件架構(gòu)風(fēng)險(xiǎn)分析)
(3)Penetration testing(滲透測(cè)試)
(4)Risk-based security tests(基于風(fēng)險(xiǎn)的安全測(cè)試)
(5)Abuse Case(最壞情況處理)
(6)security requirements(安全的需要)
(7)security operations(安全操作)
(圖3:七個(gè)切入點(diǎn)在開發(fā)周期的分布圖)
如上圖3可出從這七個(gè)方面入手可以較為全面的考慮安全構(gòu)建軟件。這七個(gè)方面分布在軟件開發(fā)周期中的各個(gè)階段。因此我們可以相信,只要我們認(rèn)真做到了這七個(gè)方面,我們的軟件的安全問題應(yīng)該可以得到解決。
4.3.Knowledge(知識(shí))
軟件安全的最大的挑戰(zhàn)是我們?nèi)狈υ谲浖踩矫娴闹R(shí)和經(jīng)驗(yàn).因此我們需要,也非常有必要給我們的開發(fā)人員、設(shè)計(jì)人員,分析人員更多的有關(guān)軟件安全的知識(shí)的培訓(xùn),以期他們具備豐富的軟件安全的知識(shí).
5. 總結(jié):
今天的軟件已經(jīng)成為我們生活重要而不可缺少的組成部分,它給我們帶來便利的同時(shí)也帶來了新的問題。黑客們常常很容易地獲取了我們重要的信息,給我們帶來巨大的經(jīng)濟(jì)損失。傳統(tǒng)的安全防御方式慢慢變得不能適應(yīng)今天的要求。提出新的解決軟件安全問題的方法迫在眉睫,“Building Security In”這一理念的提出,使我們找到了答案。對(duì)安全問題進(jìn)行匯總,分類,然后在軟件開發(fā)的過程中時(shí)刻考慮安全問題。有理由相信,這樣的方法能夠提高軟件本身的防御黑客攻擊的能力.