购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 软件安全的概念

对于软件安全,目前尚没有统一的定义。本节首先介绍一些知名标准或知名专家对软件安全的定义,然后用信息安全的属性来刻画软件安全,最后对软件安全相关概念进行辨析。

1.3.1 软件安全的一些定义

国家标准GB/T 30998—2014《信息技术 软件安全保障规范》给出的软件安全(Software Safety)定义是:软件工程与软件保障的一个方面,它提供一种系统的方法来标识、分析和追踪对危害及具有危害性功能(例如数据和命令)的软件缓解措施与控制。

实际上这一定义来源于美国国家航空航天局(National Aeronautics and Space Administration,NASA)于2013年颁布的《软件安全标准》8719.13C(Software Safety Standard,第3稿),该标准是这样定义软件安全的:“Software Safety:The aspects of software engineering and software assurance that provide a systematic approach to identifying, analyzing, tracking, mitigating, and controlling hazards and hazardous functions of a system where software may contribute either to the hazard or to its mitigation or control, to ensure safe operation of the system.”

著名安全专家加里·麦格劳(Gray McGraw)在他早期的文献中将软件的安全性定义为“在面临蓄意威胁其可靠性的事件的情形下依然能够提供所需功能的能力”,这是一种广义的对于软件应用安全状态的理解。

在我国国家标准GB/T 16260.1—2006/ISO/IEC 9126-1:2001《软件工程产品质量 第1部分:质量模型》中,将软件的安全保密性作为软件产品内部和外部质量的重要组成,将软件的安全性作为使用质量的重要组成,软件的安全性被定义为“软件产品在指定使用周境下达到对人类、业务、软件、财产或环境造成损害的可接受的风险级别的能力”。标准指出,这里的风险常常由软件内部和外部质量组成中的功能性(包括安全保密性)、可靠性、易用性或维护性中的缺陷所致。该标准对软件安全的定义强调了软件安全与数据保护的密切关系,指出了软件安全问题的根源在于软件的缺陷。

说明:

国内外大多数软件安全标准中,软件安全用的是Software Safety,而不是Software Security。本书认为,Safety侧重于对无意造成的事故或事件进行安全保护,可以是加强人员培训、规范操作流程及完善设计等方面的安全防护工作。而Security则侧重于对人为地、有意地破坏而进行的保障和保护,比如部署专门安全设备进行防护、加强安全检测等。对于软件安全,既要考虑软件系统中开发人员无意的错误,又要考虑人为地、故意地针对软件系统的渗透和破坏,因此,本书不对Software Safety和Software Security进行区分。

1.3.2 用信息安全的基本属性理解软件安全

软件已经成为现代社会生活中的关键组成,因而可以参照信息安全的基本属性来对软件安全的属性进行定义和描述。软件安全除了应具备最基本的信息安全三大基本属性CIA——保密性(Confidentiality)、完整性(Integrity)和可用性(Availability),还应当包括可认证性、授权、可审计性、抗抵赖性、可控性和可存活性等多种安全属性。

1.CIA安全基本属性

(1)保密性(Confidentiality)

信息安全中的保密性是指确保信息资源仅被合法的实体(如用户、进程等)访问,使信息不泄露给未授权的实体。这里所指的信息不但包括国家秘密,而且包括各种社会团体、企业组织的工作秘密及商业秘密,以及个人的秘密和个人隐私(如浏览习惯、购物习惯等)。保密性还包括保护数据的存在性,有时候存在性比数据本身更能暴露信息。特别需要说明的是,对计算机的进程、中央处理器、存储和打印设备的使用也必须实施严格的保密措施,以避免产生电磁泄露等安全问题。

GB/T 16260.1—2006/ISO/IEC 9126—1:2001《软件工程产品质量 第1部分:质量模型》中,软件的保密性被定义为“软件产品保护信息和数据的能力,以使未授权人员或系统不能阅读或修改这些信息和数据,而不拒绝授权人员或系统对它们的访问”。

GB/T 18492—2001《信息技术 系统及软件完整性级别》中,软件的保密性被定义为“对系统各项的保护,使其免于受到偶然的或恶意的访问、使用、更改、破坏及泄露。”

实现保密性的方法一般是通过对信息加密,或是对信息划分密级并为访问者分配访问权限,系统根据用户的身份权限控制对不同密级信息的访问。

(2)完整性(Integrity)

信息安全中的完整性是指信息资源只能由授权方或以授权的方式修改,在存储或传输过程中不被未授权、未预期或无意篡改、销毁,或在篡改后能够被迅速发现。不仅要考虑数据的完整性,还要考虑操作系统的完整性,即保证系统以无害的方式按照预定的功能运行,不被有意的或者意外的非法操作所破坏。

可以将软件完整性理解为软件产品能够按照预期的功能运行,不受任何有意的或者无意的非法错误所破坏的软件安全属性。GB/T 18492—2001《信息技术 系统及软件完整性级别》认为,软件完整性需求是软件开发中软件工程过程必须满足的需求,是软件工程产品所必须满足的需求,或是为提供与软件完整性级别相适应的软件置信度而对软件在某一时段的性能的需求。

实现完整性的方法一般分为预防和检测两种机制。预防机制通过阻止任何未经授权的方法来改写数据的企图,以确保数据的完整性。检测机制并不试图阻止完整性的破坏,而是通过分析用户或系统的行为,或是数据本身来发现数据的完整性是否遭受破坏。

(3)可用性(Availability)

信息安全中的可用性是指信息资源(信息、服务和IT资源等)可被合法实体访问并按要求的特性使用。例如,破坏网络和有关系统正常运行的拒绝服务攻击就属于对可用性的破坏。

ISO 9241-11中对可用性的定义是:一个产品被指定用户使用,在一个指定使用情景中,有效地、有效率地、满意地达到指定目标的程度。其中,有效是指用户达到指定目标的精确性和完全性,效率是指用户精确完全地达到目标所消耗的资源,满意度是指使用舒适和可接受程度。

GB/T 2900.13—2008《电工术语 可信性与服务质量》中对可用性的定义是“在所要求的外部资源得到提供的前提下,产品在规定的条件下,在给定的时刻和时间区间内处于能完成要求的功能状态的能力。此能力是产品可靠性、维修性和维修保障性的综合反映。”

可用性是一个多因素概念,涉及易用性(容易学习、容易使用)、系统的有效性、用户满意度,以及把这些因素与实际使用环境联系在一起针对特定目标的评价。可用性描述了一个产品在何种程度上能帮助特定的用户在特定的上下文环境中有效地、有效率地实现所定义的目标,包括运营、服务和维护。可用性不仅指人机交互系统中以人为本的设计流程,也包括人因工效学、软件的易用性及可用性的相关技术支持。

在上述可用性特征中,站在安全的角度,可用性被定义为保证授权实体在需要时可以正常访问和使用系统信息的属性(ISO 13335-1《信息安全管理指南》)。

为了实现可用性,可以采取备份与灾难恢复、应急响应、系统容侵等许多安全措施。

2.其他安全属性

对于安全性要求较高的软件系统,除了应具备以上介绍的三大基本属性CIA以外,还应当考虑可认证性、授权、可审计性、抗抵赖性、可控性、可存活性及隐私性等多种安全属性。

(1)可认证性(Authenticity)

信息安全的可认证性是指,保证信息使用者和信息服务者都是真实声称者,防止冒充和重放攻击。可认证性比鉴别(Authentication)有更深刻的含义,它包含了对传输、消息和消息源的真实性进行核实。

软件是访问内部网络、系统与数据库的渠道,因此对于内部敏感信息的访问必须得到批准。认证就是解决这一问题的信息安全概念,它通过验证身份信息来保证访问主体与所声称的身份唯一对应。

只有在申请认证的身份信息是可识别的情况下,认证才能成功,所提供的凭证信息必须是真实可信的。凭证最常见的形式是用户名和口令的组合,目前,生物特征认证、生物行为认证及多因素认证成为发展的方向。

(2)授权(Authorization)

信息安全中的授权是指,在访问主体与访问对象之间介入的一种安全机制。根据访问主体的身份和职能为其分配一定的权限,访问主体只能在权限范围内合法访问。

软件系统中,实体通过认证验证了实体的真实身份并不意味着该实体可以被授予访问请求资源的所有访问权限。例如,普通员工能够登录公司账户,但是不能够访问人力资源部门的工资数据,因为没有相应的权限或优先权。

(3)可审计性或可审查性(Accountability或Auditability)

信息安全的可审计性是指,确保一个实体(包括合法实体和实施攻击的实体)的行为可以被唯一地区别、跟踪和记录,从而能对出现的安全问题提供调查依据和手段。审计内容主要包括谁(用户、进程等实体)在哪里在什么时间做了什么。

软件安全中,审计(Audit)是指根据公认的标准和指导规范,对软件从计划、研发、实施到运行维护各个环节进行审查评价,对软件及其业务应用的完整性、效能、效率、安全性进行监测、评估和控制的过程,以确认预定的业务目标得以实现,并提出一系列改进建议的管理活动。这一定义既包括了软件开发的可审计性也包括了软件功能具有的可审计性。

审计是一种威慑控制措施,对于审计的预知可以潜在地威慑用户不执行未授权的动作。不过,审计也是一种被动的检测控制措施,因为审计只能确定实体的行为历史,不能阻止实体实施攻击。这一定义既包括了软件开发的可审计性也包括了软件功能具有的可审计性。

(4)抗抵赖性(Non-Repudiation)

信息安全的抗抵赖性是指,信息的发送者无法否认已发出的信息或信息的部分内容,信息的接收者无法否认已经接收的信息或信息的部分内容。

软件安全中,抗抵赖性解决的是用户或者软件系统对于已有动作的否认问题。例如,当价格发生变动时,如果软件能够记录假冒的动作变化及施加动作的用户身份,就可以给个人一个否认或者拒绝动作的机会,由此保证抗抵赖性的实现。

实现不可抵赖性的措施主要有数字签名、可信第三方认证技术等,可审计性也是有效实现抗抵赖性的基础。

(5)可控性(Controllability)

信息安全的可控性是指,对于信息安全风险的控制能力,即通过一系列措施,对信息系统安全风险进行事前识别、预测,并通过一定的手段来防范、化解风险,以减少遭受损失的可能性。

软件的可控性是一种系统性的风险控制概念,涉及对软件系统的认证授权和监控管理,确保实体(用户、进程等)身份的真实性,确保内容的安全和合法,确保系统状态可被授权方所控制。管理机构可以通过信息监控、审计和过滤等手段对系统活动、信息的内容及传播进行监管和控制。

(6)可存活性(Survivability)

信息安全的可存活性是指信息系统的这样一种能力:它能在面对各种攻击或错误的情况下继续提供核心的服务,而且能够及时恢复全部的服务。

软件作为信息系统的重要组成,可存活性是一个融合信息安全和业务风险管理的新课题,它的焦点不仅是对抗网络入侵者,还要保证在各种网络攻击的情况下业务目标得以实现,关键的业务功能得以保持。

1.3.3 软件安全相关概念辨析

本节将介绍与软件安全相似、相近和相关的一些概念,涉及软件工程、软件危机、软件质量和软件质量保证、软件保障、软件可靠性、应用软件系统安全、可信软件和软件定义安全。

1.软件工程

软件工程(Software Engineering)是指,采用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,从而经济地开发出高质量的软件并有效地进行维护。概括地说,软件工程是指导计算机软件开发和维护的一门工程学科,是技术与管理紧密结合形成的工程学科。

通常把软件生命周期全过程中使用的一整套技术方法的集合称为方法学。软件工程方法学包含3个要素:方法、工具和过程。其中,方法是完成软件开发的各项任务的技术方法,是回答“怎样做”的问题;工具是为运用方法而提供的自动的或半自动的软件工程支持环境;过程是为了获得高质量的软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。

由于软件漏洞、恶意软件和软件侵权等安全问题而导致的系统可靠性受到威胁,会危及信息系统基础设施(如工控系统)和个人隐私(如信用卡账户信息)的安全,给整个社会带来破坏,阻碍经济有序发展,因而软件安全开发、软件安全检测及软件版权保护是软件工程方法学的重要内容。

2.软件危机

软件危机(Software Crisis),也称为软件萧条(Software Depression)或软件困扰(Software Affliction),是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题绝不仅仅是不能正常运行的软件才具有的,可以说几乎所有软件都不同程度地存在这些问题。软件危机的一些具体表现如下。

●对软件开发成本和进度的估计不准确。

●用户对开发完成的软件系统不满意。

●软件产品的质量不可靠。

●软件不能适应新的硬件环境,软件中的错误难以改正。

●软件缺乏适当的文档资料。

●软件开发成本在总成本中的占比高。

●软件开发生产效率跟不上人们的需求发展。

可见,软件存在安全漏洞、恶意软件泛滥及软件版权保护等安全问题还只是软件危机的冰山一角。

3.软件质量和软件质量保证

概括地说,软件质量(Software Quality)就是“软件与明确的和隐含的定义的需求相一致的程度”。具体地说,软件质量是软件符合明确叙述的功能和性能需求、文档中明确描述的开发标准,以及所有专业开发的软件都应具有的和隐含特征相一致的程度。

基本上可用两种途径来保证产品质量,一是保证产品的开发过程,二是评价最终产品的质量。《软件工程 产品质量 第1部分 质量模型》(GB/T 16260.1—2006)中,分别给出了外部质量和内部质量模型,以及使用质量模型来描述软件质量。外部质量和内部质量模型包含6个特性(功能性、可靠性、易用性、效率、维护性和可移植性),并进一步细分为若干子特性。使用质量的属性分类为4个特性:有效性、生产率、安全性和满意度。由此可见,安全性是软件质量的一个重要属性。

软件质量保证(Software Quality Assurance,SQA)是建立一套有计划、有系统的方法,向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。软件质量保证的目的是使软件过程对于管理人员来说是可见的。它通过对软件产品和活动进行评审和审计来验证软件是合乎标准的。软件质量保证组在项目开始时就一起参与建立计划、标准和过程。这些将使软件项目满足机构的要求。

4.软件保障

通常软件保障包括软件质量(软件质量工程、软件质量保障和软件质量控制等功能)、软件安全性、软件可靠性、软件验证与确认,以及独立验证与确认等学科领域。

软件保障(Software Assurance,SA),也有译为软件确保,是用于提高软件质量的实践、技术和工具。

美国国家安全系统委员会(Committee on National Security System,CNSS)把软件保障定义为对软件无漏洞和软件功能预期化的确信程度;美国国土安全部(Department of Homeland Security,DHS)对软件保障的定义强调了可确保的软件必须具备可信赖性、可预见性和可符合性;美国国家航空航天局(NASA)把软件保障定义为有计划、有系统的一系列活动,目的是确保软件生命周期过程和产品符合要求、标准和流程。

我国国家标准GB/T 30998—2014《信息技术 软件安全保障规范》给出的软件保障(Software Assurance)的定义是:确保软件生存周期过程及产品符合需求、标准和规程要求的一组有计划的活动。

可以看出,软件保障是指提供一种合理的确信级别,确信根据软件需求,软件执行了正确的、可预期的功能,同时保证软件不被直接攻击或植入恶意代码。2004年美国第二届国家软件峰会所确定的国家软件战略中认为,软件保障目前包括4个核心服务,即软件的安全性、保险性、可靠性和生存性。

软件保障已经成为信息安全的核心,它是多门不同学科的交叉,其中包括信息确保、项目管理、系统工程、软件获取、软件工程、测试评估、保险与安全、信息系统安全工程等。目前国内被广泛认知的软件保障模型为方滨兴院士等提出的软件确保模型。该模型建立了分析和确保软件质量的保证模型,并指出软件确保是信息保障、测试评估及信息系统安全工程的核心。

5.软件可靠性

长期以来,软件可靠性(Software Reliability)作为衡量软件质量的唯一特性受到特别重视。

1983年美国IEEE计算机学会对“软件可靠性”做出了明确定义,此后该定义被美国国家标准与技术研究院接受为国家标准,1989年我国也接受该定义为国家标准。GB/T 11457—2006《信息技术 软件工程术语》给出的软件可靠性定义如下。

●在规定条件下,在规定的时间内软件不引起系统失效的概率。该概率是系统输入和系统使用的函数,也是软件中存在的缺陷的函数。系统输入将确定是否会遇到已存在的缺陷(如果缺陷存在的话)。

●在规定的时间周期内所述条件下程序执行所要求的功能的能力。

由上述定义可知,软件可靠性不但与软件存在的缺陷和/或差错有关,而且与系统输入和系统使用有关。提高软件可靠性就是要减少软件中的缺陷或错误,提高软件系统的健壮性。因此,软件可靠性通常涉及软件安全性的要求,但是软件可靠性要求不能完全取代软件安全性的要求。

6.应用软件系统安全

应用软件系统位于信息系统的上层,是在信息系统的硬件系统、操作系统、网络系统和数据库管理系统的支持下运行的,是构成信息系统的最重要部分,是信息系统中直接为用户提供服务的部分。

应用软件系统是由业务应用处理软件组成的系统。信息系统(也称应用系统)是实现业务应用的所有软硬件的总称。其中,应用软件是对业务应用进行处理的软件,其他软件和硬件,包括组成计算机平台和网络平台的所有软件和硬件,都是为了支持应用软件正常运行而配制的。

为了确保业务应用的安全,首要的是确保应用软件系统的安全。而为了实现应用软件系统的安全,除了在应用软件系统中实现必要的安全功能外,大量的是需要支持其运行的计算机平台和网络平台的安全作为支持和保证,也就是组成信息系统平台的计算机软硬件的安全和网络软硬件的安全。这些安全要求进一步分解为计算机和网络系统的物理安全、计算机操作系统的安全、数据库管理系统的安全等,网络协议安全、网络软件安全和网络数据交换与传输安全等。这些安全机制确保信息系统的各个组成部分各自安全地运行以提供确定的服务,并对各自控制范围的用户数据信息进行安全保护,确保其达到确定的保密性、完整性和可用性目标。

7.可信软件

可信性是信息安全领域较为经典的一个概念。早在1985年,美国国家计算机安全中心(National Computer Security Center,NCSC)倡议的可信计算机系统评价准则中就将软件可信性定位在安全性这个唯一的质量属性上,指出可信性是属于软件产品质量的一个属性。

“可信性”是在正确性、可靠性、安全性、时效性、完整性、可用性、可预测性、生存性及可控性等众多概念的基础上发展起来的一个新概念,是客观对象的诸多属性在人们心目中的一个综合反映。学者们试图从不同角度、不同层次去诠释“可信性”,但尚未形成共识。

一般认为,“可信”是指一个实体在实现既定目标的过程中,行为及结果可以预期,它强调目标与实现相符,强调行为和结果的可预测性和可控制性。软件的“可信”是指软件系统的动态行为及其结果总是符合人们的预期,在受到干扰时仍能提供连续的服务。这里的“干扰”包括操作错误、环境影响和外部攻击等。

构造可信软件已成为现代软件技术发展和应用的重要趋势和必然选择。一方面,软件的规模越来越大,导致软件的开发、集成和维护工作越来越复杂,目前的可信软件构造与运行保障技术、可信性度量与评测方法严重缺乏,使得软件产品在推出时就含有很多已知或未知的缺陷,对软件系统的安全可靠运行构成了不同程度的威胁。另一方面,软件的开发环境和运行环境已经从传统的封闭、静态环境发展为开放、动态、多变的互联网环境。网络交互、共享和协同带来了很多“不可信”因素,网络上对信息的滥用和恶搞,使得可信问题变得更加突出。互联网环境中计算实体的行为具有不可控性和不确定性,这种状况既对传统的软件开发方法和技术提出了重要挑战,也对软件运行时刻的可信保障提出了严峻要求。

目前的可信软件研究是在软件正确性、可靠性、安全性和生存性等基础上发展起来的,软件形式化理论和验证技术、可靠性工程、网络信息安全等领域均有针对若干可信属性的研究。但是软件可信性不是正确性、可靠性、安全性和生存性等性质的简单相加,可信软件研究也不是对已有的各种软件属性研究进行简单的综合。首先,由于软件系统越来越复杂,软件可信意味着软件行为可信、环境可信和使用可信等不同层次的可信要求,而局部的可信并不一定导致全局的可信。系统的可信性属于涌现类的性质,如何从整体上度量、获得并保证可信性将是非常困难的;其次,不同可信属性之间可能彼此有冲突,并且不同层次之间也可能会有冲突,如何最优化地协调与取舍也是一个关键问题;第三,当软件可信性成为研究目标之后,必然要针对“可信”性质建立分析、构造、度量、评价体系,使得可信性能够在软件生产活动中被有效地跟踪控制和验证实现。这也对现有的计算理论与技术体系提出了挑战。需要强调的是,要达到软件可信的目标,需要对软件系统开发的整个生命周期,包括需求分析、可信算法设计、软件设计与实现、测试与验证、运行维护等阶段进行全面、统一的研究。

8.软件定义安全

软件定义的信息安全(简称软件定义安全)是当前热门的信息安全话题。国际著名咨询公司Gartner将软件定义安全作为2014年十大信息安全技术之一发布,体现了软件定义安全问题在当前形势下的重要性。

传统的网络安全防护方法通常是根据网络的拓扑情况,以手动方式在安全域边界串联或旁路部署安全设备,对进出安全域的流量进行监控。如果将这种与接入模式、部署方式紧密耦合的防护方法沿用到复杂的网络环境(如物理与虚拟网络共存的数据中心)中,会存在诸多不适应性,例如,安全设备部署过程繁复;不能区别处理流经的流量;安全防护范围僵化;安全设备成为单一故障点。

软件定义安全(Software Defined Security,SDS)是从软件定义网络(Software Defined Network,SDN)引申而来的。SDN的基本思想是,把当前IP网络互连结点中决定报文如何转发的复杂控制逻辑从交换机/路由器等设备中分离出来,以便通过软件编程实现硬件对数据转发规则的控制,最终达到对流量进行自由操控的目的。SDN的核心理念是使网络软件化并充分开放,从而使得网络能够像软件一样便捷、灵活,以此提高网络的创新能力。

SDS是适应SDN复杂网络的安全防护新思想,基本原理是将物理及虚拟的网络安全设备预期接入模式、部署方式和实现功能进行解耦,底层抽象为安全资源池里的资源,顶层统一通过软件编程的方式进行智能化、自动化的业务编排和管理,以完成相应的安全功能,从而实现一种灵活的安全防护。SDS可以分解为软件定义流量、软件定义资源和软件定义威胁模型,三个举措环环相扣,形成一个动态、闭环的工作模型。

●软件定义流量:通过软件编程的方式来实现网络流量的细粒度定义及转发控制管理,通过将目标网络流量转发到安全设备上,实现安全设备的逻辑部署和使用。

●软件定义资源:通过管理中心对安全资源进行统一注册、池化管理、弹性分配,在虚拟计算环境下,管理中心还要支持虚拟安全设备模板的分发和设备的创建。

●软件定义威胁模型:对网络流量、网络行为和安全事件等信息进行自动化的采集、分析和挖掘,实现对未知的威胁甚至是一些高级安全威胁的实时分析和建模,之后自动用建模结果指导流量定义,实现一种动态、闭环的安全防护。

软件定义安全并不代表不再需要一些专门的信息安全硬件,这些仍然是必不可少的,只不过就像软件定义的网络一样,只是将价值和智能化转移到软件当中而己。

SDN和由此基础上发展起来的SDS,其基本思想都是不依赖于硬件设备,通过软件来实现系统的安全性,特别是可控性保障。从本质上说,软件安全关注的是实现软件产品安全性的全面质量保证的方法,而软件定义安全是实现分布式系统安全可控的一种有效方法。二者虽然都属于信息安全工程的范畴,但却是两个不同的发展方向。可以将二者结合起来,实现更高安全等级的系统安全。

拓展阅读

读者要想了解更多软件定义安全的知识,可以阅读以下书籍资料。

[1]刘文懋,等.软件定义安全:SDN/NFV新型网络的安全揭秘[M].北京:机械工业出版社,2016. cEkeR+xD76CfESRnPCsTB9mrq7t9TVKU/0FDCCFJL58mWRgqVaBW2x4GA6JQPzKx

点击中间区域
呼出菜单
上一章
目录
下一章
×