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