安全编码有章可循(二)

日期: 2012-06-27 作者:茫然 来源:TechTarget中国

使用编译器的安全检查和强化功能   不同的编译器是为不同的目的开发的。例如,C语言标准定义了许多未定义的、未明确规范的、由实现环境决定的行为。其它的许多问题都留给了“实施质量”,这意味着市场决定着行为是否合适。通常,开发团队可选择实施实现了安全特性的编译器,以此来改善安全性,也可以通过使用静态分析等方法来改善安全性。

  在开始代码开发之前,开发者应当在最大程度上启用编译器的警告和错误。如果在日后再去应对所报告的问题,其代价将很昂贵。只要可能,要尽最大努力解决各种警告问题。如果解决警告问题并不现实,就要在代码中记录这些警告。

  现代开发环境,如微软的Visual Studio包含着静态代码分……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

使用编译器的安全检查和强化功能

  不同的编译器是为不同的目的开发的。例如,C语言标准定义了许多未定义的、未明确规范的、由实现环境决定的行为。其它的许多问题都留给了“实施质量”,这意味着市场决定着行为是否合适。通常,开发团队可选择实施实现了安全特性的编译器,以此来改善安全性,也可以通过使用静态分析等方法来改善安全性。

  在开始代码开发之前,开发者应当在最大程度上启用编译器的警告和错误。如果在日后再去应对所报告的问题,其代价将很昂贵。只要可能,要尽最大努力解决各种警告问题。如果解决警告问题并不现实,就要在代码中记录这些警告。

  现代开发环境,如微软的Visual Studio包含着静态代码分析功能,而且能够自动应用。此集成开发环境不仅能够编译代码,而且还拥有200多个预定义的规则。开发人员可以根据这些规则,对照一系列潜在的漏洞来检查代码的诸多方面。

  在编译和链接实际的二进制可执行文件时,应当禁用调试选项。例如,有些流行的商业级操作系统都曾被报告包含危急漏洞,可以使攻击者利用操作系统的标准的调试接口。该接口的设计目的是为了使开发人员在测试期间能够控制程序,在实际的生产系统中也保持可用。攻击者为了能够控制程序,会通过网络利用此接口,提升攻击者对调试器程序的特权。

  有些编译时的验证工具可以利用类型限定符。这些限定符可以给程序加上注释,从而可以正式验证程序,免受已知漏洞的威胁。有些限定符不受语言的限定,并且可以检测那些本应当由开发者检查的“不安全的”系统调用,还有其它的工具可以检测特定语言的漏洞。

  此外,还可以修改编译器,以检测对堆栈数据区域的恶意篡改。这种保护的一种简单形式就是“堆栈密探”。子程序的入口代码将“堆栈密探”放在堆栈上,并由编译器生成的子程序的退出代码对它进行验证。如果密探被篡改,退出代码就会终止程序,同时产生一个错误。

  许多C/c++编译器可以检测不正确的格式字符串。例如,Gnu编译器Collection支持C的扩展。C扩展可用于标记包含不正确的格式字符串的函数,而微软的Visual C++ .NET中的/GS编译器开关可被用于标记运行时代码中的缓冲区溢出。

  虽然类型和格式字符串的检查对于检测简单的错误非常有用,但对于检测更为复杂的漏洞,就显得有点儿小儿科了。有些编译时的工具会执行“污点分析”,即将输入数据标记为“污点”,确保在将此类数据用于易受攻击的功能之前,先对其进行验证。开源的“污点”分析工具Flayer就是一个好例子。此功能也被集成到了Perl语言中。其它的编译器也包括更广泛的逻辑,可以执行全面的程序验证,并根据正式规范来验证复杂的安全属性。程序验证编译器最常被用于检测C和C++程序和库中的漏洞和“有危险的”构造,其中也包括使程序易于遭受格式字符串攻击和缓冲区溢出的构造。

  当然,还有其它的一些要求编译时支持的保护措施,这包括内存中的变量和代码位置的随机化,特别是被加载库的位置和汇编预处理程序位置的随机化,这可以减少C和C++程序遭受堆栈的缓冲区溢出的可能性。这常常要求编译器和运行时的支持。

作者

茫然
茫然

暂无

相关推荐

  • 安全编码有章可循(三)

    如何解决本地和非本地代码、被动代码和动态代码之间的安全冲突?代码的安全检查有哪些技巧?应当注意哪些问题?

  • 编写安全代码三项准备(一)

    安全的软件开发是一个涉及到需求、设计、编码、测试等诸多方面的过程。安全的开发周期要从始至终为整体的开发定义过程要素。

  • 编写安全代码三项准备(二)

    如今为不同语言和目的而开发的各种安全的软件库已经不少了。其中的许多软件库都是为C和c++语言开发的,提供了针对容易被误用的标准库函数的替代代码。

  • 程序设计者需要谨记的九大安全编码实践

    安全专家发现,多数漏洞源自常见软件的相对有限的一些漏洞。软件开发者和设计者应当严格检查程序中的各种错误,尽量在软件部署之前就减少或清除其中的漏洞。