您的位置:首页 > 编程语言 > C语言/C++

在Visual Studio中提高C++安全最佳实践

2013-05-29 20:17 609 查看
在任何一门开发语言或者任何一个开发平台中,性能与安全往往是一对矛盾体,在大部分情况下两者不能够兼得。作为开发人员,所需要做的就是在两者之间取得一个均衡。

笔者现在就以C++为例,谈谈在Visual Studio中如何提高其安全性。

  一、缓冲区安全检查避免缓冲区漏洞。

  有过程序开发经验的人都知道,缓冲区溢出是程序开发中比较常见的错误,也是一个比较大的安全隐患。利用缓冲区溢出这个漏洞进行攻击,也是黑客常用的手段。一个合格的应用程序,不能够犯这种问题。在Visual Studio平台中,提供了一种叫做GS缓冲区安全检查的机制。其主要的工作原理就是将溢出检测代码插入到面临被利用风险的函数中。当这个代码检测到缓冲区溢出时,将会停止相关代码的执行。换一句话说,其是一个动态监测的过程。

  默认情况下(也是笔记所推荐的),这个缓冲区安全检查是打开的。缓冲区安全检查主要的任务是检测试图进入返回地址的直线缓冲区溢出。通过调用约定将函数调用的返回地址保存到堆栈上,从而辨别应用程序是否有缓冲区溢出的漏洞。如果这个机制认为某些函数可能容易出现缓冲区溢出的漏洞,则编辑器会在堆栈上返回地址之前分配空间。在调用这个函数的时候,系统会用安全Cookie加载分配的空间。在调用完毕退出这个函数的时候,则会调用helper函数,以确保这个Cookie值能够保持不变。通过这种安全措施,就不怕黑客利用缓冲区溢出的漏洞进行攻击。

  GS缓冲区检查出了保护函数之外,还可以保护向函数传入易受攻击的参数。在调用函数的时候,往往需要向函数提供相关的参数,如SQL语言等等。但是这些参数也容易被攻击者修改,换成一些恶意的代码进行攻击。通常情况下,如下这些参数容易被攻击者利用。如SQL语言、指针、C++引用、字符串缓冲区等等。这些参数有一个特点,其往往是在Cookie和局部变量之前分配。如此的话,缓冲区溢出可以覆盖这些参数的值。使得使用这些参数的函数中的代码可能在函数返回之前就受到攻击。攻击者之所以需要这么大费周章,主要还是为了避开其他的一些安全检查机制。为了避免这个攻击,其方法也比较简单。即通过GS缓冲区检查机制,让编译器在函数prolog期间复制易受攻击的参数(并不是全部参数),并将他们存储在所有缓冲区域的下方。

  那么在Visual Studio平台中,如何设置这个安全选项呢?通常情况下,用户可以通过如下步骤来进行设置。一是依次打开“属性页”对话框、单击C/C++文件夹、单击代码生成属性页。二是在打开的对话框中找到“缓冲区安全检查”这个选项,然后可以修改相关的属性。如选择是打开还是关闭这个检查。笔者建议,如果没有充分的原因,最好还是打开这个安全检查机制。其虽然不能够百分之百的避免缓冲区溢出,但是其有效性还是能够达到95%以上。故在应用程序开发中推荐使用。

  二、企业代码分析帮助发现潜在的安全问题。

  其实应用程序的很多漏洞,都是开发人员不良习惯所造成的。如没有初始化内存、Null指针取消引用、内存泄漏等等。为了避免这些不良的做法对应用程序造成的潜在威胁,系统提供了一个企业代码分析的工具。通过这个工具可以帮助程序开发人员发现如上的一些潜在的安全问题。不过这个代码分析会影响到应用程序的性能。为此系统默认情况下是将其禁用的。笔者认为,对于不怎么专业或者刚进入这个领域的开发人员来说,这个工具是必不可少的。在这个工具的帮助下,可以改正其许多不良的开发习惯。

  要启用这个工具的话,可以按如下的步骤做。第一步是打开某个项目的“属性页”对话框,展开“配置属性”节点,打开“代码分析节点”。第二步选择“常规”属性页,在打开的属性页上可以看到“代码分析”属性。根据需要打开或者关闭这个选项。

  打开这个选项后,系统会自动进行检测。如果发现一些潜在的问题之后,系统就会提出警告。如警告C6066:传递了非指针参数;警告C6029表示对函数的调用中可能会发生缓冲区溢出,使用了未经检查的值等等。这些警告信息对于提高应用程序的安全是很有帮助的。

  三、安全异常处理程序保障异常处理程序的安全。

  在应用程序开发过程中往往会加入很多的异常代码。如在四则运算中,遇到除数为0的情况。如在ERP系统或者财务系统中,遇到会计期间关闭的情况 等等。异常处理程序可以保证在遇到一些不符合逻辑运算或者判断的条件下,后续的代码不会被执行。从而企业最终结果不会对用户产生误导。可见异常处理程序在 应用程序开发中必不可少。但是攻击者也已经盯上了这个异常处理程序代码。通过一些恶意的异常程序代码发起对应用程序的攻击。为此笔者建议在必要的情况下可 以开启安全异常处理程序功能。其可以保障在应用程序运行的过程中,确保只有合法的异常处理程序被运行,防止执行那些恶意引入的异常处理程序。

  四、Windows应用程序验证工具提高系统的稳定性与兼容性。

  如果利用Visual Studio平台开发基于Windows的应用程序,那么还可以通过使用Windows应用程序验证工具来提高系统的稳定性与兼容性。由于应用系统与操作 系统的不兼容,如可能存在端口冲突等等原因,也会直接导致应用系统出现安全的重大隐患,影响系统的稳定性。使用这个工具,可以帮助程序开发人员在应用程序 运行的时候,监控操作系统的应用程序使用情况。如检测操作系统注册报或者内存是否有被恶意修改等等。具体的来说,应用程序验证工具可以完成如下任务。

  一是检测有常见编程错误导致的潜在应用程序兼容性错误。如在应用程序中设置的通信端口同操作系统的默认端口相冲突等等。二是检查应用程序是否存 在于内存相关的问题,如是否采取了内存释放机制。三是确定应用程序与操作系统的各种要求的一致性,以确保能够在Windows各个操作系统上稳定运行。四 是会对应用程序的运行进行监测,标识应用程序中潜在的安全问题等等。

  除了以上这些安全措施之外,Visual Studio还提供了诸如托管代码分析、CRT安全工具等等,来确保应用程序的安全。不过需要注意的是,这些安全工具有些内容是重复的。如果将这些安全工 具全部启用的话,虽然可以提高安全保障,但是会大大的降低应用程序的性能。故在实际工作中,还是需要程序开发人员根据特定的背景有所选择的使用。这也是考 验一个程序开发人员水平的问题。

  最后需要说明的一点是,以上这些工具只是起到一种检查的作用。而不能够用来替代其他 的一些安全机制。程序开发人员需要根据一些安全提示,对源代码进行调整。换句话说,大部分安全工具并不能够代替开发人员的大脑,并不会自动修改应用程序中 的安全隐患。最终还是要靠开发人员来进行优化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: