3.3 程序设计教学中使用新版本编译器与内置防御特性
程序设计教学中,编译器的选择应当与时俱进,及时将最新的C/C++编译器及其新的特性介绍给学生。对于微软的最新C/C++编译器,使用GS选项编译选项,加入检测函数堆栈缓存溢出错误的额外代码。GS编译选项可以有效降低缓存溢出安全漏洞的危害程度。
GS编译选项的原理就是在堆栈上插入一个安全Cookie,以测试堆栈上的返回地址是否被修改过。安全Cookie为4个字节,如果一旦发现安全Cookie的值被改动,那么就会转入异常处理,终止程序运行。这样,即使存在缓存溢出的错误,GS选项也能阻止恶意代码通过覆盖函数的返回地址这种攻击方式。
GS编译选项针对的是函数的栈缓存溢出(stack buffer overrun),覆盖返回地址的攻击方式。对于程序的其它类型的安全漏洞它并不能提供有效保护,例如:堆缓存溢出(heap buffer overrun)、攻击异常处理程序等等。所以,决不是使用了GS编译选项就可以高枕无忧了。
同样需要向学生强调的是,GS编译选项并不是消除了程序的缓存溢出安全漏洞,而是在特定情况下降低安全漏洞的危害程度。例如,即使GS编译选项可以防止恶意代码被远程执行,但是程序也会异常终止。如果该程序是一个重要的服务器进程,这就会是一个典型的DOS(Deny of Service)攻击。
3.4 操作系统课程教学中介绍数据执行保护技术
在栈(stack)或堆(heap)溢出程序例子中可以看到,恶意代码是被存放在栈或堆上。无论堆还是栈,都是数据页面。通常情况下,这里是不应该执行代码的。数据执行保护,即DEP(Data Execution Prevention),以及与之对应的NXCOMPAT选项,就是禁止应用程序和服务在非可执行的内存区(non-executable memory)上执行指令。
操作系统对DEP的支持,就是将系统或应用程序的数据页面,标注上NX位。这样,一旦由于堆栈缓存溢出的安全漏洞,导致恶意代码试图在数据页面上运行,CPU就会产生异常,导致程序终止,而不是去执行恶意指令。
Windows对DEP的支持是从Windows XP SP2和Windows Server 2003开始的。出于应用程序兼容性的考虑,在Windows Vista 32位的默认配置下,DEP只负责保护Windows的系统程序和服务,而不包括其他应用程序。从Visual Studio 2005起开始支持NXCOMPAT链接选项,如果在连接选项上加上NXCOMPAT,生成的exe程序在运行时候就会受到DEP机制的保护。
需要向学生指出的是,同GS选项类似,也存在其它攻击方式可以绕过NXCOMPAT+ DEP的保护机制,例如return-to-libc攻击[7]。
3.5 软件工程课程教学中安全编码能力的训练
可以在软件工程相关课程的教学中增加如下的内容:
1)软件安全开发问题,包括软件安全问题与信息安全的关联、软件安全开发生命周期[8]等,例如介绍风险分析和代码复审,并解释这些行为应该发生是在软件开发生命周期中的哪一个阶段、哪种情况下。
2)安全设计原则,介绍由Saltzer和Schroeder提出的八项安全机制[8,9]作为软件设计与实现原则,例如最少特权(least privilege)、自动防故障缺 省(fail-safe defaults)和特权分离(separation of privilege)。
3)代码静态工具的使用。使用静态代码分析工具可以帮助我们在开发过程中,及早发现并修补代码中存在的安全漏洞[8,10]。
代码检测是软件系统安全性检查的一个重要部分,它可以在软件投入运行甚至系统没有集成前发现和修复安全漏洞。要求学生使用静态分析工具[11]快速发现代码安全漏洞,并对这些工具的优缺点进行分析。
在这一阶段的安全编码能力的训练中,应当向学生指出:软件的安全是软件质量的一个重要部分,生产高质量(包括高安全性)的软件需要一整套系统化的方法支持。可靠的软件完成设定的功能,安全的软件完成设定的功能,而不做任何未设定的工作。
3.6 其他教学实践
在Web程序设计课程的教学中,利用OWASP (the Open Web Applications Security Project, 开放网络应用软件安全计划)设计[13]的WebGoat安全学习教程。要求学生使用Web Scarab测试工具来完成WebGoat实验[14]。WebScarab是一个用来分析使用HTTP和HTTPS协议的应用程序框架。
(责任编辑:adminadmin2008)