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