APP下载

面向网络空间安全专业的C/C++程序设计教学研究

2020-12-19姚立红邱卫东

计算机教育 2020年1期
关键词:漏洞网络空间代码

姚立红,邱卫东

(上海交通大学 网络空间安全学院,上海 200240)

0 引 言

随着信息技术的发展以及信息化进程的推进,越来越多的各式业务通过计算机程序来实现,业界关于计算机程序开发人才的需求也愈加迫切。C/C++因其语言灵活、程序执行效率高且具有较好的可移植性等特点,一直受到程序员的青睐。在每年的程序开发语言排名中,C/C++一直位于前列,目前许多大型的软件系统、网络应用服务等都是使用C/C++语言开发。

为了满足业界的人才需求,各高校在多个专业中都开设了C/C++程序设计课程,并且不断地探索和实践关于该课程的教学改革。到目前为止,已有很多高校教师和学者对此课程的教学形式及教学方法等进行研究和探讨,提出了一些切实可行的方法和措施[1-3]。这些已有研究主要集中在如何激发学生学习兴趣、提高教学成果等方面。

当前不断有软件系统、网络应用服务等暴露出严重的安全问题,人们也为此付出了高昂的代价。这些安全问题多数是由对应程序中包含的安全漏洞引起,恶意的攻击者利用这些漏洞非法获取系统访问权限,读取或修改敏感信息,有的甚至以破坏系统为目标,这给企事业单位带来了相当大的经济损失,甚至造成国家层面的安全威胁。程序中存在安全漏洞的主要原因之一是程序员在编程时未将安全编码纳入考虑范畴,导致所开发的软件包含各种安全缺陷。因此,在进行C/C++教学时,除了C/C++本身知识点的讲解和实践外,还应该重视对C/C++安全编程能力的培养,防患于未然。

1 C/C++课程教学现状分析

1.1 C/C++编程语言的特点

C/C++是一种灵活的、移植性高的轻量级高级程序设计语言,该语言内存耗用小,缺乏如数组的边界检查、整数操作的溢出与截断处理、函数调用时的实参长度检查等一系列的代码保护机制,若程序员不特意考虑这方面的内容,就会导致程序的安全缺陷或漏洞。

随着我国“互联网+”行动计划的实施,越来越多的系统连接到公网上对外提供服务,这些系统面临着来自各方的攻击,系统中的安全漏洞就会逐渐被暴露并加以利用。据国家信息安全漏洞库(CNNVD)发布的漏洞通报显示,目前系统漏洞数量呈逐年上升态势[4],这给企事业单位带来了极大的安全威胁,有些甚至造成了严重的安全后果。

1.2 业界视角下的课程教学需求分析

国内外的一些知名企业一直将软件的编码质量视为产品质量的重要方面,而程序安全缺陷在很大程度上决定了产品的编码质量,一旦程序编码上出现严重的漏洞而被黑客攻击,就会给企业带来严重的损失。

业界对于程序编码尤其C/C++编程重点关注以下几个方面:①安全编程意识和安全编程技能的培训,内容包括C/C++语言的安全弱点、安全漏洞的存在形式和利用方式等;②建立C/C++安全编码规范,面向软件工程师进行培训,并在公司推广该安全编码规范;③人工代码审计以及使用代码审计工具,最大限度地在软件发布前发现存在的软件安全缺陷。

高校的网络空间安全专业肩负着培养业界所需要的网络空间安全人才的重任,需要在C/C++课程中进行安全编程意识教育,并注重安全编码规范以及代码审计等相关内容的教学。

1.3 网络空间安全专业的C/C++课程教学现状分析

目前各大高校网络空间安全专业所开展的C/C++课程教学安排主要有两种形式:一种是以大平台的形式开展教学,将C/C++程序设计作为一门基础课程,在相关的工科专业(如计算机、自动化、通信工程、软件工程等)统一进行教学;另一种是在网络空间安全专业内开设C/C++程序设计课程。

从目前了解到的情况来看,国内大部分高校的C/C++课程教学中还未融入网络安全相关的内容,缺乏在C/C++方面的安全编码教育。这导致网络空间安全专业的毕业生不能很好地体现自己的专业优势,也不能很好地满足业界对网络空间安全人才及其安全技能的需求。

2 面向网络空间安全专业的C/C++教学建议

2.1 将安全编程内容融入C/C++教学

近年来,网络空间安全专业在全国各高校相继设立。网络空间安全专业作为一个年轻的专业,其课程体系通常由原有计算机专业或通信专业的部分主干课程(如操作系统、编译原理、程序设计等)和网络空间安全的特有课程(如网络安全管理、密码学应用、入侵检测系统等)组成。实际上,对于学生在网络空间安全知识和技能的培养不能仅限于几门直接相关的网络空间安全专业课程,而应该在所有相关课程中加入网络空间安全的内容,如在操作系统教学中增加专门的章节介绍操作系统的权限管理体系等安全内容,在编译原理的课程中加入编译器安全漏洞方面的教学内容等。

如前所述,通常软件的安全质量在很大程度上影响了软件漏洞的存在,直接决定了黑客攻击系统的难度,也决定了系统的安全程度。因此在网络空间安全专业的C/C++教学中,必须增加软件安全编码相关的教学内容,以全方面培养学生的专业安全技能。

2.2 跨课程的安全编码教学

程序漏洞的存在和被利用通常具有复杂的原因,要解释清楚一个具体的程序编码漏洞成因,不仅涉及程序设计的知识,还可能涉及编译原理、操作系统甚至CPU 体系结构的知识。如影响甚广、多次造成重大网络安全事件的缓冲区溢出漏洞就是这样的例子。

缓冲区溢出漏洞的成因是程序员忽略了数组边界检查,向小块内存区域拷入过多的内容,造成相邻区域被意外覆盖而导致的。从这个角度而言,预防缓冲区溢出属于C/C++程序设计范畴。但要向学生讲解缓冲区溢出漏洞的危害,就需要向学生展示和讲解黑客如何利用该漏洞发起攻击的方式和过程。缓冲区溢出漏洞利用原理和实施方式涉及程序编译过程中的程序内存分配方式。在网络空间安全专业的课程体系中,程序的内存分配原理主要属于编译原理课程的教学内容,实际系统下的程序内存布局还会牵涉到操作系统和计算机体系结构的部分内容。因此,不能仅限于传统C/C++的教学内容进行软件安全编码教学,仅限于编程语言层面,无法清晰地向学生讲述缓冲区溢出漏洞的根源和危害。

据权威组织统计,目前超过30%的软件安全漏洞都由缓冲区溢出导致,网络空间安全专业的教学中不应该忽视该部分内容。据了解,在全国的网络空间安全课程体系中,缓冲区溢出根源、利用过程、攻击危害及预防方式等内容处于多个课程均有部分关联但均不负责教学的状态。因此,对缓冲区溢出等跨课程的教学内容,需要在C/C++课程教学中综合操作系统和编译原理课程的相关知识进行系统化讲解,以完善网络空间安全专业学生的知识体系。

2.3 安全编码规范教学

作为网络空间安全专业的主干课程,C/C++教学不仅要培养学生如何进行软件编程的能力,也要培养学生如何写出高安全质量、不含或者少含安全漏洞的代码。软件编程具有非常强的实践性,编写高安全质量的软件不仅需要网络空间安全理念支持,还需要已有知识和经验的积累。计算机应急响应组(CERT)制定的C/C++语言安全编码规则是资深程序员和信息安全专家的最佳安全编程实践的总结,定义了字符串安全操作、内存管理操作、文件操作、整数安全、禁用危险函数等方面的安全编码规范[5]。

从业界网络安全实践来看,遵守C/C++语言安全编码规范可以在很大程度上减少程序编码方面的漏洞,减少程序被黑客攻击的可能,对编写高安全质量的软件具有很好的实践效果。网络空间安全专业从为业界培养所需要的网络安全人才角度,需要在C/C++教学中引入安全编码规范的内容,引导学生编写具有高安全质量的程序。

2.4 代码审计教学

近年来,网络安全事件愈发严重,代码质量管理在很多研发企业越来越受到重视。除了上文所述的软件安全编码规范的应用和普及外,代码审计也是一项重要的安全内容。

代码审计的主要内容是检查程序源代码中的安全缺陷,通过自动化工具或者人工审计的方式对程序源代码逐条进行检查和分析,发现程序源代码中是否存在安全隐患或者不规范编码。人工审计的效果在很大程度上依赖于审计者的经验,因此效率低下,一个有经验的程序员每天只能审计数千行代码,而审计速度的加快会带来审计效果的下降。基于自动化工具的代码审计具有较高的效率,数小时甚至数分钟就能完成一个复杂工程的代码审计。很多软件企业通常以工具审计为主,或者采用工具审计和人工审计相结合的方式进行,即首先利用工具进行所有代码的审计,而访问接口、身份认证、数据加解密等关键代码同时进行人工审计,以保证关键代码的安全。

网络空间安全专业的毕业生参加工作后,不仅自己要写出高质量的安全代码,而且可能要负责整个项目或整个企业的软件代码质量,因而代码审计能力就显得尤为必要,尤其是代码审计工具的熟练使用。因此,从培养企业所需安全人才的角度而言,在网络空间安全专业的C/C++程序设计教学中,应适当增加代码安全审计相关的内容,包括如何高效使用自动化审计工具等。

2.5 结合攻击案例的实例化教学

在网络空间安全专业开展C/C++程序设计课程时,除对引起程序安全问题的编程漏洞在原理方面更为深入分析之外,还需结合攻击实例进行实践教学与应用,以加深对原理的理解,同时对漏洞引起的安全问题有直观的了解。

在C/C++教学中,实例化教学可以包含以下内容:

(1)结合典型安全攻击方式进行安全编程意识教学。对C/C++程序员而言,盲目信任外部输入而不进行必要的检查是不良编程习惯,也是导致程序受到攻击的重要原因。显然,在教学过程中,单纯强调学生必须进行程序输入检查难以取得好的教学效果。如果能够结合缓冲区溢出漏洞的攻击实例,向学生展示黑客如何利用程序输入检查缺失构造攻击过程来实现控制整个程序的完整过程,就能让学生深刻认识到不良安全编程习惯的危害,从而增强学生们的安全编程意识,有助于养成检查程序输入的编程习惯。

(2)从违背导致的后果例证进行安全编码规范的教学。业界使用的安全编码规范内容比较多,单纯从正向讲解要求如何遵循安全编码规范通常不能收到很好的教学效果。若对每条安全编码规范设计反向案例,用程序实例演示不遵守安全规则导致的安全危害,如会带来哪些安全隐患以及黑客如何利用这些隐患发起攻击,就能帮助学生理解规则背后的原因,也能激发学生的兴趣。

(3)从实际操作角度进行安全编程和代码审计技能的培养。程序设计具有实践性强的特点,C/C++教学会安排较多的学时完成具体的编程任务。在实际的教学中,教师不仅要求学生完成相应的编程任务,而且要求他们写出符合安全要求的程序代码,并要求同学之间相互进行代码审计以发现不规范或不安全的程序代码,从而提升学生的实际安全编程和代码审计能力。

3 结 语

笔者在本科生的C++程序设计教学中,在完成常规教学任务的同时,给学生补充了C++安全编程规范的教学内容。C++程序设计和网络空间安全知识的结合激发了学生非常高的兴趣,也提升了学生的网络空间安全素养。由于教学学时所限,具体的安全编程实践和代码审计工具的使用还未得到有效的开展,这需要在未来的网络空间安全课程体系优化中得到解决。

在当前以及可见的未来,应用系统的安全问题一直会为企事业单位甚至国家层面重点关注,业界需要具有专业安全知识和安全技能的人才。在高校的网络空间安全专业课程建设中,可以就安全编码教学及实践设立专门的课程,或者结合已有程序设计或软件工程等课程,为其分配一定的教学课时和资源,以培养学生的安全编码能力,从而满足业界的人才需求。

猜你喜欢

漏洞网络空间代码
漏洞
网络空间攻防对联合作战体系支援度评估指标体系构建
基于selenium的SQL注入漏洞检测方法
《网络空间安全》订阅单
《网络空间安全》订阅单
侦探推理游戏(二)
《网络空间安全》订阅单
神秘的代码
一周机构净增(减)仓股前20名
漏洞在哪儿