(圖1:安全漏洞趨勢圖)

  今天軟件安全問題增長的原因:

  • Connectivity(互聯(lián)性):互聯(lián)網(wǎng)無處不在,系統(tǒng)全在上面。互聯(lián)網(wǎng)在使人們使用軟件變得方便的同時,也給黑客們更好的機會,給人們的軟件帶來了更多的風(fēng)險。互聯(lián)網(wǎng)意味著,黑客隨時隨地都可以訪問我們的軟件系統(tǒng),公共的訪問平臺使我們不能夠分別出哪些是真正的用戶,哪些是黑客。這樣他們比過去有了更多的時間和空間來攻擊我們的系統(tǒng),如果我們的軟件中一點兒安全的缺陷,他們就能夠知道,并利用之來攻擊。

  • Extensibility(擴展性):使攻擊系統(tǒng)的方式變得不可預(yù)測?,F(xiàn)在的軟件應(yīng)用系統(tǒng)趨向可擴展化,可擴展的系統(tǒng)可以接受更新或擴展,許多時候依賴于動態(tài)的代碼,使得系統(tǒng)的功能得到擴展,更好滿足人們的需求。如:Plug-In架構(gòu)的Web 瀏覽器使得我們可以隨意地安裝我們需要的文檔格式的閱讀器:Word, Excel, PDF等。今天操作系統(tǒng)通過動態(tài)的裝載設(shè)備驅(qū)動和模塊來支持可擴展。今天的應(yīng)用系統(tǒng),如:word 文字處理,E-mail客戶端,Web瀏覽器等都通過scripting, controls, components和applets來支持可擴展性。但擴展性給軟件的安全帶來了,很大的挑戰(zhàn)。

  • Complexity(復(fù)雜性)互聯(lián)網(wǎ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),為了達到更高運算速度,承載很大訪問量,就使用分布式,集群,可擴展架構(gòu)。使我們軟件代碼數(shù)急劇增長。復(fù)雜度也越來越大。軟件安全隱患也越來越大。

  2. 傳統(tǒng)的軟件安全的解決方法:

  在很多的公司或者企業(yè)里,系統(tǒng)安全一直依賴于硬件的防護,主要就由基層的人員完成,他們在我們的應(yīng)用系統(tǒng)上安裝并維護防火墻、入侵檢測系統(tǒng)和反病毒引擎。在我們應(yīng)用系統(tǒng)上增加一層又一層的保護層。使得系統(tǒng)得以安全。這些技術(shù)統(tǒng)稱:“Reactive Technologies”。同時通過限制一些網(wǎng)絡(luò)的端口,IP限制訪問等手段來防止黑客的攻擊。但是隨著軟件的發(fā)展,許多軟件是基于互聯(lián)網(wǎng)的,許多的業(yè)務(wù)和功能是通過互聯(lián)網(wǎng)完成的。這使得軟件應(yīng)用系統(tǒng)必須打破傳統(tǒng)的保護層,直接與外面的系統(tǒng)交互。如下圖2:從而使得系統(tǒng)沒有“內(nèi)”“外”之分了。這就使得傳統(tǒng)的防火墻所謂防止“外”來入侵的防御技術(shù)變得毫無意義了。這就是迫使我們一定要通過加強應(yīng)用軟件本身的質(zhì)量來防御黑客或惡意的內(nèi)部人員對應(yīng)用系統(tǒng)的攻擊。

  

  (圖2:傳統(tǒng)的保護層被打破)

      3. 軟件安全漏洞的分類:

  由于傳統(tǒng)的安全防護方式日益變得不再有用。我們也知道軟件的安全問題主要來自于軟件的本身。安全漏洞產(chǎn)生主要是由不合理的軟件架構(gòu)和錯誤的編碼所造成的。那么黑客到底利用我們軟件的什么樣的漏洞來攻擊我們軟件呢?換句話說,我們的軟件設(shè)計和編碼中,生產(chǎn)了什么樣的安全漏洞呢?那么將這些軟件安全的問題綜合起來,再進行分類,這個價值是無庸致疑的。分類可以使人們更好地了解計算機安全缺陷產(chǎn)生的根源。于是早在70年代中期,軟件安全問題分類這一問題就受到了廣泛的關(guān)注。很多研究組織紛紛進行研究。最早進行計算機安全與機密研究的組織是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

  這個研究表明在不同上下文的情況下,共同遇到的只有很少量的一些基礎(chǔ)性的缺陷。這個分類也只論述了很有限的幾個共有問題的類型,而且每個類型的限定也不是很清楚,許多情況下一個問題可以屬于一個或幾個類型,這樣的分類是不精確的。同時,分類的命名,不夠直觀。雖然它對很多研究人員也說很有用,但是對于軟件開發(fā)人員,他們并不能在他們每天繁重的工作的情況下很快地通過直覺把它們區(qū)分開來。另外,這項研究只是關(guān)注操作系統(tǒng)一些安全問題的分類而沒有關(guān)注到企業(yè)級軟件的安全問題。而隨著軟件的不斷發(fā)展,應(yīng)用軟件形式也不斷變化,安全問題分類也有了新的研究。下面摘要著名的軟件安全專家Gary Mc Graw的2006年的新書《Software Security building security In》中提出的軟件安全問題的“7+1”個很高級別的大類。這幾個領(lǐng)域中七個大類都是關(guān)注于源代碼的安全,一個是與軟件的配置和環(huán)境有關(guān)的。大類中我們又分了很多的小類,這8個大類及每個大類中主要的分類分別是:

  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. 真實有效的解決方案

  所謂“知己知彼,百戰(zhàn)不殆”,通過對安全漏洞的分類,我們清楚的知道了軟件中可能產(chǎn)生的各種各樣的安全隱患,那么我們只要做好充分的主動的預(yù)防工作,消除軟件中的安全隱患,這樣我們的軟件就可以抵御黑客或惡意的內(nèi)部人員的攻擊了。那么怎么做才可以徹底消除這些隱患呢?什么樣的方案才是真實有效的呢?

  軟件安全涉及軟件工程、編程語言、網(wǎng)絡(luò)、數(shù)據(jù)庫、安全工程等各個領(lǐng)域各個層次。涉及面非常廣。這使得做好軟件安全防御工作需要有很深的專業(yè)知識,管理技能,同時也要有非常豐富的實際經(jīng)驗。著名的軟件安全專家,美國著名的軟件安全咨詢Cigital公司CTO Gary Mc Graw博士一直從事軟件安全的研究,可以說是軟件和應(yīng)用程序安全領(lǐng)域的世界級權(quán)威。他建議,解決軟件安全主要可以從如下幾個方面入手:

  4.1.Applied Risk Management Framework(實用的風(fēng)險管理框架)

  我們常說的風(fēng)險管理和風(fēng)險分析都是在軟件設(shè)計的階段,軟件架構(gòu)級的風(fēng)險分析。分析我們的設(shè)計可能給軟件帶來什么樣的風(fēng)險。雖然它是風(fēng)險管理框架中最為重要最實際的一個關(guān)鍵的階段,但它不是風(fēng)險管理的全部。因為我們的軟件安全風(fēng)險是在整個軟件開發(fā)生命周期中慢慢地產(chǎn)生的。而不僅僅在設(shè)計階段。所以貫穿整個開發(fā)周期的風(fēng)險管理才尤為重要。所以我們稱之為“風(fēng)險管理框架”。

  風(fēng)險管理常常被人們叫做“black art” 。這是因為風(fēng)險管理有部分像占卜、算命一樣,在那里對未來要發(fā)生的事進行預(yù)測。又有部分像數(shù)學(xué),有著一定的邏輯推理。給人一空洞,沒有真憑實據(jù)的空談的感覺。然而一個成功的風(fēng)險管理,它是比做任何一個業(yè)務(wù)級的決策需要的依據(jù)都要多的多。首先我們必須要收集充分的用來做決策的數(shù)據(jù),其次我們要有軟件缺陷、威脅、影響和可能性的知識作基礎(chǔ),還要有豐富的軟件風(fēng)險管理的經(jīng)驗,綜合起來,這樣才能做好整個開發(fā)過程的風(fēng)險。從而降低風(fēng)險甚至消除風(fēng)險??偤推饋盹L(fēng)險管理也有五個階段的活動:

  (1)Understand the Business Context(了解業(yè)務(wù)需求內(nèi)容)

  (2)Identify the Business and Technical Risks(確認(rèn)業(yè)務(wù)風(fēng)險和技術(shù)風(fēng)險)

  (3)Synthesize and Rank the Risks(綜合風(fēng)險并劃分等級)

  (4)Define the Risk Mitigation Strategy(確定降低風(fēng)險策略)

  (5)Carry out Fixes and Validate(實施修復(fù)并檢驗結(jié)果)

  4.2.Software Security Touchpoints(軟件安全開發(fā)切入點)

  提高軟件安全的最好的一個種方法就創(chuàng)建安全的軟件——“Building Security In”。今天的軟件都有明顯的安全需求的特征。我們在完成軟件需求的功能的同時,也要建立安全需求。但是建立安全不等于就是簡單地加入SSL(Security Socket Layer)就可以的。第一因為安全問題是整個系統(tǒng)級的問題,它包括:安全機制(如:訪問控制)設(shè)計安全(如:堅固的設(shè)計使攻擊變得困難)編碼安全(如:Buffer Overflows)等很多方面。有時候這些方面是相互重疊的,但有時候又不是。第二因為安全問題是一個慢慢地連續(xù)不斷地出現(xiàn)的一個問題。在開發(fā)周期的每一個階段都有可能引入安全隱患,甚至是我們選擇的工具,選擇的實現(xiàn)技術(shù),數(shù)據(jù)庫等都可能引入新的問題。這也就是為什么安全問題是貫穿軟件開發(fā)整個生命周期的主要原因。所以要想解決安全問題從原來的被動的救火方式轉(zhuǎn)換到主動的防御式,就是時刻記

  住——“Building Security In”。

  (1)Code Review(代碼重審)

  (2)Architecture risk analysis(軟件架構(gòu)風(fēng)險分析)

  (3)Penetration testing(滲透測試)

  (4)Risk-based security tests(基于風(fēng)險的安全測試)

  (5)Abuse Case(最壞情況處理)

  (6)security requirements(安全的需要)

  (7)security operations(安全操作)

  

  (圖3:七個切入點在開發(fā)周期的分布圖)

  如上圖3可出從這七個方面入手可以較為全面的考慮安全構(gòu)建軟件。這七個方面分布在軟件開發(fā)周期中的各個階段。因此我們可以相信,只要我們認(rèn)真做到了這七個方面,我們的軟件的安全問題應(yīng)該可以得到解決。

  4.3.Knowledge(知識)

  軟件安全的最大的挑戰(zhàn)是我們?nèi)狈υ谲浖踩矫娴闹R和經(jīng)驗.因此我們需要,也非常有必要給我們的開發(fā)人員、設(shè)計人員,分析人員更多的有關(guān)軟件安全的知識的培訓(xùn),以期他們具備豐富的軟件安全的知識.

  5. 總結(jié):

  今天的軟件已經(jīng)成為我們生活重要而不可缺少的組成部分,它給我們帶來便利的同時也帶來了新的問題。黑客們常常很容易地獲取了我們重要的信息,給我們帶來巨大的經(jīng)濟損失。傳統(tǒng)的安全防御方式慢慢變得不能適應(yīng)今天的要求。提出新的解決軟件安全問題的方法迫在眉睫,“Building Security In”這一理念的提出,使我們找到了答案。對安全問題進行匯總,分類,然后在軟件開發(fā)的過程中時刻考慮安全問題。有理由相信,這樣的方法能夠提高軟件本身的防御黑客攻擊的能力.

分享到

yajing

相關(guān)推薦