陳柏政,竇立君
(1.南京林業大學信息科學技術學院;2.南京林業大學網絡安全和信息化辦公室,江蘇南京 210037)
在當今社會,軟件與網絡安全相關問題已成為熱門話題。與機械器材廠商不同,軟件的安全檢測到目前為止并沒有形成統一標準,不同廠商有著不同的檢測評估系統,導致軟件安全問題層出不窮[1]。這些問題給數據安全及人們的生活隱私帶來了極大隱患。
目前針對軟件安全的研究很多,但是較少有研究對這些問題及相關解決方法進行總結?;谏鲜銮闆r,本文通過對當前存在的主要軟件安全問題進行總結分析,并提出相應防護措施與解決方案,如靜態分析[2]、動態分析[3]、脆弱性評估[4]等,這些措施能夠有效應對當前主要的軟件安全問題,保障用戶在軟件使用過程中的安全性。最后分析了未來軟件安全可能面臨的挑戰,并針對這些問題提出可能的應對方法。
互聯網興起初期,公司缺乏完善的管理體系,早期的軟件安全問題大多是由于安全加密系統不完善或技術人員素質不高引起的。
首先,互聯網公司自身存在的管理問題是軟件安全問題產生的主要原因之一。早在1986 年,世界上第一個計算機木馬病毒[5]就已出現,并且隨著互聯網的發展,第三代木馬病毒兼具偽裝和傳播兩種特征,并結合TCP/IP 網絡技術[6]四處傳播。早期關于網絡安全的研究尚處于空白,殺毒軟件與防火墻技術[7]尚未成熟,導致了木馬病毒的泛濫。
其次,用戶安全意識較差下也是早期軟件安全問題頻發的主要原因之一。早期的用戶通常把自己的軟件賬戶密碼設為類似“123456”的簡單密碼,黑客只需用窮舉法即能破解這些密碼。此外,某些企業也缺乏對技術人員安全意識方面的培訓,在進行企業機密文件傳輸時,有些技術人員仍使用保密性一般的郵箱,導致企業泄密問題頻繁發生。
此外,國家早期也缺乏針對軟件安全問題相關的法律法規,因此很多流氓軟件[8]趁機大肆傳播。流氓軟件是介于病毒與正規軟件之間的一種軟件,這些軟件可能不會給用戶計算機造成直接的破壞,但會嚴重影響用戶體驗。其管理難點并不在于難以發現與查殺,而是其模糊的定義標準,法律法規與行業規范的缺失給了流氓軟件可乘之機。我國尚未有完善的法律法規對流氓軟件進行管理約束,所以流氓軟件至今仍是一個難以解決的問題。
如今互聯網公司都對自身的管理體系進行了完善,普遍擁有嚴格的管理制度,并且也會對工程師及開發人員進行全面、嚴格的安全意識培訓,但軟件安全問題仍然沒有顯著減少,利用互聯網進行的違法活動相較之前甚至更加猖狂。主要原因在于廠商在完善其安全防護系統的同時,黑客群體也具有了更加多樣化的攻擊手法和工具。
網絡空間的開放性也為軟件安全帶來了極大隱患。人工智能與大數據的發展使網絡主體之間需要傳輸更多信息,令黑客的攻擊更容易實現。
軟件攻擊[9]手段日益多樣化,要達到某一目的的軟件攻擊行為也并不是單一的,本節將結合軟件攻擊對象簡述主要軟件攻擊方式的原理。根據軟件攻擊對象,可將軟件攻擊類型分為6 種,具體見表1。

Table 1 Software attack classification表1 軟件攻擊分類
如表1 所示,軟件攻擊技術主要包括反匯編[10]和運行時內存監控[11]兩種。
反匯編攻擊的原理是使用一段特殊構造的代碼欺騙反匯編工具,使其產生錯誤的程序代碼,其目的是拖延軟件分析師對病毒的解析進程,為病毒的變種爭取時間,使該病毒的解密算法更難被解析出來。
運行時內存監控指對內存發起的攻擊方式,主要通過耗盡資源、軟件故障、物理損壞等方式達到攻擊目的。其中資源耗盡是最常用的攻擊方式,其原理是通過對用戶主機內存不斷發起大量攻擊,導致其主機內存耗盡或CPU 被應用程序占滿,從而無法提供網絡服務。目前最難防御的內存攻擊方式為分布式拒絕服務攻擊(Distributed Denial of Service Attack,DDoS)[12]。
軟件攻擊和軟件防御技術是相輔相成的,本節將簡述針對反匯編與內存攻擊的軟件防御技術原理。
目前所使用的主要的防反匯編技術是代碼混淆技術[13],其原理是使代碼共享一條指令代碼,從而使共享段的代碼可被不同的指令控制流調用。其目的是混淆反匯編得到的代碼,使黑客由反匯編得到錯誤代碼,以此達到保護軟件的目的。
由于DDoS 攻擊發起成本低、攻擊威力大,到目前為止針對其防御仍是一個世界級的難題。目前主要的緩解DDoS 攻擊的方式是加強DDoS 攻擊檢測,保證能在第一時間發現DDoS 攻擊,從而盡快更新安全補丁,以減少損失。Huang 等[14]對DDoS 的攻擊結構進行分析,為針對DDoS 攻擊的防御策略優化設計提供了建議;Alzahrani 等[15]提出一種用于檢測DDoS 攻擊的系統,其與基于特征和神經網絡的檢測方法相比,具有更高的檢測率與檢測精度。
2.1.1 軟件漏洞
軟件漏洞是當前軟件安全面臨的最大挑戰。目前比較常見的軟件漏洞大致可分為緩沖區溢出漏洞[16]、整數溢出漏洞[17]、邏輯錯誤漏洞等[18],下面將從3 個方面對軟件漏洞問題進行具體分析。
(1)緩沖區溢出。在軟件開發過程中,開發人員通常會預先分配出一個臨時空間用于存儲特殊信息,即緩沖區。向緩沖區中輸入數據時,如果數據過大,則會溢出緩沖區,覆蓋靠近該緩沖區內存上存儲的合法數據。在理想情況下,程序會檢查數據長度,不允許開發者輸入超過緩沖區長度的字符。但實際上,大多數程序都會假設已輸入數據與緩沖區的空間大小匹配,并且不作檢查。由于C/C++語言在編譯時,不會對數組及指針自動進行邊界檢查,使得編譯時很難發現程序中的漏洞,所以采用C/C++編寫的程序中往往存在緩沖區溢出漏洞。下面給出一個經典的緩沖區溢出漏洞的例子。

例子中的函數p()通過strcpy 函數將字符串b 直接拷貝給字符數組c,在執行這段代碼時并沒有進行任何判斷,最后執行的結果是程序崩潰。
黑客利用緩沖區溢出漏洞發起攻擊,輸入超過緩沖區長度的數據,使緩沖區溢出,進而破壞程序的堆棧。之后的攻擊一般分為兩種,一種是直接使程序崩潰,拒絕服務請求,另一種是在函數返回時改變函數返回的地址,使程序跳轉到一個任意的地址,執行黑客輸入的惡意代碼。緩沖區溢出漏洞攻擊的目的大多是獲取某些具有特權的程序控制權,從而對整個主機進行操控。
(2)整數溢出。整數溢出是在執行程序過程中,計算得到的結果超過了存儲結果位向量所能表達的最大整數范圍。由于整數變量存在上界和下界,整數溢出會出現上溢和下溢兩種情況。上溢是指若計算結果超過整數變量的上界,計算結果就會由本來的一個極大值變為一個極小值或零,下溢則反之。整數溢出漏洞通常是由有符號整數之間的混合使用或開發人員對數據運算邊界問題的疏忽引起的。
黑客往往會利用整數溢出漏洞發起針對代幣資產的攻擊,在攻擊時向賬戶中轉入一個數額巨大的代幣量,使其超出軟件中整數類型的最大數值,從而以極小甚至零代價得到高額利潤。
(3)邏輯錯誤。常見的邏輯漏洞有越權訪問、密碼找回邏輯漏洞、支付邏輯漏洞、多線程條件競爭漏洞等,這些漏洞大多是由于程序本身邏輯不嚴謹造成的。
2.1.2 軟件安全設計缺陷
軟件安全設計是指開發人員通過設計各種安全機制預防軟件可能遭受的攻擊。
首先,由于當下激烈的商業競爭環境,比起質量安全,很多廠商更注重軟件開發速度,導致軟件在開發過程中往往會倉促完成安全設計甚至舍棄安全設計,轉而選擇在軟件發布后不斷發布補丁來維護軟件安全,即penetrate-andpatch[19]方法。這種方法可讓廠商更好地把握住商業機會,但會為軟件的長久安全帶來隱患,等黑客發起攻擊時才進行補丁研發會對軟件安全造成極大威脅,從而嚴重破壞用戶的使用體驗。
其次,軟件安全設計上的缺陷不同于軟件本身出現的漏洞,后者可由自動代碼審查工具進行篩查,而前者往往存在于軟件架構設計中,這些錯誤無法由代碼審查工具掃描發現。所以軟件安全設計往往交由專門的人員進行研究,但由于技術門檻較高,很多企業缺乏相應的人員,使得軟件安全設計一直是一個難以解決的問題。
目前常見的軟件安全設計缺陷主要有密碼技術使用不當、結構性安全薄弱等。開發者有時會將過多精力投入到密碼算法設計上,而忽略了其他安全性問題。即便如此,在密碼技術的使用上也存在很多問題。有的開發者在進行安全設計時會選用不當的密碼技術,這不僅會為軟件安全架構帶來隱患,也為日后軟件的維護與修復工作帶來很多問題。對于結構性安全方面的問題,通常都是違反了軟件安全設計的四大原則,具體如下:
(1)過大的攻擊面[20]。黑客往往耗費大量時間和精力在信息收集上,而過大的攻擊面給了黑客更好的收集信息的機會。
(2)在過高的權限級別上運行進程。為了維護方便,只用一個root 賬戶操作所有系統,但是黑客只要成功攻擊了任意一個系統,就相當于拿到了所有系統權限。
(3)沒有進行縱深防御[21]。開發者將所有精力放在一種防御手段上,然而即使防御技術再先進,也會有出現0day 漏洞[22]的可能性,僅僅一層防御無法確保軟件安全,黑客在攻破一層防御系統之后即可直接破壞整個系統。
(4)故障安全缺陷。黑客在信息收集階段往往會對系統輸入異常的信息,若系統在故障安全方面存在缺陷,黑客則有可能收集到關鍵的信息和數據,為下一步攻擊作好準備[23]。
由于開發者在進行軟件安全設計時往往會忽視以上問題,導致軟件在結構性安全方面存在很大漏洞,從而為之后的軟件開發帶來隱患。
2.1.3 軟件安全評估系統問題
軟件漏洞是不可避免的,因此對軟件的安全評估將起到至關重要的作用。軟件安全評估是對軟件安全的評價度量,對軟件中可能存在的安全漏洞作出預測,并提出軟件可能遭受的攻擊,從而作好預防措施。但由于當今軟件規模不斷增長,邏輯功能也日漸復雜,這意味著對軟件進行安全評估的成本不斷增加。而且由于代碼復雜度過高,在對代碼進行安全分析時,許多針對大規模軟件進行分析的技術對上下文、控制流及路徑信息進行了簡化,從而降低了計算復雜度,但同時也意味著分析結果的精度會大幅下降。就目前而言,想要研發出一個成本低廉且精度較高的軟件安全評估系統十分困難。
2.2.1 針對軟件漏洞的防護
目前針對大部分軟件漏洞,通用的防護措施分為漏洞挖掘[24]、漏洞分析[25]及漏洞利用緩解[26]3 個階段。下面將從這3 個方面總結國內外在軟件漏洞防護方面的研究進展。
軟件漏洞挖掘的目的是為了確認軟件漏洞的存在。早在20 世紀70 年代,美國南加州大學就發起了保護分析項目(Protection Analysis Project,PA)研究計劃,針對操作系統的安全漏洞進行分析與研究[27],以提高軟件的安全性。之后人們開始對軟件源代碼進行分析,檢測在軟件中是否存在可能被利用的漏洞,即軟件漏洞挖掘。軟件漏洞挖掘技術可大致分為4 種,分別是基于源代碼的漏洞挖掘、基于補丁對比的漏洞挖掘、基于模糊測試的漏洞挖掘與基于代碼特征的漏洞挖掘。
每種技術同樣也存在不足之處,如基于源代碼的漏洞挖掘技術只適用于開源軟件或開發者自身進行的測試,由于其要求擁有軟件源代碼,所以并不適用于如Windows 旗下的Office 等閉源軟件[28]?;谘a丁對比的軟件漏洞挖掘技術,對比方法主要分為基于文本的對比、基于匯編指令的對比和基于結構化的對比,但由于其精度較低、復雜度較高,還有很大的改進空間。基于模糊測試的漏洞挖掘技術原理是輸入非正常數據之后對系統進行檢測,再發現軟件漏洞,因此需要大量測試用例。目前這種方法只適用于小型程序或代碼片段中,如何生成測試用例是模糊測試研究中的一個難點。基于代碼特征的漏洞挖掘技術相較于其他方法可適用于較復雜的大規模軟件,但有較高的誤報率,所以十分依賴于人工篩選。Wang 等[29]提出一種基于動靜結合的Android 應用漏洞挖掘方法,該方法相較于靜態分析誤報率更低,提高了漏洞挖掘的穩定性和準確度,但其分析框架應用范圍較窄;Zhang 等[30]提出基于Fuzzing 技術的網絡協議自動漏洞挖掘技術,解決了人工分析效率低下的問題,但仍然沒有解決如何生成高質量測試用例的問題。
在完成軟件漏洞挖掘之后,下一步是對發現的漏洞進行分析。通過軟件漏洞分析技術,對軟件漏洞形成原因進行研究分析,最終目的是判斷出軟件漏洞類型及其具體位置。吳世忠等[31]將當前的軟件漏洞安全分析技術分為軟件架構分析技術、代碼靜態分析技術、代碼動態分析技術、動靜結合的分析技術和漏洞定位技術共5 種,其中軟件架構分析技術尚未成熟,而代碼的靜態與動態分析技術已進入瓶頸期,所以動靜結合的分析技術將成為未來的研究重點。Almorsy 等[32]研究了一種自動化的漏洞分析工具,提高了漏洞分析的覆蓋率與正確率,但在速度上仍需改進;Yan 等[33]介紹了一種新的PHP 代碼靜態漏洞分析算法,該算法有效解決了傳統方法中誤報率高的問題,但由于缺少描述所有Web 應用程序漏洞的通用模型,其誤報率難以進一步降低。
在鎖定軟件漏洞的位置及類型后,開始對利用該軟件漏洞發起的攻擊進行緩解,目前可將攻擊方式分為面向數據流與面向控制流兩種。George 等[34]提出一種基于圖的工業物聯網安全框架漏洞利用方法,可將安全問題表述為圖論問題,為網絡風險評估提供了一個安全框架,但是目前缺少針對成本模型的泛用性標準,難以對漏洞進行修補;魏強等[35]總結了軟件漏洞利用緩解技術,主要包括堆保護、地址隨機化、沙箱保護等,這些技術可以有效化解大部分面向控制流的攻擊,但其不足之處在于基于數據流的攻擊很難進行防御。
2.2.2 完善軟件安全設計
為了規范軟件安全設計,開發者在軟件開發過程中必須遵守軟件安全設計的5 項原則[36],包括保護最薄弱環節、縱深防御、故障安全、最小特權與分隔原則。
保護最薄弱環節即對軟件進行安全分析時,要重點關注系統中最薄弱的地方;縱深防御即開發者應實施多重防護措施來防御可能的攻擊;故障安全即需要開發者考慮到可能出現的各種故障,并在開發過程中提前設計好針對系統故障的安全保護機制;最小特權是軟件安全設計中最基本的原則,即將用戶特權限定在最小范圍內,在保證用戶正常進行管理操作的同時,不能越權使用系統;分隔原則是指將系統分隔為盡可能獨立的系統單元,如果系統一部分出現了安全隱患,也不會對其他部分造成較大影響。
除傳統的5 項安全設計原則外,目前提出了更多需要遵守的規范,如默認設置安全性、不信任第三方系統、公開設計、簡化系統設計、使用白名單等。Sion 等[37]提出一種基于風險的設計安全性分析方法,該方法提出的威脅模型解決了系統設計與具體數據脫節的問題,但其無法隨著時間推移動態更新安全目錄,時效性不強。
2.2.3 改善軟件安全評估系統
軟件安全評估系統是修復軟件漏洞的前提,其旨在盡量發現軟件可能存在的安全風險,提高軟件的安全標準,在進行安全評估時應從需求、結構設計、編程、詳細設計、編碼、測試等方面對軟件進行完整的安全性分析。具體如表2 所示。

Table 2 Software security assessment system表2 軟件安全評估系統
未來在軟件的不斷發展過程中,軟件交互與協同會更加頻繁,軟件功能會更加智能化,其結構也會更加復雜,這意味著軟件安全會面臨更嚴峻的挑戰。
2010 年6 月,“震網”病毒[38]首次被檢測發現,被稱為有史以來最復雜的網絡武器。該病毒具有極強的傳播性、隱藏性和破壞力,會定向攻擊核電站、水壩及國家電網,危害極大。之后,2011 年的“Duqu”病毒[39]和2012 年的“沙蒙”病毒[40]等超級病毒的相繼出現也意味著針對工業控制系統的大規模復雜攻擊已成為現實。這些攻擊與以往攻擊的不同之處在于,傳統的安全攻擊普遍是利用通用軟件的漏洞發起的,其目的大多是通過盜取用戶隱私信息謀取非法利益,而以“震網”病毒為代表的攻擊則是針對行業專用軟件及內部專用網絡,對傳統的軟件安全觀念造成了很大沖擊。攻擊發起者不再是一般的個人或組織,其攻擊目的上升到針對國家的關鍵敏感行業,這可能成為未來軟件攻擊新的發展趨勢。一旦這種復雜的網絡攻擊開始大規模出現,傳統的軟件安全防御措施將很難再發揮作用,屆時需要提出全新的軟件安全理念以支撐新的軟件安全防御技術的研究。
“震網”病毒的出現意味著傳統的工業控制網絡系統不再安全,未來應更加關注專業系統及專業網絡的安全檢測。由于現場總線控制系統中的組態軟件等行業軟件產品被少數公司所壟斷,如西門子公司的SIMATIC WinCC 系統,即“震網”病毒攻擊的主要目標,伊朗將其廣泛應用于基礎國防設施中,所以伊朗成為遭受攻擊損失最慘重的國家。因此,工業控制網絡安全不能依賴于單一的行業軟件。
深度學習的不斷發展也為軟件安全防護提供了新的實現方法。如鄭煒等[41]采用深度文本挖掘模型TextCNN與TextRNN 構建安全缺陷報告預測模型,以輔助發現軟件測試中的安全問題。
此外,國家應加強對軟件安全的管控,大力發展漏洞挖掘技術相關研究,對重要的軟件系統使用自主可控的信息安全技術。同時國家之間應加強交流合作,進行網絡戰的應對演習,成立軟件安全應急組織,研究針對大規模攻擊的應急措施。如果有高危的軟件安全問題出現,能夠及時發現并加以應對,從而將危害降到最低。
隨著如今軟件逐漸朝著智能化與自動化方向發展,軟件應用范圍已從日常生活擴展到航空航天、核技術控制等重要領域,但是軟件安全問題也日益增加,傳統的安全防護措施已逐漸無法應對新型的軟件安全攻擊。本文通過對主要軟件安全問題及其應對措施的分析,總結了軟件安全問題現狀,探討了未來可能會出現的軟件安全問題及相應解決措施。不僅公民應提升自身的安全意識,而且企業和國家也要加強軟件安全管理,做好安全檢測工作,做到防患于未然。針對大規模復雜攻擊的防護措施將會是未來研究的重點,對于所有的軟件企業而言,這都是一個新的挑戰,沒有很多成功經驗可以借鑒,所以需要針對相關問題進行深入探索與研究。