摘要
本文根据复习课录音和大模型总结了软件安全的期末考点。题目来自教材课后习题,仅提供简单题和阅读报告题,不提供实验题和复杂的阅读报告题。
如无特殊标注,本文的题目答案来源为 PPT 或教材。使用大模型生成的回答会有明确标注。
考试题型:只靠概念题,10 道简答;每章一道,来自书后概念习题(除去 3,9,10,11 章)。
本文参考了 南京大学软件学院-2023-软件安全(研究生)期末复习参考 - 知乎。
懒狗答题思路
对于原因、应对措施类问题,可以从以下几个方面分条作答:
- 内部和外部:如软件本身的特点、软件应用场景的特点;
- 历史和现实:传统的软件系统如何、新技术下的软件系统如何;
- 理论和实践:软件系统理论上如何、软件开发过程中实际上如何;
- 意识和行为:开发者对软件安全重视程度如何、开发过程中的行为如何。
日志
时间 | 版本 | 描述 |
---|---|---|
2025-01-09 16:39 | v1 | 整理了所有 PPT 中有明确答案的题目。 |
2025-01-09 23:02 | v2 | 标记了所有没讲的题目,部分习题补充了教材内容作为答案。 标注了 10 个【押题 ★★★★★】(每章 1 个)和 11 个【押题 ★★★★】。 |
2025-01-11 15:14 | v3 | 考前添加了“懒狗答题思路” |
2025-01-11 17:10 | v4 | 半小时速通,添加真题标注 |
第一章-软件安全概述
软件安全的重要性
【押题 ★★★★★】【2024Fall 真题】零日漏洞和零日攻击
什么是零日(0 day)漏洞?什么是零日(0 day)攻击?
零日漏洞是指未被公开披露的软件漏洞,没有给软件的作者或厂商以时间去为漏洞打补丁或是给出建议解决方案,从而攻击者能够利用这种漏洞破坏计算机程序、数据及设备。(注意,零日漏洞并不是指软件发布后被立刻发现的漏洞。)
利用零日漏洞开发攻击工具进行的攻击称为零日攻击。
【押题 ★★★★】为什么必须对软件安全给予强烈关注?
为什么说面对当前的全球网络空间安全威胁,必须对软件安全给予强烈关注?
背景:软件已经渗透到社会、经济与国防建设的方方面面,是信息时代所依赖的重要技术与手段,其安全直接关系到国计民生与国家安全,因此,软件安全关乎到国家竞争力。
问题:软件漏洞普遍存在,零日漏洞成为主要威胁。
结论:安全漏洞是软件产生安全问题的根源,漏洞发现是软件安全的基础工作,软件安全体系的建立是以漏洞为核心展开的,对漏洞的掌控能力是衡量一个国家信息安全水平的重要因素。
零日漏洞威胁实际上反映了软件系统存在的什么问题?
当前,黑客为了能够有效达到窃取数据、破坏系统的目的,常常通过挖掘或是购买零日漏洞,开发针对零日漏洞的攻击工具,零日漏洞威胁实际上反映了软件系统存在的一个什么问题?
没讲。
软件安全威胁
软件安全威胁分类
根据本书的介绍,软件安全威胁可以分为哪几类?
本书将软件面临的安全威胁分为 3 大类:软件自身的安全(软件漏洞)、恶意代码以及软件侵权。
在以下几个题目中分别解释这三类威胁。
【押题 ★★★★】软件漏洞
试谈谈对软件漏洞的认识,举出软件漏洞造成危害的事件例子。
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
本书中并不对软件漏洞/脆弱点、软件缺陷以及软件错误等概念严格区分。
一方面,软件漏洞可能会造成软件在运行过程中出现错误结果或运行不稳定、崩溃等现象,甚至引起死机等情况。
另一方面,软件漏洞会被黑客发现和利用,进而实施窃取隐私信息、甚至破坏系统等攻击行为。
【大模型】震网病毒便是利用软件漏洞实施的攻击,通过 U 盘和局域网进行传播,震网病毒对伊朗等国家的核设施造成的危害不亚于 1986 年发生的切尔诺贝利核电站事故,最终造成伊朗核计划拖后了 2 年,我国近 500 万网民及多个行业的领军企业也遭受了此病毒的攻击。
恶意代码
什么是恶意代码?除了传统的计算机病毒,还有哪些恶意代码类型?
恶意代码(Malicious Software,Malware)是在未被授权的情况下,以破坏软硬件设备、窃取用户信息、干扰用户正常使用、扰乱用户心理为目的而编制的软件或代码片段。
定义指出,恶意代码是软件或代码片段,其实现方式可以有多种,如二进制执行文件、脚本语言代码、宏代码或是寄生在其他代码或启动扇区中的一段指令。
恶意代码包括:计算机病毒(Computer Virus)蠕虫(Worm)特洛伊木马(Trojan Horse)后门(Back Door)内核套件(Rootkit)间谍软件(Spyware)恶意脚本(Malice Script)恶意广告(Dishonest Adware)流氓软件(Crimeware)逻辑炸弹(Logic Bomb)僵尸网络(Botnet)网络钓鱼(Phishing)、垃圾信息(Spam)等恶意的或令人讨厌的软件及代码片段。近几年危害甚广的勒索软件(Ransomware)也属于恶意代码范畴。
软件侵权
针对软件的版权,有哪些侵权行为?
主要指侵犯版权(著作权),常见软件侵权行为:
- 未经软件著作权人许可,发表、登记、修改、翻译其软件;
- 将他人软件作为自己的软件发表或者登记,在他人软件上署名或者更改他人软件上的署名;
- 未经合作者许可,将与他人合作开发的软件作为自己单独完成的软件发表或者登记;
- 复制或者部分复制著作权人的软件;
- 向公众发行、出租、通过信息网络传播著作权人的软件;
- 故意避开或者破坏著作权人为保护其软件著作权而采取的技术措施;
- 故意删除或者改变软件权利管理电子信息;转让或者许可他人行使著作权人的软件著作权。
【押题 ★★★★】软件安全的概念
谈谈对软件安全概念的理解。
软件安全是软件工程与软件保障的一个方面,它提供一种系统的方法来标识、分析和追踪对危害以及具有危害性的功能(例如数据和命令)的软件缓解措施与控制。
国内外大多数软件安全标准中,软件安全用的是 Software Safety,而非 Software Security。本书认为,safety 侧重于对无意造成的事故或事件进行安全保护,可以是加强人员培训,规范操作流程,完善设计等方面的安全防护工作。而 security 则侧重于对人为地有意地破坏进行的保障和保护,比如部署专门安全设备进行防护,加强安全检测等。对于软件安全,既要考虑软件系统中开发人员无意的错误,又要考虑人为地故意地针对软件系统的渗透和破坏,因此,本书不对 Software Safety 和 Software Security 进行区分。
软件安全具有信息安全三大基本属性 CIA:保密性、完整性、可用性。
其他属性:可认证性、授权、可审计性、抗抵赖性、可控性、可存活性等。
软件和软件工程
简述软件和软件工程的概念。
这题不是软件安全的课程内容。
软件=代码+文档。
软件工程定义:
- 将系统化、规范化、可量化的方法应用于软件的开发、运行和维护,即将工程学应用于软件的过程。
- 对(1)中的方法的研究。
软件安全工程
对照一般软件工程的概念,软件安全工程主要增添了哪些任务?
PPT 和教材都没有
【押题 ★★★★】软件安全相关概念
谈谈软件安全与软件危机、软件质量和软件质量保证、软件保障、软件可靠性、应用软件系统安全、可信软件和软件定义安全等概念的区别和联系。
【省流版】
- 软件危机:软件交付延期、成本超出预期、质量不可靠等;
- 软件质量和软件质量保证:软件与明确的和隐含的定义的需求相一致的程度;
- 软件保障:用于提高软件质量的实践、技术和工具;
- 软件可靠性:在规定的时间周期内所述条件下程序执行所要求的功能的能力;
- 应用软件系统安全:即信息系统上层的应用软件系统的安全;
- 可信软件:行为及结果可以预期,受到干扰时仍能正常提供服务;
- 软件定义安全:适应软件定义网络的安全防护新思想。
联系:
它们都是为了确保软件具有可靠性和可信度,保证软件系统运行可靠。
【教材完整版】
软件危机
软件危机(Software Crisis),也称为软件萧条(Software Depression)或软件困扰(Software Affliction),是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。这些问题绝不仅仅是不能正常运行的软件才具有的,可以说几乎所有软件都不同程度地存在这些问题。软件危机的一些具体表现如下:
- 对软件开发成本和进度的估计不准确。
- 用户对开发完成的软件系统不满意。
- 软件产品的质量不可靠。
- 软件不能适应新的硬件环境,软件中的错误难以改正。
- 软件缺乏适当的文档资料。
- 软件开发成本在总成本中的占比高。
- 软件开发生产效率跟不上人们的需求发展。
可见,软件存在安全漏洞、恶意软件泛滥及软件版权保护等安全问题还只是软件危机的冰山一角。
软件质量和软件质量保证
概括地说,软件质量(Software Quality)就是“软件与明确的和隐含的定义的需求相一致的程度”。具体地说,软件质量是软件符合明确叙述的功能和性能需求、文档中明确描述的开发标准,以及所有专业开发的软件都应具有的和隐含特征相一致的程度。
基本上可用两种途径来保证产品质量,一是保证产品的开发过程,二是评价最终产品的质量。《软件工程产品质量 第 1 部分 质量模型》(GB/T 16260.1-2006)中,分别给出了外部质量和内部质量模型,以及使用质量模型来描述软件质量。外部质量和内部质量模型包含 6 个特性(功能性、可靠性、易用性、效率、维护性和可移植性),并进一步细分为若干子特性。使用质量的属性分类为 4 个特性:有效性、生产率、安全性和满意度。由此可见,安全性是软件质量的一个重要属性。
软件质量保证(Software Quality Assurance, SQA)是建立一套有计划、有系统的方法,向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。软件质量保证的目的是使软件过程对于管理人员来说是可见的。它通过对软件产品和活动进行评审和审计来验证软件是合乎标准的。软件质量保证组在项目开始时就一起参与建立计划、标准和过程。这些将使软件项目满足机构的要求。
软件保障
通常软件保障包括软件质量(软件质量工程、软件质量保障和软件质量控制等功能)、软件安全性、软件可靠性、软件验证与确认,以及独立验证与确认等学科领域。
软件保障(Software Assurance, SA),也有译为软件确保,是用于提高软件质量的实践、技术和工具。
美国国家安全系统委员会(Committee on National Security System, CNSS)把软件保障定义为对软件无漏洞和软件功能预期化的确信程度;美国国土安全部(Department of Homeland Security, DHS)对软件保障的定义强调了可确保的软件必须具备可信赖性、可预见性和可符合性;美国国家航空航天局(NASA)把软件保障定义为有计划、有系统的一系列活动,目的是确保软件生命周期过程和产品符合要求、标准和流程。
我国国家标准 GB/T 30998-2014《信息技术 软件安全保障规范》给出的软件保障(Software Assurance)的定义是:确保软件生命周期过程及产品符合需求、标准和规程要求的一组有计划的活动。
可以看出,软件保障是指提供一种合理的确信级别,确信根据软件需求,软件执行了正确的、可预期的功能,同时保证软件不被直接攻击或植入恶意代码。2004 年美国第二届国家软件峰会所确定的国家软件战略中认为,软件保障目前包括 4 个核心服务,即软件的安全性、保险性、可靠性和生存性。
软件保障已经成为信息安全的核心,它是多门不同学科的交叉,其中包括信息确保、项目管理、系统工程、软件获取、软件工程、测试评估、保险与安全、信息系统安全工程等。目前国内被广泛认知的软件保障模型为方滨兴院士等提出的软件确保模型。该模型建立了分析和确保软件质量的保证模型,并指出软件确保是信息保障、测试评估及信息系统安全工程的核心。
软件可靠性
长期以来,软件可靠性(Software Reliability)作为衡量软件质量的唯一特性受到特别重视。
1983 年美国 IEEE 计算机学会对“软件可靠性”做出了明确定义,此后该定义被美国国家标准与技术研究院接受为国家标准,1989 年我国也接受该定义为国家标准。GB/T 11457-2006《信息技术 软件工程术语》给出的软件可靠性定义如下:
- 在规定条件下,在规定的时间内软件不引起系统失效的概率。该概率是系统输入和系统使用的函数,也是软件中存在的缺陷的函数。系统输入将确定是否会遇到已存在的缺陷(如果缺陷存在的话)。
- 在规定的时间周期内所述条件下程序执行所要求的功能的能力。
由上述定义可知,软件可靠性不但与软件存在的缺陷和/或差错有关,而且与系统输入和系统使用有关。提高软件可靠性就是要减少软件中的缺陷或错误,提高软件系统的健壮性。因此,软件可靠性通常涉及软件安全性的要求,但是软件可靠性要求不能完全取代软件安全性的要求。
应用软件系统安全
应用软件系统位于信息系统的上层,是在信息系统的硬件系统、操作系统、网络系统和数据库管理系统的支持下运行的,是构成信息系统的最重要部分,是信息系统中直接为用户提供服务的部分。
应用软件系统是由业务应用处理软件组成的系统。信息系统(也称应用系统)是实现业务应用的所有软硬件的总称。其中,应用软件是对业务应用进行处理的软件,其他软件和硬件,包括组成计算机平台和网络平台的所有软件和硬件,都是为了支持应用软件正常运行而配制的。
为了确保业务应用的安全,首要的是确保应用软件系统的安全。而为了实现应用软件系统的安全,除了在应用软件系统中实现必要的安全功能外,大量的是需要支持其运行的计算机平台和网络平台的安全作为支持和保证,也就是组成信息系统平台的计算机软硬件的安全和网络软硬件的安全。这些安全要求进一步分解为计算机和网络系统的物理安全、计算机操作系统的安全、数据库管理系统的安全等,网络协议安全、网络软件安全和网络数据交换与传输安全等。这些安全机制确保信息系统的各个组成部分各自安全地运行以提供确定的服务,并对各自控制范围的用户数据信息进行安全保护,确保其达到确定的保密性、完整性和可用性目标。
可信软件
可信性是信息安全领域较为经典的一个概念。早在 1985 年,美国国家计算机安全中心(National Computer Security Center, NCSC)倡议的可信计算机系统评价准则中就将软件可信性定位在安全性这个唯一的质量属性上,指出可信性是属于软件产品质量的一个属性。
“可信性”是在正确性、可靠性、安全性、时效性、完整性、可用性、可预测性、生存性及可控性等众多概念的基础上发展起来的一个新概念,是客观对象的诸多属性在人们心目中的一个综合反映。学者们试图从不同角度、不同层次去诠释“可信性”,但尚未形成共识。
一般认为,“可信”是指一个实体在实现既定目标的过程中,行为及结果可以预期,它强调目标与实现相符,强调行为和结果的可预测性和可控制性。软件的“可信”是指软件系统的动态行为及其结果总是符合人们的预期,在受到干扰时仍能提供连续的服务。这里的“干扰”包括操作错误、环境影响和外部攻击等。
构造可信软件已成为现代软件技术发展和应用的重要趋势和必然选择。一方面,软件的规模越来越大,导致软件的开发、集成和维护工作越来越复杂,目前的可信软件构造与运行保障技术、可信性度量与评测方法严重缺乏,使得软件产品在推出时就含有很多已知或未知的缺陷,对软件系统的安全可靠运行构成了不同程度的威胁。另一方面,软件的开发环境和运行环境已经从传统的封闭、静态环境发展为开放、动态、多变的互联网环境。网络交互、共享和协同带来了很多“不可信”因素,网络上对信息的滥用和恶搞,使得可信问题变得更加突出。互联网环境中计算实体的行为具有不可控性和不确定性,这种状况既对传统的软件开发方法和技术提出了重要挑战,也对软件运行时刻的可信保障提出了严峻要求。
目前的可信软件研究是在软件正确性、可靠性、安全性和生存性等基础上发展起来的,软件形式化理论和验证技术、可靠性工程、网络信息安全等领域均有针对若干可信属性的研究。但是软件可信性不是正确性、可靠性、安全性和生存性等性质的简单相加,可信软件研究也不是对已有的各种软件属性研究进行简单的综合。首先,由于软件系统越来越复杂,软件可信意味着软件行为可信、环境可信和使用可信等不同层次的可信要求,而局部的可信并不一定导致全局的可信。系统的可信性属于涌现类的性质,如何从整体上度量、获得并保证可信性将是非常困难的;其次,不同可信属性之间可能彼此有冲突,并且不同层次之间也可能会有冲突,如何最优化地协调与取舍也是一个关键问题;第三,当软件可信性成为研究目标之后,必然要针对“可信”性质建立分析、构造、度量、评价体系,使得可信性能够在软件生产活动中被有效地跟踪控制和验证实现。这也对现有的计算理论与技术体系提出了挑战。需要强调的是,要达到软件可信的目标,需要对软件系统开发的整个生命周期,包括需求分析、可信算法设计、软件设计与实现、测试与验证、运行维护等阶段进行全面、统一的研究。
软件定义安全
软件定义的信息安全(简称软件定义安全)是当前热门的信息安全话题。国际著名咨询公司 Gartner 将软件定义安全作为 2014 年十大信息安全技术之一发布,体现了软件定义安全问题在当前形势下的重要性。
传统的网络安全防护方法通常是根据网络的拓扑扑情况,以手动方式在安全域边界串联旁路部署安全设备,对进出安全域的流量进行监控。如果将这种与接入模式、部署方式紧耦合的防护方法沿用到复杂的网络环境(如物理与虚拟网络共存的数据中心)中,会存在诸多不适应性,例如,安全设备部署过程繁复;不能区别处理流经的流量;安全防护范围固化;安全设备成为单一故障点。
软件定义安全(Software Defined Security, SDS)是从软件定义网络(Software Defined Network, SDN)引申而来的。SDN 的基本思想是,把当前 IP 网络互连结点中决定报文如转发的复杂控制逻辑从交换机/路由器等设备中分离出来,以便通过软件编程实现硬件对数据转发规则的控制,最终达到对流量进行自由操控的目的。SDN 的核心理念是使网络软化并充分开放,从而使得网络能够像软件一样便捷、灵活,以此提高网络的创新能力。
SDS 是适应 SDN 复杂网络的安全防护新思想,基本原理是将物理及虚拟的网络安全设备预期接入模式、部署方式和实现功能进行解耦,底层抽象为安全资源池里的资源,顶层通过软件编程的方式进行智能化、自动化的业务编排和管理,以完成相应的安全功能,而实现一种灵活的安全防护。SDS 可以分解为软件定义流量、软件定义资源和软件定义威胁模型,三个举措环环环相扣,形成一个动态、闭环的工作模型。
- 软件定义流量:通过软件编程的方式来实现网络流量的细粒度定义及转发控制管理,通过将目标网络流量转发到安全设备上,实现安全设备的逻辑部署和使用。
- 软件定义资源:通过管理中心对安全资源进行统一注册、池化管理、弹性分配,在虚拟计算环境下,管理中心还要支持虚拟安全设备模板的分发和设备的创建。
- 软件定义威胁模型:对网络流量、网络行为和安全事件等信息进行自动化的采集、分析和挖掘,实现对未知的威胁甚至是一些高级安全威胁的实时分析和建模,之后自动用建模结果指导流量定义,实现一种动态、闭环的安全防护。
软件定义安全并不代表不再需要一些专门的信息安全硬件,这些仍然是必不可少的,只不过就像软件定义的网络一样,只是将价值和智能化转移到软件当中而已。
SDN 和由此基础上发展起来的 SDS,其基本思想都是不依赖于硬件设备,通过软件来实现系统的安全性,特别是可控性保障。从本质上说,软件安全关注的是实现软件产品安全性的全面质量保证的方法,而软件定义安全是实现分布式系统安全可控的一种有效方法。二者虽然都属于信息安全工程的范畴,但却是两个不同的发展方向。可以将二者结合起来,实现更高安全等级的系统安全。
【押题 ★★★★】软件安全思路和技术
确保软件安全的基本思路是什么?软件安全涉及的技术主要有哪些方面?
【省流版】
两种思路:
- 发现并修补漏洞;
- 尽量避免产生漏洞;
现有关于软件安全的技术主要包含三个方面:
- 软件安全属性认知;
- 信息系统安全工程;
- 软件安全开发。
【教材完整版】
两种思路:
- 发现并修补漏洞:采用多种检测、分析及挖掘技术对安全错误或是安全漏洞进行发现、分析与评价,然后采取多种安全控制措施进行错误修复和风险控制,如传统的打补丁、防病毒、防火墙、入侵检测和应急响应等。
这种将安全保障措施置于软件发布运行之时是当前普遍采用的方法。历史经验证明,该方法在时间和经济上投入产出比低,信息系统的安全状况很难得到有效改善。本章前面对于当前软件安全问题的现状分析表明了这点。
- 尽量避免产生漏洞:分析软件安全错误发生的原因,将安全错误的修正嵌入到软件开发生命周期的整个阶段。通过对需求分析、设计、实现、测试、发布及运维等各阶段相关的软件安全错误的分析与控制,以期大大减少软件产品的漏洞数量,使软件产品的安全性得到有效提高。
该方法是将安全保障的实施开始于软件发布之前,尤其强调从软件生命周期的早期阶段开始安全考虑,从而减少软件生命周期的后期系统运行过程中安全运维的工作量,提高安全保障效果。实践经验表明,从系统开发需求阶段就引入安全要素要比在系统维护阶段才考虑安全问题所花费的修复成本要低很多。
现有关于软件安全的技术主要包含三个方面:
软件安全属性的认知
安全是一个整体性的概念。根据国家标准《软件工程产品质量 第 1 部分 质量模型》(GB/T 16260.1-2006),软件安全既离不开它所存储、传输、处理的数据的安全,也离不开相关文档的安全,因此软件安全应涵盖数据及其信息处理过程本身的三个基本安全要素:保密性、完整性和可用性;同时软件需要接收外界信息输入才能实现预期的功能产生输出结果,信息来源的安全性必然成为软件安全重要的组成部分。基于这些分析,本书将保密性、完整性、可用性、认证性、授权和可审计性作为软件安全的核心属性;而软件自身的实现质量,即软件产品包含的漏洞情况也应该是软件安全性的主要内容,因为这些漏洞会直接导致安全性问题,这也是传统的软件安全关注的问题;此外,站在不同的管理者视角,抗抵赖性、可信性、可控性、可靠性及软件弹性等也成为软件被关注的其他安全属性。
系统安全工程
系统安全工程是一项复杂的系统工程,需要运用系统工程的思想和方法,系统地分析信息系统存在的安全漏洞、风险、事件、损失、控制方法及效果之间复杂的对应关系,对信息系统的安全性进行分析与评价,以期建立一个有效的安全防御体系,而不是简单的安全产品堆砌。
确切地说,系统安全工程是系统的安全性问题而不仅是软件产品的安全性问题,是一种普适性的信息系统安全工程理论与实践方法,可以用于构建各种系统安全防御体系。系统安全工程可以在系统生命周期的不同阶段对安全问题提供指导,例如,对于已经发布运行的软件,可以采用系统测试、风险评估与控制等方法构建安全防御体系;而对于尚待开发的系统,也可以应用系统安全工程的思想方法来提高目标系统的安全性。这是一项具有挑战性的工作,也是本书的出发点。
软件安全开发
漏洞是引发信息安全事件的根源,而软件漏洞又是在软件开发的整个生命周期中引入的。软件生命周期包括需求分析、可行性分析、总体描述、系统设计、编码、调试和测试、验收与运行、维护升级、废弃等多个阶段,每个阶段都要定义、审查并形成文档以供交流或备查,以此来提高软件的质量。虽然此类流程严格规范,但是由于开发过程中人员经验不足、开发平台客观条件等方面的原因,依然会引入各种类别的安全漏洞。因此,在软件开发的各个环节中进行漏洞的预防和分析,能够快速、高效地发现软件中的安全问题,减少其在后期带来更大的危害。
一些软件开发相关的机构和企业意识到了这一情况,纷纷在软件开发过程的各个阶段采取各种措施对开发的软件进行漏洞分析。微软、思科等公司推出的安全开发生命周期(Security Development Lifecycle, SDL)就是一套对软件开发过程进行安全保障的方案,旨在尽量减少设计、代码和文档中与安全相关的漏洞的数量。微软的实践证明,从需求分析阶段开始就考虑安全问题,可以大大减少软件产品漏洞的数量,而不会增加成本。
第二章-软件漏洞概述
【2024Fall 真题】软件漏洞的概念
试述软件漏洞的概念,谈谈软件漏洞与软件错误、软件缺陷、软件 Bug 的区别与联系。
【PPT】本书中并不对软件漏洞/脆弱点、软件缺陷以及软件错误等概念严格区分。
【教材】软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
软件错误(Error)是指在软件开发过程中出现的不符合期望或不可接受的人为差错,其结果将可能导致软件缺陷的产生。在软件开发过程中,人是主体,难免会犯错误。软件错误主要是一种人为错误,相对于软件本身而言,是一种外部行为。
软件缺陷(Bug/Defect)是指由于人为差错或其他客观原因,导致软件隐含能导致其在运行过程中出现不希望或不可接受的偏差,例如软件需求定义,以及设计、实现等错误。在这种意义下,软件缺陷和软件错误有着相近的含义。当软件运行于某一特定的环境条件时出现故障,这时称软件缺陷被激活。软件缺陷存在于软件内部,是一种静态形式。
软件故障(Fault)是指软件出现可感知的不正常、不正确或不按规范执行的状态。例如,软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失或非正常中断等现象。
软件失效(Failure)是指软件丧失完成规定功能的能力的事件。软件失效通常包含三方面的含义:软件或其构成单元不能在规定的时间内和条件下完成所规定的功能,软件故障被触发及丧失对用户的预期服务时都可能导致失效;一个功能单元执行所要求功能的能力终结;软件的操作偏离了软件需求。
为了简化理解,本书此处仅讨论软件错误(Error)和软件缺陷(Bug/Defect)。
ISO 和 NIST 对漏洞认识的 3 个共同特点:
- 持久性与时效性
- 广泛性与具体性
- 可利用性与隐蔽性
安全缺陷的相对性
为什么说安全缺陷或者说 Bug 是一个需要考虑具体环境、具体对象的概念?
PPT 没讲。
【押题 ★★★★★】软件漏洞的成因
试分析软件漏洞的成因
- 计算机系统结构决定了漏洞的必然性
- 软件件趋向大型化,第三方扩展增多
- 新技术、新应用产生之初即缺乏安全性考虑
- 软件使用场景更具威胁
- 对软件安全开发重视不够,软件开发者缺乏安全知识
软件漏洞管理
【押题 ★★★★】软件漏洞分类分级管理
软件漏洞如何分类分级管理?
软件漏洞分类:通常可以从漏洞利用的成因、利用的位置、和对系统造成的直接威胁进行分类。
- 基于漏洞成因的分类:内存破坏类、逻辑错误类、输入验证类、设计错误类和配置错误类。
- 基于漏洞利用位置的分类:
- 本地漏洞。即需要操作系统级的有效帐号登录到本地才能利用的漏洞,主要构成为权限提升类漏洞,即把自身的执行权限从普通用户级别提升到管理员级别。
- 远程漏洞。即无需系统级的帐号验证即可通过网络访问目标进行利用的漏洞。
- 基于威胁类型的分类:
- 获取控制。即可以导致劫持程序执行流程,转向执行攻击者指定的任意指令或命令,控制应用系统或操作系统。威胁最大,同时影响系统的机密性、完整性,甚至在需要的时候可以影响可用性。主要来源:内存破坏类。
- 获取信息。即可以导致劫持程序访问预期外的资源并泄露给攻击者,影响系统的机密性。主要来源:输入验证类、配置错误类漏洞。
- 拒绝服务。即可以导致目标应用或系统暂时或永远性地失去响应正常服务的能力,影响系统的可用性。主要来源:内存破坏类、意外处理错误类漏洞。
软件漏洞分级:对漏洞进行分级有助于人们对数目众多的安全漏洞给予不同程度的关注并采取不同级别的措施。
- 按照漏洞严重等级进行分级:
评级 定义 严重 利用此类漏洞,Internet 蠕虫不需要用户操作即可传播。 重要 利用此类漏洞可能会危及用户数据的机密性、完整性或可用性,或者危及处理资源的完整性或可用性。 中等 此类漏洞由于默认配置、审核或利用难度等因素大大减轻了其影响。 低 利用此类漏洞非常困难或其影响很小。
- 利用通用漏洞评分系统(CVSS)进行分级:依据对 3 种度量评价标准来对一个已知的安全漏洞危害程度进行打分。
- 基本度量用于描述漏洞的固有基本特性,这些特性不随时间和用户环境的变化而改变。
- 时间度量用于描述漏洞随时间而改变的特性,这些特性不随用户环境的变化而改变。
- 环境度量用于描述漏洞与特殊用户环境相关的特性。
软件漏洞管理标准
软件漏洞管理应当遵循怎样的标准?
遵循软件安全漏洞管理规范?
遵循国内标准和国际标准?
出题人要不要看看你在问什么 😅
软件漏洞的法律问题
软件漏洞买卖合法吗?软件漏洞应当如何管控?
没讲。
厂商发布漏洞信息的标准过程是怎样的?
没讲。
知识拓展:目前已有的漏洞库可以划分为国家级漏洞库、行业和民间级、软件厂商漏洞库 3 类。请访问以下漏洞库,试从所属机构、漏洞库名称、漏洞数据类型及数量、漏洞类型和相关产品等方面进行比较。
没讲。
第三章-Windows 系统典型漏洞分析(不考)
第四章-Web 漏洞分析
Web 基础知识
Web 三层架构
常用的 Web 三层架构是怎样的?
一次 Web 访问过程分析
当在浏览器的地址栏中输入一个完整的 URL,再按〈Enter〉键直至页面加载完成,整个过程发生了什么?
典型的 Web 安全漏洞
Web 威胁分类和变化
根据 OWASP 在 2013 发布的 Web 安全十大威胁报告,Web 漏洞分为哪几大类型?请将该报告与 2017 年发布的 Web 安全十大威胁进行对比分析,了解这几年来 Web 安全威胁有哪些新的变化和发展。
对比如下:
变化的主要原因:在过去的几年中,应用程序的基础技术和结构发生了重大变化,一些成熟的框架被大量使用,JS 框架(如 Angular、React)编写的单页应用程序,允许创建高度模块化的前端用户体验;原来交付服务器端处理的功能现在变为由客户端处理。
试将 Web 典型漏洞根据客户端和服务器端来划分,并根据漏洞原理阐述这样划分的理由。
TODO:PPT 没写,回头抄书。
SQL 注入漏洞
【押题 ★★★★】SQL 注入漏洞概述
简述 SQL 注入漏洞的原理?为什么 SQL 注入漏洞多年来一直名列 Web 安全漏洞的榜首?
(1)攻击者能够利用现有 Web 应用程序,将恶意代码当作数据插入查询语句或命令中,这些恶意数据可以欺骗解析器,从而执行非授权操作。
(2)
- SQL 注入攻击具有广泛性;
- SQL 注入攻击原理简单;
- 对 SQL 注入漏洞的防范困难,因为其攻击内容往往是正常输入的一部分。
【押题 ★★★★】防范方法
防范 SQL 注入漏洞的基本方法有哪些?重点谈谈在代码开发层面的安全措施。
- 代码层漏洞防护
- 采用强类型语言,如 Java、C#。
- 尽可能避免使用拼接的动态 SQL 语句,所有的查询语句都使用数据库提供的参数化查询接口。参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。
- 在服务端验证用户输入的值和类型是否符合程序的预期要求。
- 在服务器端对用户输入进行过滤。
- 避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
- 加固应用程序服务器和数据库,利用最低权限账户与数据库连接。
- Web 安全开发中应当遵循安全规范,例如 OWASP 企业安全应用程序接口(The OWASP Enterprise Security API,OWASP ESAPI)。
- 使用专业的漏洞扫描工具进行安全性测试
- 应当在 Web 应用程序开发过程的所有阶段实施代码的安全检查,在开发和部署 Web 应用的前后,应利用专业的漏洞扫描工具对网站进行安全性测试,对检测出的 SQL 注入漏洞及时修补。
- SQLMap(http://sqlmap.sourceforge.net)
- Pangolin(中文译名“穿山甲”)
SQL 盲注
什么是 SQL 盲注?它与一般的 SQL 注入有什么区别?
没讲。
【2024Fall 真题】跨站漏洞
简述 XSS 跨站脚本漏洞的原理。
TODO:看不懂,回头整理。
CSRF 跨站请求伪造漏洞
简述 CSRF 跨站请求伪造漏洞的原理,并比较其与 XSS 漏洞的不同。
没讲。
什么是命令执行漏洞?什么是文件包含漏洞?什么是文件上传漏洞?
没讲。
第五章-软件安全开发模型
软件开发模型
软件生命周期
什么是软件的生命周期?软件生命周期通常包括哪几个阶段?
软件生命周期划可分成 3 个时期 8 个阶段
- 软件定义时期
- 通常进一步划分成 3 个阶段,即问题定义、可行性研究和需求分析。
- 这个时期的工作通常又称为系统分析,由系统分析员负责完成。
- 软件开发时期
- 通常由 4 个阶段组成:总体设计,详细设计,编码和单元测试,综合测试。
- 前两个阶段又称为系统设计,后两个阶段又称为系统实现。
- 软件维护时期
- 软件维护时期的任务是,使软件持久地满足用户的需要:
- 当软件在使用过程中发现错误时应该加以改正;
- 当环境改变时应该修改软件以适应新的环境;
- 当用户有新要求时应该及时改进软件以满足用户的新需要。
事实上,在实际从事软件开发工作时,根据软件规模、种类、开发环境及开发时使用的技术方法等因素,这些阶段的划分都会有所不同。
软件过程与软件开发模型
什么是软件过程?什么是软件开发(过程)模型?为什么从 20 世纪 90 年代以后,人们更多使用“软件过程”来替代传统的“软件开发模型”?
所谓软件过程,是指为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。
通常使用软件生命周期模型简洁地描述软件过程。软件生命周期模型规定了把生命周期划分为哪些阶段及各个阶段的执行顺序,因此,也称为软件过程模型。
为了强调软件开发者在软件过程中对于确保软件安全的主导地位和重要作用,本书仍沿用“软件过程模型”的传统叫法——“软件开发模型”。
软件开发模型(Software Development Model)是跨越整个软件生存周期的系统开发、运行和维护所实施的全部工作和任务的结构框架,它给出了软件开发活动各阶段之间的关系。
典型的软件开发模型
有哪些典型的软件开发模型?这些软件开发模型有什么区别与联系?
不是课程内容。
8 种典型的软件开发模型:
- 瀑布模型(Waterfall Model)
- 快速原型模型(Rapid Prototype Model)
- 增量模型(Incremental Model)
- 螺旋模型(Spiral Model)
- 喷泉模型(Fountain Model)
- Rational 统一过程(Rational Unified Process,RUP)
- 极限编程和敏捷开发(eXtreme Programming & Agile Development)
- 微软过程(Microsoft Process)
软件安全开发模型
微软的软件安全开发生命周期模型 SDL
【押题 ★★★★★】SD3+C 原则
SD3+C 原则是 SDL 模型实施的基本原则,试简述其内容。
- 安全设计(Secure by Design)。在架构设计和实现软件时,需要考虑保护其自身及其存储和处理的信息,并能抵御攻击。
- 安全配置(Secure by Default)。在现实世界中,软件达不到绝对安全,所以设计者应假定其存在安全缺陷。为了使攻击者针对这些缺陷发起攻击时造成的损失最小,软件在默认状态下应具有较高的安全性。例如,软件应在最低的所需权限下运行,非广泛需要的服务和功能在默认情况下应被禁用或仅可由少数用户访问。
- 安全部署(Security by Deployment)。软件需要提供相应的文档和工具,以帮助最终用户或管理员安全地使用。此外,更新应该易于部署。
- 沟通(Communication)。软件开发人员应为产品漏洞的发现准备响应方案,并与系统应用的各类人员不断沟通,以帮助他们采取保护措施(如打补丁或部署变通办法)。
SDL 模型和其他模型
微软的 SDL 模型与传统的瀑布模型的关系是怎样的?
SDL 模型是由软件工程的瀑布模型发展而来,是在瀑布模型的各个阶段添加了安全活动和业务活动目标。
【押题 ★★★★】【2024Fall 真题】敏捷 SDL
什么是敏捷 SDL?敏捷 SDL 和经典 SDL 的主要区别是什么?
很多软件产品开发的时间都很紧迫,一般 Web 项目开发可能只有 2~3 周的时间,采用完整的 SDL 开发流程显然不切实际,需要更简洁快速的软件安全开发方法。为此,微软对 SDL 进行调整,使其能够快速利用敏捷开发流程更好地实现安全需求,这就是敏捷 SDL。
敏捷 SDL 与典型 SDL 的差别主要有两点:
- 敏捷 SDL 不采用传统的瀑布模型而是采用无阶段的迭代开发模型,以实现软件版本的快速更新和发布。
- 在敏捷 SDL 中,并不是每个发布版本(或每次“突击发布”)都需要达到所有的要求。
试从软件各个开发阶段所进行活动的角度,对几种软件安全开发模型进行对比分析。
TODO:题目太大,回头再说。
第六章-软件安全需求分析
软件需求分析
为什么要进行需求分析?通常对软件系统有哪些需求?
不是课程内容。没想到这么多年过去了匡匡还在折磨我。
基本任务是准确地描述“系统必须做什么”这个问题。
通常对软件系统的综合要求:
- 功能需求
- 性能需求
- 可靠性和可用性需求
- 出错处理需求
- 接口需求
- 约束
- 逆向需求
- 将来可能提出的要求
【押题 ★★★★★】软件安全需求分析
为什么要进行安全需求分析?通常对软件系统有哪些安全需求?
(1)目的:描述为了实现信息安全目标,软件系统应该做什么,才能有效地提高软件产品的安全质量,减少进而消减软件安全漏洞。
(2)【教材 $\S 1.3$】软件安全具有信息安全三大基本属性 CIA:保密性、完整性、可用性。
其他属性:可认证性、授权、可审计性、抗抵赖性、可控性、可存活性等。
每一个性质都是一种安全需求。
软件安全需求分析的主要工作是什么?它和软件需求分析有什么区别与联系?
(1)主要工作:
- 首先确定目标系统的业务运行环境、规则环境以及技术环境;
- 然后在了解各类软件安全需求内容的基础上,通过一定的安全需求获取过程,对软件应该包含的安全需求进行分析;
- 对于如何实现这些安全需求将在软件安全设计和开发部分进行讨论。
(2)软件安全需求分析与软件需求分析的联系
- 软件安全需求是软件需求的一个必要组成部分。安全需求应该与业务功能需求具有同样的需求水平,并对业务功能需求具有约束力。
- 传统的周边安全方法所提供的安全保证不足以抵御无处不在的安全威胁,应用软件本身应该被设计为能够感知安全风险,并对安全问题具有自主控制和自我防御的能力,因此,将安全需求作为业务功能同样重要的系统需求来处理已经成为一种必然的趋势。
- 在实际开发过程中,需求文档中常常提到安全需求,但是通常只是简单地提及安全机制。
- 部分需求文档中包含安全需求分析,但是安全需求分析过程与功能需求没有联系起来,这导致安全需求最终实现的保护形同虚设。
- 在审查需求文档时,已存的安全需求通常是从一组通用的安全需求特征列表中复制其中一部分。
- 一方面开发人员经常被灌输着在需求分析阶段就融入安全分析很重要的思想,而另一方面安全需求分析开发人员却没有掌握真正有效的安全需求分析方法
(3)软件安全需求分析与软件需求分析的区别
- 客观性:
- 安全需求并不是从使用者的要求和兴趣出发,而是由系统的客观属性所决定的。因此,需求分析员将承担更多软件需求的分析工作。
- 用户对于软件即将面临的使用对象、使用环境的考虑通常不会包括那些恶意用户和不可控环境,因此,他们对于安全威胁的了解往往不全面,也很难从专业角度提出安全需求。这时,需求分析员就需要承担软件安全需求分析的主要工作。
- 系统性:
- 软件安全需求分析不能只从软件本身出发,必须从系统角度进行分析。
- 软件属于逻辑产品,很多情况下并不是软件失效,而是在软件正常工作时,在某种特殊条件下软硬件相互作用,以及由于人的使用问题而导致不安全情况发生。
- 凡是与软件相关的接口、硬件状态、硬件故障和系统时序、人员操作、使用环境,包括软件自身的逻辑和物理模型、处理的静态动态数据,均属于软件安全性需求分析的范畴。
- 分析的重点为软件功能设计缺陷,以及软件使用过程中软件、硬件和操作人员的相互作用。
- 软件开发的每一个阶段都需要持续地对安全需求进行充分的定义和管理,这些安全需求应该作为与软件功能、质量和可用性同等重要的需求来处理,并且对那些残余风险需要遵从相关约束的安全需求也应该明确定义。
- 从系统角度分析软件的安全性需求,这就不可避免地会涉及到各种不同领域的专业知识与经验积累。因此,分析时应以人为主,任何软件分析工具只能起辅助作用。
- 这就对软件安全性分析人员提出了较高的要求。分析时要求有专门知识的软件安全性分析人员、熟悉系统结构的系统总体设计人员、软件设计人员、领域专家参加,共同工作。
- 经济性和适用性:
- 软件安全的需求内容非常丰富,并不是所有的应用安全需求控制都要采纳和实施。
- 组织应当根据具体业务的重要性,对安全措施进行成本控制。安全控制的成本应该与软件所有者或者管理部门要求的目标水平相当。
- 信息安全等级保护制度是我国信息安全保障体系建设的一项基本制度,对不同等级的信息系统提出相应的安全要求,要求不同等级的信息系统应具备相应的基本安全保护能力。
软件安全需求的来源
为什么说软件安全需求更多地来源于遵从性需求?
软件需求分析中,分析员和用户都起着关键的、必不可少的作用。然而,在软件安全性需求分析中,软件用户由于安全知识的缺乏,很难从专业角度提出安全需求。因此,软件安全需求更多地来自于对组织内部和外部的一些安全政策和标准的遵从。
本章中介绍的安全需求遵从性标准有哪些类别,它们之间有何联系与区别?
信息安全标准从适用地域范围可以分为:国际标准、国家标准、地方标准、区域标准、行业标准和企业标准。
信息安全标准从涉及的内容可以分为:信息安全体系标准、信息安全机制标准、信息安全测评标准、信息安全管理标准、信息安全工程标准、信息系统等级保护标准以及信息安全产品标准等类别。
联系和区别:TODO
我国为什么要实行网络安全等级保护制度?网络安全保护能力划分为哪些等级?具体每个等级有什么要求?
(1)对信息安全分级保护是客观需求。信息系统的建立是为社会发展、社会生活的需要而设计、建立的,是社会构成、行政组织体系及其业务体系的反映,这种体系是分层次和级别的。因此,信息安全保护必须符合客观存在。
等级化保护是信息安全发展规律。按组织业务应用区域、分层、分类、分级进行保护和管理,分阶段推进等级保护制度建设,这是做好国家信息安全保护必须遵循的客观规律。
等级保护是国家法律和政策要求。
- 1994 年国务院颁布的《中华人民共和国计算机信息系统安全保护条例》规定:“计算机信息系统实行安全等级保护,安全等级的划分标准和安全等级保护的具体方法,由公安部会同有关部门制定”。
- 2017 年 6 月 1 日起实施的《中华人民共和国网络安全法》第 21 条明确规定:“国家实行网络安全等级保护制度,要求网络运营者应当按照网络安全等级保护制度要求,履行安全保护义务”;第 31 条规定“对于国家关键信息基础设施,在网络安全等级保护制度的基础上,实行重点保护”。
- 《网络安全法》规定国家实行网络安全等级保护制度,标志着从 1994 年国务院颁布的《中华人民共和国计算机信息系统安全保护条例》上升到国家法律;
- 标志着国家实施十余年的信息安全等级保护制度进入 2.0 阶段;
- 标志着以保护国家关键信息基础设施安全为重点的网络安全等级保护制度依法全面实施。
(2)没讲
(3)没讲
对网络安全等级划分通常有两种描述形式,即根据安全保护能力划分安全等级的描述,以及根据主体遭受破坏后对客体的破坏程度划分安全等级的描述这两种形式。试谈谈这两种等级划分的对应关系。
没讲。
简述网络等级保护与信息安全管理体系的联系和区别。
信息安全管理体系是站在管理的角度上对信息进行管理,而等级保护则是管理体系中的一部分,是基础性的工作,两者在管理目标上具有一致性,而且还有相辅相成的作用。
- 工作重点不同。
- 所依据的标准不同。
- 实施对象不同。
软件安全需求的获取
软件安全需求获取相关方
软件安全需求获取过程中涉及哪些相关方人员?他们各自主要的职责是什么?
(1)软件安全需求获取相关方
- 业务负责人、最终用户、客户、安全需求分析人员、安全技术支持等。
- 为了保证安全需求获取活动有效地开展,相关方面的人员必须进行充分的沟通与合作,特别当相关方是非技术/业务人员的情况下。
- 由于每个人对于安全需求的重要性认识不同,软件安全需求获取活动将是一项具有挑战性的工作。
(2)各自职责:现编就行。
软件安全需求获取方法
软件安全需求的获取方法有哪些?
- 头脑风暴(Brain-storming)
- 问卷调查和访谈
- 策略分解
- 数据分类在数据生成(即创建)和使用(即加工)、传输、存储和存档这一生命周期中,都需要采取适当的保护机制。根据数据的重要性来进行分类,实际上也就是根据数据的敏感级,同时根据对数据泄露、变更或破坏的影响,有意识地为数据资产分配标签,以此来确定保护数据资产的不同安全保护需求和控制方法。根据数据的重要度分级保护,可以降低数据保护的成本,使数据保护的投资—回报率最大化。
- 主/客体关系矩阵采用主/客体关系矩阵来刻画一个基于使用用例的主/客体之间的操作关系。主/客体关系矩阵是角色和组件的二维表示,主体(角色)作为列,客体(对象/组件)作为行。当主/客体关系矩阵产生后,与主/客体关系矩阵所允许的对应动作相违背的事件就可以判定为威胁,在此基础之上可以确定安全需求。这一方法在确定软件安全认证性、授权需求的时候最为有用。
- 使用用例和滥用案例建模一个使用用例模型可以描述软件或系统的预期行为,而预期行为描述了完成业务功能所需要的行为和事件的顺序。通过清楚地描述什么时间和在什么条件下会发生某些行为,可以有效地确定业务需求,包括安全需求。从使用用例出发,可以开发滥用案例。滥用案例可以通过对负面场景进行建模来帮助确定安全需求。
- 软件安全需求跟踪矩阵通过数据分类、使用用例和滥用案例建模、主/客体关系矩阵以及其他需求获取过程,可以将软件安全需求编制成一个需求列表或需求跟踪矩阵(Requirement Traceability Matrix,RTM)。一个通用的 RTM 是一个信息列表,可以采用管理决策理论的 Zachman 框架来描述。
【2024Fall 真题】策略分解
软件安全需求的获取方法中的策略分解是指什么?
策略分解:
- 将组织需要遵守的内部和外部政策,包括外部法律法规、隐私和遵从性命令分解成为详细的安全需求。
- 策略分解过程是一个连续的和结构化的过程。
- 在分解过程中往往会出现很多歧义。因此,需要关注策略定义范围并谨慎实施分解过程,以确保分解过程是客观的、符合安全策略的,而不是某个人主观上的意见。
数据分类
软件安全需求的获取方法中的数据分类是指什么?
在数据生成(即创建)和使用(即加工)、传输、存储和存档这一生命周期中,都需要采取适当的保护机制。
根据数据的重要性来进行分类,实际上也就是根据数据的敏感级,同时根据对数据泄露、变更或破坏的影响,有意识地为数据资产分配标签,以此来确定保护数据资产的不同安全保护需求和控制方法。根据数据的重要度分级保护,可以降低数据保护的成本,使数据保护的投资—回报率最大化。
针对信息系统中的数据生命周期,通常应当考虑的安全需求有哪些?
应该不考吧?
软件安全需求的获取方法中的主/客体关系矩阵是指什么?
采用主/客体关系矩阵来刻画一个基于使用用例的主/客体之间的操作关系。
主/客体关系矩阵是角色和组件的二维表示,主体(角色)作为列,客体(对象/组件)作为行。当主/客体关系矩阵产生后,与主/客体关系矩阵所允许的对应动作相违背的事件就可以判定为威胁,在此基础之上可以确定安全需求。
这一方法在确定软件安全认证性、授权需求的时候最为有用。
第七章-软件安全设计
软件设计阶段的主要工作
软件设计阶段的主要工作是什么?
软件设计可以看作是从软件需求规格说明书出发,根据需求分析阶段确定的功能,设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法等内容,形成软件的具体设计方案,即从整体到局部,从总体设计(也有称为概要设计)到详细设计的过程。
从工程管理的角度,软件设计可以分为总体设计和详细设计两个子阶段。
目前采用的很多软件开发方法,例如面向对象方法,其设计过程从概念模型逐步精化到实现模型,并且不断进行迭代,设计过程很难用总体设计和详细设计进行明确的区分。
所以,再从技术的角度看软件设计阶段的主要工作,包括:软件架构设计、界面接口设计、模块/子系统等构件设计、数据模型设计、过程/算法设计以及部署设计等。
软件安全设计阶段的主要工作
软件安全设计阶段的主要工作是什么?
没讲
软件架构安全性设计
为什么要进行软件架构设计?软件架构设计的主要工作是什么?软件架构安全性设计的主要工作是什么?
(1)没讲
(2)没讲
(3)
- 首先需要进行系统描述,包括系统功能、安全要求、系统部署和技术需求,确定软件系统的安全级别。
- 接着,设计软件网络、数据库等应具备的安全功能,根据软件具体安全需求的不同,设计的安全功能包括加密、完整性验证、数字签名、访问控制以及安全管理等等。
- 在架构安全设计过程中,还需要解决软件安全功能的易用性、可维护性和独立性问题。
软件架构安全性分析
为什么要进行软件架构安全性分析?软件架构安全性分析的基本过程是什么?
(1)没讲
(2)分析过程:首先进行架构建模,然后根据软件的安全需求描述或相关标准,对架构模型是否满足进行检查,如果不满足,需要修改设计架构,如此反复,直至满足所有安全需求和相关标准。
软件安全设计原则
【押题 ★★★★★】减少软件受攻击面原则
软件受攻击面是指什么?举例说明软件设计时可以采取哪些策略来降低受攻击面。
软件受攻击面是指,用户或其他程序以及潜在的攻击者都能够访问到的所有功能和代码的总和,它是一个混合体,不仅包括代码、接口、服务,也包括对所有用户提供服务的协议,尤其是那些未被验证的或远程用户都可以访问到的协议。
一个软件的攻击面越大,安全风险就越大。减少软件受攻击面就是去除、禁止一切不需要使用的模块、协议和服务,其目的是减少攻击可以利用的漏洞。
举例:
- 重要性低的功能可取消;
- 重要等级为中的功能可设置为非默认开启,需要用户配置后才予以开启;
- 重要性高的功能则关闭或增加一些安全措施进行限制。
- 重用那些经过测试、已证明安全的现有库和通用组件,而不是用户自己开发的共享库。
- 苹果公司的 iOS 不支持 Java 和 Flash,一个重要原因就是相对于 Mac OS X(或其他智能手机)减小了 iOS 的受攻击面。
【押题 ★★★★】【2024Fall 真题】最小授权原则
什么是最小授权原则?试举例说明软件设计时哪些措施是采用了最小授权原则。
最小授权原则是指,系统仅授予实体(用户、管理员、进程、应用和系统等)完成规定任务所必需的最小权限,并且该权限的持续时间也尽可能短。
举例:
- 将超级用户的权限划分为一组细粒度的权限,分别授予不同的系统操作员/管理员。对管理员账户分配安全资源的访问权限也要设置为受限访问,而不是超级用户权限。
- 采用高内聚、低耦合的模块化编程方法,也就是模块之间的依赖关系是弱链接(低耦合),每一个模块只负责执行一个独立的功能(高内聚)。
- Windows 系统用户账户控制(User Account Control,UAC),实际上就是最小授权原则的运用。
【押题 ★★★★】权限分离原则
什么是权限分离原则?试举例说明软件设计时哪些措施是采用了权限分离原则。
权限分离原则在软件设计中是指,将软件功能设计为需要在两个或更多条件下才能实现,以防止一旦出现问题,整个软件都可能面临风险。
实际上这一原则也是最小权限原则的一种体现。举例:清晰的模块划分,将风险分散到各个模块中。不允许程序员检查自己编写的代码。Linux 将敏感操作(如超级用户的权利)分成 26 个特权,由一些特权用户分别掌握这些特权,每个特权用户都无法独立完成所有的敏感操作。
软件安全功能设计
针对第 6 章介绍的核心安全需求,软件安全功能设计通常有哪些内容?
考虑如何将这些安全需求纳入到软件架构和设计方案中,将它们转化为可实现的功能组件,具体包括保密性、完整性、可用性、认证性、授权和可记账性等核心安全需求的设计,以及其他相关安全需求设计。
基于安全模式的软件安全设计
什么是软件设计模式?有哪些软件设计模式?
设计模式:
- 是对软件设计中普遍存在、反复出现的各种问题,根据多次处理的经验,提出的一套能够快速、准确响应此类问题的解决方案。设计模式描述在各种不同情况下,应如何解决共性问题。
- 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
什么是安全模式?为什么说能够利用安全模式来快速、准确地进行软件安全设计?
(1)安全模式:
- 是在给定的场景中,为控制、阻止或消减一组特定的威胁而采取的通用解决方案。该解决方案需要应对一系列的问题,并且可以使用 UML 类图、时序图、状态图和活动图等进行表述。
- 安全模式封装了反复出现的系统问题的解决方案,同时精确地表述了系统要求和解决方案。
- 采用模式的系统架构描述比较容易让人看懂,也为设计和分析提供了指南,还定义了使架构更安全的方法。
- 安全模式使得不具备专业安全知识的应用开发人员也可以使用安全措施。
(2)没讲。
试给出一种利用安全模式进行软件安全设计的方法。
没讲。
威胁建模
什么是威胁建模?试简述威胁建模的过程。
(1)在实际生活中,人们常常进行着威胁建模。比如,在离家外出时会提醒自己,家中的门窗有没有关好,以免小偷光顾;家中的水电气有没有关好,以免发生意外。
在软件系统中也需要做这样的思考,也就是即将开发完成的软件系统会面临哪些安全威胁,由此可在接下来的软件设计和软件实现等环节中来防范每一个安全威胁。
本书试图给出这样的一个解释,软件威胁建模是指,通过抽象的概念模型对影响软件系统的威胁进行系统地识别和评价。
(2)没讲。
为什么说组织自身的威胁建模能力水平对提升组织的整体安全保障能力起到至关重要的作用?
没讲,现编。
采用威胁建模方法,可以系统性地分析其架构、软件体系和程序部署,分析网络和信息系统可能面临的潜在威胁,确认有哪些攻击面,之后提出有针对性的安全防范措施,这才是有效解决网络安全对抗的良策。
威胁评估
在威胁排序的几种计算方法中,为什么说相比 Delphi 法和平均排序法,$P \times I$ 排序方法更科学?
- Delphi 排序:由威胁建模团队的每一个成员给出他/她对特定威胁的风险水平的最佳估计值
- 平均排序:即 DREAD 法,通过计算这些值的平均值给出风险排序
- 概率 × 影响因子排序:由风险发生的概率(可能性)和威胁对业务产生的可能影响而得出。
- 风险=事件发生的概率 × 商业影响
- 即:风险=(R 值+ E 值+ DI 值)×(D 值+ A 值)
第八章-软件安全编码
软件安全编码概述
软件安全编码阶段的主要工作有哪些?
- 选择安全的编程语言
- 版本(配置)管理
- 代码检测
- 安全编译
开发语言的安全性
什么是类型安全语言?哪些程序开发语言是类型安全的?
(1)没讲
(2)C 语言不是类型安全语言,C# 和 Java 是类型安全的。
【2024Fall 真题】安全编译
安全编译是指在代码编译阶段采取的哪些安全措施?
- 采用最新的集成编译环境,并选择使用这些编译环境提供的安全编译选项和安全编译机制。如在 VS 中编译时,开启/GS 选项对缓冲区的安全进行检查。
- 在一个安全的环境中进行。例如:对代码编译系统实施安全访问控制;使用访问控制列表防止未授权用户的访问;使用软件版本控制方法;尽量使用自动化编译工具和脚本。
- 对应用环境的真实模拟。
- 多样化编译技术应用。
【押题 ★★★★★】安全编码原则
试列举几条安全编码原则,并举例说明这些原则的重要意义。
答题思路与 $\S 7.3$ 软件安全设计原则一致。
CERT 安全编码建议:
- 验证输入(Validate input)
- 留意编译器警告(Heed compiler warnings)
- 安全策略的架构和设计
- 保持简单性(Keep it simple)
- 默认拒绝(Default deny)
- 坚持最小权限原则(Adhere to the principle of least privilege)
- 清洁发送给其他系统的数据(Sanitize data sent to other systems)
- 纵深防御(Practice defense in depth)
- 使用有效的质量保证技术(Use effective quality assurance techniques)
- 采用安全编码标准(Adopt a secure coding standard)
其他安全编码原则:
- 最少反馈
- 检查返回
C 语言安全编码
为什么要避免使用 C 语言中原有的字符串函数?所谓的安全字符串函数解决了原有 C 字符串函数的什么安全漏洞?
没讲。
Java 语言安全编码
Java 提供的沙箱安全机制的核心思想是什么?
没讲。
试谈谈 Java 提供的安全机制。
第九章-软件安全测试(不考)
第十章-软件安全部署(不考)
第十一章-恶意代码分析基础(不考)
第十二章-恶意代码防治
恶意代码机理分析
试解释以下与恶意代码程序相关的计算机系统概念,以及各概念之间的联系与区别:进程、线程、动态链接库、服务、注册表。
没讲。
从危害、传播、激活和隐藏 4 个主要方面分析计算机病毒、蠕虫、木马、后门、Rootkit 及勒索软件这几类恶意代码类型的工作原理。
题目太大了,我猜不考。
【押题 ★★★★★】病毒和蠕虫的区别
病毒程序与蠕虫程序的主要区别有哪些?
- 漏洞利用型蠕虫与病毒根本区别在于其是否需要人为干预来触发传播,而在很多其他方面,例如个体独立性、破坏性、隐藏性等,二者区别并不大。
- 计算机病毒的关键技术是伪装,通过诱导、欺骗用户的手段引导用户的误操作从而实现感染,用户的行为直接决定病毒的感染是否成功。
- 蠕虫在其感染过程中并不需要用户的主动行为,其感染过程是一种自动化、智能化的过程。
- 蠕虫的重要特征:对用户的非依赖性。而实现这一功能的基础便是系统漏洞。
【2024Fall 真题】Rootkit
什么是 Rootkit?它与木马和后门有什么区别与联系?
目前通常所说的 Rootkit 是指:一类木马后门工具,通过修改现有的操作系统软件,使攻击者获得访问权限并隐藏在计算机中。
勒索软件
什么是勒索软件?为什么勒索软件成为近年来数量增长最快的恶意代码类型?
勒索软件是黑客用来劫持用户资产或资源并以此为条件向用户勒索钱财的一种恶意软件。
面向恶意代码检测的软件可信验证
恶意代码防范的基本措施包括哪些?
TODO:PPT 没有明确答案,待整理。
第十三章-开源软件及其安全性
开源软件概述
试从软件的权益处置角度,谈谈对商业软件、免费软件、共享软件(或试用软件)、闭源软件、自由软件及开源软件概念的理解。
没讲。
自由软件赋予软件使用者哪些“自由”?
没讲。
【押题 ★★★★★】开源软件 vs. 自由软件
试简述开源软件与自由软件的联系与区别。
联系:开源软件由自由软件发展而来。两者都具有同一种理想主义的色彩,即无论是保证软件的自由,还是强调可用性,追求开发可以为更多的人使用、学习和改进的软件这一理想始终不会改变。
区别:
- 概念不同:自由软件是一个比开源软件更严格的概念,因此所有自由软件都是开放源代码的,但不是所有的开源软件都能被称为自由软件。只有遵守 GPL 和 BSD 许可证的开源软件才符合自由软件的定义。BSD 和 Apache 等许可证与 GPL 等 Copyleft 型的许可证有很大区别,它们对软件的衍生和再发布的约束十分宽松,这样大大减少了商业公司在使用和参与开源软件时的顾虑。
- 价值观不同:在追求自由、分享精神的过程中,自由软件始终将自由作为道德标准,而开源软件则更加注重软件的发展。自由软件最重要的特点是,从许可证即法律角度保证了自由软件在演化过程中将始终保持其“自由性”,从而保证了其任何版本都可以为任何人使用、学习和改进。斯托曼认为使用软件专利是非常不道德的事情,只有自由的程序才是符合其道德标准的。斯托曼并不认同开源软件,仍然觉得自由软件更能体现他所倡导的自由使用、修改、共享和发布软件的思想(http://www.gnu.org/philosophy/open-source-misses-the-point.html)。
开源软件则更加注重与软件产业的结合,对商业化更加友好,希望用各种方式来发展软件本身。开源软件的思想首先考虑的是如何发展软件,让更多的人来使用软件,而不是先去保证软件在演化过程中的开源性。
【2024Fall 真题】开源软件的知识产权
所开发的软件中使用了带 GPL 许可证的开源软件,那么这个软件是不是就要开源?
是的。GNU 通用公共许可证(GNU General Public License,GPL)。只要在一个软件中使用(“使用”指类库引用,修改代码或者衍生代码)GPL 许可证产品,则该软件产品必须也采用 GPL 许可证,即必须也是开源和免费的,这就是所谓的“传染性”。这就是说,GPL 不允许修改后和衍生的代码做为闭源的商业软件发布和销售。
第十四章-软件知识产权保护
软件知识产权的法律保护
【押题 ★★★★★】软件知识产权保护途径
我国对于软件的知识产权有哪些法律保护途径?
- 《计算机软件保护条例》
- 《中华人民共和国专利法》
- 《商业秘密所有权保护规定》
- 《中华人民共和国商标法》
- 《互联网著作权行政保护办法》
- 《信息网络传播权保护条例》
- 《移动互联网应用程序信息服务管理规定》
软件界侵权行为
根据我国法律,软件著作权人有哪些权利?在日常学习和生活中,有哪些违反软件著作权的行为?
没讲。
【2024Fall 真题】软件版权
试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?
TODO:没细讲,待整理。
软件版权保护的目标有哪些?它与软件保护的目标有什么联系与区别?
(1)
- 防软件盗版,即对软件进行防非法复制和使用的保护。
- 防逆向工程,即防止软件被非法修改或剽窃软件设计思想等。
- 防信息泄露,即对软件载体及涉及数据的保护,如加密硬件、加密算法的密钥等。
(2)没讲。