傅建明 彭國軍 嚴飛
摘 要:從軟件安全的基礎知識、工具實踐、編程實踐3方面介紹課程教學思路。理論教學采用循序漸進的思路講授軟件安全相關知識點,同時配合工具實踐使學生加深對理論知識的理解,熟練掌握工具,最后學生通過編程實踐提升動手實踐能力,培養軟件安全的攻防博弈思維。近五年的教學實踐證實了該方法的有效性,可提升學生的代碼逆向分析能力與漏洞機理驗證能力。
關鍵詞:信息安全;軟件安全;教學方法;實踐教學
DOI:10. 11907/rjdk. 192205 開放科學(資源服務)標識碼(OSID):
中圖分類號:G434 文獻標識碼:A 文章編號:1672-7800(2020)002-0226-04
英標:Research on Teaching Methods of the Course of Software Security
英作:FU Jian-ming, PENG Guo-jun, YAN Fei
英單:(School of Cyber Science and Engineering,Wuhan University,Wuhan 430072,China)
Abstract:This paper introduces the teaching ideas from three aspects including basic knowledge of software security, tool practice and programming practice. The knowledge of the course of software security has been presented from six stages step by step, and deep understanding of software security has been obtained by a way of tool practices. Finally, it is proved that code practice improves assimilation of software security, and students ability of code reverse analysis and vulnerability mechanism verification.
Key Words:information security;software security;teaching method; practice teaching
0 引言
目前,軟件安全正面臨嚴峻挑戰。一方面,隨著軟件規模的不斷擴大,軟件的開發、集成與演化變得越來越復雜,導致軟件產品在推出時總會含有很多已知或未知缺陷。另一方面,軟件運行與開發環境已從傳統的靜態封閉狀態轉變為互聯網環境下的動態開放狀態,因此越來越多軟件漏洞和缺陷被發現。另外APT(Advanced Persistent Threat)攻擊逐漸利益化、集團化與專業化,觸及國家各類重要的信息系統,攻擊手段防不勝防,對國家信息安全造成了巨大威脅。習近平總書記提出:“沒有網絡安全,就沒有國家安全”。因此,作為本科階段的軟件安全課程,本科生通過該課程學習可以更好地理解軟件缺陷,及時應對軟件威脅,如軟件漏洞、惡意代碼、勒索軟件等。
在信息安全專業建設初期,計算機病毒[1]、網絡安全是兩門基礎安全課程。其中,計算機病毒課主要講授計算機威脅、計算機病毒機理,以及計算機病毒防御與檢測等。在近六年的教學中,發現學生可以基本理解計算機病毒機理,但仍缺乏對計算機病毒的全面認識,加上計算機病毒植入與遠程感染沒有列入教學規范中,為此,2012年結合信息安全教學指導委員會制定的信息安全專業規范[2],我院將計算機病毒課程更名為軟件安全課程[3],同時對軟件缺陷與漏洞相關知識進行了擴充。
本文主要從軟件安全基礎知識、工具實踐、編程實踐3方面介紹課程教學思路,如圖1所示。
1 相關文獻綜述
針對信息安全與網絡空間安全教學的研究文獻有很多。如文獻[4]概述了國內外信息安全專業建設現狀和不足,介紹了網絡安全管理、系統安全工程、應用安全服務3個專業方向及其課程設置;文獻[5]探索了信息安全專業的知識體系和能力體系;文獻[6]討論了網絡空間安全的內涵和外延,比較國內外網絡空間安全人才培養體系,從國家統籌規劃、學歷教育、職業培訓與認證、專才發現與培養等4個方面給出了人才培養規劃建議;文獻[7]從自然語言處理角度分析近20年的網絡安全教學相關論文,并利用共現與頻率構建知識圖譜。以上研究可從整體上為信息安全教學規劃提供指導。
針對單個課程教學及其改革的文獻也有很多,包括信息內容安全、計算機病毒、網絡安全、操作系統、信息系統安全等課程。如文獻[8]給出信息內容的定義,討論了信息內容獲取、識別、控制與阻斷技術;文獻[9]首次從病毒編寫角度看待病毒機理,尋找病毒檢測與防御方法;文獻[10]對網絡安全課程內容及教學方法進行優化,如將密碼學、操作系統安全、數據庫安全等內容分離為其它課程,實時更新教學內容,采用案例教學、啟發式教學等改進教學方法,并取得了較好效果;文獻[11]采用科研課題、互助小組、信息安全競賽、系統設計等多種方式將學生與多種教學內容有效組織起來,從而優化教學效果;文獻[12]從計算機病毒、木馬、進程監控等方面對操作系統教學內容作進一步深化,利用課外實踐和競賽提高學生學習興趣;文獻[13]為適應軍隊對信息安全應用型高級工程人才的需求,采用CDIO工程教育理念,構建工程型信息系統安全課程教學體系。以上文獻可為軟件安全課程教學規劃與實踐提供支持,但尚沒有單獨的有關軟件安全教學改革相關研究。因此,本文在計算機病毒課程基礎上,闡述軟件安全課程知識點和實踐大綱構建過程。
2 軟件安全基礎知識
高級語言程序設計、編譯原理、操作系統、密碼學、計算機網絡等都是軟件安全課程的基礎,同時軟件安全課程與網絡安全、內容安全、信息系統安全等課程可以實現無縫聯接。從設備、數據、服務、用戶的角度看,用戶通過服務實現數據操縱,相關服務都是通過軟件實現的。因此,軟件安全是信息安全的基礎課程。
軟件安全涉及的知識點非常多,圖2從6個方面介紹教學內容,每個板塊序號表示授課順序。攻擊者利用物理植入、誘騙植入、漏洞植入等方式給計算機安裝各種惡意代碼,但不管是惡意代碼還是正常代碼都需遵循基本代碼格式。其中,基本結構部分從系統角度介紹磁盤分區、文件系統與內存系統,接著是可執行文件結構,如PE結構、ELF結構等,最后是可執行代碼在內存中操作的棧和堆。網絡攻防戰場已從過去的磁盤逐漸延伸到內存,因此需要了解軟件代碼在內存的布局以及內存頁管理。教學時要注意32位系統和64位系統的差異,包括可執行文件結構、寄存器、函數調用方式等。
軟件安全威脅主要包括兩種:一種是具有完整格式的惡意代碼,如計算機病毒、網絡蠕蟲、特洛伊木馬、后門、Rootkit、流氓軟件、勒索軟件、廣告軟件等;另一種是因軟件缺陷或漏洞而引入的代碼片斷(Code snippet),如Shellcode、ROP(Returned-Oriented Programming)等。惡意代碼威脅如今已從地下隱藏方式發展為公開方式,如勒索軟件。惡意代碼部分主要講授惡意代碼的功能實現、威脅持續保持、安全檢測對抗、安全工具兼容及用戶免打擾等內容,相關檢測技術包括特征值檢測、啟發式掃描、主動防御、虛擬機檢測、云查殺、蜜罐等。講授時需要區分檢測技術動態性與靜態性、誤報與漏報以及對不同未知惡意代碼的檢測能力等。
漏洞威脅是目前網絡攻防的焦點,攻擊者利用未知漏洞可以在對方不知情的情況下安裝惡意代碼,而防御者可以提前發現漏洞,做到未雨綢繆。該部分主要介紹棧溢出、堆溢出、空指針、釋放后引用、整數/浮點數溢出、競爭條件缺陷、格式化輸出缺陷等安全缺陷引發的數據劫持與控制劫持,并講授缺陷與漏洞原理、可能的代碼模式,以及漏洞危害、緩解措施等。講授時可以結合文獻[14]、[15]中的源碼進行,以增強學生的感性認識。由于攻擊者會利用這些缺陷和漏洞設計用于攻擊的POC(Proof of Code),其典型代碼包括Shellcode和ROP兩類,講授這類代碼的特征以及可能的檢測點。
漏洞防御是目前學術界研究的熱點,企業界稱為黑客攻擊防御。在主要采用的防御方法中,混淆加殼主要是對抗代碼分析,而訪問控制是從資源角度約束用戶訪問,降低攻擊危害。其它防御方法包括DEP(Data Execution Prevention)、GS、ASLR(Address Space Layout Randomization)、safeSEH(safe Structured Exception Handling)、CFG(Control Flow Guard)、CIG(Code Integrity Guard)、ACG(Arbitrary Code Guard)等,其主要目的是阻止非授權的外部模塊、外部代碼、內部重構代碼執行等。
漏洞分析包括源代碼設計、靜態分析、動態分析、逆向分析、Fuzzing、代碼切片、符號執行、污點傳播等。另外,Web安全內容建議在網絡安全課程中進行講授,包括SQL注入、XSS、CSRF、點擊劫持、目錄遍歷、文件上傳等。
3 軟件安全工具實踐
軟件安全課程具有很強的實踐性,通過掌握相關軟件安全工具,便于理解上述基礎知識。微軟工具套件[16]提供對磁盤、文件、進程、注冊表與網絡的監視,表1給出了課程教學中的常用工具。
為了更好地理解基礎知識,本文設計了一組實驗驗證上述知識點,實驗課程見表2。其中,實驗1考查學生利用工具查看程序加載的模塊鏈,了解數字簽名對軟件的保護作用;實驗2考查學生利用Winhex對磁盤分區,以及文件系統結構的理解程度;實驗3利用OD等工具查看軟件調用外部模塊的方式,重點是IAT與EAT的關聯;實驗4利用Winhex等工具學習內存頁管理與頁權限分配;實驗5考查學生手工注入代碼的能力;實驗6、7考查學生手動分析木馬與安全軟件的能力;實驗8使學生加深對堆和棧的認識;實驗9認識編譯器安全指示的作用及其對軟件的影響;實驗10是metasploit測試。
4 軟件安全編程實踐
軟件安全編程實踐重在將軟件安全知識融入到編程中,以提高學生的編程能力,并使其更好地理解安全威脅,增強安全防御能力。表3給出了軟件安全編程實例。其中,實驗1考查學生對磁盤分區以及文件系統關聯數據結構的應用能力;實驗2對給定文件進行感染;實驗3學習Hooking的實現,并培養學生跨進程的內存訪問能力;實驗4模仿木馬對系統資源的訪問與網絡交互;實驗5模仿安全工具對系統資源的訪問監視與訪問控制,鍛煉學生設計訪問控制策略的能力;實驗6模仿對棧(堆)的利用;實驗7模仿安全工具對黑客攻擊的檢測。編程實踐通過模擬攻擊者的漏洞利用過程以及防御者的資源監管過程,提高學生的攻防博弈思維能力。
5 結語
本文主要從軟件安全的基礎知識、工具實踐、編程實踐3方面介紹課程教學思路。理論教學分為基本結構、惡意代碼解析、惡意代碼檢測、漏洞實例分析、漏洞攻擊檢測、漏洞分析技術6個階段,采用循序漸進的思路講授軟件安全相關知識點,同時配合工具實踐使學生加深對理論知識的理解,熟練掌握工具,最后通過編程實踐提高動手能力。近五年的教學實踐證實了該方法的有效性,通過對軟件運行環境、代碼文件結構與內存結構、代碼與操作系統接口等內容的綜合學習及實踐,提升學生的代碼逆向分析能力和漏洞機理驗證能力,為培養其軟件安全的攻防博弈思維奠定了堅實基礎。如何將軟件安全課程知識拓寬到多平臺、多系統上,將是未來的研究方向。
參考文獻:
[1] 傅建明. 計算機病毒分析與對抗[M]. 武漢:武漢大學出版社, 2009.
[2] 教育部高等學校. 高等學校信息安全專業指導性專業規范[M]. 北京:清華大學出版社,2014.
[3] 彭國軍,傅建明,梁玉. 軟件安全[M]. 武漢:武漢大學出版社, 2015.
[4] 王練,陳龍. 信息安全專業課程體系設置的探討[J]. 計算機教育,2009(24):108-110.
[5] 杜瑞穎,張煥國,王麗娜,等. 本科信息安全專業課程體系研究[J].? 計算機教育,2011,150(18):1-3.
[6] 張宏莉,于海寧,翟健宏,等. 網絡空間安全人才培養的規劃建議[J]. 網絡與信息安全學報,2016, 2(3):1-9.
[7] 努爾布力. 國內網絡安全教學研究脈絡和現狀的知識圖譜分析(1997~2016)[J]. 伊犁師范學院學報(自然科學版),2016,10(3):86-92.
[8] 張宏莉,翟健宏,胡銘曾. 信息內容安全的主要技術及國內外對比[J]. 計算機教育,2005(1):74-76.
[9] 彭國軍,張煥國. 關于計算機病毒教學的幾點建議[J]. 計算機教育,2006(7):30-31.
[10] 周由勝,羅文俊,陳龍.? 《網絡安全》課程教學創新初探[J]. 現代計算機,2012(3):35-37.
[11] 周藝華,楊宇光,侍偉敏. 基于融合機制的計算機網絡安全教學模式探索[J]. 計算機教育,2016(11):20-23.
[12] 唐作其,葉潔,武彤,等. 面向信息安全專業的操作系統教學改革[J].? 計算機教育,2012(1):83-85.
[13] 陳萍,于晗,趙敏. 面向卓越工程師培養的“信息系統安全”課程建設[J]. 計算機工程與科學,2014,36(s2):49-51.
[14] 塞克德盧濤. C和C++安全編碼 :Secure coding in C and C++[M]. 北京:機械工業出版社,2014.
[15] CWE. 2011 CWE/SANS top 25 most dangerous software errors[EB/OL]. http://cwe.mitre.org/top25/index.html.
[16] MICROSOFT. Windows sysinternals[EB/OL]. https://technet.microsoft.com/en-us/sysinternals/bb842062.aspx.
(責任編輯:黃 健)