姚立紅,邱衛東
(上海交通大學 網絡空間安全學院,上海 200240)
隨著信息技術的發展以及信息化進程的推進,越來越多的各式業務通過計算機程序來實現,業界關于計算機程序開發人才的需求也愈加迫切。C/C++因其語言靈活、程序執行效率高且具有較好的可移植性等特點,一直受到程序員的青睞。在每年的程序開發語言排名中,C/C++一直位于前列,目前許多大型的軟件系統、網絡應用服務等都是使用C/C++語言開發。
為了滿足業界的人才需求,各高校在多個專業中都開設了C/C++程序設計課程,并且不斷地探索和實踐關于該課程的教學改革。到目前為止,已有很多高校教師和學者對此課程的教學形式及教學方法等進行研究和探討,提出了一些切實可行的方法和措施[1-3]。這些已有研究主要集中在如何激發學生學習興趣、提高教學成果等方面。
當前不斷有軟件系統、網絡應用服務等暴露出嚴重的安全問題,人們也為此付出了高昂的代價。這些安全問題多數是由對應程序中包含的安全漏洞引起,惡意的攻擊者利用這些漏洞非法獲取系統訪問權限,讀取或修改敏感信息,有的甚至以破壞系統為目標,這給企事業單位帶來了相當大的經濟損失,甚至造成國家層面的安全威脅。程序中存在安全漏洞的主要原因之一是程序員在編程時未將安全編碼納入考慮范疇,導致所開發的軟件包含各種安全缺陷。因此,在進行C/C++教學時,除了C/C++本身知識點的講解和實踐外,還應該重視對C/C++安全編程能力的培養,防患于未然。
C/C++是一種靈活的、移植性高的輕量級高級程序設計語言,該語言內存耗用小,缺乏如數組的邊界檢查、整數操作的溢出與截斷處理、函數調用時的實參長度檢查等一系列的代碼保護機制,若程序員不特意考慮這方面的內容,就會導致程序的安全缺陷或漏洞。
隨著我國“互聯網+”行動計劃的實施,越來越多的系統連接到公網上對外提供服務,這些系統面臨著來自各方的攻擊,系統中的安全漏洞就會逐漸被暴露并加以利用。據國家信息安全漏洞庫(CNNVD)發布的漏洞通報顯示,目前系統漏洞數量呈逐年上升態勢[4],這給企事業單位帶來了極大的安全威脅,有些甚至造成了嚴重的安全后果。
國內外的一些知名企業一直將軟件的編碼質量視為產品質量的重要方面,而程序安全缺陷在很大程度上決定了產品的編碼質量,一旦程序編碼上出現嚴重的漏洞而被黑客攻擊,就會給企業帶來嚴重的損失。
業界對于程序編碼尤其C/C++編程重點關注以下幾個方面:①安全編程意識和安全編程技能的培訓,內容包括C/C++語言的安全弱點、安全漏洞的存在形式和利用方式等;②建立C/C++安全編碼規范,面向軟件工程師進行培訓,并在公司推廣該安全編碼規范;③人工代碼審計以及使用代碼審計工具,最大限度地在軟件發布前發現存在的軟件安全缺陷。
高校的網絡空間安全專業肩負著培養業界所需要的網絡空間安全人才的重任,需要在C/C++課程中進行安全編程意識教育,并注重安全編碼規范以及代碼審計等相關內容的教學。
目前各大高校網絡空間安全專業所開展的C/C++課程教學安排主要有兩種形式:一種是以大平臺的形式開展教學,將C/C++程序設計作為一門基礎課程,在相關的工科專業(如計算機、自動化、通信工程、軟件工程等)統一進行教學;另一種是在網絡空間安全專業內開設C/C++程序設計課程。
從目前了解到的情況來看,國內大部分高校的C/C++課程教學中還未融入網絡安全相關的內容,缺乏在C/C++方面的安全編碼教育。這導致網絡空間安全專業的畢業生不能很好地體現自己的專業優勢,也不能很好地滿足業界對網絡空間安全人才及其安全技能的需求。
近年來,網絡空間安全專業在全國各高校相繼設立。網絡空間安全專業作為一個年輕的專業,其課程體系通常由原有計算機專業或通信專業的部分主干課程(如操作系統、編譯原理、程序設計等)和網絡空間安全的特有課程(如網絡安全管理、密碼學應用、入侵檢測系統等)組成。實際上,對于學生在網絡空間安全知識和技能的培養不能僅限于幾門直接相關的網絡空間安全專業課程,而應該在所有相關課程中加入網絡空間安全的內容,如在操作系統教學中增加專門的章節介紹操作系統的權限管理體系等安全內容,在編譯原理的課程中加入編譯器安全漏洞方面的教學內容等。
如前所述,通常軟件的安全質量在很大程度上影響了軟件漏洞的存在,直接決定了黑客攻擊系統的難度,也決定了系統的安全程度。因此在網絡空間安全專業的C/C++教學中,必須增加軟件安全編碼相關的教學內容,以全方面培養學生的專業安全技能。
程序漏洞的存在和被利用通常具有復雜的原因,要解釋清楚一個具體的程序編碼漏洞成因,不僅涉及程序設計的知識,還可能涉及編譯原理、操作系統甚至CPU 體系結構的知識。如影響甚廣、多次造成重大網絡安全事件的緩沖區溢出漏洞就是這樣的例子。
緩沖區溢出漏洞的成因是程序員忽略了數組邊界檢查,向小塊內存區域拷入過多的內容,造成相鄰區域被意外覆蓋而導致的。從這個角度而言,預防緩沖區溢出屬于C/C++程序設計范疇。但要向學生講解緩沖區溢出漏洞的危害,就需要向學生展示和講解黑客如何利用該漏洞發起攻擊的方式和過程。緩沖區溢出漏洞利用原理和實施方式涉及程序編譯過程中的程序內存分配方式。在網絡空間安全專業的課程體系中,程序的內存分配原理主要屬于編譯原理課程的教學內容,實際系統下的程序內存布局還會牽涉到操作系統和計算機體系結構的部分內容。因此,不能僅限于傳統C/C++的教學內容進行軟件安全編碼教學,僅限于編程語言層面,無法清晰地向學生講述緩沖區溢出漏洞的根源和危害。
據權威組織統計,目前超過30%的軟件安全漏洞都由緩沖區溢出導致,網絡空間安全專業的教學中不應該忽視該部分內容。據了解,在全國的網絡空間安全課程體系中,緩沖區溢出根源、利用過程、攻擊危害及預防方式等內容處于多個課程均有部分關聯但均不負責教學的狀態。因此,對緩沖區溢出等跨課程的教學內容,需要在C/C++課程教學中綜合操作系統和編譯原理課程的相關知識進行系統化講解,以完善網絡空間安全專業學生的知識體系。
作為網絡空間安全專業的主干課程,C/C++教學不僅要培養學生如何進行軟件編程的能力,也要培養學生如何寫出高安全質量、不含或者少含安全漏洞的代碼。軟件編程具有非常強的實踐性,編寫高安全質量的軟件不僅需要網絡空間安全理念支持,還需要已有知識和經驗的積累。計算機應急響應組(CERT)制定的C/C++語言安全編碼規則是資深程序員和信息安全專家的最佳安全編程實踐的總結,定義了字符串安全操作、內存管理操作、文件操作、整數安全、禁用危險函數等方面的安全編碼規范[5]。
從業界網絡安全實踐來看,遵守C/C++語言安全編碼規范可以在很大程度上減少程序編碼方面的漏洞,減少程序被黑客攻擊的可能,對編寫高安全質量的軟件具有很好的實踐效果。網絡空間安全專業從為業界培養所需要的網絡安全人才角度,需要在C/C++教學中引入安全編碼規范的內容,引導學生編寫具有高安全質量的程序。
近年來,網絡安全事件愈發嚴重,代碼質量管理在很多研發企業越來越受到重視。除了上文所述的軟件安全編碼規范的應用和普及外,代碼審計也是一項重要的安全內容。
代碼審計的主要內容是檢查程序源代碼中的安全缺陷,通過自動化工具或者人工審計的方式對程序源代碼逐條進行檢查和分析,發現程序源代碼中是否存在安全隱患或者不規范編碼。人工審計的效果在很大程度上依賴于審計者的經驗,因此效率低下,一個有經驗的程序員每天只能審計數千行代碼,而審計速度的加快會帶來審計效果的下降。基于自動化工具的代碼審計具有較高的效率,數小時甚至數分鐘就能完成一個復雜工程的代碼審計。很多軟件企業通常以工具審計為主,或者采用工具審計和人工審計相結合的方式進行,即首先利用工具進行所有代碼的審計,而訪問接口、身份認證、數據加解密等關鍵代碼同時進行人工審計,以保證關鍵代碼的安全。
網絡空間安全專業的畢業生參加工作后,不僅自己要寫出高質量的安全代碼,而且可能要負責整個項目或整個企業的軟件代碼質量,因而代碼審計能力就顯得尤為必要,尤其是代碼審計工具的熟練使用。因此,從培養企業所需安全人才的角度而言,在網絡空間安全專業的C/C++程序設計教學中,應適當增加代碼安全審計相關的內容,包括如何高效使用自動化審計工具等。
在網絡空間安全專業開展C/C++程序設計課程時,除對引起程序安全問題的編程漏洞在原理方面更為深入分析之外,還需結合攻擊實例進行實踐教學與應用,以加深對原理的理解,同時對漏洞引起的安全問題有直觀的了解。
在C/C++教學中,實例化教學可以包含以下內容:
(1)結合典型安全攻擊方式進行安全編程意識教學。對C/C++程序員而言,盲目信任外部輸入而不進行必要的檢查是不良編程習慣,也是導致程序受到攻擊的重要原因。顯然,在教學過程中,單純強調學生必須進行程序輸入檢查難以取得好的教學效果。如果能夠結合緩沖區溢出漏洞的攻擊實例,向學生展示黑客如何利用程序輸入檢查缺失構造攻擊過程來實現控制整個程序的完整過程,就能讓學生深刻認識到不良安全編程習慣的危害,從而增強學生們的安全編程意識,有助于養成檢查程序輸入的編程習慣。
(2)從違背導致的后果例證進行安全編碼規范的教學。業界使用的安全編碼規范內容比較多,單純從正向講解要求如何遵循安全編碼規范通常不能收到很好的教學效果。若對每條安全編碼規范設計反向案例,用程序實例演示不遵守安全規則導致的安全危害,如會帶來哪些安全隱患以及黑客如何利用這些隱患發起攻擊,就能幫助學生理解規則背后的原因,也能激發學生的興趣。
(3)從實際操作角度進行安全編程和代碼審計技能的培養。程序設計具有實踐性強的特點,C/C++教學會安排較多的學時完成具體的編程任務。在實際的教學中,教師不僅要求學生完成相應的編程任務,而且要求他們寫出符合安全要求的程序代碼,并要求同學之間相互進行代碼審計以發現不規范或不安全的程序代碼,從而提升學生的實際安全編程和代碼審計能力。
筆者在本科生的C++程序設計教學中,在完成常規教學任務的同時,給學生補充了C++安全編程規范的教學內容。C++程序設計和網絡空間安全知識的結合激發了學生非常高的興趣,也提升了學生的網絡空間安全素養。由于教學學時所限,具體的安全編程實踐和代碼審計工具的使用還未得到有效的開展,這需要在未來的網絡空間安全課程體系優化中得到解決。
在當前以及可見的未來,應用系統的安全問題一直會為企事業單位甚至國家層面重點關注,業界需要具有專業安全知識和安全技能的人才。在高校的網絡空間安全專業課程建設中,可以就安全編碼教學及實踐設立專門的課程,或者結合已有程序設計或軟件工程等課程,為其分配一定的教學課時和資源,以培養學生的安全編碼能力,從而滿足業界的人才需求。