我们今天的现代化社会十分依赖于软件,软件可以实现企业的商务流程,可以操控我们日常中所有的电子商务,(例如手机,飞机和取款机),软件也是一些重要服务的核心,例如电话网络,互联网,空中交通指挥系统等。对全球经济增长,人民生活质量,企业成功以及政府组织机构来说,如今软件比以往任何时候都重要。我们必需使用安全的软件。
然而随着互联网和基于互联网的应用系统的不断发展,软件安全问题日异严重。传统的安全防御方式已逐渐不能满足现在的软件安全的要求。黑客们已不再着眼于破坏防火墙等手段。黑客们会直接通过企业、政府、银行等机构的公共网站及应用系统入手,直达核心系统盗取所需的信息。他们的攻击方法变得更加高明,方式也更加隐蔽。传统的靠在我们的服务器上加一层SSL(Security Socket Layer)、再加一层防火墙是不能够解决的了。软件安全问题必需要有新的解决方案。
1. 软件安全的现状:
软件安全是软件工程里的一个概念,它是指软件受到恶意的攻击下,软件能够正常运行。这个正常运行是从指软件的功能和性能上考量的。软件安全课题就是了解产生软件安全的风险并怎样去管理他们。近几年来,软件安全问题变得流行起来,主要是由于互联网的发展。根据CERT/CC统计软件安全问题的增长如图1:
(图1:安全漏洞趋势图)
今天软件安全问题增长的原因:
• Connectivity(互联性):互联网无处不在,系统全在上面。互联网在使人们使用软件变得方便的同时,也给黑客们更好的机会,给人们的软件带来了更多的风险。互联网意味着,黑客随时随地都可以访问我们的软件系统,公共的访问平台使我们不能够分别出哪些是真正的用户,哪些是黑客。这样他们比过去有了更多的时间和空间来攻击我们的系统,如果我们的软件中一点儿安全的缺陷,他们就能够知道,并利用之来攻击。
• Extensibility(扩展性):使攻击系统的方式变得不可预测。现在的软件应用系统趋向可扩展化,可扩展的系统可以接受更新或扩展,许多时候依赖于动态的代码,使得系统的功能得到扩展,更好满足人们的需求。如:Plug-In架构的Web 浏览器使得我们可以随意地安装我们需要的文档格式的阅读器:Word, Excel, PDF等。今天操作系统通过动态的装载设备驱动和模块来支持可扩展。今天的应用系统,如:word 文字处理,E-mail客户端,Web浏览器等都通过scripting, controls, components和applets来支持可扩展性。但扩展性给软件的安全带来了,很大的挑战。
• Complexity(复杂性)互联网,分布式,动态的代码。现在的软件应用系统的变得越来越大,复杂性也越来越大,操作系统从DOS到今天的WindowsXP,XP的代码最少4000亿行。复杂度可想可知。而现在的基于网络的应用系统,为了达到更高运算速度,承载很大访问量,就使用分布式,集群,可扩展架构。使我们软件代码数急剧增长。复杂度也越来越大。软件安全隐患也越来越大。
2. 传统的软件安全的解决方法:
在很多的公司或者企业里,系统安全一直依赖于硬件的防护,主要就由基层的人员完成,他们在我们的应用系统上安装并维护防火墙、入侵检测系统和反病毒引擎。在我们应用系统上增加一层又一层的保护层。使得系统得以安全。这些技术统称:“Reactive Technologies”。同时通过限制一些网络的端口,IP限制访问等手段来防止黑客的攻击。但是随着软件的发展,许多软件是基于互联网的,许多的业务和功能是通过互联网完成的。这使得软件应用系统必须打破传统的保护层,直接与外面的系统交互。如下图2:从而使得系统没有“内”“外”之分了。这就使得传统的防火墙所谓防止“外”来入侵的防御技术变得毫无意义了。这就是迫使我们一定要通过加强应用软件本身的质量来防御黑客或恶意的内部人员对应用系统的攻击。
(图2:传统的保护层被打破)
3. 软件安全漏洞的分类:
由于传统的安全防护方式日益变得不再有用。我们也知道软件的安全问题主要来自于软件的本身。安全漏洞产生主要是由不合理的软件架构和错误的编码所造成的。那么黑客到底利用我们软件的什么样的漏洞来攻击我们软件呢?换句话说,我们的软件设计和编码中,生产了什么样的安全漏洞呢?那么将这些软件安全的问题综合起来,再进行分类,这个价值是无庸致疑的。分类可以使人们更好地了解计算机安全缺陷产生的根源。于是早在70年代中期,软件安全问题分类这一问题就受到了广泛的关注。很多研究组织纷纷进行研究。最早进行计算机安全与机密研究的组织是RISOS(Research Into Secure Operating System).RISOS提出和描述了几种操作系统安全的缺陷。它的目标是了解在操作系统中存在的安全问题。RISOS提出的安全问题的种类包括:
• Incomplete Parameter Validation
• Inconsistent Parameter Validation
• Implicit Sharing of Privileges / Confidential Data
• Asynchronous Validation / Inadequate Serialization
• Inadequate Identification / Authentication / Authorization
• Violable Prohibition / Limit
• Exploitable Logic Error
这个研究表明在不同上下文的情况下,共同遇到的只有很少量的一些基础性的缺陷。这个分类也只论述了很有限的几个共有问题的类型,而且每个类型的限定也不是很清楚,许多情况下一个问题可以属于一个或几个类型,这样的分类是不精确的。同时,分类的命名,不够直观。虽然它对很多研究人员也说很有用,但是对于软件开发人员,他们并不能在他们每天繁重的工作的情况下很快地通过直觉把它们区分开来。另外,这项研究只是关注操作系统一些安全问题的分类而没有关注到企业级软件的安全问题。而随着软件的不断发展,应用软件形式也不断变化,安全问题分类也有了新的研究。下面摘要著名的软件安全专家Gary Mc Graw的2006年的新书《Software Security building security In》中提出的软件安全问题的“7+1”个很高级别的大类。这几个领域中七个大类都是关注于源代码的安全,一个是与软件的配置和环境有关的。大类中我们又分了很多的小类,这8个大类及每个大类中主要的分类分别是:
1. Input Validation and Representation
Buffer Overflows
Command Injection
Cross-Site Scripting(XSS) Flaws
Format String Problems
Integer Range Errors
SQL Injection
2. API Abuse
Trusting Network Address Information
Dangerous Function
Directory Restriction.
Heap Inspection
3. Security Features
Failing to Protect Network Traffic
Failing to Store and Protect Data
Failing to Use Cryptographically Strong Random
Numbers
Improper File Access
Improper Use of SSL
Use of Weak Password-Based Systems
Unauthenticated Key Exchange
4. Time and State
Signal Race Conditions
Use of “Magic” URLs and Hidden Forms
5. Errors
Failure to Handle Errors
Catch NullPointerException
Empty Catch Block
Overly-Broad Catch Block
Overly-Broad Throws Declaration.
6. Code Quality
Poor Usability
Double Free. Calling free()
Inconsistent Implementations
Memory Leak
Null Dereference
7. Encapsulation
Information Leakage
Comparing Classes by Name
Data Leaking Between Users
Leftover Debug Code
Trust Boundary Violation
8. Environment
Insecure Compiler Optimization
ASP .NET Misconfiguration: Creating Debug Binary ;Missing Custom Error Handling
Password in Configuration File
J2EE Misconfiguration: Insecure Transport ; Insufficient Session-ID Length
Missing Error Handling ; Unsafe Bean Declaration
Weak Access Permissions
这些分类包括了各种程序语言中遇到的源代码的安全问题,它包括C,C++,JAVA,以及。NET家族的C#、ASP。在这里我只是大致描述一下。详细的分类的描述在http://www.fortify.com/vulcat/。
4. 真实有效的解决方案:
所谓“知己知彼,百战不殆”,通过对安全漏洞的分类,我们清楚的知道了软件中可能产生的各种各样的安全隐患,那么我们只要做好充分的主动的预防工作,消除软件中的安全隐患,这样我们的软件就可以抵御黑客或恶意的内部人员的攻击了。那么怎么做才可以彻底消除这些隐患呢?什么样的方案才是真实有效的呢?
软件安全涉及软件工程、编程语言、网络、数据库、安全工程等各个领域各个层次。涉及面非常广。这使得做好软件安全防御工作需要有很深的专业知识,管理技能,同时也要有非常丰富的实际经验。著名的软件安全专家,美国著名的软件安全咨询Cigital公司CTO Gary Mc Graw博士一直从事软件安全的研究,可以说是软件和应用程序安全领域的世界级权威。他建议,解决软件安全主要可以从如下几个方面入手:
4.1.Applied Risk Management Framework(实用的风险管理框架)
我们常说的风险管理和风险分析都是在软件设计的阶段,软件架构级的风险分析。分析我们的设计可能给软件带来什么样的风险。虽然它是风险管理框架中最为重要最实际的一个关键的阶段,但它不是风险管理的全部。因为我们的软件安全风险是在整个软件开发生命周期中慢慢地产生的。而不仅仅在设计阶段。所以贯穿整个开发周期的风险管理才尤为重要。所以我们称之为“风险管理框架”。
风险管理常常被人们叫做“black art” 。这是因为风险管理有部分像占卜、算命一样,在那里对未来要发生的事进行预测。又有部分像数学,有着一定的逻辑推理。给人一空洞,没有真凭实据的空谈的感觉。然而一个成功的风险管理,它是比做任何一个业务级的决策需要的依据都要多的多。首先我们必须要收集充分的用来做决策的数据,其次我们要有软件缺陷、威胁、影响和可能性的知识作基础,还要有丰富的软件风险管理的经验,综合起来,这样才能做好整个开发过程的风险。从而降低风险甚至消除风险。总和起来风险管理也有五个阶段的活动:
(1)Understand the Business Context(了解业务需求内容)
(2)Identify the Business and Technical Risks(确认业务风险和技术风险)
(3)Synthesize and Rank the Risks(综合风险并划分等级)
(4)Define the Risk Mitigation Strategy(确定降低风险策略)
(5)Carry out Fixes and Validate(实施修复并检验结果)
4.2.Software Security Touchpoints(软件安全开发切入点)
提高软件安全的最好的一个种方法就创建安全的软件——“Building Security In”。今天的软件都有明显的安全需求的特征。我们在完成软件需求的功能的同时,也要建立安全需求。但是建立安全不等于就是简单地加入SSL(Security Socket Layer)就可以的。第一因为安全问题是整个系统级的问题,它包括:安全机制(如:访问控制)设计安全(如:坚固的设计使攻击变得困难)编码安全(如:Buffer Overflows)等很多方面。有时候这些方面是相互重叠的,但有时候又不是。第二因为安全问题是一个慢慢地连续不断地出现的一个问题。在开发周期的每一个阶段都有可能引入安全隐患,甚至是我们选择的工具,选择的实现技术,数据库等都可能引入新的问题。这也就是为什么安全问题是贯穿软件开发整个生命周期的主要原因。所以要想解决安全问题从原来的被动的救火方式转换到主动的防御式,就是时刻记
住——“Building Security In”。
(1)Code Review(代码重审)
(2)Architecture risk analysis(软件架构风险分析)
(3)Penetration testing(渗透测试)
(4)Risk-based security tests(基于风险的安全测试)
(5)Abuse Case(最坏情况处理)
(6)security requirements(安全的需要)
(7)security operations(安全操作)
(图3:七个切入点在开发周期的分布图)
如上图3可出从这七个方面入手可以较为全面的考虑安全构建软件。这七个方面分布在软件开发周期中的各个阶段。因此我们可以相信,只要我们认真做到了这七个方面,我们的软件的安全问题应该可以得到解决。
4.3.Knowledge(知识)
软件安全的最大的挑战是我们缺乏在软件安全方面的知识和经验.因此我们需要,也非常有必要给我们的开发人员、设计人员,分析人员更多的有关软件安全的知识的培训,以期他们具备丰富的软件安全的知识.
5. 总结:
今天的软件已经成为我们生活重要而不可缺少的组成部分,它给我们带来便利的同时也带来了新的问题。黑客们常常很容易地获取了我们重要的信息,给我们带来巨大的经济损失。传统的安全防御方式慢慢变得不能适应今天的要求。提出新的解决软件安全问题的方法迫在眉睫,“Building Security In”这一理念的提出,使我们找到了答案。对安全问题进行汇总,分类,然后在软件开发的过程中时刻考虑安全问题。有理由相信,这样的方法能够提高软件本身的防御黑客攻击的能力.