编码安全是应用程序安全的基础。在准备阶段,开发团队除了要根据其技术特长选择一种符合项目要求、特点的安全语言之外,还要做好以下三方面的准备。
一、制定一个安全的开发过程
安全的软件开发是一个涉及到需求、设计、编码、测试等诸多方面的过程。此过程的一个关键要素是,在软件开发期间不同团队之间的信息传递。这个过程必须支持安全编码的各种努力。
安全的开发周期要从始至终为整体的开发定义过程要素。在编码过程中,典型的过程要素包括六方面:明确的编码标准、为安全编码而对编译器进行设置、源代码工具的分析和使用、经核准的和被禁用的功能、安全编码的清单等。
安全的开发周期的主要目的是,使项目的管理实现协调,确保软件满足整体要求,其中也包括安全要求。指望开发团队没有协调好所有其它各方的努力而生产出安全的代码是不现实的。许多安全问题并非源自句法、语法错误,而是源自设计问题。在不同团队之间的正确协调是安全开发周期过程的主要功能。这种跨团队交流的一个主要例子就是威胁建模的形式。威胁建模技术要分析一个系统的潜在威胁,并使用此结果来设计减轻威胁的措施。这要求不同团队的交流,使软件体现出安全思维,从而挫败潜在的威胁。
二、创建应用指南
在开发团队开始编码过程之前,开发者必须在应用指南中制定策略,要求其明晰、易于理解,并且足够全面,有助于程序员编写规范的代码。通过这种方法,任何开发人员都能轻易地维护代码。该应用指南应当包括如下信息:
从哪里得到特定软件(也就是URL地址、服务器等)、将安件安装到哪里(目录结构、硬盘、服务器等)、到哪里寻找许可信息、到哪里去发现部署要求、如何测试软件及使用什么工具测试、在哪里将代码投入生产(服务器名和IP地址等)、软件检验的过程、语言编码标准的确认等。
保持代码的协调一致非常重要,但对于实现安全的代码却远远不够。通过遵循应用指南,开发人员就可以强化代码的可读性,并增加协同工作的可能性。如果开发团队能够正确地创建应用指南,它就可以在整个开发团队中贯彻实施。虽然这个过程可能需要根据不同项目或部门的需要而做出调整,但该指南必将有助于在整个开发团队中强化安全代码的开发。
三、确认安全的软件库
如今,为不同语言和目的而开发的各种安全的软件库已经不少了。其中的许多软件库都是为C和C++语言开发的,提供了针对容易被误用的标准库函数的替代代码:
安全软件库的类型:开发团队必须高度关注这些软件库的来源。因为开发团队往往没有时间查看库中的代码,检验其纯洁性,检验代码是否没有被篡改,因而必须确保文件来自一个可信的源。可信源的定义依赖于团队和正在开发的软件。开发团队不妨考虑下面这些软件库的例子:
CERT的可管理字符串库:计算机紧急响应小组(CERT)库的开发是为了应对一个字符串库的需要,主要用于改善新开发的C语言程序的质量和安全性,同时排除程序的广泛应用和标准化的障碍。正如其名称所暗示的那样,可管理的字符串库基于一种动态的方法;可以根据需要分配和重新分配内存。这种方法可以确保总有充足的空间用于最终的字符串(包括终止性的空串)。
SafeInt:SafeInt是一个C++模板类。SafeInt在执行一次操作之前要测试操作数的值,以决定是否会发生错误。这个类被声明为一个模板,因而它可用于任何整型类型。SafeInt被微软广泛用于其Windows及Office系列产品。如果您仅对微软的编译器感兴趣,现在的 Visual Studio版本就有一个类似的简版。它可用于拥有良好模板支持的任何编译器。
OWASP(开放式Web应用程序安全项目)的企业安全API:该API可以简化许多安全任务,如输入验证或访问控制。
antiXSS库:该库可用于Web应用程序。antiXSS库主要用于防止跨站脚本(XSS)攻击。这些antiXSS库至少支持对所有源自不可信的用户输入的所有输出进行HTML编码。其中的例子包括,OWASP PHP AntiXSS 和SAFECode 11
保障库的安全性:在选择了一个安全库之后,很重要的一点是确保其安全性。对于JAVA的JAR文件,任何人都可以轻易地解压文件、损害JAVA 类,然后重新压缩文件。在发现问题时,就得花费几周或几个月的时间才能决定JAR文件中的问题。因而,应当将库放到一个安全的目录中,设置有限的访问权限,确保其不受到破坏。其目标不仅是为了确保库不会被重新打包,而且要限制操作人员。
代码签名:这种技术可用于确保库和函数不会遭受损害或篡改。确保代码在使用之前的完整性的方法包括:认证代码、强健的命名、WinSxS等。代码签名还可以在开源代码库工具中使用,如Mercurial and GIT。关键在于:开发团队需要定义并遵循一个适当的代码签名策略,使其成为安全编码的一部分。
代码库的集中化:将软件项目的代码库以及项目代码库的其它部分存放到一个可控的库中。代码库可以使所有项目代码存放到一个集中的位置,并可以有效地管理其更改。这种做法的安全好处是,易于备份整个代码库,如果代码受到损害还可以在日后进行恢复。将代码放置到一个中央位置也可以使开发团队有效地控制谁可以访问代码库。