摘要
- 为什么对软件安全必须给与强烈关注?
- 软件面临哪些安全威胁?
- 如何理解软件安全的概念?
- 软件安全研究什么?如何研究?
为什么对软件安全必须给予强烈关注?
软件的定义
国家标准 GB/T 11457—2006《信息技术 软件工程术语》给出的软件定义是:计算机程序、规则和可能相关的文档。
美国电气和电子工程师协会(IEEE)1990 发布的《软件工程术语标准词汇表》(Standard Glossary of Software Engineering Terminology)给出的软件定义是:“Computer programs, procedures, and possibly associated documentation and data pertaining to the operation of a computer system”。
以上两个标准文档都认为,软件是程序、数据和文档的集合体。
- 程序是完成特定功能和满足性能要求的指令序列;
- 数据是程序运行的基础和操作的对象;
- 文档是与程序开发、维护和使用有关的图文资料。
软件无处不在
现在是一个信息化的时代,每时每刻都有无数的软件系统在运行着。
软件己融入我们日常生活的方方面面,已经成为国家和社会关键基础设施的重要组成部分。
软件规模日益庞大
随着软件应用范围日益广泛,软件规模也大幅增加。
软件漏洞普遍存在,零日漏洞成为主要安全威胁
辩证唯物论的认识论和辩证唯物论的知行统一观告诉我们,人对于客观世界的认识是有局限性的,人对于客观世界的认识过程是螺旋上升的。软件是人们为了实现解决生产生活实际问题而开发的某种完成特定功能的计算机程序,因而必然存在缺陷或漏洞。
软件漏洞是普遍存在的,系统软件、应用软件和第三方软件,它们在开发、部署和应用中的问题层出不穷。
微软定期发布的《安全情报报告 SIR》会及时披露微软和其他第三方软件的漏洞情况和对安全的影响: https://www.microsoft.com/zh-cn/security/business/security-intelligence-report
补天漏洞平台:https://butian.360.cn
暗网软件漏洞交易黑市:知道创宇《2018 上半年暗网研究报告》
恶意软件作为网络战武器对国家关键基础设施乃至整个国家的巨大破坏力。攻击者为了能够有效达到窃取数据、破坏系统的目的,可以通过挖掘或是购买零日漏洞,开发针对零日漏洞的攻击工具实施攻击。
零日漏洞是指未被公开披露的软件漏洞,没有给软件的作者或厂商以时间去为漏洞打补丁或是给出建议解决方案,从而攻击者能够利用这种漏洞破坏计算机程序、数据及设备。
注意,零日漏洞并不是指软件发布后被立刻发现的漏洞。
利用零日漏洞开发攻击工具进行的攻击称为零日攻击。
零日攻击针对的漏洞由于软件厂商还没有发现或是还未及提供相应的补丁,所以零日攻击的成功率高,造成的破坏大。
从日常黑客攻击到军事领域的对抗,从震网病毒到棱镜门事件,信息空间的几乎所有攻防对抗都是以软件安全问题为焦点展开的。
描述零日漏洞和零日攻击的书籍和影片
2014 年,美国自由撰稿人金·泽特(Kim Zetter)出版了 Countdown to Zero Day: Stuxnet and the Launch of the World's First Digital Weapon(《零日攻击:震网病毒全揭秘》)
该书是目前关于震网病毒入侵伊朗核设施事件最为全面和权威的读物,也为人们揭开了零日漏洞攻击的神秘面纱。
2016 年,美国导演亚历克斯·吉布尼(Alex Gibney)执导的纪录片 Zero Days(《零日》)
讲述了震网病毒攻击伊朗核设施的故事,揭露了网络武器的巨大危险性。
软件安全应当引起重视,应当成为当务之急,甚至成为国家的一项竞争优势
错误认识一:应对安全威胁的主要手段是密码技术,是添置边界防护等各种安全设备。
是什么真正引发了当今世界大多数的信息安全问题?有人会回答,是黑客的存在。那么黑客和网络犯罪分子的主要目标是什么?有人会回答,是重要的信息资产,是各类敏感数据。这样的回答看起来不错,但是再往深处想一想,黑客是如何实现盗取重要信息资产的?黑客成功实施攻击的途径是什么?那就是发现、挖掘和利用信息系统的漏洞。
错误认识二:不值得在关注软件安全,降低糟糕的软件开发、集成和部署带来的风险上花费成本。
开发出安全漏洞尽可能少的软件应当是软件开发者或者说是软件厂商追求的目标。
我们不仅要把软件做得更好而且要更安全,同时,根据现实世界的经验,必须保证该解决方案具有较好的成本效益、操作相关性和可行性以及投资的可行性。
软件已经渗透到社会、经济与国防建设的方方面面,是信息时代所依赖的重要技术与手段,其安全直接关系到国计民生与国家安全,因此,软件安全关乎到国家竞争力。
安全漏洞是软件产生安全问题的根源,漏洞发现是软件安全的基础工作,软件安全体系的建立是以漏洞为核心展开的,对漏洞的掌控能力是衡量一个国家信息安全水平的重要因素。
软件安全之路
事实上,软件安全开发的最佳实践是采用从软件开发之初就不允许漏洞发生的方式,在软件开发的各个环节尽可能消除漏洞,这不仅使得软件及其用户更安全,关键基础设施更具弹性,还将节省软件企业的开发成本。
100%安全的软件和系统是不存在的,软件产品存在漏洞是当前信息安全领域而临的最大困境。
由于漏洞的产生、利用以及相互作用的机理复杂,因此,如何有效减少系统漏洞数量,提高信息系统整体安全性成为当前亟待解决的挑战性问题。
软件面临哪些安全威胁?
本书将软件面临的安全威胁分为 3 大类:软件自身的安全(软件漏洞)、恶意代码以及软件侵权。
本节将概要介绍这 3 类威胁,后续第 2~4 部分将分别介绍针对这 3 类威胁的解决方案。
软件漏洞
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
本书中并不对软件漏洞/脆弱点、软件缺陷以及软件错误等概念严格区分。
一方面,软件漏洞可能会造成软件在运行过程中出现错误结果或运行不稳定、崩溃等现象,甚至引起死机等情况。
另一方面,软件漏洞会被黑客发现、利用,进而实施窃取隐私信息、甚至破坏系统等攻击行为。
恶意代码
恶意代码(Malicious Software,Malware)是在未被授权的情况下,以破坏软硬件设备、窃取用户信息、干扰用户正常使用、扰乱用户心理为目的而编制的软件或代码片段。
定义指出,恶意代码是软件或代码片段,其实现方式可以有多种,如二进制执行文件、脚本语言代码、宏代码或是寄生在其他代码或启动扇区中的一段指令。
恶意代码包括
- 计算机病毒(Computer Virus)
- 蠕虫(Worm)
- 特洛伊木马(Trojan Horse)
- 后门(Back Door)
- 内核套件(Rootkit)
- 间谍软件(Spyware)
- 恶意脚本(Malice Script)
- 恶意广告(Dishonest Adware)
- 流氓软件(Crimeware)
- 逻辑炸弹(Logic Bomb)
- 僵尸网络(Botnet)
- 网络钓鱼(Phishing)、垃圾信息(Spam)等恶意的或令人讨厌的软件及代码片段。近几年危害甚广的勒索软件(Ransomware)也属于恶意代码范畴。
软件侵权
主要指侵犯版权(著作权),常见软件侵权行为:
- 未经软件著作权人许可,发表、登记、修改、翻译其软件;
- 将他人软件作为自己的软件发表或者登记,在他人软件上署名或者更改他人软件上的署名;
- 未经合作者许可,将与他人合作开发的软件作为自己单独完成的软件发表或者登记;
- 复制或者部分复制著作权人的软件;
- 向公众发行、出租、通过信息网络传播著作权人的软件;
- 故意避开或者破坏著作权人为保护其软件著作权而采取的技术措施;
- 故意删除或者改变软件权利管理电子信息;
- 转让或者许可他人行使著作权人的软件著作权。
如何理解软件安全的概念?
软件安全的一些定义
国家标准 GB/T 30998—2014《信息技术 软件安全保障规范》给出的软件安全(Software Safety)的定义是:软件工程与软件保障的一个方面,它提供一种系统的方法来标识、分析和追踪对危害以及具有危害性的功能(例如数据和命令)的软件缓解措施与控制。
国内外大多数软件安全标准中,软件安全用的是 Software Safety,而非 Software Security。
本书认为,safety 侧重于对无意造成的事故或事件进行安全保护,可以是加强人员培训,规范操作流程,完善设计等方面的安全防护工作。
而 security 则侧重于对人为地有意地破坏进行的保障和保护,比如部署专门安全设备进行防护,加强安全检测等。
对于软件安全,既要考虑软件系统中开发人员无意的错误,又要考虑人为地故意地针对软件系统的渗透和破坏,因此,本书不对 Software Safety 和 Software Security 进行区分。
用信息安全的基本属性理解软件安全
保密性(Confidentiality)
对谁保?信息安全中的保密性,也称为机密性,是指信息仅被合法的实体(如用户、进程等)访问,而不被泄漏给未授权实体的特性。
保什么?这里所指的信息不但包括国家秘密,而且包括各种社会团体、企业组织的工作秘密及商业秘密,个人的秘密和个人隐私(如浏览习惯、购物习惯等)。
保密性还包括保护数据的存在性,有时候存在性比数据本身更能暴露信息。
特别要说明的是,对计算机的进程、中央处理器、存储、打印设备的使用也必须实施严格的保密措施,以避免产生电磁泄露等安全问题。
GB/T 16260.1—2006/ISO/IEC 9126—1:2001《软件工程产品质量 第 1 部分:质量模型》中,软件的保密性被定义为“软件产品保护信息和数据的能力,以使未授权人员或系统不能阅读或修改这些信息和数据,而不拒绝授权人员或系统对它们的访问”。
GB/T 18492—2001《信息技术 系统及软件完整性级别》中,软件的保密性被定义为“对系统各项的保护,使其免于受到偶然的或恶意的访问、使用、更改、破坏及泄露。”
实现保密性的方法一般是通过物理隔离,信息加密,或是访问控制(对信息划分密级并为用户分配访问权限,系统根据用户的身份权限控制对不同密级信息的访问)等。
完整性(Integrity)
信息安全中的完整性是指,信息在存储、传输或处理等过程中不被未授权、未预期或无意地篡改、销毁等破坏的特性。
不仅仅要考虑数据的完整性,还要考虑操作系统的完整性,即保证系统以无害的方式按照预定的功能运行,不被有意的或者意外的非法操作所破坏。
可以将软件完整性理解为软件产品能够按照预期的功能运行,不受任何有意的或者无意的非法错误所破坏的软件安全属性。
实现完整性的方法一般分为预防和检测两种机制。
- 预防机制通过阻止任何未经授权的方法来改写数据的企图,如加密、访问控制,以确保数据的完整性。
- 检测机制并不试图阻止完整性的破坏,而是通过分析数据本身或是用户、系统的行为来发现数据的完整性是否遭受破坏,如数字签名、哈希(Hash)值计算等。
可用性(Availability)
信息安全中的可用性是指,信息、信息系统资源和系统服务可被合法实体访问并按要求使用的特性。
例如,对信息资源和系统服务的拒绝服务攻击就属于对可用性的破坏。
可用性被定义为保证授权实体在需要时可以正常地访问和使用系统信息的属性(ISO13335-1《信息安全管理指南》)。
为了实现可用性可以采取备份与灾难恢复、应急响应、系统容侵等许多安全措施。
对于安全性要求较高的软件系统,除了应具备以上介绍的三大基本属性 CIA 以外,还应当考虑多种安全属性:
- 可认证性
- 授权
- 可审计性
- 抗抵赖性
- 可控性
- 可存活性等。
可认证性
信息安全的可认证性,又称为真实性,是指能够对信息的发送实体和接收实体的真实身份,以及信息的内容进行鉴别(Authentication)的特性。
可认证性可以防止冒充、重放、欺骗等攻击。
软件是访问内部网络、系统与数据库的渠道,因此对于内部敏感信息的访问必须得到批准。认证就是解决这一问题的信息安全概念,它通过验证身份信息来保证访问主体与所声称的身份唯一对应。
实现可认证性的方法主要有数字签名、哈希函数以及基于口令的身份认证、生物特征认证、生物行为认证以及多因素认证技术。
授权
信息安全中的授权是指,在信息访问主体与客体之间介入的一种安全机制,该机制根据访问主体的身份和职能为其分配一定的权限,访问主体只能在权限范围内合法访问客体。
软件系统中,实体通过认证验证了实体的真实身份并不意味着该实体可以被授予访问请求的资源的所有访问权限。例如,普通员工能够登录公司账户,但是不能够访问人力资源的工资数据,因为没有相应的权限或优先权。
实现授权的基础是访问控制模型,如数据库系统中常采用的基于角色的访问控制模型。
可审计性
信息安全的可审计性是指,确保一个实体(包括合法实体和实施攻击的实体)的行为可以被唯一地区别、跟踪和记录,从而能对出现的安全问题提供调查依据和手段。审计内容主要包括谁(用户、进程等实体)在哪里在什么时间做了什么。
软件安全中,审计(Audit)是指根据公认的标准和指导规范,对软件从计划、研发、实施到运行维护各个环节进行审查评价,对软件及其业务应用的完整性、效能、效率、安全性进行监测、评估和控制的过程,以确认预定的业务目标得以实现,并提出一系列改进建议的管理活动。
审计是一种威慑控制措施,对于审计的预知可以潜在地威慑用户不执行未授权的动作。
不过,审计也是一种被动的检测控制措施,因为审计只能确定实体的行为历史,也不能阻止实体实施攻击。
抗抵赖性
信息安全的抗抵赖性,也称为不可否认性,是指信息的发送者无法否认已发出的信息或信息的部分内容,信息的接收者无法否认已经接收的信息或信息的部分内容。
软件安全中,抗抵赖性解决的是用户或者软件系统对于已有动作的否认问题。例如,当价格发生变动时,如果软件能够记录假冒的动作变化以及施加动作的用户身份,就可以给个人一个否认或者拒绝动作的机会,由此保证抗抵赖性的实现。
实现不可抵赖性的措施主要有:数字签名、可信第三方认证技术等,可审计性也是有效实现抗抵赖性的基础。
可控性
信息安全的可控性是指,对于信息安全风险的控制能力,即通过一系列措施,对信息系统安全风险进行事前识别、预测,并通过一定的手段来防范、化解风险,以减少遭受损失的可能性。
软件的可控性是一种系统性的风险控制概念,涉及对软件系统的认证授权和监控管理,确保实体(用户、进程等)身份的真实性,确保内容的安全和合法,确保系统状态可被授权方所控制。
管理机构可以通过信息监控、审计、过滤等手段对系统活动、信息的内容及传播进行监管和控制。
可存活性
信息安全的可存活性是指,计算机系统在面对各种攻击或错误的情况下继续提供核心的服务,而且能够及时地恢复全部服务的能力。
软件作为信息系统的重要组成,可存活性是一个融合信息安全和业务风险管理的新课题,它的焦点不仅是对抗网络入侵者,还要保证在各种网络攻击的情况下业务目标得以实现,关键的业务功能得以保持。
实现可存活性的措施主要有:系统容侵、灾备与恢复等。
软件安全相关概念辨析
- 软件工程
- 软件危机
- 软件质量和软件质量保证
- 软件保障
- 软件可靠性
- 应用软件系统安全
- 可信软件
- 软件定义安全
软件安全研究什么?如何研究?
网络空间安全的概念
信息安全已经进入网络空间安全阶段,这已成为共识。网络空间的安全问题得到世界各国的普遍重视。
网络空间(Cyberspace)不再只包含传统互联网所依托的各类电子设备,还包含了重要的基础设施以及各类应用和数据信息,人也是构成网络空间的一个重要元素。
网络空间安全(CyberSecurity)不仅关注传统信息安全研究的信息的保密性、完整性和可用性,同时还关注构成网络空间的基础设施的安全和可信,以及网络对现实社会安全的影响。
信息保障的概念
信息保障与之前的信息保密、网络信息安全等阶段的概念相比,它的层次更高、涉及面更广、解决问题更多、提供的安全保障更全面,它通常是一个战略级的信息防护概念。组织可以遵循信息保障的思想建立一种有效的、经济的信息安全防护体系和方法。
其核心思想是“纵深防护战略(Defense-in-Depth)”,它采用层次化的、多样性的安全措施来保障用户信息及信息系统的安全。
人、技术和操作是 3 个核心因素,包括了主机、网络、系统边界和支撑性基础设施等多个网络环节之中,如何实现保护(Protection)、检测(Detection)、响应(Reaction)和恢复(Restore)有机结合的动态技术体系,这就是所谓的 PDRR(或称 PDR2)模型。
软件安全是信息安全保障的重要内容
软件在网络空间信息系统的运行、危险控制以及关键安全功能实现等方面正发挥着越来越重要的作用,成为系统安全保障、避免重大人员伤亡和财产损失的一个重要环节。
信息安全保障的目标,主要是确保信息及信息系统的机密性、完整性、可用性、可核查性、真实性、抗抵赖性等,包括信息系统的保护、检测和恢复能力,以降低信息系统的脆弱性,减少风险。
降低系统脆弱性的最有效方法就是漏洞分析,因此,漏洞分析是信息安全保障的基础,在信息安全保障中占据核心地位。
漏洞是引发信息安全事件产生的根源,软件漏洞尤其如此。恶意代码通常也是针对漏洞而编写出来的,软件侵权的成功往往跟软件漏洞也有密切的关系。因此,软件安全防护围绕漏洞消除展开。
将安全保障措施置于软件发布运行之时:采用多种检测、分析、挖掘技术对安全错误或是安全漏洞进行发现、分析、评价,然后采取多种安全控制措施进行错误修复和风险控制,如传统的打补丁、防病毒、防火墙、入侵检测、应急响应等。
该方法在时间和经济上投入产出比低,信息系统的安全状况很难得到有效改善。
分析软件安全错误发生的原因,将安全错误的修正嵌入到软件开发生命周期的整个阶段。通过对需求分析、设计、实现、测试、发布,以及运维等各阶段相关的软件安全错误的分析与控制,以期大大减少软件产品的漏洞数量,使软件产品的安全性得到有效提高。
该方法是将安全保障的实施开始于软件发布之前,尤其强调从软件生命周期的早期阶段开始安全考虑,从而减少软件生命周期的后期系统运行过程中安全运维的工作量,提高安全保障效果。
从系统开发需求阶段就引入安全要素要比在系统维护阶段才考虑安全问题所花费的错误修复成本要低很多。
软件安全防护的主要技术
软件安全属性的认知
本书将保密性、完整性、可用性、认证性、授权、可审计性作为软件安全的核心属性;
而软件自身的实现质量,即软件产品包含的漏洞情况也应该是软件安全性的主要内容,因为这些漏洞会直接导致安全性问题,这也是传统的软件安全关注的问题;
此外,站在不同的管理者视角,抗抵赖性、可信性、可控性、可靠性、软件弹性等也成为软件被关注的其他安全属性。
系统安全工程
运用系统工程的思想和方法,系统地分析信息系统存在的安全漏洞、风险、事件、损失、控制方法以及效果之间复杂的对应关系,对信息系统的安全性进行分析与评价,以期建立一个有效的安全防御体系,而不是简单的安全产品堆砌。
系统安全工程可以在系统生命周期的不同阶段对安全问题提供指导,例如,对于已经发布运行的软件,可以采用系统测试、风险评估与控制等方法构建安全防御体系;而对于尚待开发的系统,也可以应用系统安全工程的思想方法来提高目标系统的安全性。这是一项具有挑战性的工作,也是本书的出发点。
软件安全开发
软件安全开发关注的是如何运用系统安全工程的思想,以软件的安全性为核心,将安全要素嵌入软件开发生命周期的全过程,有效减少软件产品潜在的漏洞数量或控制在一个风险可接受的水平内,提高软件系统的整体安全性。
软件安全开发方法抛弃了传统的先构建系统,然后再将安全手段应用于系统的构建模式,而且保留了采用风险管理、身份认证、访问控制、数据加密保护、入侵检测等传统安全方法,将安全作为功能需求的必要组成部分,在系统开发的需求阶段就引入安全要素,同时对软件开发全过程的每一个阶段实施风险管理,以期减少每一个开发步骤中可能出现的安全问题,最终提高软件产品的本质安全性。
- 对于软件安全性的测试和评估主要基于产品的视角,描述产品是什么,它的安全性怎么样;
- 而系统安全工程与软件安全开发是基于过程的视角,回答软件的安全性是如何构建的
- 软件安全开发是系统安全工程应用的最高阶段,也是解决信息安全问题的最根本途径。