我們今天的現代化社會十分依賴於軟體,軟體可以實現企業的商務流程,可以操控我們日常中所有的電子商務,(例如手機,飛機和取款機),軟體也是一些重要服務的核心,例如電話網絡,網際網路,空中交通指揮系統等。對全球經濟增長,人民生活質量,企業成功以及政府組織機構來說,如今軟體比以往任何時候都重要。我們必需使用安全的軟體。
然而隨著網際網路和基於網際網路的應用系統的不斷發展,軟體安全問題日異嚴重。傳統的安全防禦方式已逐漸不能滿足現在的軟體安全的要求。黑客們已不再著眼於破壞防火牆等手段。黑客們會直接通過企業、政府、銀行等機構的公共網站及應用系統入手,直達核心系統盜取所需的信息。他們的攻擊方法變得更加高明,方式也更加隱蔽。傳統的靠在我們的伺服器上加一層SSL(Security Socket Layer)、再加一層防火牆是不能夠解決的了。軟體安全問題必需要有新的解決方案。
1. 軟體安全的現狀:
軟體安全是軟體工程裡的一個概念,它是指軟體受到惡意的攻擊下,軟體能夠正常運行。這個正常運行是從指軟體的功能和性能上考量的。軟體安全課題就是了解產生軟體安全的風險並怎樣去管理他們。近幾年來,軟體安全問題變得流行起來,主要是由於網際網路的發展。根據CERT/CC統計軟體安全問題的增長如圖1:
(圖1:安全漏洞趨勢圖)
今天軟體安全問題增長的原因:
• Connectivity(互聯性):網際網路無處不在,系統全在上面。網際網路在使人們使用軟體變得方便的同時,也給黑客們更好的機會,給人們的軟體帶來了更多的風險。網際網路意味著,黑客隨時隨地都可以訪問我們的軟體系統,公共的訪問平臺使我們不能夠分別出哪些是真正的用戶,哪些是黑客。這樣他們比過去有了更多的時間和空間來攻擊我們的系統,如果我們的軟體中一點兒安全的缺陷,他們就能夠知道,並利用之來攻擊。
• Extensibility(擴展性):使攻擊系統的方式變得不可預測。現在的軟體應用系統趨向可擴展化,可擴展的系統可以接受更新或擴展,許多時候依賴於動態的代碼,使得系統的功能得到擴展,更好滿足人們的需求。如:Plug-In架構的Web 瀏覽器使得我們可以隨意地安裝我們需要的文檔格式的閱讀器:Word, Excel, PDF等。今天作業系統通過動態的裝載設備驅動和模塊來支持可擴展。今天的應用系統,如:word 文字處理,E-mail客戶端,Web瀏覽器等都通過scripting, controls, components和applets來支持可擴展性。但擴展性給軟體的安全帶來了,很大的挑戰。
• Complexity(複雜性)網際網路,分布式,動態的代碼。現在的軟體應用系統的變得越來越大,複雜性也越來越大,作業系統從DOS到今天的WindowsXP,XP的代碼最少4000億行。複雜度可想可知。而現在的基於網絡的應用系統,為了達到更高運算速度,承載很大訪問量,就使用分布式,集群,可擴展架構。使我們軟體代碼數急劇增長。複雜度也越來越大。軟體安全隱患也越來越大。
2. 傳統的軟體安全的解決方法:
在很多的公司或者企業裡,系統安全一直依賴於硬體的防護,主要就由基層的人員完成,他們在我們的應用系統上安裝並維護防火牆、入侵檢測系統和反病毒引擎。在我們應用系統上增加一層又一層的保護層。使得系統得以安全。這些技術統稱:「Reactive Technologies」。同時通過限制一些網絡的埠,IP限制訪問等手段來防止黑客的攻擊。但是隨著軟體的發展,許多軟體是基於網際網路的,許多的業務和功能是通過網際網路完成的。這使得軟體應用系統必須打破傳統的保護層,直接與外面的系統交互。如下圖2:從而使得系統沒有「內」「外」之分了。這就使得傳統的防火牆所謂防止「外」來入侵的防禦技術變得毫無意義了。這就是迫使我們一定要通過加強應用軟體本身的質量來防禦黑客或惡意的內部人員對應用系統的攻擊。
(圖2:傳統的保護層被打破)
3. 軟體安全漏洞的分類:
由於傳統的安全防護方式日益變得不再有用。我們也知道軟體的安全問題主要來自於軟體的本身。安全漏洞產生主要是由不合理的軟體架構和錯誤的編碼所造成的。那麼黑客到底利用我們軟體的什麼樣的漏洞來攻擊我們軟體呢?換句話說,我們的軟體設計和編碼中,生產了什麼樣的安全漏洞呢?那麼將這些軟體安全的問題綜合起來,再進行分類,這個價值是無庸致疑的。分類可以使人們更好地了解計算機安全缺陷產生的根源。於是早在70年代中期,軟體安全問題分類這一問題就受到了廣泛的關注。很多研究組織紛紛進行研究。最早進行計算機安全與機密研究的組織是RISOS(Research Into Secure Operating System).RISOS提出和描述了幾種作業系統安全的缺陷。它的目標是了解在作業系統中存在的安全問題。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
這個研究表明在不同上下文的情況下,共同遇到的只有很少量的一些基礎性的缺陷。這個分類也只論述了很有限的幾個共有問題的類型,而且每個類型的限定也不是很清楚,許多情況下一個問題可以屬於一個或幾個類型,這樣的分類是不精確的。同時,分類的命名,不夠直觀。雖然它對很多研究人員也說很有用,但是對於軟體開發人員,他們並不能在他們每天繁重的工作的情況下很快地通過直覺把它們區分開來。另外,這項研究只是關注作業系統一些安全問題的分類而沒有關注到企業級軟體的安全問題。而隨著軟體的不斷發展,應用軟體形式也不斷變化,安全問題分類也有了新的研究。下面摘要著名的軟體安全專家Gary Mc Graw的2006年的新書《Software Security building security In》中提出的軟體安全問題的「7+1」個很高級別的大類。這幾個領域中七個大類都是關注於原始碼的安全,一個是與軟體的配置和環境有關的。大類中我們又分了很多的小類,這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。在這裡我只是大致描述一下。詳細的分類的描述在http://www.fortify.com/vulcat/。
4. 真實有效的解決方案:
所謂「知己知彼,百戰不殆」,通過對安全漏洞的分類,我們清楚的知道了軟體中可能產生的各種各樣的安全隱患,那麼我們只要做好充分的主動的預防工作,消除軟體中的安全隱患,這樣我們的軟體就可以抵禦黑客或惡意的內部人員的攻擊了。那麼怎麼做才可以徹底消除這些隱患呢?什麼樣的方案才是真實有效的呢?
軟體安全涉及軟體工程、程式語言、網絡、資料庫、安全工程等各個領域各個層次。涉及面非常廣。這使得做好軟體安全防禦工作需要有很深的專業知識,管理技能,同時也要有非常豐富的實際經驗。著名的軟體安全專家,美國著名的軟體安全諮詢Cigital公司CTO Gary Mc Graw博士一直從事軟體安全的研究,可以說是軟體和應用程式安全領域的世界級權威。他建議,解決軟體安全主要可以從如下幾個方面入手:
4.1.Applied Risk Management Framework(實用的風險管理框架)
我們常說的風險管理和風險分析都是在軟體設計的階段,軟體架構級的風險分析。分析我們的設計可能給軟體帶來什麼樣的風險。雖然它是風險管理框架中最為重要最實際的一個關鍵的階段,但它不是風險管理的全部。因為我們的軟體安全風險是在整個軟體開發生命周期中慢慢地產生的。而不僅僅在設計階段。所以貫穿整個開發周期的風險管理才尤為重要。所以我們稱之為「風險管理框架」。
風險管理常常被人們叫做「black art」 。這是因為風險管理有部分像佔卜、算命一樣,在那裡對未來要發生的事進行預測。又有部分像數學,有著一定的邏輯推理。給人一空洞,沒有真憑實據的空談的感覺。然而一個成功的風險管理,它是比做任何一個業務級的決策需要的依據都要多的多。首先我們必須要收集充分的用來做決策的數據,其次我們要有軟體缺陷、威脅、影響和可能性的知識作基礎,還要有豐富的軟體風險管理的經驗,綜合起來,這樣才能做好整個開發過程的風險。從而降低風險甚至消除風險。總和起來風險管理也有五個階段的活動:
(1)Understand the Business Context(了解業務需求內容)
(2)Identify the Business and Technical Risks(確認業務風險和技術風險)
(3)Synthesize and Rank the Risks(綜合風險並劃分等級)
(4)Define the Risk Mitigation Strategy(確定降低風險策略)
(5)Carry out Fixes and Validate(實施修復並檢驗結果)
4.2.Software Security Touchpoints(軟體安全開發切入點)
提高軟體安全的最好的一個種方法就創建安全的軟體——「Building Security In」。今天的軟體都有明顯的安全需求的特徵。我們在完成軟體需求的功能的同時,也要建立安全需求。但是建立安全不等於就是簡單地加入SSL(Security Socket Layer)就可以的。第一因為安全問題是整個系統級的問題,它包括:安全機制(如:訪問控制)設計安全(如:堅固的設計使攻擊變得困難)編碼安全(如:Buffer Overflows)等很多方面。有時候這些方面是相互重疊的,但有時候又不是。第二因為安全問題是一個慢慢地連續不斷地出現的一個問題。在開發周期的每一個階段都有可能引入安全隱患,甚至是我們選擇的工具,選擇的實現技術,資料庫等都可能引入新的問題。這也就是為什麼安全問題是貫穿軟體開發整個生命周期的主要原因。所以要想解決安全問題從原來的被動的救火方式轉換到主動的防禦式,就是時刻記
住——「Building Security In」。
(1)Code Review(代碼重審)
(2)Architecture risk analysis(軟體架構風險分析)
(3)Penetration testing(滲透測試)
(4)Risk-based security tests(基於風險的安全測試)
(5)Abuse Case(最壞情況處理)
(6)security requirements(安全的需要)
(7)security operations(安全操作)
(圖3:七個切入點在開發周期的分布圖)
如上圖3可出從這七個方面入手可以較為全面的考慮安全構建軟體。這七個方面分布在軟體開發周期中的各個階段。因此我們可以相信,只要我們認真做到了這七個方面,我們的軟體的安全問題應該可以得到解決。
4.3.Knowledge(知識)
軟體安全的最大的挑戰是我們缺乏在軟體安全方面的知識和經驗.因此我們需要,也非常有必要給我們的開發人員、設計人員,分析人員更多的有關軟體安全的知識的培訓,以期他們具備豐富的軟體安全的知識.
5. 總結:
今天的軟體已經成為我們生活重要而不可缺少的組成部分,它給我們帶來便利的同時也帶來了新的問題。黑客們常常很容易地獲取了我們重要的信息,給我們帶來巨大的經濟損失。傳統的安全防禦方式慢慢變得不能適應今天的要求。提出新的解決軟體安全問題的方法迫在眉睫,「Building Security In」這一理念的提出,使我們找到了答案。對安全問題進行匯總,分類,然後在軟體開發的過程中時刻考慮安全問題。有理由相信,這樣的方法能夠提高軟體本身的防禦黑客攻擊的能力.
未經允許不得轉載:DOIT » 基於原始碼級的軟體安全問題研究