本节首先介绍信息安全漏洞的概念,软件安全漏洞是信息(系统)安全漏洞的一个重要方面,重点介绍软件漏洞的概念、特点及成因。
信息系统安全漏洞是信息安全风险的主要根源之一,是网络攻防对抗中的重要目标。由于信息系统安全漏洞的危害性、多样性和广泛性,在当前网络空间的各种博弈行为中,漏洞作为一种战略资源而被各方所积极关注。如何有效发现、管理和应用漏洞相关信息,减少由于漏洞带来的对社会生活和国家信息安全的负面影响,即对漏洞及相关信息的掌控,已经成为世界各国在信息安全领域工作的共识和重点。
ISO/IEC 15408-1《信息技术—安全技术—IT安全评估标准》( Information technology—Security techniques—Evaluation criteria for IT security ,2009年第3版,2014年修正版,GB/T 18336.1-2015参照本)中给出的定义是:“Vulnerability:weakness in the TOE(Target Of Evaluation)that can be used to violate the SFRs in some environment”。漏洞是存在于评估对象中的、在一定的环境条件下可能违反安全功能要求的弱点。
美国国家标准与技术研究院NIST在内部报告《信息安全关键技术语词汇表》( Glossary of Key Information Security Terms ,NISTIR 7298,2013年第2版)中给出的定义是:“Vulnerability:weakness in an information system, system security procedures, internal controls, or implementation that could be exploited or triggered by a threat source”。漏洞是存在于信息系统、系统安全过程、内部控制或实现过程中的、可被威胁源攻击或触发的弱点。
ISO/IEC 27000《信息技术—安全技术—信息安全管理系统—概述和词汇》( Information technology—Security techniques—Information security management systems—Overview and vocabulary,2016年第4版)中给出的定义是:“Vulnerability:weakness of an asset or control that can be exploited by one or more threats”。漏洞是能够被一个或多个威胁利用的资产或控制中的弱点。
以上这些关于信息安全漏洞的定义或者解释的角度虽各不相同,但对漏洞的认识却有以下三个共同特点。
●漏洞是信息系统自身具有的弱点或者缺陷。
●漏洞存在环境通常是特定的。
●漏洞具有可利用性,若攻击者利用了这些漏洞,将会给信息系统安全带来严重威胁和经济损失。
软件(安全)漏洞是信息系统安全漏洞的一个重要方面。分析、理解软件漏洞对于了解当下的安全威胁非常关键。
什么是软件漏洞(Software Vulnerability)?与软件“漏洞”相关的术语很多,包括错误(Error/Mistake)、缺陷(Defect/Flaw/Bug)及失效(Failure)等,那么软件错误、软件缺陷与软件漏洞的关系是什么呢?
根据ISO/IEC/IEEE 24765:2010《系统和软件工程—词汇表》( Systems and software engineering—Vocabulary ),软件中的错误、缺陷、故障和失效可以用图2-1来区别它们在软件生命周期各个阶段的表现。
图2-1 软件中的错误、缺陷、故障和失效在软件生命周期各个阶段的表现
软件错误(Error)是指在软件开发过程中出现的不符合期望或不可接受的人为差错,其结果将可能导致软件缺陷的产生。在软件开发过程中,人是主体,难免会犯错误。软件错误主要是一种人为错误,相对于软件本身而言,是一种外部行为。
软件缺陷(Bug/Defect)是指由于人为差错或其他客观原因,导致软件隐含能导致其在运行过程中出现不希望或不可接受的偏差,例如软件需求定义,以及设计、实现等错误。在这种意义下,软件缺陷和软件错误有着相近的含义。当软件运行于某一特定的环境条件时出现故障,这时称软件缺陷被激活。软件缺陷存在于软件内部,是一种静态形式。
软件故障(Fault)是指软件出现可感知的不正常、不正确或不按规范执行的状态。例如,软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失或非正常中断等现象。
软件失效(Failure)是指软件丧失完成规定功能的能力的事件。软件失效通常包含三方面的含义:软件或其构成单元不能在规定的时间内和条件下完成所规定的功能,软件故障被触发及丧失对用户的预期服务时都可能导致失效;一个功能单元执行所要求功能的能力终结;软件的操作偏离了软件需求。
为了简化理解,本书此处仅讨论软件错误(Error)和软件缺陷(Bug/Defect)。
软件错误是软件开发生命周期各阶段中错误的真实体现。软件安全错误是软件错误的一个子集,软件安全错误可能包含以下几种情况。
●需求说明错误。由于软件开发生命周期需求分析过程的错误而产生的需求不正确或需求的缺失,如用户提出的需求不完整,用户需求的变更未及时消化,以及软件开发者和用户对需求的理解不同等。
●设计错误。由于设计阶段引入不正确的逻辑决策、决策本身错误或者由于决策表达错误而导致的系统设计上的错误,如缺少用户输入验证,这会导致数据格式错误或缓冲区溢出漏洞。
●编码错误。如语法错误、变量初始化错误等。
●测试错误。如数据准备错误、测试用例错误等。
●配置错误。由于软件在应用环境中配置不当而产生的错误,如防火墙采用默认口令。
●文档错误。如文档不齐全,文档相关内容不一致,文档版本不一致,以及缺乏完整性等。
软件缺陷也称软件Bug,是指计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的存在会导致软件产品在某种程度上不能满足用户的需要。
需要说明的是,安全缺陷或者说Bug是一个需要考虑具体环境、具体对象的概念。举例来说,一般的Web应用程序没有使用HTTPS协议(超文本传输安全协议)来加密传输的状态并不能算作是Bug,而对于网上银行或电子商务等应用,不采用HTTPS协议进行加密传输就应当算作一个Bug。如同使用HTTPS来对传输内容进行加密那样,积极主动地加强安全性的措施,也就是增加安全性功能,可以尽可能地消除Bug。安全性功能实际为软件系统的一种需求,所以也被称为安全性需求。是否将安全性功能加入到项目需求中,还需要根据项目的具体情况考虑,如项目经费等。
还需要注意的是,Bug的发现和消除是有一个过程的,一定时期即使修正了所有Bug,也不能保证软件系统的绝对安全,因为很可能还有未知Bug尚未发现。
知识拓展:软件Bug
1947年9月9日,格蕾丝·霍珀(Grace Hopper)博士正在哈佛大学对Mark II计算机进行测试。然而过程并不顺利,霍珀博士始终没能得到预期的结果。最后她终于发现了原因所在。原来一只飞蛾飞进了计算机里。霍珀博士于是将这只飞蛾夹出后粘到了自己的笔记本上(如图2-2所示),并写到:“最早发现的Bug实体”(First actual case of bug being found)。
这个发现奠定了Bug这个词在计算机世界的地位,变成无数程序员的噩梦。从那以后,Bug这个词在计算机世界表示计算机程序中的缺陷或者疏漏,它们会使程序计算出莫名其妙的结果,甚至引起程序的崩溃。
这是流传最广的关于计算机Bug的故事,可是历史的真相是,Bug这个词早在发明家托马斯·爱迪生的年代就被广泛用于表示机器的故障,这在爱迪生本人1870年左右的笔记里面也能看得到。而电气电子工程师学会IEEE也将Bug这一词的引入归功于爱迪生。
图2-2 软件史上的第一虫
漏洞(Vulnerability)又称脆弱点,这一概念早在1947年冯·诺依曼建立计算机系统结构理论时就有涉及,他认为计算机的发展和自然生命有相似性,一个计算机系统也有天生的类似基因的缺陷,也可能在使用和发展过程中产生意想不到的问题。20世纪80年代,由于早期黑客的出现和第一个计算机病毒的产生,软件漏洞逐渐引起人们的关注。在历经30多年的研究过程中,学术界及产业界对漏洞给出了很多定义,漏洞的定义本身也随着信息技术的发展而具有不同的含义与范畴。
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。本书并不对软件漏洞/脆弱点、软件缺陷及软件错误等概念严格区分。
软件漏洞一方面会导致有害的输出或行为,例如,导致软件运行异常;另一方面漏洞也会被攻击者所利用来攻击系统,例如,攻击者通过精心设计攻击程序,准确地触发软件漏洞,并利用该漏洞在目标系统中插入并执行精心设计的代码,从而获得对目标系统的控制权,进而实施其他攻击行为。
本书中关于漏洞的定义为:软件系统或产品在设计、实现、配置和运行等过程中,由操作实体有意或无意产生的缺陷、瑕疵或错误,它们以不同形式存在于信息系统的各个层次和环节之中,且随着信息系统的变化而改变。漏洞一旦被恶意主体所利用,就会造成对信息系统的安全损害,从而影响构建于信息系统之上正常服务的运行,危害信息系统及信息的安全属性。
本定义也体现了漏洞是贯穿软件生命周期各环节的。在时间维度上,漏洞都会经历产生、发现、公开和消亡等过程,在此期间,漏洞会有不同的名称或表示形式,如图2-3所示。从漏洞是否可利用且相应的补丁是否已发布的角度,可以将漏洞分为以下三类。
图2-3 漏洞生命周期时间轴
●0day漏洞是指已经被发现(有可能未被公开)但官方还没有相关补丁的漏洞。
●1day漏洞是指厂商发布安全补丁之后但大部分用户还未打补丁时的漏洞,此类漏洞依然具有可利用性。
●历史漏洞是指距离补丁发布日期已久且可利用性不高的漏洞。由于各方定义不一样,故用虚线表示。
从漏洞是否公开的角度来讲,已知漏洞是已经由各大漏洞库、相关组织或个人所发现的漏洞;未公开/未知漏洞是在上述公开渠道上没有发布、只被少数人所知的漏洞。
漏洞作为信息安全的核心元素,它可能存在于信息系统的各个方面,其对应的特点也各不相同。下面分别从时间、空间和可利用性三个维度来分析漏洞的特点。
(1)持久性与时效性
一个软件系统从发布之日起,随着用户广泛且深入地使用,软件系统中存在的漏洞会不断暴露出来,这些被发现的漏洞也会不断地被软件开发商发布的补丁软件修补,或在以后发布的新版软件中得以纠正。而在新版软件纠正旧版本中的漏洞的同时,也会引入一些新的漏洞和问题。软件开发商和软件使用者的疏忽或错误(如对软件系统不安全的配置或者没有及时更新安全补丁等),也会导致软件漏洞长期存在。随着时间的推移,旧的漏洞会不断消失,新的漏洞会不断出现,因此漏洞具有持久性。相关数据表明高危漏洞及其变种会可预见地重复出现,对内部和外部网络构成持续的威胁。
漏洞具有时效性,超过一定的时间限制(例如,当针对该漏洞的修补措施出现时,或者软件开发商推出了更新版本系统时),漏洞的威胁就会逐渐减少直至消失。漏洞的时效性具有双刃剑的作用,一方面,漏洞信息的公开加速了软件开发商的安全补丁的更新进程,能够尽快警示软件用户,减少了恶意程序的危害程度;另一方面,攻击者也可能会尽快利用漏洞信息实施攻击行为。
(2)广泛性与具体性
漏洞具有广泛性,会影响到很大范围的软件和硬件设备,包括操作系统本身及系统服务软件、网络客户和服务器软件、网络路由器和防火墙等。理论上讲,所有信息系统或设备中都会存在设计、实现或者配置上的漏洞。
漏洞又具有具体性,即它总是存在于具体的环境或条件中。对组成信息系统的软硬件设备而言,在这些不同的软硬件设备中都可能存在不同的安全漏洞,甚至在不同种类的软硬件设备中,同种设备的不同版本之间,由不同设备构成的信息系统之间,以及同种软件系统在不同的配置条件下,都会存在各自不同的安全漏洞。
(3)可利用性与隐蔽性
漏洞具有可利用性,漏洞一旦被攻击者利用就会给信息系统带来威胁和损失。当然,软件厂商也可以通过各种技术手段来降低漏洞的可利用性,例如微软公司通过在Windows操作系统或应用软件中增加内存保护机制(如DEP、ASLR和SafeSEH等),极大地降低了缓冲区溢出等漏洞的可利用性,本书将在第3章介绍这些保护机制。
漏洞具有隐蔽性,往往需要通过特殊的漏洞分析手段才能发现。尽管随着程序分析技术的进步,已有工具可以对程序源代码进行静态分析和检查,以发现其中的代码缺陷(如strcpy等危险函数的使用),但是对于不具备明确特征的漏洞而言,需要组合使用静态分析和动态分析工具、人工分析等方法去发现。本书的后面部分会着重讲述这些漏洞分析技术。
软件作为一种产品,其生产和使用过程依托于现有的计算机系统和网络系统,并且以开发人员的经验和行为作为其核心内涵,因此,软件漏洞是难以避免的,主要体现在以下几个方面。
现今的计算机基于冯·诺依曼体系结构,其基本特征决定了漏洞产生的必然。表2-1说明了漏洞产生的原因。
表2-1 冯·诺依曼体系容易导致漏洞产生的原因
在内存中,代码、数据和指令等任何信息都是以0、1串的形式表示的。例如,0x1C是跳转指令的操作码,并且跳转指令的格式是1C displ,其表示跳转到该指令的前displ字节的地址处开始执行,则串0x1C0A将被解释成向前跳转10字节。如图2-4所示,如果在一串指令中存储数值7178(十六进制为1C0A),将与控制程序跳转的功能是相同的。
虽然计算机指令能够决定这些串如何解释,但是攻击者常常在内存溢出类攻击中,将数据溢出到可执行代码中,然后选择能够被当作有效指令的数据值来达到攻击的目的。本书将在第3章中介绍内存溢出类攻击。
图2-4 内存中数据和指令的存储
现代软件功能越来越强,功能组件越来越多,软件也变得越来越复杂。现在基于网络的应用系统更多地采用了分布式、集群和可扩展架构,软件内部结构错综复杂。软件应用向可扩展化方向发展,成熟的软件也可以接受开发者或第三方扩展,系统功能得到扩充。例如,Firefox和Chrome浏览器支持第三方插件;Windows操作系统支持动态加载第三方驱动程序;Word和Excel等软件支持第三方脚本和组件运行等。这些可扩展性在增加软件功能的同时,也加重了软件的安全问题。研究显示,软件漏洞的增长与软件复杂性、代码行数的增长呈正比,即“代码行越多,缺陷也就越多”。
作为互联网基础的TCP/IP协议栈,以及众多的协议及实现(如OpenSSL),在设计之初主要强调互联互通和开放性,没有充分考虑安全性,且协议栈的实现通常由程序员人工完成,导致漏洞的引入成为必然。当今软件和网络系统的高度复杂性,也决定了不可能通过技术手段发现所有的漏洞。
伴随信息技术的发展出现了很多新技术和新应用,如移动互联网、物联网、云计算、大数据和社交网络等。随着移动互联网、物联网的出现,网络终端的数量呈几何倍数增长,云计算和大数据的发展极大提高了攻击者的计算能力,社交网络为攻击者提供了新的信息获取途径。总之,这些新技术、新应用不仅扩展了互联网影响范围,提高了互联网的复杂度,也增大了漏洞产生的概率,必然会导致越来越多的漏洞的产生。
安全协议实现,以及云计算、移动智能终端中出现的新型软件漏洞分析,请扫描封底的二维码获取内容查看 。
网络技术拓展了软件的功能范围,提高了其使用方便程度,与此同时,也给软件带来了更大风险。由于软件被应用于各种环境,面对不同层次的使用者,软件开发者需要考虑更多的安全问题。同时,黑客和恶意攻击者可以比以往获得更多的时间和机会来访问软件系统,并尝试发现软件中存在的安全漏洞。
当前黑客组织非常活跃,其中既包括传统的青少年黑客、跨国黑客组织,也包括商业间谍黑客和恐怖主义黑客,乃至国家网络战部队。以前的黑客多以恶作剧和破坏系统为主,包括对技术好奇的青少年黑客和一些跨国黑客组织;现今的黑客则多为实施商业犯罪并从事地下黑产,危害已经不限于让服务与系统不可用,更多的是带来敏感信息的泄露和现实资产的损失。尤其是近些年,一系列APT攻击的出现及美国“棱镜”计划曝光,来自国家层面的网络威胁逐渐浮出水面。
传统软件开发更倾向于软件功能,而不注重对安全风险的管理。软件开发公司工期紧、任务重,为争夺客户资源、抢夺市场份额,经常仓促发布软件。软件开发人员将软件功能视为头等大事,对软件安全架构、安全防护措施认识不够,只关注是否实现需要的功能,很少从“攻击者”的角度来思考软件安全问题。
如果采用严格的软件开发质量管理机制和多重测试技术,软件公司开发的产品的缺陷率会低很多。在软件安全性分析中可以使用缺陷密度(即每千行代码中存在的软件缺陷数量)来衡量软件的安全性。以下各类软件代码缺陷的统计数据也说明了这个情况。
●普通软件开发公司开发的软件的缺陷密度为4~40个缺陷/KLOC(千行代码)。
●高水平的软件公司开发的软件的缺陷密度为2~4个缺陷/KLOC(千行代码)。
●美国NASA的软件缺陷密度为0.1个缺陷/KLOC(千行代码)。
国内大量软件开发厂商对软件开发过程的管理不够重视,大量软件使用开源代码和公用模块,缺陷率普遍偏高,可被利用的己知和未知缺陷较多。
软件公司中,项目管理和软件开发人员缺乏软件安全开发知识,不知道如何更好地开发安全的软件。实施软件的安全开发过程,需要开发团队所有的成员及项目管理者都具备较高的安全知识。软件开发人员很少进行安全能力与意识的培训,项目开发管理者不了解软件安全开发的管理流程和方法,不清楚安全开发过程中使用的各类方法和思想;开发人员大多数仅学会了编程技巧,不了解安全漏洞的成因、技术原理与安全危害,不能更好地将软件安全需求、安全特性和编程方法相互结合。
软件开发生命周期的各个环节都是人为参与的,经验的缺乏和意识的疏忽都有可能引入安全漏洞。为此,本书用以培养软件开发人员的安全开发意识,增强对软件安全威胁的认识,提高安全开发水平,提升IT产品和软件系统的抗攻击能力。本书将在后续章节中展开介绍。
本节将介绍软件漏洞的分类和分级方法,以及软件漏洞管理的国际和国内标准。
对软件安全漏洞进行分类是搜集威胁信息、掌握安全威胁发展趋势的基础。更全面、精细的软件安全漏洞分类可以把安全事件、漏洞利用和软件平台等多方面组件在安全的视角下关联起来,从而帮助安全专家、分析人员等有效地进行分析,找到相应的解决方案。漏洞的分类是客观存在的,但不是一成不变的,而是根据需求变化的。
漏洞分类主要是从不同角度描述漏洞,是漏洞研究的基础之一。和其他事物一样,安全漏洞具有多方面的属性,也就可以从多个维度对其进行分类,如从漏洞的成因、漏洞被利用的技术及漏洞作用范围等方面进行分类研究。
(1)从对操作系统研究的角度提出的漏洞分类方法
操作系统安全性分析研究项目(Research in Secure Operating System,RISOS)将漏洞分为7类。
●不完整的参数合法性验证:参数使用前没有进行正确检查。
●不一致参数合法性验证:使用不一致的数据格式进行数据有效性检查。
●固有的机密数据共享:不能正确地隔离进程和用户。
●异步验证错误或不适当的序列:竞争条件错误。
●不适当的鉴别、认证和授权:不正确地认证用户。
●可违反的限制:处理边界条件错误。
●可利用的逻辑错误:不属于上述6类的其他错误。
(2)从软件错误角度的漏洞分类方法
T.Aslam等人将漏洞分为编码错误和意外错误等。由于该分类方法存在二义性和非穷举性,I.V.Krsul对该方法进行了扩展及修改,形成了完整的分类方法,将漏洞类型分为操作错误、编码错误、环境错误及其他错误四大类。
(3)多维度分类方法
M.Bishop等人根据时间、漏洞成因、利用方式、漏洞利用组件数、代码缺陷和作用域6个维度分别进行了分类。
(4)广义漏洞分类方法
E.Knight将网络漏洞分为策略疏忽、社会工程、技术缺陷和逻辑错误。
(5)抽象分类方法
美国MITRE公司的通用缺陷列表(Common Weakness Emulation,CWE)提供了根据漏洞机制进行分类的方法,它将漏洞大致分为十二大类,包括随机不充分、被索引资源的不当访问、在资源生命周期中的不当控制、相互作用错误、控制管理不充分、计算错误、不充分比较、保护机制失效、名称或引用的错误解析、异常处理失败、违反代码编写标准,以及消息或数据结构的不当处理等。
以上这些漏洞分类方法普遍存在量化模糊的问题,对于用户来说,清晰地了解漏洞是如何被利用的及产生何种危害是重要的。因此,通常可以从漏洞利用的成因、利用的位置和对系统造成的直接威胁这三个方面进行分类。
(1)基于漏洞成因的分类
基于漏洞成因的分类包括:内存破坏类、逻辑错误类、输入验证类、设计错误类和配置错误类。
1)内存破坏类。此类漏洞的共同特征是由于某种形式的非预期的内存越界访问(读、写或兼而有之),可控程度较好的情况下可执行攻击者指定的任意指令,其他的大多数情况下会导致拒绝服务或信息泄露。对内存破坏类漏洞再按来源细分,可以分出如下子类型:栈缓冲区溢出、堆缓冲区溢出、静态数据区溢出、格式串问题、越界内存访问、释放后重用和二次释放。
2)逻辑错误类。涉及安全检查的实现逻辑上存在的问题,导致设计的安全机制被绕过。
3)输入验证类。漏洞来源都是由于对来自用户输入没有做充分的检查过滤就用于后续操作,威胁较大的有以下几类:SQL注入、跨站脚本执行、远程或本地文件包含、命令注入和目录遍历。
4)设计错误类。系统设计上对安全机制的考虑不足导致在设计阶段就已经引入安全漏洞。
5)配置错误类。系统运行维护过程中以不正确的设置参数进行安装,或被安装在不正确的位置。
(2)基于漏洞利用位置的分类
1)本地漏洞。即需要操作系统级的有效账号登录到本地才能利用的漏洞,主要构成为权限提升类漏洞,即把自身的执行权限从普通用户级别提升到管理员级别。
2)远程漏洞。即无需系统级的账号验证即可通过网络访问目标进行利用的漏洞。
(3)基于威胁类型的分类
1)获取控制。即可以导致劫持程序执行流程,转向执行攻击者指定的任意指令或命令,控制应用系统或操作系统。这种漏洞威胁最大,同时影响系统的机密性、完整性,甚至在需要的时候可以影响可用性。主要来源为内存破坏类。
2)获取信息。即可以导致劫持程序访问预期外的资源并泄露给攻击者,影响系统的机密性。主要来源为输入验证类和配置错误类漏洞。
3)拒绝服务。即可以导致目标应用或系统暂时或永远性地失去响应正常服务的能力,影响系统的可用性。主要来源为内存破坏类和意外处理错误类漏洞。
对漏洞进行分级,有助于人们对数目众多的安全漏洞给予不同程度的关注并采取不同级别的措施,因此,建立一个灵活、协调一致的漏洞级别评价机制是非常必要的。
如今,各漏洞发布组织和技术公司都有自己的评级标准。目前主要的漏洞级别评价方式有按照漏洞严重等级和利用漏洞评分系统(CVSS)进行分级两类主要形式。
以微软、中国国家信息安全漏洞库(China National Vulnerability Database of Information Security,CNNVD)等为代表的机构按照严重等级进行分级。
微软是全球著名的软件厂商,它通常在每个月的第二个星期三发布其安全公告。在安全公告中会有对漏洞危急程度的描述,微软使用严重程度等级来确定漏洞及其相关软件更新的紧急性。表2-2列出了微软对漏洞严重程度分类的等级。
表2-2 微软漏洞分级情况
由中国信息安全测评中心负责建设运维的CNNVD,漏洞分级划分综合考虑访问路径、利用复杂度和影响程度3种因素,将漏洞按照危害程度从高至低分为超危、高危、中危和低危4种等级,并保持与CVSS的兼容。
访问路径的赋值包括本地、邻接和远程,通常可被远程利用的安全漏洞危害程度高于可被邻接利用的安全漏洞,可本地利用的安全漏洞次之。利用复杂度的赋值包括简单和复杂,通常利用复杂度为简单的安全漏洞危害程度高。影响程度的赋值包括完全、部分、轻微和无,通常影响程度为完全的安全漏洞危害程度高于影响程度为部分的安全漏洞,影响程度为轻微的安全漏洞次之,影响程度为无的安全漏洞可被忽略。影响程度的赋值由安全漏洞对目标的机密性、完整性和可用性三个方面的影响共同计算。
美国国家标准与技术研究院NIST于2007年发布了 The Common Vulnerability Scoring System ( CVSS ) and Its applicability to Federal Agency Systems (NIST IR 7435),中文名称为《通用漏洞评分系统(Common Vulnerability Scoring System,CVSS)及其在联邦系统的应用》。该标准旨在建立一种统一的漏洞危害评分系统,实现对漏洞危害程度评估的标准化。
该标准依据对基本度量(Base Metric Group)、时间度量(Temporal Metric Group)和环境度量(Environmental Metric Group)三种度量评价标准来对一个已知的安全漏洞危害程度进行打分。
●基本度量用于描述漏洞的固有基本特性,这些特性不随时间和用户环境的变化而改变。
●时间度量用于描述漏洞随时间而改变的特性,这些特性不随用户环境的变化而改变。
●环境度量用于描述漏洞与特殊用户环境相关的特性。
一般情况下,用于评价基本度量和时间度量的度量标准由漏洞公告分析师、安全产品厂商或应用程序提供商指定,而用于评价环境度量的度量标准由用户指定。
该标准定义的评估过程将基本评价、生命周期评价和环境评价所得到的结果综合起来,得到一个最终的分数。具体而言,即是先根据基本度量标准计算得到基础评分,再将基础评分和时间度量标准结合起来计算暂时评分,最后结合环境度量标准和暂时评分得到最终的分数。分数越高,漏洞的威胁性越大。
CVSS的意义如下。
●统一评估方法代替专用评估方法。CVSS对软件的安全漏洞进行标准评估,取代了此前由软件提供厂商各自评级的混乱状况。
●统一对安全漏洞的描述语言。CVSS系统提供了一种通用的语言,用于描述安全漏洞的严重性,以代替不同的软件厂商的漏洞描述。
●提供良好的优先级排序方法。IT安全产品厂商可以使用CVSS体系对自己的产品进行评估,并对软件的安全性进行排序。
CVSS作为国际标准提供了一个开放的框架,它使得通用漏洞等级定义在信息产业得到广泛使用,但是其自身也存在一些不足。其自身度量标准具有很大的主观性,对于同一个安全漏洞,不同的人可能会得出不同的分值,不同的安全组织或技术公司对其的级别评价也有区别,即可重复性较差;而且,攻击技术的发展及恶意攻击者对于不同安全漏洞的关注度的影响也没有考虑进去;此外,同一系统可能存在多个不同的安全漏洞,攻击者同时利用多个漏洞进行深入攻击所达到的危害程度会远远高于单个漏洞。这些情况如何在评分中表现出来,都是CVSS所欠缺的。
为了实现对漏洞的合理、有效管控,除了研究前沿的漏洞分析技术以快速发现漏洞之外,还需要根据漏洞发展变化,研究各种漏洞的管理方法、策略和准则,制定漏洞相关标准和规范,为国家在漏洞的管理措施制定、管理机制运行和管理部门协作等方面提供参考和依据,为漏洞资源的行政管理提供辅助手段,为信息安全测评和风险评估提供基础。漏洞标准是关于漏洞命名、评级、检测及管理的一系列规则和规范。
美国的安全研究机构与组织先后推出了一系列有影响力的标准,其中,通用漏洞和披露CVE、通用漏洞评分系统CVSS等6个标准已被国际电信联盟(ITU)的电信标准化部门(ITU-T)纳入到了其X系列(数据网、开放系统通信和安全性)建议书中,成为ITU-T推荐的国际漏洞标准。表2-3列出了这6个标准及其建议书编号。
表2-3 ITU-T推荐的漏洞标准
通用漏洞评分系统CVSS已经在2.2.2节中介绍过了,下面简要介绍其他5类标准。
(1)通用漏洞和披露(Common Vulnerabilities and Exposures,CVE)
CVE是美国MITRE公司于1999年9月建立的一个为公开的信息安全漏洞或者披露进行命名的国际标准。所谓披露,是指发布那些在一些安全策略中认为有问题,在另一些安全策略中可以被接受的问题,是指仅仅让攻击者获得一些边缘性的信息,隐藏一些行为,或是仅仅为攻击者提供一些尝试攻击的可能性。
CVE官网是http://cve.mitre.org。CVE为每个公开的漏洞和披露分配一个唯一的编号,并给每个漏洞和披露一个标准化的描述及有关参考信息。如图2-5所示,漏洞编号CVE-2015-8153是一个SQL注入型漏洞,存在于SEPM RU6-MP4之前12.1版本中,远程攻击者可利用该漏洞执行任意SQL命令。
图2-5 CVE漏洞示例
CVE不是一个数据库,而是一个字典。由于采用标准漏洞描述语言,可以使得安全事件报告更好地被理解,更好地实现协同工作。国际上很多组织机构都采用了CVE作为标识漏洞的统一标准。
(2)通用缺陷枚举/评分系统(Common Weakness Enumeration/Common Weakness Scoring System,CWE/CWSS)
CWE也是由MITRE公司建立和维护的,定位于创建一个软件缺陷的树状枚举列表,使得程序员和安全从业者能够更好地理解软件的缺陷,并创建能够识别、修复及阻止此类缺陷的自动化工具。
CWE官网是http://cwe.mitre.org。CWE为每一个条目或名词都分配了一个唯一的编号,其基本形式是CWE-XXX,如“基于堆栈的缓冲区溢出”的编号为CWE-121。
CWE对于列出的每一个缺陷,都列举了缺陷的成因描述、对应的语言和其他缺陷的关系等相关信息,有的甚至给出了缺陷代码的例子、对应的攻击模式和防护措施。
CWE VIEW 734是由美国卡内基梅隆大学软件工程学院的CERT团队制订的CERT C Secure Coding Standard,它包括了CWE中的103项,列举了由C语言编码引起的软件缺陷。
CWE VIEW 844是由美国卡内基梅隆大学软件工程学院的CERT团队制订的CERT Java Secure Coding Standard,它包括CWE中的124项,列举了由Java语言编码引起的软件缺陷。
CWE VIEW 868是由美国卡内基梅隆大学软件工程学院的CERT团队制订的《CERT C++ Secure Coding Standard》,它包括CWE中的111项,列举了由C++语言编码引起的软件缺陷。
CWE可以帮助程序员认识到自己编程中的问题,从而编写出更安全的代码;也可以帮助软件设计师、架构师甚至首席信息官了解软件中可能出现的弱点,并采取恰当的措施;还能帮助安全测试人员迅速查找分析源代码中的潜在缺陷。
CWSS是一个度量软件缺陷等级的开放标准,它是CWE项目的一部分。
(3)通用平台枚举(Common Platform Enumeration,CPE)
CPE是一种对应用程序、操作系统及硬件设备进行描述和标识的标准化方案,它提供了一个标准的机器可读的格式,利用这个格式可以对IT产品和平台进行编码。
(4)开放漏洞评估语言(Open Vulnerability and Assessment Language,OVAL)
OVAL是由MITRE公司开发的一种用来定义检查项、漏洞等技术细节的描述语言,它能够根据系统的配置信息,分析系统的安全状态(包括漏洞、配置和系统补丁版本等),形成评估结果报告。OVAL通过XML来描述检测系统中与安全相关的软件缺陷、配置问题和补丁实现。并且这种描述是机器可读的,能够直接应用到自动化的安全扫描中。
除了表2-3中所列出的标准,美国国家标准与技术研究院(NIST)、国际标准化组织(ISO)和国际电工委员会(IEC)的联合技术委员会先后发布了若干有关漏洞管理的国际标准。
(1) Guide to Using Vulnerability Naming Schemes (NIST SP 800—51 Rev.1)
NIST于2011年2月发布了该标准,中文名称为《漏洞命名机制指南》。该标准为使用统一的漏洞、配置错误和产品的命名方法提出建议。
美国国家漏洞库、美国国家信息安全应急小组、国际权威漏洞机构Secunia、Security Focus和开源漏洞库OSVDB等多个漏洞库对漏洞的命名及描述方式都遵循该标准。
(2) The Technical Specification for the Security Content Automation Protocol ( SCAP ):SCAP Version 1.2(NIST SP 800—126 Rev.2)
NIST于2011年发布了该标准,中文名称为《安全内容自动化协议(SCAP)安全指南:SCAP 1.2版》,该标准的1.0和1.1版本分别于2009年11月和2011年2月发布。SCAP是当前比较成熟的一套信息安全评估标准体系,其标准化、自动化的思想对信息安全行业产生了深远影响。
(3) Guide to Enterprise Patch Management Technologies (NIST SP 800—40 Rev.3)
该标准的中文名称为《企业安全补丁管理技术指南》,由NIST于2013年发布了第3版。本指南可用于安全管理人员、工程师、管理员和其他人员进行安全补丁的采集、检测、优先管理、实施和验证。本指南旨在帮助用户了解补丁管理技术的基本知识,向读者阐述补丁管理的重要性,并探讨在执行补丁管理时面临的挑战,同时也简要介绍了补丁管理的成效。
(4) Source Code Security Analysis Tool Functional Specification (NIST SP 500-268)
NIST于2007年7月发布了NIST SP 500-268,中文名称为《源代码安全分析工具功能规范》,于2011年2月更新了1.1版本。该规范可作为衡量源代码安全分析工具缺陷分析能力的指南,其目的不是规定所有源代码安全分析工具必备的特性和功能,而是找出会显著影响软件安全性的源代码缺陷,并帮助源代码分析工具的用户衡量这一工具识别这些缺陷的能力。
(5) Information Technology— Security Techniques—Vulnerability Disclosure (ISO/IEC 29147)
国际标准化组织和国际电工委员会(ISO/IEC)于2014年发布了该标准,中文名称为《 信息技术—安全技术—漏洞发布 》。 该标准通过规范漏洞发现者 、 漏洞厂商及第三方安全漏洞管理组织在漏洞披露过程中所应承担的角色及标准操作 , 从而保护受影响厂商及漏洞提交者的利益 。 该标准描述了厂商应该如何响应外界对其产品和服务的漏洞报告 。
(6) Information Technology—Security Techniques—Vulnerability Handling Processes (ISO/IEC 30111)
ISO/IEC于2013年发布了该标准,中文名称为《信息技术—安全技术—漏洞处理流程》,该标准与漏洞发布标准(ISO/IEC 29147)是相关的。该标准描述了厂商处理和解决产品或在线服务中潜在漏洞信息的标准流程,其目标是要求厂商为潜在的漏洞提供及时的解决方案。
国内的安全漏洞标准化工作也在建设中,在中国信息安全测评中心与其他政府及学术机构的共同努力下,迄今已相继制定了关于漏洞标识与描述、漏洞分类、漏洞等级划分和漏洞管理4项国家标准。
《信息安全技术 安全漏洞标识与描述规范》(GB/T 28458—2012)规定了计算机信息系统安全漏洞的标识和描述规范,适用于计算机信息系统安全管理部门进行安全漏洞信息发布和漏洞库建设。
该标准规定了漏洞描述的简明原则和客观原则。简明原则是指对漏洞信息进行筛选,提炼漏洞管理所需的基本内容,保障漏洞描述简洁明确;客观原则是指漏洞描述应便于漏洞发布和漏洞库建设等的管理。根据以上原则,该标准对安全漏洞标识和描述做出了明确的规范,包括标识号、名称、发布时间、发布单位、类别、等级和影响系统等必需的描述项,并可根据需要扩充(但不限于)相关编号、利用方法、解决方案建议和其他描述等描述项。
《信息安全技术 安全漏洞等级划分指南》(GB/T 30279—2013)规定了信息系统安全漏洞的等级划分要素和危害等级程度,适用于信息安全漏洞管理组织和信息安全漏洞发布机构对信息安全漏洞危害程度的评估和认定,也适用于信息安全产品生产、技术研发和系统运营等组织、机构在相关工作中的参考。
该标准给出了安全漏洞等级划分方法,用户根据受影响系统的具体部署情况,结合该指南给出的漏洞危害等级综合判断漏洞的危害程度。该标准中,安全漏洞等级划分要素包括访问路径、利用复杂度和影响程度三个方面。访问路径的赋值包括本地、邻接和远程,通常可被远程利用的漏洞危害程度高于可被邻接利用的漏洞,可被本地利用的漏洞次之。利用复杂度的赋值包括简单和复杂,通常利用复杂度简单的漏洞危害程度高。影响程度的赋值包括完全、部分、轻微和无,通常影响程度越大的漏洞的危害程度越高。
安全漏洞的危害程度从低至高依次为低危、中危、高危和超危,具体的危害等级由三个要素的不同取值共同决定。
《信息安全技术 安全漏洞分类》(GB/T 33561—2017)规定了计算机信息系统安全漏洞的分类规范,适用于计算机信息系统安全管理部门进行安全漏洞管理和技术研究部门开展安全漏洞分析研究工作。
该标准遵循互斥性原则和扩展性原则,根据漏洞形成的原因、漏洞所处空间和时间对安全漏洞进行分类。按照安全漏洞的形成原因可分为:边界条件错误、数据验证错误、访问验证错误、处理逻辑错误、同步错误、意外处理错误、对象验证错误、配置错误、设计缺陷、环境错误或其他等。按照安全漏洞在计算机信息系统所处的位置可分为:应用层、系统层和网络层。按照安全漏洞在软件生命周期的时间关系可分为:生成阶段、发现阶段、利用阶段和修复阶段。
(1)《信息安全技术 信息安全漏洞管理规范》(GB/T 30276—2013)
《信息安全技术 信息安全漏洞管理规范》规范了安全漏洞的有效预防与管理过程,适用于用户、厂商和漏洞管理组织对信息安全漏洞的管理。
根据安全漏洞生命周期中漏洞所处的发现、利用、修复和公开4个阶段,该标准将漏洞管理行为分为预防、收集、消减和发布等实施活动。
●在漏洞预防阶段,厂商应采取相应手段来提高产品安全水平;用户应对使用的计算机系统进行安全加固、安装安全防护产品和开启相应的安全配置。
●在漏洞收集阶段,漏洞管理组织与漏洞管理中涉及的各方进行沟通与协调,广泛收集并及时处置漏洞;厂商应提供接收漏洞信息的渠道,确认所提交漏洞的真实存在性,并回复报告方。
●在漏洞消减阶段,厂商依据消减处理策略在规定时间内修复漏洞,依据漏洞类型和危害程度,优先开发高危漏洞的修复措施。同时,厂商应保证补丁的有效性和安全性,并进行兼容性测试;用户应及时跟踪公布的漏洞信息和相关厂商的安全公告,进行及时修复。
●在漏洞发布阶段,漏洞管理组织应在规定时间内发布漏洞及修复措施等信息(参见《信息安全技术 安全漏洞标识与描述规范(GB/T 28458—2012)》);厂商应建立发布渠道,发布漏洞信息及修复措施,并通知用户。
同时该标准还规定了信息安全漏洞的管理要求,涉及漏洞的产生、发现、利用、公开和修复等环节,根据漏洞管理活动的实施情况,定期对实施方案和实施效果进行检查、评审,并针对方案与相关文档做出有效改进,保障被发现的漏洞得到有效处置。
(2)CNNVD漏洞管理规范
经过多年的工作积累,中国国家信息安全漏洞库(CNNVD)形成了一套自己的漏洞管理规范,包括《CNNVD漏洞编码规范》《CNNVD漏洞命名规范》《CNNVD漏洞内容描述规范》《CNNVD漏洞分类描述规范》《CNNVD漏洞分级规范》和《CNNVD漏洞影响实体描述规范》。
在漏洞标识方面,CNNVD使用自己的编号,并建立了与CVE编号的关联。例如,2.2.3节中图2-5所示的CVE-2015-8153漏洞在CNNVD中对应的编号是CNNVD-201603-272。
在漏洞数据方面,除收录CVE漏洞数据外,CNNVD还收录了中国主流信息技术产品的重要安全漏洞。CNNVD还向信息安全产品厂商提供了兼容性服务,通过CNNVD兼容性服务,进一步提高了CNNVD的影响力,推动了CNNVD漏洞编号的使用范围和认知度。
在漏洞信息方面,与CVE只记录漏洞的简要信息相比,CNNVD包含更加丰富的内容,如危害等级、漏洞类型和威胁类型等。漏洞CNNVD-201603-272的详细信息如图2-6所示。
图2-6 CNNVD漏洞示例