电信运营商应用软件安全开发生命周期管理
2011-06-27王渭清薄明霞
王渭清,陈 军,薄明霞
(中国电信股份有限公司北京研究院 北京100035)
1 背景
进入全业务经营时代的各家运营商均已经不满足于只提供网络管道和能力给用户,随着用户需求的多样化和应用时代的来临,运营商加大应用平台和应用系统的开发和推广(如网上营业厅、各种B/S或C/S架构的增值业务系统),在业务丰富的同时,过多定制化应用软件的出现引出了许多安全问题。
多个权威组织和机构均表明,目前网络攻击的主要对象已经由攻击网络和主机系统转而变为攻击应用软件。这些攻击可能导致被攻击方声誉受损、经济损失甚至产生不良的政治影响。其中,根据美国国家标准技术研究院(NIST)的统计分析得出,所确认漏洞中92%的是在应用层,而不是在网络层;另据Gartner的数据表明,当前网络上75%的攻击是针对Web应用的[1]。
与此同时,对于应用软件用户而言,软件是否安全目前已经逐渐成为他们面临选择时最为关注的方面。尤其是运营商的应用软件往往承载大量的用户数据、充值卡信息以及部分商业机密,安全需求就更加突出。由此可见,更有效地解决安全问题,提供安全的应用软件,能够使运营商在争夺市场份额的战斗中占据更为有力的位置。
2 应用软件安全漏洞分析
应用软件主要包括采用B/S、C/S结构软件和单机应用软件,其中单机应用软件可看作没有客户端的C/S结构软件。应用软件的通用漏洞主要由于应用软件在需求、设计、开发和测试等过程中存在缺陷和弱点,进而产生能被利用的漏洞,影响安全性。通用漏洞主要包括溢出漏洞、拒绝服务、功能滥用、暴力破解、认证绕过、SQL注入、跨站脚本、客户端攻击、网络攻击、用户输入、信息泄露、安全审计、恶意代码等。下面将对主要的漏洞进行介绍。
(1)缓冲区溢出漏洞
缓冲区溢出漏洞是一种在软件中最易发生的漏洞。它发生的原理是,由于软件在处理用户数据时使用了不限边界的拷贝,导致程序内部一些关键的数据被覆盖,引发了安全问题,严重的缓冲区溢出漏洞会使得程序被利用而安装上木马或病毒。
(2)格式化字符串漏洞
格式化字符串漏洞是由于程序的数据输出函数中对输出数据的格式解析不当而引发的。可以被黑客利用的数据输出函数一般具有3个特性:参数个数不固定造成访问越界数据、利用%n格式符写入跳转地址和利用附加格式符控制跳转地址的值。
(3)指针覆盖漏洞
由于程序在运行中往往会将来自于程序外部的数据也存进内存中,如果某些数据恰好覆盖了程序的指针,那么程序的执行流程会被这些外部的数据所控制,这就是指针覆盖漏洞。
(4)SQL 注入漏洞
SQL注入漏洞将包含了某种目的的SQL语句,通过关键变量插入到软件中正常的数据库操作语句中。软件一启动就会产生注入漏洞,从而引发一系列的安全隐患。
(5)Bypass漏洞
Bypass漏洞是一个大类,包含了很多小类,这些小类有一个共同的特点,就是这些出现问题的软件在使用上都存在对用户使用的限制,而Bypass漏洞就可以绕过软件的限制,使得软件的限制形同虚设。
(6)信息泄漏漏洞
信息泄漏漏洞主要分为两种:本地式信息泄漏漏洞和远程式信息泄漏漏洞。本地式信息泄漏漏洞是指当用户在自己的计算机系统上安装使用了某个软件后,该软件生成的文件会将用户计算机系统上的其他数据信息在未经用户许可的情况下,擅自保存到文件中。当该文件被恶意攻击者获得后,恶意攻击者就可以借助该漏洞获得用户计算机系统的信息,从而造成用户信息被泄漏;远程式信息泄漏漏洞常见于提供远程网络服务的软件。恶意攻击者可以通过该漏洞获取远程服务器或者系统上的涉密信息,进而引发经济或者政治上的巨大损失。
3 应用软件安全开发周期管理
传统软件开发生命周期,主要从软件功能实现的角度出发,其基本目的是如何合理地组织开发流程以高效地完成软件的各项功能,通常只是注重软件功能的定义、实现与测试,安全策略没有得到充分的考虑。即使是在测试环节考虑到软件系统的安全性,也往往是在编码完成后进行,而没有将软件安全的思想贯穿到软件开发的整个过程。对比而言,安全软件开发生命周期是将安全原则渗透在整个软件开发的生命周期中,即在每个开发阶段均需要考虑安全性。安全软件开发生命周期是通过软件开发的各个步骤来确保软件的安全性,其目的是确保安全的软件得以成功实现。在软件安全开发周期的每一个阶段都需要应用安全风险管理。只有保证安全风险管理贯彻在整个开发周期中,才能保证软件的安全性。
近年来,众多公司投入了大量的资金进行软件安全工程的研究,并且形成了3种高效的管理模式,即OWASP的 CLASP、微软的 SDL和 McGraw的 Touchpoints[2]。
其中微软公司提出的SDL(security development lifecycle)是从安全角度指导软件开发过程的管理模式。这一过程包括一系列基于安全的行为,并将它们分配至软件开发的各个阶段,这些行为包括:在设计阶段对危险的模式进行改善、在编码阶段使用静态编码分析工具以及在安全推进工作中进行产品代码检查和安全测试。在软件被释出前,它还必须经过评审小组的安全审核,与未经SDL模式开发出的产品相比,SDL模式可令产品在对外发行后发现安全漏洞的几率显著降低[3]。
SDL的核心理念就是将软件安全的考虑集成在软件开发的每一个阶段,如图1所示,通过对需求分析、设计、编码、测试和维护各阶段进行约束来实现软件的安全管理。
SDL作为微软提出的软件安全开发周期,它主要适用于软件开发公司,并不完全适用于运营商。作为软件采购者和服务提供者,运营商位于软件开发商和用户二者之间,在软件开发的进程中,需要收集并分析用户的需求,通过模拟使用环境等一系列因素向软件开发商提出具体的要求,在软件开发周期中要负责软件功能的制定,其后需要根据用户对软件的反映来进一步与软件开发商沟通,以对应用软件进行完善。
4 运营商的软件安全开发周期探讨
借鉴业界成熟的安全开发周期思路,运营商可针对自身情况设计自己的应用软件安全开发周期。从需求、设计、开发、测试、部署等阶段,为运营商自己和开发厂商制定应遵循的安全原则与安全要求,确保应用软件在交付使用后能稳定、可靠、安全地为用户提供服务。
(1)需求阶段
在需求阶段中,运营商应该在功能需求的提炼、软件功能与厂商协商的基础上,找出关键的安全对象,考虑如何在开发流程中集成安全性,分析软件风险及评估项目代价,最终形成开发计划,同时,在提升软件安全性的同时尽量减少对计划和日程的影响。在此阶段工作中,运营商应该充分发挥主要地位,结合企业自身安全标准和要求,将安全需求和功能需求相融合,最终以技术规范书的形式,在合同中予以确定。
(2)设计阶段
设计阶段主要将需求转变为软件陈述(表达),包括概要设计和详细设计。其中概要设计关注于如何将需求转换成数据和软件框架,详细设计关注于将框架逐步精细化为具体的数据结构和软件的算法表达,设计阶段的安全要求主要目的是将各项安全需求转变成具体的安全要求。在此阶段中,运营商主要负责根据软件的应用环境和功能提出身份认证、会话管理、访问控制、权限管理、日志记录、数据存储与传输等多个项目的开发要求,并在此基础上协助软件开发商进行概要设计框架的构建,至于详细设计环节,则主要交予软件开发商来完成。
图1 SDL开发模式
(3)开发阶段
开发阶段是软件开发生命周期的重要阶段,与软件厂商不同,运营商在此环节中并不实际参与。但是,应该在需求分析或者设计中应明确地提出此阶段的一些安全要求,如输入验证、输出管理、内存管理、异常管理等。需要注意的是在此阶段,除应满足设计阶段提出的安全要求外,还应注意使用安全的编码方法,确保软件的交付质量,避免因为编码缺陷给应用软件引入安全漏洞。
(4)测试阶段
测试阶段是软件开发过程的重要组成部分,主要确认一个软件的品质或性能是否符合需求、设计和开发阶段的各项要求,是对软件需求分析、设计规格说明和编码的最终复审,是软件质量保证的关键步骤。在测试阶段中,电信运营商也需要承担一定的工作。有别于软件厂商在此阶段主要针对代码实现和设计以及需求阶段的传统软件测试,电信运营商还应该开展安全验收测试工作,主要包括应用软件所在环境的安全测试(如所处网络环境、主机操作系统等),其次,采用黑盒测试对应用软件的身份认证有效性、授权管理有效性、访问控制可用性、日志审计有效性及完整性等内容进行测试,有条件的运营商甚至可以采用白盒测试,也就是业界常说的代码审核来测试应用软件的安全性。因为应用软件一旦上线往往将直接面向用户,所以运营商测试阶段需要尽可能发现问题和整改问题,进而保障应用软件在现网的安全运行。
(5)部署阶段
部署阶段主要包括将应用软件从测试环境搬迁到生产环境以及与各接口应用的联调工作。此阶段应在测试阶段的基础上,对应用软件和其所处环境进行必要的安全加固,部署后需要对整个应用软件系统进行全面的安全评估检查,评估合格者方能允许上线运行。
从项目初期就考虑安全问题,并将安全意识贯穿于整个应用软件的开发生命周期中,是电信运营商解决应用软件安全问题的重要思路之一。
1 俞优,顾健,李毅.Web应用安全现状分析及防护建议.信息网络安全,2010(7)
2 Bart De Win,Riccardo Scandariato,Koen Buyens.On the secure software development process:CLASP,SDL and touchpoints compared.Information and Software Technology,2009,51(7)
3 Linper S.The trustworthy computing security development lifecycle.Information Theory,2004