文章

南京大学软件学院-2025Fall-软件安全(研究生)期末复习参考

南京大学软件学院-2025Fall-软件安全(研究生)期末复习参考

说明:

  • 本指南基于《软件安全技术》(陈波 著)、《软件安全》课程课件(伏晓)以及软件安全领域的通用核心知识点整理而成。
  • 部分内容使用AI生成,仅供参考。
  • 感谢往年学长/学姐的博客支持:EagleBear 2022的博客
  • 【2024FALL 真题】参考EagleBear 2022的博客的整理。
  • 【2025FALL】为今年考完回顾标记的,应该不会有错。

考试范围: 第1、2、3、5、6、7、8、12、13、14章 考试形式: 10道问答题,每章1题


第一章、软件安全概述

1.【2024Fall 真题】什么是零日(0 day)漏洞和零日(0 day)攻击?

  • 零日漏洞:指未被公开披露的软件漏洞,没有给软件的作者或厂商以时间去为漏洞打补丁或是给出建议解决方案,从而攻击者能够利用这种漏洞破坏计算机程序、数据及设备。
  • 零日攻击:指利用零日漏洞开发攻击工具进行的攻击。

2.为什么必须对软件安全给予强烈关注?

  • 背景:软件已经渗透到社会、经济与国防建设的方方面面,是信息时代所依赖的重要技术与手段,其安全直接关系到国计民生与国家安全,因此,软件安全关乎到国家竞争力。
  • 问题:软件漏洞普遍存在,零日漏洞成为主要威胁。
  • 结论:安全漏洞是软件产生安全问题的根源,漏洞发现是软件安全的基础工作,软件安全体系的建立是以漏洞为核心展开的,对漏洞的掌控能力是衡量一个国家信息安全水平的重要因素。

3.零日漏洞威胁实际上反映了软件系统存在的什么问题?

零日漏洞威胁实质上反映了软件系统在设计、开发和维护过程中不可避免地存在安全缺陷,以及现有安全防护和漏洞发现机制具有滞后性的问题

由于软件复杂度高、代码规模大,难以在发布前发现并消除所有安全漏洞,使得攻击者可以在漏洞尚未被公开和修补之前加以利用,从而对系统安全构成严重威胁。

总之,零日漏洞的存在说明当前软件系统的安全性是相对的而非绝对的,安全防护更多依赖事后修补而非事前消除

4.根据本书的介绍,软件安全威胁可以分为哪几类?

本书将软件面临的安全威胁分为 3 大类:软件自身的安全(软件漏洞)、恶意代码以及软件侵权。

5.试谈谈对软件漏洞的认识,举出软件漏洞造成危害的事件例子

软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。一方面,软件漏洞可能会造成软件在运行过程中出现错误结果或运行不稳定、崩溃等现象,甚至引起死机等情况;另一方面,软件漏洞会被黑客发现和利用,进而实施窃取隐私信息、甚至破坏系统等攻击行为。

震网病毒便是利用软件漏洞实施的攻击,它利用了 Windows 操作系统及西门子工业控制软件中的多个零日漏洞,通过 U 盘和局域网等方式进行传播。震网病毒导致了伊朗核计划拖后了2年。

【2025FALL】6.什么是恶意代码?除了传统的计算机病毒,还有哪些恶意代码类型?

恶意代码是在未被授权的情况下,以破坏软硬件设备、窃取用户信息、干扰用户正常使用、扰乱用户心理为目的而编制的软件或代码片段。

恶意代码是软件或代码片段,其实现方式可以有多种,如二进制执行文件、脚本语言代码、宏代码或是寄生在其他代码或启动扇区中的一段指令。

除了传统的计算机病毒,恶意代码还可以是蠕虫、木马、后门、间谍软件、流氓软件、僵尸网络、网络钓鱼等

7.针对软件的版权,有哪些侵权行为?

常见软件侵权行为:

  1. 未经软件著作权人许可,发表、登记、修改、翻译其软件;
  2. 将他人软件作为自己的软件发表或者登记,在他人软件上署名或者更改他人软件上的署名;
  3. 未经合作者许可,将与他人合作开发的软件作为自己单独完成的软件发表或者登记;
  4. 复制或者部分复制著作权人的软件;
  5. 向公众发行、出租、通过信息网络传播著作权人的软件;
  6. 故意避开或者破坏著作权人为保护其软件著作权而采取的技术措施;
  7. 故意删除或者改变软件权利管理电子信息;
  8. 转让或者许可他人行使著作权人的软件著作权。

8.谈谈对软件安全概念的理解。

软件安全是软件工程与软件保障的一个方面,它提供一种系统的方法来标识、分析和追踪对危害以及具有危害性的功能(例如数据和命令)的软件缓解措施与控制。

软件安全具有信息安全三大基本属性 CIA:保密性、完整性、可用性。另外还包括可认证性、授权、可审计性、抗抵赖性、可控性、可存活性等多种安全属性。

9.简述软件和软件工程的概念。

10.对照一般软件工程的概念,软件安全工程主要增添了哪些任务?

11.谈谈软件安全与软件危机、软件质量和软件质量保证、软件保障、软件可靠性、应用软件系统安全、可信软件和软件定义安全等概念的区别和联系。

(1)软件安全与软件危机

软件安全是主要是防止软件因漏洞或缺陷被恶意利用从而造成安全问题,它关注的是对抗性风险;软件危机是在宏观背景下,软件频繁出现进度失控、质量低下、成本超支甚至失败的现象。软件安全问题正是软件危机的重要表现之一,大量安全漏洞说明软件工程能力不足,安全需求长期被忽视。

(2)软件质量与软件质量保证

软件质量关注软件是否满足功能性和非功能性需求; 软件质量保证是为保证软件质量而建立的一系列过程和管理活动,它为软件安全提供了制度和流程基础,但本身并不等同于安全。

(3)软件保障

软件保障比软件安全范围更广,强调在整个生命周期中,通过工程化和管理手段,确保软件在可预期条件下按预期方式运行。可以理解为“把安全、质量和可信性系统性地打包在一起”。

(4)软件可靠性

软件可靠性关注的是软件在规定条件和时间内无故障运行的能力,主要应对随机故障和缺陷,而不是恶意攻击。可靠的软件不一定安全,但不可靠的软件几乎一定不安全。

(5)应用软件系统安全

应用软件系统安全是软件安全在具体应用层面的体现,强调在实际系统中如何保护数据、用户和业务流程。

(6)可信软件

可信软件关注的是“你能不能放心用这个软件”。它强调软件在安全性、可靠性、可验证性和可控性等方面都具备可证明的可信属性。可以说,安全是可信的必要条件,但可信不只靠安全。

(7)软件定义安全

软件定义安全是一种新理念,强调用软件方式实现安全能力的动态配置、集中管理和快速响应。它不是安全目标,而是实现安全的一种架构和技术手段,为现代复杂系统提供更灵活的安全防护能力。

12.确保软件安全的基本思路是什么?软件安全涉及的技术主要有哪些方面?

(1)确保软件安全的基本思路

  1. 发现并修补漏洞:采用多种检测、分析及挖掘技术对安全错误或是安全漏洞进行发现、分析与评价,然后采取多种安全控制措施进行错误修复和风险控制。
  2. 尽量避免产生漏洞:分析软件安全错误发生的原因,将安全错误的修正嵌入到软件开发生命周期的整个阶段。通过对软件开发各阶段相关的软件安全错误的分析与控制,以期大大减少软件产品的漏洞数量,使软件产品的安全性得到有效提高。

(2)现有关于软件安全的技术主要包含三个方面:

  1. 软件安全属性认知;
  2. 信息系统安全工程;
  3. 软件安全开发。

第二章、软件漏洞概述

【2024Fall 真题】软件漏洞的概念

1.试述软件漏洞的概念,谈谈软件漏洞与软件错误、软件缺陷、软件 Bug 的区别与联系。

  • 软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
  • 软件错误(Error)是指在软件开发过程中出现的不符合期望或不可接受的人为差错,其结果将可能导致软件缺陷的产生。软件错误主要是一种人为错误,相对于软件本身而言,是一种外部行为。
  • 软件缺陷也称软件Bug,是指计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。软件缺陷存在于软件内部,是一种静态形式。

【2025FALL】2.为什么说安全缺陷或者说 Bug 是一个需要考虑具体环境、具体对象的概念?

因为同一个软件缺陷在不同运行环境、不同使用场景和不同攻击者条件下,其安全影响并不相同。某些缺陷在特定环境中可能无法被触发或利用,仅表现为一般功能错误;而在另一种环境时,却可能被利用并演变为严重的安全漏洞。

因此,安全缺陷的存在和危害程度具有场景依赖性和对象依赖性,不能脱离具体环境和攻击条件来孤立判断。

3.试分析软件漏洞的成因。

  1. 计算机系统结构决定了漏洞的必然性:冯·诺依曼体系结构决定了漏洞产生的必然性:二进制表示混乱了指令和数据;指令与数据同时存在内存中可能导致指令混乱、编码逻辑和外部输入。
  2. 软件件趋向大型化,第三方扩展增多:代码行越多,缺陷越多;第三方扩展也会引入缺陷。
  3. 新技术、新应用产生之初即缺乏安全性考虑:这些新技术本身的不安全性以及复杂性,会大大增加互联网软件产品产生漏洞的概率。
  4. 软件使用场景更具威胁:软件被各种使用者用于各种环境下,需要软件开发者考虑更多的安全问题。
  5. 对软件安全开发重视不够,软件开发者缺乏安全知识:传统软件公司更专注于功能的实现,而很少从攻击者角度思考软件安全问题。

4.软件漏洞如何分类分级管理?

通常可以从从漏洞的成因、漏洞被利用的技术及漏洞作用范围等方面对软件漏洞进行分类研究。

  1. 基于漏洞成因的分类:内存破坏类、逻辑错误类、输入验证类、设计错误类和配置错误类。
  2. 基于漏洞利用位置的分类:
    • 本地漏洞。即需要操作系统级的有效帐号登录到本地才能利用的漏洞。
    • 远程漏洞。即无需系统级的帐号验证即可通过网络访问目标进行利用的漏洞。
  3. 基于威胁类型的分类:
    • 获取控制。即可以导致劫持程序执行流程,转向执行攻击者指定的任意指令或命令,控制应用系统或操作系统。
    • 获取信息。即可以导致劫持程序访问预期外的资源并泄露给攻击者,影响系统的机密性。
    • 拒绝服务。即可以导致目标应用或系统暂时或永远性地失去响应正常服务的能力,影响系统的可用性。

对漏洞进行分级,有助于人们对数目众多的安全漏洞给予不同程度的关注并采取不同级别的措施,目前主要的漏洞级别评价方式有按照漏洞严重等级和利用漏洞评分系统(CVSS)进行分级两类主要形式。

5.软件漏洞管理应当遵循怎样的标准?

6.软件漏洞买卖合法吗?软件漏洞应当如何管控?

7.厂商发布漏洞信息的标准过程是怎样的?

8.知识拓展

第三章、Windows系统典型漏洞

1.程序运行时的内存布局是怎样的?

程序运行时使用的内存按功能可以分为四个区域:代码区、数据区、堆区和栈区。

  • 代码区:存放机器代码和只读数据,当计算机运行程序时,会到这个区域读取指令并执行
  • 数据区:用于存储全局变量和静态变量
  • 堆区:该区域内存由进程利用相关函数或运算符动态申请,用完后释放并归还给堆区
  • 栈区:该区域内存由系统自动分配,用于动态存储函数之间的调用

2.在程序运行时,用来动态申请分配数据和对象的内存区域形式称为什么?

堆。堆是程序运行过程中用于动态内存分配的数据区,通常由程序通过动态分配函数申请并由系统进行管理。

3.什么是缓冲区溢出漏洞?

缓冲区溢出漏洞就是在向缓冲区写入数据时,由于没有做边界检查,导致写入缓冲区的数据超过预先分配的边界,从而使溢出数据覆盖在合法数据上而引起系统异常的一种现象。

程序中所使用的缓冲区既可以是堆区和栈区,也可以是存放静态变量的数据区。根据缓冲区利用的方法和缓冲区在内存中的所属区域,其可分为栈溢出和堆溢出

(1)栈溢出

在函数的栈帧中,局部变量是顺序排列的,局部变量下面紧跟着的是前栈帧EBP及函数返回地址RET。如果这些局部变量为数组,由于存在越界的漏洞,那么越界的数组元素将会覆盖相邻的局部变量,甚至覆盖前栈帧EBP及函数返回地址RET,从而造成程序的异常。

(2)堆溢出

堆溢出利用的精髓就是用精心构造的数据去溢出覆盖下一个堆块的块首,使其改写块首中的前向指针(flink)和后向指针(blink),然后在分配、释放和合并等操作发生时伺机获得一次向内存任意地址写人任意数据的机会。

【2025FALL】4.简述Windows安全漏洞保护的基本技术及其存在的问题。

  • 栈溢出检测选项 / GS:在函数调用栈中加入保护值(canary),在返回前检查是否被篡改,用于防止栈溢出攻击覆盖返回地址
  • 数据执行保护 DEP:标记某些内存区域(如栈、堆)为不可执行,防止攻击者通过缓冲区溢出将数据注入并执行。
  • 地址空间布局随机化 ASLR:随机化可执行文件和库在内存中的加载地址,增加攻击者预测目标地址的难度,降低 缓冲区溢出及 ROP 攻击成功率
  • 安全结构化异常处理 SafeSEH:验证异常处理函数表中记录的地址是否合法,防止攻击者利用异常处理机制覆盖异常处理指针进行攻击。
  • 增强环节体验工具包 EMET:微软提供的工具,用于在应用程序层启用多种缓解技术(如 DEP、ASLR 等)。

【2025FALL】5.本章介绍了Windows的5种典型保护机制,但是每一种保护机制仍然面临着缺陷和许多对抗的方法,这说明了什么问题?应当如何应对这一问题

说明了任何防御手段都无法实现绝对的安全;还有一些方式只是提高攻击门槛,并没有从根本上解决问题;单一的保护机制很难实现绝对安全。

应该:纵深防御,多层保护;源头治理(把bug扼杀在摇篮里);权限最小化;使用安全语言。

第五章、软件安全开发模型

1.什么是软件的生命周期?软件生命周期通常包括哪几个阶段?

软件生命周期由定义、开发和维护3个时期组成。

8个阶段:【问题定义、可行性研究、需求分析】、【系统设计、详细设计、编码、单元测试】、【软件维护】

(1)软件定义时期

这个时期的工作通常又称为系统分析,由系统分析员负责完成。软件定义时期可以进一步划分成 3 个阶段,即问题定义可行性研究需求分析

(2)软件开发时期

软件开发时期通常由总体设计、详细设计、编码和单元测试四个阶段组成。前两个阶段成为系统设计,后两个阶段成为系统实现。

(3)软件维护时期

软件维护时期的任务:使软件持久的满足用户的需要。

2.什么是软件过程?什么是软件开发(过程)模型?为什么从 20 世纪 90 年代以后,人们更多使用“软件过程”来替代传统的“软件开发模型”?

所谓软件过程,是指为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。

通常使用软件生命周期模型简洁地描述软件过程。软件生命周期模型规定了把生命周期划分为哪些阶段及各个阶段的执行顺序,因此,也称为软件开发(过程)模型。

20世纪90年代以后,因为“软件过程”模型能够更快更有效地完成软件产品,人们更多地使用它来代替传统的“软件开发模型”。

3.有哪些典型的软件开发模型?这些软件开发模型有什么区别与联系?

8 种典型的软件开发模型:

  1. 瀑布模型
  2. 快速原型模型
  3. 增量模型
  4. 螺旋模型
  5. 喷泉模型
  6. Rational 统一过程
  7. 极限编程和敏捷开发
  8. 微软过程

4.SD3+C 原则是 SDL 模型实施的基本原则,试简述其内容。

SD3+C 原则是 SDL 模型实施的基本原则,试简述其内容。

  1. 安全设计(Secure by Design)。在架构设计和实现软件时,需要考虑保护其自身及其存储和处理的信息,并能抵御攻击。
  2. 安全配置(Secure by Default)。在现实世界中,软件达不到绝对安全,所以设计者应假定其存在安全缺陷。为了使攻击者针对这些缺陷发起攻击时造成的损失最小,软件在默认状态下应具有较高的安全性。例如,软件应在最低的所需权限下运行,非广泛需要的服务和功能在默认情况下应被禁用或仅可由少数用户访问。
  3. 安全部署(Security by Deployment)。软件需要提供相应的文档和工具,以帮助最终用户或管理员安全地使用。此外,更新应该易于部署。
  4. 沟通(Communication)。软件开发人员应为产品漏洞的发现准备响应方案,并与系统应用的各类人员不断沟通,以帮助他们采取保护措施(如打补丁或部署变通办法)。

5.微软的 SDL 模型与传统的瀑布模型的关系是怎样的?

SDL模型是由软件工程的瀑布模型发展而来的,是在瀑布模型的各个阶段添加了安全活动和业务活动目标。

【2025FALL】6.【2024Fall 真题】什么是敏捷 SDL?敏捷 SDL 和经典 SDL 的主要区别是什么?

为应对快速的软件产品开发,微软对 SDL 进行了调整,使其能够快速利用敏捷开发流程更好地实现安全需求,这就是敏捷 SDL。

敏捷 SDL 与典型 SDL 的差别主要有两点:

  1. 敏捷 SDL 不采用传统的瀑布模型而是采用无阶段的迭代开发模型,以实现软件版本的快速更新和发布。
  2. 在敏捷 SDL 中,并不是每个发布版本(或每次“突击发布”)都需要达到所有的要求。

10.试从软件各个开发阶段所进行活动的角度,对几种软件安全开发模型进行对比分析。

第六章、软件安全需求分析

1.为什么要进行需求分析?通常对软件系统有哪些需求?

为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深人理解是软件开发工作获得成功的前提条件。

通常对软件系统的需求:

  1. 功能需求
  2. 性能需求
  3. 可靠性和可用性需求
  4. 出错处理需求
  5. 接口需求
  6. 约束
  7. 逆向需求
  8. 将来可能提出的要求

2.为什么要进行安全需求分析?通常对软件系统有哪些安全需求?

软件安全需求目的是描述为了实现信息安全目标,软件系统应该做什么,才能有效地提高软件产品的安全质量,减少软件安全漏洞。

通常包含外部安全需求和内部安全需求:外部安全需求通常主要指法律、法规等遵从性需求;内部安全需求通常包括组织内部需要遵守的政策、标准等以及与软件业务功能相关的安全需求。

【2025FALL】3.软件安全需求分析的主要工作是什么?它和软件需求分析有什么区别与联系?

(1)主要工作:

首先确定目标系统的业务运行环境、规则环境及技术环境;

然后在了解各类软件安全需求内容的基础上,通过一定的安全需求获取过程,对软件应该包含的安全需求进行分析。

(2)区别与联系

区别:

  • 客观性:软件安全需求由系统的客观属性决定,而一般软件需求更多是从使用者的要求和兴趣出发。
  • 系统性:软件安全需求分析不能只从软件本身出发,必须从系统角度进行分析
  • 经济性和适用性:软件安全需求内容很多,并不是所有的都需要采纳和实施,应根据业务需求进行成本控制。

联系:

软件安全需求是软件需求的一个必要组成部分,并且将安全需求作为与业务功能同样重要的系统需求来处理已经成为一种必然的趋势。

4.为什么说软件安全需求更多地来源于遵从性需求?

在软件安全性需求分析中,软件用户由于安全知识的缺乏,很难从专业角度提出安全需求。因此,软件安全需求更多地来自于对组织内部和外部的一些安全政策和标准的遵从。

5.本章中介绍的安全需求遵从性标准有哪些类别,它们之间有何联系与区别?

6.我国为什么要实行网络安全等级保护制度?网络安全保护能力划分为哪些等级?具体每个等级有什么要求?

对信息安全分级保护是客观需求;等级化保护是信息安全发展规律;等级保护是国家法律和政策要求。

8.简述网络等级保护与信息安全管理体系的联系和区别。

9.软件安全需求获取过程中涉及哪些相关方人员?他们各自主要的职责是什么?

业务负责人、最终用户、客户、安全需求分析人员、安全技术支持

10.软件安全需求的获取方法有哪些?

头脑风暴、问卷调查和访谈、策略分解(策略文件分解)、数据分类(对数据分阶段划分来决定相应的安全需求)、主/客体关系矩阵(刻画一个基于使用用例的主/客体之间的操作关系)、使用案例和滥用案例建模、软件安全需求跟踪矩阵

11.【2024Fall 真题】软件安全需求的获取方法中的策略分解是指什么?

裁支策略分解是指将组织需要遵守的内部和外部政策,包括外部法律法规、隐私和遵从性命令分解成详细的安全需求。策略分解过程是一个连续的、结构化的过程。

12.软件安全需求的获取方法中的数据分类是指什么?

数据分类是指,根据数据生命周期管理对数据的分阶段划分来决定相应的安全需求;也可以根据数据的重要性对保护级别的划分来决定相应的安全需求。

13.针对信息系统中的数据生命周期,通常应当考虑的安全需求有哪些?

数据生成、使用、传输、存储和存档生命周期

14.软件安全需求的获取方法中的主/客体关系矩阵是指什么?

采用主/客体关系矩阵来刻画一个基于使用用例的主/客体之间的操作关系。主/客体关系矩阵是角色和组件的二维表示,主体(角色)作为列,客体(对象/组件)作为行。当主/客体关系矩阵产生后,与主/客体关系矩阵所允许的对应动作相违背的事件就可以判定为威胁,在此基础之上可以确定安全需求。

第七章、软件安全设计

1.软件设计阶段的主要工作是什么?

软件设计可以看作是从软件需求规格说明书出发,根据需求分析阶段确定的功能,设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法等内容,形成软件的具体设计方案。

从工程管理的角度,软件设计可以分为总体设计和详细设计两个子阶段。

从技术的角度看软件设计阶段的主要工作,包括:软件架构设计、界面接口设计、模块/子系统等构件设计、数据模型设计、过程/算法设计以及部署设计等。

2.软件安全设计阶段的主要工作是什么?

软件安全设计就是将软件的安全需求转化为软件的功能结构的过程。软件安全设计的主要工作包括软件架构安全性设计、软件架构安全性分析及软件安全功能设计。

3.软件架构安全性设计的主要工作是什么?

  1. 首先需要进行系统描述,包括系统功能、安全要求、系统部署和技术需求,确定软件系统的安全级别。
  2. 接着,设计软件网络、数据库等应具备的安全功能,根据软件具体安全需求的不同,设计的安全功能包括加密、完整性验证、数字签名、访问控制以及安全管理等等。
  3. 在架构安全设计过程中,还需要解决软件安全功能的易用性、可维护性和独立性问题。

4.为什么要进行软件架构安全性分析?软件架构安全性分析的基本过程是什么?

为什么:对于复杂系统,将安全属性一次性设计进软件架构中是一项很困难的事情,所以在完成架构设计和架构安全设计之后,退出设计之前,需要再次对软件安全架构进行分析检查。

基本过程:首先进行架构建模,然后根据软件的安全需求描述或相关标准,对架构模型是否满足进行检查,如果不满足,需要修改设计架构,如此反复,直至满足所有安全需求和相关标准。

5.软件受攻击面是指什么?举例说明软件设计时可以采取哪些策略来降低受攻击面。

软件受攻击面是指,用户或其他程序以及潜在的攻击者都能够访问到的所有功能和代码的总和,它是一个混合体,不仅包括代码、接口、服务,也包括对所有用户提供服务的协议,尤其是那些未被验证的或远程用户都可以访问到的协议。

减少软件受攻击面就是去除、禁止一切不需要使用的模块、协议和服务,其目的是减少攻击可以利用的漏洞:

  • 重要性低的功能可取消;
  • 重要等级为中的功能可设置为非默认开启,需要用户配置后才予以开启;
  • 重要性高的功能则关闭或增加一些安全措施进行限制。
  • 重用那些经过测试、已证明安全的现有库和通用组件,而不是用户自己开发的共享库。
  • 苹果公司的 iOS 不支持 Java 和 Flash,一个重要原因就是相对于 Mac OS X(或其他智能手机)减小了 iOS 的受攻击面。

6.【2024Fall 真题】什么是最小授权原则?试举例说明软件设计时哪些措施是采用了最小授权原则。

最小授权原则是指,系统仅授予实体(用户、管理员、进程、应用和系统等)完成规定任务所必需的最小权限,并且该权限的持续时间也尽可能短。

  • 将超级用户的权限划分为一组细粒度的权限,分别授予不同的系统操作员/管理员。对管理员账户分配安全资源的访问权限也要设置为受限访问,而不是超级用户权限。
  • 采用高内聚、低耦合的模块化编程方法,也就是模块之间的依赖关系是弱链接(低耦合),每一个模块只负责执行一个独立的功能(高内聚)。
  • Windows 系统的标准权限和管理员权限,实际上就是最小授权原则的运用。

7.什么是权限分离原则?试举例说明软件设计时哪些措施是采用了权限分离原则。

权限分离原则在软件设计中是指,将软件功能设计为需要在两个或更多条件下才能实现,以防止一旦出现问题,整个软件都可能面临风险。

举例:清晰的模块划分,将风险分散到各个模块中;不允许程序员检查自己编写的代码;Linux 将敏感操作(如超级用户的权利)分成 26 个特权,由一些特权用户分别掌握这些特权,每个特权用户都无法独立完成所有的敏感操作。

8.针对第 6 章介绍的核心安全需求,软件安全功能设计通常有哪些内容?

具体包括保密性、完整性、可用性、认证性、授权和可记账性等核心安全需求的设计,以及其他相关安全需求设计。

9.什么是软件设计模式?有哪些软件设计模式?

对软件设计中普遍存在的问题,根据经验提出一套能快速响应的解决方案。它描述了在各种情况下如何应对共性问题。

抽象工厂模式、工厂方法、代理模式、观察者模式等。

10.什么是安全模式?为什么说能够利用安全模式来快速、准确地进行软件安全设计?

安全模式:在给定的场景中,为控制、阻止或消减一组特定的威胁而采取的通用解决方案。

为什么?:

  • 安全模式封装了反复出现的系统问题的解决方案,并且给出了解决方案。
  • 采用模式的系统架构描述比较容易让人看懂,也为设计和分析提供了指南
  • 安全模式使得不具备专业安全知识的应用开发人员也可以使用安全措施。

11.试给出一种利用安全模式进行软件安全设计的方法。

【2025FALL】12.什么是威胁建模?试简述威胁建模的过程。

我觉得这题不可能考,没想到还真考了,所以复习的时候还是要全面一点!!!

软件威胁建模是指,通过抽象的概念模型对影响软件系统的威胁进行系统地识别和评价。

image-20251220193658617 软件威胁建模的过程:

  1. 确定安全目标:确定安全目标包括确定软件系统涉及的资产,以及围绕这些资产的业务目标和安全目标。
  2. 创建应用程序概况图:创建应用程序概况图的主要目的是分析应用程序的功能、应用程序的体系结构、物理部署配置以及构成解决方案的技术,这有助于在步骤4中确定相关威胁。
  3. 分解应用程序:分解应用程序的主要目的是,通过分解应用程序的结构来确定信任边界、数据流、数据人口点和数据出口点。对应用程序结构了解得越多,设计人员就越容易发现威胁和漏洞。
  4. 确定威胁:确定可能影响应用程序和危及安全目标的威胁的最大难题是系统性和全面性,特别是对于不断变化的技术和发展中的攻击技术,没有一种方法能够识别复杂软件产品中的所有威胁。
  5. 威胁评估:从经济角度,不可能解决所有威胁,因此需要对威胁进行排序,以便优先处理最重要的威胁。常用的威胁排序方法有 Delphi 法、平均排序法和 P × I 排序法。
  6. 确定威胁缓解计划或策略:根据具体情况选择相应的策略。
  7. 验证威胁:验证前面步骤确定的威胁是为了确保威胁模型准确反映了应用程序的潜在安全问题。验证的内容包括威胁模型、列举的威胁和缓解措施等。
  8. 验证建档:威胁建模的最后一步是将威胁模型和威胁缓解计划记录在案,以便在软件开发生命周期的后续阶段使用。

13.为什么说组织自身的威胁建模能力水平对提升组织的整体安全保障能力起到至关重要的作用?

14.在威胁排序的几种计算方法中,为什么说相比 Delphi 法和平均排序法, P × I排序方法更科学?

Delphi 法:依赖专家匿名投票、多轮反馈达成共识,具有较强的主观性和感性色彩。

平均排序法:将各项评价指标简单相加再取平均值。

P * I方法:风险值 = 可能性 (Probability) * 影响 (Impact),更加具有科学性和客观性

第八章、软件安全编码

2025FALL】1.软件安全编码阶段的主要工作有哪些?

  • 选择安全的编程语言:具有对缓冲区、指针等有管理能力的语言
  • 版本(配置)管理:可以回滚、可以跟踪变化
  • 代码检测:发现漏洞
  • 安全编译:

2.什么是类型安全语言?哪些程序开发语言是类型安全的?

类型安全语言是指在程序执行过程中,能够确保所有的操作都只作用在与之匹配的数据类型上的编程语言。

C 语言不是类型安全语言,C# 和 Java 是类型安全的。

3.【2024Fall 真题】安全编译是指在代码编译阶段采取的哪些安全措施?

编译是指将程序员编写的源代码转换为计算机可以理解的目标代码的过程。安全编译采取:

  • 采用最新的集成编译环境,并选择使用安全编译选项和安全编译机制。
  • 在一个安全的环境中进行。例如:对代码编译系统实施安全访问控制;使用访问控制列表防止未授权用户的访问;使用软件版本控制方法;尽量使用自动化编译工具和脚本。
  • 对应用环境的真实模拟。尽可能保证测试环境与实际应用环境一致
  • 多样化编译技术应用。

4.试列举几条安全编码原则,并举例说明这些原则的重要意义。

CERT 安全编码建议:

  1. 验证输入(Validate input)
  2. 留意编译器警告(Heed compiler warnings)
  3. 安全策略的架构和设计
  4. 保持简单性(Keep it simple)
  5. 默认拒绝(Default deny)
  6. 坚持最小权限原则(Adhere to the principle of least privilege)
  7. 清洁发送给其他系统的数据(Sanitize data sent to other systems)
  8. 纵深防御(Practice defense in depth)
  9. 使用有效的质量保证技术(Use effective quality assurance techniques)
  10. 采用安全编码标准(Adopt a secure coding standard)

5.为什么要避免使用 C 语言中原有的字符串函数?所谓的安全字符串函数解决了原有 C 字符串函数的什么安全漏洞?

这些函数的设计理念是“基于信任”的,它们缺乏必要的边界检查机制(Boundary Checking)

主要解决了缓冲区溢出、内存破坏、因终止符缺失导致的越界读取

6.Java 提供的沙箱安全机制的核心思想是什么?

Java 沙箱的核心思想是:将不可信的代码限制在特定的运行环境中,严格管控其对本地系统资源(如文件系统、网络、内存、操作系统命令)的访问权限,从而防止恶意代码对宿主机造成破坏。

7.试谈谈 Java 提供的安全机制。

在字节码层次,Java提供了两种保障安全的机制:类加载器和字节码验证器

  • 类加载器就阻止了破坏性的代码干扰正常的代码,在不同的命名空 间之间设置了“保护屏”,有效地保障了Java运行时的安全。
  • 保证加载的类文件内容有正确的内部结构,并且这些类文件相互间协调一致,以确保只有合法的Java代码才能被执行且执行时不会带来破坏性的操作

第十二章、恶意代码防止

1.试解释以下与恶意代码程序相关的计算机系统概念,以及各概念之间的联系与区别:进程、线程、动态链接库、服务、注册表。

2.从危害、传播、激活和隐藏 4 个主要方面分析计算机病毒、蠕虫、木马、后门、Rootkit 及勒索软件这几类恶意代码类型的工作原理。

恶意代码类型危害 (Harm)传播 (Propagation)激活 (Activation)隐藏 (Hiding)
计算机病毒破坏本地文件寄生性。随受感染的宿主文件(EXE/DOC)拷贝扩散。被动激活。用户点击运行隐藏在宿主程序的代码段、空隙或资源中。
蠕虫消耗网络带宽、造成服务器拒绝服务自主性。利用网络漏洞主动扫描并自我复制扩散。主动激活。一旦感染成功,利用漏洞或脚本自动运行。伪装成正常的网络服务进程或驻留在内存中。
木马窃取隐私、监控、远程控制。欺骗性。通常伪装成合法软件诱导用户下载诱导激活。用户相信其“合法性”并主动安装/运行。伪装成合法文件名或图标,利用 DLL 注入、API 钩子隐藏。
后门绕过身份验证,获取系统长期的控制权。植入性。通常由病毒/木马进入系统后留下的“后门”。远程激活。攻击者通过网络发送特定信号(Knocking)触发。开启非标准端口,或隐藏在正常服务的通信流量中。
Rootkit彻底剥夺操作系统控制权,破坏系统完整性。渗透性。作为攻击的最后阶段,替换系统内核组件。自启动激活钩子技术(Hooking)。通过拦截系统调用,让任务管理器看不到进程。
勒索软件加密核心资产数据,进行金钱勒索。多渠道。结合蠕虫(漏洞)、木马(钓鱼)或 RDP 爆破。延时激活在加密完成前保持低调,加密后公开显现。

3.病毒程序与蠕虫程序的主要区别有哪些?

  • 存在形式:
    • 病毒:寄生性,必须寄生在合法的宿主文件的代码中
    • 蠕虫:独立性,完整、可独立运行的程序
  • 传播媒介与触发机制:
    • 病毒:依赖于人的参与,通过文件复制、移动介质、邮件附件传播
    • 蠕虫:触发是自动化的,主要依赖网络传播
  • 传播速度:
    • 病毒:受限于人的操作频率,较慢
    • 蠕虫:利用网络,传播速度指数级增长
  • 破坏目标:
    • 病毒:本地系统
    • 蠕虫:网络资源的消耗

【2024Fall 真题】4.什么是 Rootkit?它与木马和后门有什么区别与联系?

通常所说的 Rootkit 是指:一类木马后门工具,通过修改现有的操作系统软件,使攻击者获得访问权限并隐藏在计算机中。

Rootkit与木马、后门等既有联系又有区别。

首先,Rootkit属于木马的范畴,它伪装自己掩盖其真实的恶意的目的,而这种伪装和隐藏机制正是木马的特性。

此外,Rootkit还作为后门行使其职能,为攻击者提供绕过检查机制的后门访问通道,这是后门工具的又一特性。

Rootkit强调的是强大的隐藏功能、伪造和欺骗功能,而木马、后门强调的是窃取功能、远程侵人功能,两者的侧重点不一样。

【2025FALL】5.什么是勒索软件?为什么勒索软件成为近年来数量增长最快的恶意代码类型?

勒索软件是黑客用来劫持用户资产或资源并以此为条件向用户勒索钱财的一种恶意软件。

快速增长的原因:采用成熟的加密手段,很难破解;电子支付支付方便、追踪困难;勒索软件服务化降低了攻击的门槛。

6.恶意代码防范的基本措施包括哪些?

增强法律意识,自觉履行恶意代码防治责任

健全管理制度,严格执行恶意代码防治规定

第十三章、开源软件及其安全性

1.试从软件的权益处置角度,谈谈对商业软件、免费软件、共享软件(或试用软件)、闭源软件、自由软件及开源软件概念的理解。

2.自由软件赋予软件使用者哪些“自由”?

使用自由、研究自由、重新发布自由、改写自由

【2025FALL】3.试简述开源软件与自由软件的联系与区别。

开源软件由自由软件发展而来,但是严格地说,开源软件和自由软件是两个不同的 概念,有着不同的价值观,它们是开源运动中两个相交但又不同的流派。

概念不同:自由软件比开源软件更严格,因此所有自由软件都是开放源代码的,但只有遵守特定许可证的开源软件才符合自由软件的定义。

价值观不同:自由软件始终将自由作为道德标准,而开源软件则更加注重软件的发展。

自由软件始终保持其“自由性”,从而保证了其任何版本都可以为任何人使用、学习和改进。

开源软件则更加注重与软件产业的结合,对商业化更加友好,希望用各种方式来发展软件本身。

4.列举常见的开源软件

5.【2024Fall 真题】所开发的软件中使用了带 GPL 许可证的开源软件,那么这个软件是不是就要开源?

只要在一个软件中使用(“使用”指类库引用,修改代码或者衍生代码)GPL 许可证产品,则该软件产品必须也采用 GPL 许可证,即必须也是开源和免费的,这就是所谓的“传染性”。这就是说,GPL 不允许修改后和衍生的代码做为闭源的商业软件发布和销售。

第十四章、软件知识产权保护

1.我国对于软件的知识产权有哪些法律保护途径?

  • 《计算机软件保护条例》
  • 《中华人民共和国专利法》
  • 《商业秘密所有权保护规定》
  • 《中华人民共和国商标法》
  • 《互联网著作权行政保护办法》
  • 《信息网络传播权保护条例》
  • 《移动互联网应用程序信息服务管理规定》

2.根据我国法律,软件著作权人有哪些权利?在日常学习和生活中,有哪些违反软件著作权的行为?

发表权、署名权、修改权、复制权、发行权、出租权、信息网络传播权、翻译权等

乱XX(权)

使用与传播“破解版”商业软件、代码层面的剽窃与抄袭、违反开源许可证约定、研发与传播破解工具

【2024Fall 真题】软件版权

3.试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?

概念:软件版权(又称计算机软件著作权)是指软件开发者或者其他权利人,根据著作权法的规定,对于其开发的计算机软件(包括程序及其相关文档)所享有的各项专有权利。

侵权:制作盗版软件、逆向修改、软件信息泄露等

保护措施:

法律保护:著作权、合同约束、司法救济

技术保护:

基于硬件:对发行介质的保护、软件狗可信计算芯片

基于软件:注册验证、软件水印、代码混淆技术、软件加壳、虚拟机保护

【2025FALL】4.软件版权保护的目标有哪些?它与软件保护的目标有什么联系与区别?

  1. 防软件盗版,即对软件进行防非法复制和使用的保护。
  2. 防逆向工程,即防止软件被非法修改或剽窃软件设计思想等。
  3. 防信息泄露,即对软件载体及涉及数据的保护,如加密硬件、加密算法的密钥等。

软件保护 是一个更广泛的技术范畴,它涵盖了版权保护,但也包括安全性、健壮性等目标。

本文由作者按照 CC BY 4.0 进行授权