2025.1.11 考试回忆

1.1

2.1

4.9

5.6

6.11

7.6

8.3

12.4

13.5

14.3

第一章

1.1 什么是零日(0 day)漏洞?什么是零日(0 day)攻击?

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

1.2 为什么说面对当前的全球网络空间安全威胁,必须对软件安全给予强烈关注?

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

1.3 当前,黑客为了能够有效达到窃取数据、破坏系统的目的,常常通过挖掘或是购买零日漏洞,开发针对零日漏洞的攻击工具,零日漏洞威胁实际上反映了软件系统存在的一个什么问题?

软件是人们为了实现解决生产生活实际问题而开发的某种完成特定功能的计算机程序,因而必然存在缺陷或漏洞。(软件漏洞是普遍存在的 )

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

软件自身的安全(软件漏洞)、恶意代码以及软件侵权。

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

  • 软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。另一方面,软件漏洞会被黑客发现和利用,进而实施窃取隐私信息、甚至破坏系统等攻击行为。
  • 震网病毒便是利用软件漏洞实施的攻击,通过U盘和局域网进行传播,震网病毒对伊朗等国家的核设施造成的危害不亚于1986年发生的切尔诺贝利核电站事故,最终造成伊朗核计划拖后了2年,我国近500万网民及多个行业的领军企业也遭受了此病毒的攻击

1.6 什么是恶意代码?除了传统的计算机病毒,还有哪些恶意代码类型?

  • 恶意代码是未被授权情况下,以破坏硬件、窃取信息、干扰正常使用、扰乱用户心理为目的的软件或代码片段。
  • 举例:蠕虫、特洛伊木马、后门、恶意广告、流氓软件、逻辑炸弹、僵尸网络、勒索软件等。

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

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

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

  • GB: 是软件工程和软件保障的一个方面,提供了一种系统的方法来标识、分析和追踪对危害及具有危害性功能的软件缓解措施和控制。
  • 软件安全具有信息安全三大基本属性CIA: 保密性、完整性、可用性。其他属性:可认证性、授权、可审计性、抗抵赖性、可控性、可存活性等。

1.9 简述软件和软件工程的概念。

软件概念:

软件是程序、数据和文档的集合体。

  • 程序是完成特定功能和满足性能要求的指令序列;
  • 数据是程序运行的基础和操作的对象;
  • 文档是与程序开发、维护和使用有关的图文资料。

软件工程概念:

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

SE2:

  1. 应用系统的、规范的、可量化的方法来开发、运行和维护软件,即将工程应用到软件。
  2. 对1)中各种方法的研究。

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

//TODO

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

//TODO

  • 软件危机:软件交付延期、成本超出预期、质量不可靠等;
  • 软件质量和软件质量保证:软件与明确的和隐含的定义的需求相一致的程度;
  • 软件保障:用于提高软件质量的实践、技术和工具;
  • 软件可靠性:在规定的时间周期内所述条件下程序执行所要求的功能的能力;
  • 应用软件系统安全:即信息系统上层的应用软件系统的安全;
  • 可信软件:行为及结果可以预期,受到干扰时仍能正常提供服务;
  • 软件定义安全:适应软件定义网络的安全防护新思想

联系:

它们都是为了确保软件具有可靠性和可信度,保证软件系统运行可靠。

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

  • 采用多种检测、分析及挖掘技术对安全错误或是安全漏洞进行发现、分析与评价,然后采取多种安全控制措施进行错误修复和风险控制,如传统的打补丁、防病毒、防火墙、入侵检测和应急响应等。
    • 这种将安全保障措施置于软件发布运行之时是当前普遍采用的方法。历史经验证明,该方法在时间和经济上投入产出比低,信息系统的安全状况很难得到有效改善。本章前面对于当前软件安全问题的现状分析表明了这点。
  • 分析软件安全错误发生的原因,将安全错误的修正嵌入到软件开发生命周期的整个阶段。通过对需求分析、设计、实现、测试、发布及运维等各阶段相关的软件安全错误的分析与控制,以期大大减少软件产品的漏洞数量,使软件产品的安全性得到有效提高。
    • 该方法是将安全保障的实施开始于软件发布之前,尤其强调从软件生命周期的早期阶段开始安全考虑,从而减少软件生命周期的后期系统运行过程中安全运维的工作量,提高安全保障效果。实践经验表明,从系统开发需求阶段就引入安全要素要比在系统维护阶段才考虑安全问题所花费的修复成本要低很多。
  • 现有关于软件安全的技术主要包含三个方面:
    • 软件安全属性认知
    • 信息系统安全工程
    • 软件安全开发

第二章

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

本书中并不对软件漏洞/脆弱点、软件缺陷以及软件错误等概念严格区分。

软件漏洞:

软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。

对漏洞认识的3个共同特点:

  • 漏洞是信息系统自身具有的弱点或者缺陷
  • 漏洞存在环境通常是特定的;
  • 漏洞具有可利用性,若攻击者利用了这些漏洞将会给信息系统安全带来严重威胁和经济损失。

区别与联系:

  • 软件错误(Error)是指在软件开发过程中出现的不符合期望或不可接受的人为差错,其结果将可能导致软件缺陷的产生。在软件开发过程中,人是主体,难免会犯错误。软件错误主要是一种人为错误,相对于软件本身而言,是一种外部行为。
  • 软件缺陷(Bug/Defect)是指由于人为差错或其他客观原因,导致软件隐含能导致其在运行过程中出现不希望或不可接受的偏差,例如软件需求定义,以及设计、实现等错误。在这种意义下,软件缺陷和软件错误有着相近的含义。当软件运行于某一特定的环境条件时出现故障,这时称软件缺陷被激活。软件缺陷存在于软件内部,是一种静态形式。
  • 软件故障(Fault)是指软件出现可感知的不正常、不正确或不按规范执行的状态。例如,软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失或非正常中断等现象。
  • 软件失效(Failure)是指软件丧失完成规定功能的能力的事件。软件失效通常包含三方面的含义:软件或其构成单元不能在规定的时间内和条件下完成所规定的功能,软件故障被触发及丧失对用户的预期服务时都可能导致失效;一个功能单元执行所要求功能的能力终结;软件的操作偏离了软件需求。
  • 为了简化理解,本书此处仅讨论软件错误(Error)和软件缺陷(Bug/Defect)。

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

//TODO

  • 持久性与时效性:漏洞会不断出现,漏洞被补救后其威胁会消失
  • 广泛性与具体性:会影响到很大范围的软硬件,不同的软硬件可能存在不同的漏洞
  • 可利用性与隐蔽性:漏洞一旦被攻击者利用就会给信息系统带来威胁和损失,往往需要通过特殊的漏洞分析手段才能发现

2.3 试分析软件漏洞的成因

  • 计算机系统结构决定了漏洞的必然性
  • 软件件趋向大型化,第三方扩展增多
  • 新技术、新应用产生之初即缺乏安全性考虑
  • 软件使用场景更具威胁
  • 对软件安全开发重视不够,软件开发者缺乏安全知识

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

软件漏洞分类

  • 基于漏洞成因的分类:内存破坏类、逻辑错误类、输入验证类、设计错误类和配置错误类
  • 基于漏洞利用位置的分类
    • 本地漏洞。即需要操作系统级的有效帐号登录到本地才能利用的漏洞,主要构成为权限提升类漏洞,即把自身的执行权限从普通用户级别提升到管理员级别。
    • 远程漏洞。即无需系统级的帐号验证即可通过网络访问目标进行利用的漏洞。
  • 基于威胁类型的分类:
    • 获取控制。即可以导致劫持程序执行流程,转向执行攻击者指定的任意指令或命令,控制应用系统或操作系统。威胁最大,同时影响系统的机密性、完整性,甚至在需要的时候可以影响可用性。主要来源:内存破坏类。
    • 获取信息。即可以导致劫持程序访问预期外的资源并泄露给攻击者,影响系统的机密性。主要来源:输入验证类、配置错误类漏洞。
    • 拒绝服务。即可以导致目标应用或系统暂时或永远性地失去响应正常服务的能力,影响系统的可用性。主要来源:内存破坏类、意外处理错误类漏洞。

软件漏洞分级:对漏洞进行分级有助于人们对数目众多的安全漏洞给予不同程度的关注并采取不同级别的措施。

  • 按照漏洞严重等级进行分级:
评级 定义
严重 利用此类漏洞,Internet 蠕虫不需要用户操作即可传播。
重要 利用此类漏洞可能会危及用户数据的机密性、完整性或可用性,或者危及处理资源的完整性或可用性。
中等 此类漏洞由于默认配置、审核或利用难度等因素大大减轻了其影响。
利用此类漏洞非常困难或其影响很小。
  • 利用通用漏洞评分系统(CVSS)进行分级:依据对 3 种度量评价标准来对一个已知的安全漏洞危害程度进行打分。
    • 基本度量用于描述漏洞的固有基本特性,这些特性不随时间和用户环境的变化而改变。
    • 时间度量用于描述漏洞随时间而改变的特性,这些特性不随用户环境的变化而改变。
    • 环境度量用于描述漏洞与特殊用户环境相关的特性。

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

  • 国际标准主要包括6大漏洞分级规范以及一系列安全漏洞管理规范,分级规范包括:
    • CVE(通用漏洞和披露)

    • CVSS(通用漏洞评分系统)

    • CWE(通用缺陷枚举)

    • CWSS(通用缺陷评分系统)

    • CPE(通用平台枚举)

    • OVAL(开放漏洞评估语言)

  • 国内标准主要包括《信息安全技术安全漏洞标识与描述规范》、《信息安全技术安全漏洞等级划分指南》、《信息安全技术安全漏洞分类》、《信息安全技术信息安全漏洞管理规范》。

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

不合法。

  • 认清漏洞是一种“武器”。
  • 让白帽的漏洞发现有章有法。限制“白帽”行为的尺度和规范,使软件厂家与“白帽”获得双赢。
  • 漏洞管控势在必行。企业和国家都应建立专门的部门来系统的收集、分析、修复软件安全漏洞。

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

//TODO

第四章

4.1 常用的 Web 三层架构是怎样的?

img

4.2 当在浏览器的地址栏中输入一个完整的 URL,再按〈Enter〉键直至页面加载完成,整个过程发生了什么?

img
  1. 域名解析:浏览器会依次查询浏览器的DNS缓存、系统缓存、路由器缓存,如果没有找到,则一直查询到根域名服务器缓存,找到域名所对应的的IP地址。
  2. TCP连接:通过IP地址找到IP对应的服务器后,要求建立TCP连接。
  3. HTTP连接:TCP连接成功后,浏览器开始向这个服务器发送一个HTTP请求。服务器接收到请求后开始进行处理,处理结束,返回一个响应包。
  4. 浏览器接收和处理:浏览器接收到来自服务器的响应后,开始解析和渲染接收到的内容并呈现给用户。
  5. TCP断开连接:最后客户端断开与服务器的TCP连接。

4.3 根据 OWASP 在 2013 发布的 Web 安全十大威胁报告,Web 漏洞分为哪几大类型?请将该报告与 2017 年发布的 Web 安全十大威胁进行对比分析,了解这几年来 Web 安全威胁有哪些新的变化和发展。

2013:

  • 注入
  • 失效的身份认证与会话管理
  • 跨站脚本
  • 不安全的直接对象引用
  • 错误的安全配置
  • 敏感数据泄漏
  • 缺失功能级访问控制
  • 跨站请求伪造
  • 使用有漏洞的组件
  • 未验证的重定向和转发

变化

  • 删除了A8和A10项。由于更多的平台添加了CSRF防御,所以发现CSRF漏洞的应用程序不到5%,同时只在8%左右的应用程序中发现未验证的重定向和转发漏洞,因此A8和A10这两项排除在了top10之外,但仍然是需要关注的重要风险。
  • A3降位。2013年排名第三的XSS在2017年只排名第七名,其中除了开发者对XSS的防范意识加强之外另一個关键的原因在于,目前有很多自动化的扫描工具,都已经内建XSS扫描,可以加快漏洞修补速度,使得整体XSS漏洞数量看起来比以往少,但XSS风险却没有因此减少。
  • 新添加3项。包括XXE、不安全的反序列化和不足的日志记录和监控,而后者对于许多组织来说是个严重的问题。
  • 变化的主要原因:在过去的几年中,应用程序的基础技术和结构发生了重大变化,一些成熟的框架被大量使用,JS框架(如Angular、React)编写的单页应用程序,允许创建高度模块化的前端用户体验;原来交付服务器端处理的功能现在变为由客户端处理。

4.4 试将 Web 典型漏洞根据客户端和服务器端来划分,并根据漏洞原理阐述这样划分的理由。

//TODO

4.5 简述 SQL 注入漏洞的原理?为什么 SQL 注入漏洞多年来一直名列 Web 安全漏洞的榜首?

  • 攻击者能够利用现有Web应用程序,将恶意代码当作数据插入查询语句或命令中,这些恶意数据可以欺骗解析器,从而执行非授权操作。
  • SQL注入漏洞的风险要高于其他所有的漏洞,原因如下:
    • SQL注入攻击具有广泛性。SQL注入利用的是SQL语法,这使得所有基于SQL语言标准的数据库软件,包括SQL Server、Oracle、MySQL、DB2和Informix等,以及与之连接的网络应用程序,包括Active/Java Server Pages、PHP或Perl等都面临该类攻击。当然各种软件都有自身的特点,实际的攻击代码可能不尽相同。此外,SQL注入攻击的原理相对简单,介绍注入漏洞和利用方法的教程等资源非常多。这些因素造成近年SQL注入攻击的数量一直居高不下。
    • 相较于其他漏洞,对于SQL注入漏洞的防范要困难。例如,要实施缓冲区溢出攻击,攻击者必须首先能绕过站点的防火墙,而SQL注入内容往往作为正常输入的一部分,能够通过防火墙的控制审查,访问数据库进而获得数据库所在服务器的访问权。

4.6 防范 SQL 注入漏洞的基本方法有哪些?重点谈谈在代码开发层面的安全措施。

  • 代码层漏洞防护
    • 采用强类型语言,如 Java、C#。
    • 尽可能避免使用拼接的动态 SQL 语句,所有的查询语句都使用数据库提供的参数化查询接口。参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中。
    • 服务端验证用户输入的值和类型是否符合程序的预期要求。
    • 在服务器端对用户输入进行过滤
    • 避免网站显示 SQL 错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
    • 加固应用程序服务器和数据库,利用最低权限账户与数据库连接。
    • Web 安全开发中应当遵循安全规范,例如 OWASP 企业安全应用程序接口(The OWASP Enterprise Security API,OWASP ESAPI)。
  • 使用专业的漏洞扫描工具进行安全性测试
    • 应当在 Web 应用程序开发过程的所有阶段实施代码的安全检查,在开发和部署 Web 应用的前后,应利用专业的漏洞扫描工具对网站进行安全性测试,对检测出的 SQL 注入漏洞及时修补。
    • SQLMap(http://sqlmap.sourceforge.net)
    • Pangolin(中文译名“穿山甲”)

4.7 什么是 SQL 盲注?它与一般的 SQL 注入有什么区别?

//TODO

4.8 在如图 4-26 所示页面中,当输入“1'”进行注入尝试时,系统返回数据库报错信息,是否可以肯定这里一定存在数字型注入漏洞?

//TODO

4.9 简述 XSS 跨站脚本漏洞的原理。

XSS漏洞是指,应用程序没有对接收到的不可信数据经过适当的验证或转义就直接发给客户端浏览器。XSS是脚本代码注人的一种。Web浏览器可以执行HTML页面中嵌入的脚本命令,支持多种脚本语言类型(如JavaScript、VBScript和ActiveX等),其中最主要的是JavaScript。攻击者利用XSS漏洞将恶意脚本代码注入到网页中,当用户浏览该网页时,便会触发执行恶意脚本。

存在三种XSS类型,通常针对用户的浏览器:

  • 反射式XSS:应用程序或API包括未经验证和未经转义的用户输入,作为HTML输出的一部分。一个成功的攻击可以让攻击者在受害者的浏览器中执行任意的HTML和JavaScript。通常,用户将需要与指向攻击者控制页面的某些恶意链接进行交互,例如恶意漏洞网站,广告或类似内容。
  • 存储式XSS:应用或者API将未净化的用户输入存储下来,并在后期在其他用户或者管理员的页面展示出来。存储型XSS一般被认为是高危或严重的风险。
  • 基于DOM的XSS:会动态地将攻击者可控的内容加入页面的JavaScript框架、单页面程序或API存在这种类型的漏洞。理想的来说,你应该避免将攻击者可控的数据发送给不安全的JavaScript API。

4.10 简述 CSRF 跨站请求伪造漏洞的原理,并比较其与 XSS 漏洞的不同。

跨站请求伪造(Cross-siterequestforgery)简称CSRF,尽管与跨站脚本漏洞名称相近,但它与跨站脚本漏洞不同。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。CSRF和反射型XSS的主要区别是:反射型XSS的目的是在客户端执行脚本,CSRF的目的是在Web应用中执行操作。

CSRF跨站请求伪造攻击迫使登录用户的浏览器将伪造的HTTP请求,包括该用户的会话Cookie和其他认证信息,发送到一个存在漏洞的Web应用程序,而这些请求会被应用程序认为是用户的合法请求。

攻击者利用CSRF漏洞针对普通用户发动攻击时,将对用户的数据和操作指令构成严重威胁,当受到攻击的用户具有管理员账户时,CSRF攻击将危及整个Web应用程序。与XSS攻击相比,CSRF攻击虽不流行(因此对其进行防范的资源也相当稀少),但却难以防范。所以认为它比 XSS 更具危险性。

4.11 什么是命令执行漏洞?什么是文件包含漏洞?什么是文件上传漏洞?

  • 命令执行漏洞:
    • 命令执行漏洞是PHPWeb应用程序中比较常见的一种漏洞类型,主要是因为PHP中包含很多可以执行命令的函数,如eval()、system()和exee()等,如果过滤不严格就会产生此漏洞。攻击者可以将恶意代码提交给有包含漏洞的Web应用服务器,从而执行一些系统命令,如添加管理员用户等。
    • 命令执行漏洞的危害在于,攻击者继承Web服务程序的权限去执行系统命令或读写文件,进而控制整个网站甚至控制服务器。
  • 文件包含漏洞:
    • 程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数时,直接调用此文件,而无需再次编写,这种调用文件的过程一般被称为包含。
    • 程序开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,用来进行动态调用,但正是由于这种灵活性,导致客户端可以调用一个恶意文件,造成文件包含漏洞。
    • 文件包含漏洞实际上是代码注人的一种,其原理就是,注入一段用户能控制的脚本或代码,并让服务器端执行。
  • 文件上传漏洞:
    • 上传功能在互联网中应用得非常普遍。例如,上传一张自定义的图片;分享一段视频或者照片;论坛发帖时附带一个附件;在发送邮件时附带附件等。
    • 文件上传功能本身是一个正常业务需求,对于网站来说,很多时候也确实需要用户将文件上传到服务器,所以“文件上传”本身没有问题,但有问题的是文件上传后服务器如何处理和解析文件。若服务器的处理逻辑做得不够安全,则会导致严重的后果。
    • 文件上传漏洞是指,用户上传一个可执行的脚本文件,并通过此脚本文件获得执行服务器端命令的能力这种攻击方式是最为直接和有效的,几乎没有什么技术门槛。

From GPT:

XSS是通过注入脚本让浏览器执行,通常影响客户端;

命令执行漏洞是通过注入操作系统命令让服务器执行,通常影响服务器。

第五章

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

正如任何事物一样,软件开发也有其孕育、诞生、成长、成熟和衰亡的生存过程,一般称为“软件生命周期”。软件生命周期划可分成3个时期8个阶段:

  • 软件定义时期 通常进一步划分成3个阶段,即问题定义、可行性研究和需求分析。这个时期的工作通常又称为系统分析,由系统分析员负责完成。
  • 软件开发时期 通常由4个阶段组成:总体设计,详细设计,编码和单元测试,综合测试。前两个阶段又称为系统设计,后两个阶段又称为系统实现。
  • 软件维护时期 软件维护时期的任务是,使软件持久地满足用户的需要。当软件在使用过程中发现错误时应该加以改正;当环境改变时应该修改软件以适应新的环境;当用户有新要求时应该及时改进软件以满足用户的新需要。

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

  • 所谓软件过程,是指为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤
  • 软件开发模型(Software Development Model)是跨越整个软件生存周期的系统开发、运行和维护所实施的全部工作和任务的结构框架,它给出了软件开发活动各阶段之间的关系。
  • 20世纪90年代以后,因为“软件过程”模型能够更快更有效地完成软件产品,人们更多地使用它来代替传统的“软件开发模型”。 它支持灵活的插入及替换,使开发人员可以避免在开发的任何一个阶段中做出决定,并能实现更高的精度,减少了质量问题的风险。 此外,它还可以更好地利用团队的能力,实现分配任务的整个程序和过程。

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

  1. 瀑布模型 (Waterfall Model):
    1. 特点:瀑布模型是最传统的软件开发方法,它将软件开发过程划分为一系列严格定义的阶段,如需求分析、设计、编码、测试和维护。每个阶段完成后才开始下一个阶段。
    2. 适用场景:适用于需求明确、不太可能发生变化的项目。
    3. 局限性:不适用于需求不断变化的项目,且直到后期才能看到成品。
  2. 螺旋模型 (Spiral Model):
    1. 特点:螺旋模型结合了瀑布模型和原型制作的特点,强调风险分析。它是一个迭代的模型,将项目开发划分为多个迭代,每个迭代都包含瀑布模型的阶段。
    2. 适用场景:适用于大型、复杂、风险较高的项目。
    3. 局限性:管理复杂,成本可能较高。
  3. 快速原型模型 (Rapid Prototyping Model):
    1. 特点:快速原型模型着重于快速开发一个可工作的软件原型,用于验证用户需求和设计选择。
    2. 适用场景:适用于需求不明确的项目,需要快速得到用户反馈。
    3. 局限性:原型可能不够完善,可能需要重构。
  4. 增量模型 (Incremental Model):
    1. 特点:增量模型将项目分解为多个小的模块,每个模块被视为一个小的软件项目,逐渐增加功能。
    2. 适用场景:适用于需求逐渐明确,但希望早点看到部分成果的项目。
    3. 局限性:需要良好的模块规划和接口设计。
  5. 敏捷模型 (Agile Model):
    1. 特点:敏捷模型注重快速响应变化,它支持快速迭代开发,强调团队协作和客户交互。
    2. 适用场景:适用于需求频繁变化、要求快速交付的项目。
    3. 局限性:对团队自律要求高,可能在文档和设计方面较为薄弱。

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

  • 安全设计( Security by Design)。 软件的设计和实现需考虑如何保护其本身(和存储的信息)抵御外部攻击。
  • 安全配置( Security by Default)。软件的缺省配置运行环境应考虑如何降低安全风险。重要的一个假设是软件自身代码总存在安全漏洞。那么,如何减少这些安全漏洞的危害?例如,是否可以运行于普通用户权限,而不需要管理员权限?是否可以缺省关闭某些高风险的代码模块?
  • 安全部署( Security by Deployment)。软件需要提供相应的文档和工具,以帮助最终用户或管理员安全地使用。此外,更新应该易于部署。
  • 沟通(Communication)。 软件开发人员应为产品漏洞的发现准备响应方案,并与系统应用的各类人员不断沟通,以帮助他们采取保护措施(如打补丁或部署变通办法)。

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

Security Development Lifecycle

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

5.6 什么是敏捷SDL?敏捷SDL和经典SDL的主要区别是什么?

  • 很多软件产品开发的时间都很紧迫,一般Web项目开发可能只有2~3周的时间,采用完整的SDL开发流程显然不切实际,需要更简洁快速的软件安全开发方法。为此,微软对SDL进行调整,使其能够快速利用敏捷开发流程更好地实现安全需求,这就是敏捷SDL

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

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

第六章

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

  • 为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深入理解是软件开发工作获得成功的前提条件。
  • 对软件系统的需求:功能需求、性能需求、可靠性和可用性需求、出错处理需求、接口需求、约束、逆向需求、将来可能提出的要求。

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

软件安全需求分析的目的

  • 软件安全需求分析的目的是描述为了实现信息安全目标,软件系统应该做什么.才能有效地提高软件产品的安全质量,减少进而消减软件安全漏洞。
  • 软件安全需求分析的重要作用
  • 以往软件在开发时只强调业务功能需求,没有考虑安全需求,导致所开发的应用系统存在大量的漏洞。尽管周边安全技术如防火墙、入侵检测系统、防病毒及平台安全可以用来实现系统安全,但由于安全只是在产品环境下被测试和构建,其效果并不理想。
  • 一个缺少安全需求分析的软件开发项目,将威胁到信息的保密性、完整性和可用性,以及其他一些重要安全属性。这个软件产品被攻破可能就只是一个时间早晚的问题,而不是条件的问题,这取决于攻击者对于这个软件系统价值的判断。

哪些安全需求:

  • 外部安全需求
    • 外部安全需求通常主要指法律、法规等遵从性需求,包括相应国家和地区关于安全技术与管理的法规、标准及要求等。这些安全技术和管理的合规性要求往往是已有安全威胁的经验性对策的总结,因而遵循这些要求不仅是法规制度上的要求,也是软件安全性保障的要求。
  • 内部安全需求
    • 内部安全需求通常包括两个部分,一是组织内部需要遵守的政策、标准、指南和实践模式,二是与软件业务功能相关的安全需求。

6.3 软件安全需求分析的主要工作是什么?它和软件需求分析有什么区别与联系?

主要工作

  • 首先确定目标系统的业务运行环境、规则环境以及技术环境
  • 然后在了解各类软件安全需求内容的基础上,通过一定的安全需求获取过程,对软件应该包含的安全需求进行分析
  • 对于如何实现这些安全需求将在软件安全设计和开发部分进行讨论

与软件需求分析的区别

  • 客观性:
    • 安全需求并不是从使用者的要求和兴趣出发,而是由系统的客观属性所决定的。因此,需求分析员将承担更多软件需求的分析工作。

    • 用户对于软件即将面临的使用对象、使用环境的考虑通常不会包括那些恶意用户和不可控环境,因此,他们对于安全威胁的了解往往不全面,也很难从专业角度提出安全需求。这时,需求分析员就需要承担软件安全需求分析的主要工作。

  • 系统性:
    • 软件安全需求分析不能只从软件本身出发,必须从系统角度进行分析

    • 软件属于逻辑产品,很多情况下并不是软件失效,而是在软件正常工作时,在某种特殊条件下软硬件相互作用,以及由于人的使用问题而导致不安全情况发生。

    • 凡是与软件相关的接口、硬件状态、硬件故障和系统时序、人员操作、使用环境,包括软件自身的逻辑和物理模型、处理的静态动态数据,均属于软件安全性需求分析的范畴。

    • 分析的重点为软件功能设计缺陷,以及软件使用过程中软件、硬件和操作人员的相互作用。

    • 软件开发的每一个阶段都需要持续地对安全需求进行充分的定义和管理,这些安全需求应该作为与软件功能、质量和可用性同等重要的需求来处理,并且对那些残余风险需要遵从相关约束的安全需求也应该明确定义。

    • 从系统角度分析软件的安全性需求,这就不可避免地会涉及到各种不同领域的专业知识与经验积累。因此,分析时应以人为主,任何软件分析工具只能起辅助作用。

    • 这就对软件安全性分析人员提出了较高的要求。分析时要求有专门知识的软件安全性分析人员、熟悉系统结构的系统总体设计人员、软件设计人员、领域专家参加,共同工作。

  • 经济性和适用性:
    • 软件安全的需求内容非常丰富,并不是所有的应用安全需求控制都要采纳和实施。

    • 组织应当根据具体业务的重要性,对安全措施进行成本控制。安全控制的成本应该与软件所有者或者管理部门要求的目标水平相当。

    • 信息安全等级保护制度是我国信息安全保障体系建设的一项基本制度,对不同等级的信息系统提出相应的安全要求,要求不同等级的信息系统应具备相应的基本安全保护能力。

与软件需求分析的联系

  • 软件安全需求是软件需求的一个必要组成部分。安全需求应该与业务功能需求具有同样的需求水平,并对业务功能需求具有约束力。
  • 传统的周边安全方法所提供的安全保证不足以抵御无处不在的安全威胁,应用软件本身应该被设计为能够感知安全风险,并对安全问题具有自主控制和自我防御的能力,因此,将安全需求作为业务功能同样重要的系统需求来处理已经成为一种必然的趋势。
  • 在实际开发过程中,需求文档中常常提到安全需求,但是通常只是简单地提及安全机制
  • 部分需求文档中包含安全需求分析,但是安全需求分析过程与功能需求没有联系起来,这导致安全需求最终实现的保护形同虚设。
  • 在审查需求文档时,已存的安全需求通常是从一组通用的安全需求特征列表中复制其中一部分。
  • 一方面开发人员经常被灌输着在需求分析阶段就融入安全分析很重要的思想,而另一方面安全需求分析开发人员却没有掌握真正有效的安全需求分析方法

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

  • 软件需求分析中,分析员和用户都起着关键的、必不可少的作用。然而,在软件安全性需求分析中,软件用户由于安全知识的缺乏,很难从专业角度提出安全需求。因此,软件安全需求更多地来自于对组织内部和外部的一些安全政策和标准的遵从。

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

  • 信息安全标准从适用地域范围可以分为:国际标准、国家标准、地方标准、区域标准、行业标准和企业标准。
  • 信息安全标准从涉及的内容可以分为:信息安全体系标准、信息安全机制标准、信息安全测评标准、信息安全管理标准、信息安全工程标准、信息系统等级保护标准以及信息安全产品标准等类别。

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

为什么:

  • 对信息安全分级保护是客观需求。信息系统的建立是为社会发展、社会生活的需要而设计、建立的,是社会构成、行政组织体系及其业务体系的反映,这种体系是分层次和级别的。因此,信息安全保护必须符合客观存在。
  • 等级化保护是信息安全发展规律。按组织业务应用区域、分层、分类、分级进行保护和管理,分阶段推进等级保护制度建设,这是做好国家信息安全保护必须遵循的客观规律。
  • 等级保护是国家法律和政策要求。
    • 1994年国务院颁布的《中华人民共和国计算机信息系统安全保护条例》规定:“计算机信息系统实行安全等级保护,安全等级的划分标准和安全等级保护的具体方法,由公安部会同有关部门制定”。
    • 2017年6月1日起实施的《中华人民共和国网络安全法》第21条明确规定:“国家实行网络安全等级保护制度,要求网络运营者应当按照网络安全等级保护制度要求,履行安全保护义务”;第31条规定“对于国家关键信息基础设施,在网络安全等级保护制度的基础上,实行重点保护”。

哪些等级及具体要求

  • 第一级,属于一般网络,其一旦受到破坏,会对公民、法人和其他组织的合法权益造成损害,但不危害国家安全、社会秩序和社会公共利益。
  • 第二级,属于一般网络,其一旦受到破坏,会对公民、法人和其他组织的合法权益造成严重损害,或者对社会秩序和社会公共利益造成危害,但不危害国家安全。
  • 第三级,属于重要网络,其一旦受到破坏,会对公民、法人和其他组织的合法权益造成特别严重损害,或者会对社会秩序和社会公共利益造成严重危害,或者对国家安全造成危害。
  • 第四级,属于特别重要网络,其一旦受到破坏,会对社会秩序和社会公共利益造成特别严重危害,或者对国家安全造成严重危害。
  • 第五级,属于极其重要网络,其一旦受到破坏,会对国家安全造成特别严重危害

6.7 对网络安全等级划分通常有两种描述形式,即根据安全保护能力划分安全等级的描述,以及根据主体遭受破坏后对客体的破坏程度划分安全等级的描述这两种形式。试谈谈这两种等级划分的对应关系

//TODO

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

  • 信息安全管理体系是站在管理的角度上对信息进行管理,而等级保护则是管理体系中的一部分,是基础性的工作,两者在管理目标上具有一致性,而且还有相辅相成的作用。
  • 工作重点不同。
  • 所依据的标准不同。
  • 实施对象不同。

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

  • 业务负责人、最终用户和客户:在安全需求确定时应发挥重要作用,积极参与安全需求的采集和分析过程。业务负责人是业务风险的最终责任人,负责确定可接受的风险阈值,明确哪些残余风险是可以接受的,因此他们应该了解软件的安全漏洞,协助安全需求分析人员和软件开发团队考虑风险的优先顺序,权衡决定哪些风险是重要的。业务负责人、客户和最终用户对安全威胁和相关安全技术的了解和掌握不是很专业,他们还应当加强信息安全方面的培训和教育,提升安全意识,增长安全知识,确保能够充分了解软件将来应用的外部和内部环境威胁,对于安全需求的优先级确定提供帮助。
  • 安全需求分析人员:负责软件安全需求的收集和分析,并帮助软件开发团队将安全需求转化为功能说明。
  • 运维小组和信息安全小组等安全技术支持:也是软件安全需求获取相关方,安全需求分析人员、业务负责人、最终用户及客户应当积极与之保持联系和沟通,寻求他们的支持和帮助。

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

  • 头脑风暴(Brain-storming)
    • 无限制的自由联想和讨论,其目的在于产生新观念或激发创新设想。在应用程序需要快速实现的情况下使用 。
  • 问卷调查和访谈
    • 可以直接用于生成安全需求。调查人和被调查人之间的协作和沟通是很重要的。
  • 策略分解
    • 将组织需要遵守的内部和外部政策分解成为详细的安全需求。是一个连续的和结构化的过程。
  • 数据分类
    • 根据数据的重要度分级保护,可以降低数据保护的成本,使数据保护的投资—回报率最大化。
  • 主/客体关系矩阵
    • 角色和组件的二维表示,主体(角色)作为列,客体(对象/组件)作为行。在确定软件安全认证性、授权需求的时候最为有用。
  • 使用用例和滥用案例建模
    • 通过清楚地描述什么时间和在什么条件下会发生某些行为,可以有效地确定业务需求,包括安全需求。滥用案例可以通过对负面场景进行建模来帮助确定安全需求。
  • 软件安全需求跟踪矩阵
    • 通过数据分类、使用用例和滥用案例建模、主/客体关系矩阵以及其他需求获取过程,可以将软件安全需求编制成一个需求列表或需求跟踪矩阵(Requirement Traceability Matrix,RTM)。

6.11 软件安全需求的获取方法中的策略分解是指什么?

将组织需要遵守的内部和外部政策,包括外部法律法规、隐私和遵从性命令分解成为详细的安全需求。

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

  • 在数据生成(即创建)和使用(即加工)、传输、存储和存档这一生命周期中,都需要采取适当的保护机制。
  • 根据数据的重要性来进行分类,实际上也就是根据数据的敏感级,同时根据对数据泄露、变更或破坏的影响,有意识地为数据资产分配标签,以此来确定保护数据资产的不同安全保护需求和控制方法。

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

  1. 谁可以创建数据?谁可以对数据进行访问?访问权限是什么(授权的级别)?
  2. 当进行数据处理时,是否需要数据泄漏保护(Data Leakage Prevention, DLP)?
  3. 当数据被传输时,是否需要采用传输层或网络层安全协议(如SSL/TLS或IPSec)来保护数据?
  4. 数据是以结构化还是非结构化的方式进行存储,数据存储和使用的环境(私人、公共或混合)面临哪些安全威胁?
  5. 从数据的可访问性和可用性角度来看,一些需要频繁访问的关键业务数据必须存储在更快的存储介质上,但是,如何应对这些存储介质的可靠性、易失性等物理安全问题?
  6. 当数据归档时,需要遵循企业的数据保留政策,或是当地法律法规对数据存档的要求。当数据失去其效用(即不再被业务操作或连续性所需要),且没有监管或规范要求保留时,数据是否需要通过数据逻辑删除、物理媒体破坏或存储媒体消磁等被安全地处理?

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

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

第七章

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

软件设计可以看作是从软件需求规格说明书出发,根据需求分析阶段确定的功能,设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法等内容,形成软件的具体设计方案,即从整体到局部,从总体设计(也有称为概要设计)到详细设计的过程。

  • 从工程管理的角度,软件设计可以分为总体设计和详细设计两个子阶段。
  • 从技术的角度看软件设计阶段的主要工作,包括:软件架构设计、界面接口设计、模块/子系统等构件设计、数据模型设计、过程/算法设计以及部署设计等。

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

软件安全设计的主要工作包括软件架构安全性设计,软件架构安全性分析以及软件安全功能设计

7.3 为什么要进行软件架构设计?软件架构设计的主要工作是什么?软件架构安全性设计的主要工作是什么?

  • 为什么:为了达到控制软件复杂性、提高软件系统质量、支持软件开发和复用。软件架构设计对于开发高质量软件有较大作用。
  • 软件架构的设计工作:
    • 首先需要理清业务逻辑的功能要求,了解业务逻辑的变化性要求,包括可维护性和可扩展性,分离出概要业务逻辑层。
    • 接着,设计业务逻辑层和系统其他部分的接口与交互关系,按照职责分离原则设计包、类、方法和消息,设计业务逻辑算法。
    • 然后,使用自底向上和自顶向下相结合的方式,不断渐进地迭代架构设计
  • 软件架构安全性设计工作:
    • 首先需要进行系统描述,包括系统功能、安全要求、系统部署和技术需求,确定软件系统的安全级别。
    • 接着,设计软件网络、数据库等应具备的安全功能,根据软件具体安全需求的不同,设计的安全功能包括加密、完整性验证、数字签名、访问控制及安全管理等。
    • 在架构安全设计过程中,还需要解决软件安全功能的易用性、可维护性和独立性问题

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

  • 为什么:在软件架构安全性设计的过程中,尤其是对于大而复杂的系统,要将安全属性一次性设计到软件架构中成为架构的有机组成部分,这是一项非常具有挑战性的工作。为此,一旦软件架构设计或是软件架构安全性设计完成,在退出设计阶段进入开发阶段之前,需要对软件(安全)架构和设计方案进行检查,以确保设计能够满足软件的安全需求。这不仅包括功能方面的设计检查,也包括安全设计检查。检查可以帮助开发人员在编码之前对安全设计要素进行验证,提供一个识别和处理任何安全漏洞的机会,减少后续阶段重新设计软件的需要。
  • 基本过程:首先进行架构建模,然后根据软件的安全需求描述或相关标准,对架构模型是否满足进行检查,如果不满足,需要修改设计架构,如此反复,直至满足所有安全需求和相关标准。

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

  • 软件受攻击面是指,用户或其他程序以及潜在的攻击者都能够访问到的所有功能和代码的总和,它是一个混合体,不仅包括代码、接口、服务,也包括对所有用户提供服务的协议,尤其是那些未被验证的或远程用户都可以访问到的协议。一个软件的攻击面越大,安全风险就越大。
  • 举例:
    • 重要性低的功能可取消;
    • 重要等级为中的功能可设置为非默认开启,需要用户配置后才予以开启;
    • 重要性高的功能则关闭或增加一些安全措施进行限制。
    • 重用那些经过测试、已证明安全的现有库和通用组件,而不是用户自己开发的共享库。
    • 苹果公司的iOS不支持Java和Flash,一个重要原因就是相对于Mac OS X(或其他智能手机)减小了iOS的受攻击面。

7.6 什么是最小授权原则?试举例说明软件设计时哪些措施是采用了最小授权原则。

  • 最小授权原则是指,系统仅授予实体(用户、管理员、进程、应用和系统等)完成规定任务所必需的最小权限,并且该权限的持续时间也尽可能短。
  • 举例:
    • 将超级用户的权限划分为一组细粒度的权限,分别授予不同的系统操作员/管理员。对管理员账户分配安全资源的访问权限也要设置为受限访问,而不是超级用户权限。
    • 采用高内聚、低耦合的模块化编程方法,也就是模块之间的依赖关系是弱链接(低耦合),每一个模块只负责执行一个独立的功能(高内聚)。
    • Windows系统用户账户控制(User Account Control,UAC),实际上就是最小授权原则的运用。

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

  • 权限分离原则在软件设计中是指,将软件功能设计为需要在两个或更多条件下才能实现,以防止一旦出现问题,整个软件都可能面临风险。实际上这一原则也是最小权限原则的一种体现。
  • 举例:
    • 清晰的模块划分,将风险分散到各个模块中。
    • 不允许程序员检查自己编写的代码。
    • Linux将敏感操作(如超级用户的权利)分成26个特权,由一些特权用户分别掌握这些特权,每个特权用户都无法独立完成所有的敏感操作。

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

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

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

  • 设计模式是对软件设计中普遍存在、反复出现的各种问题,根据多次处理的经验,提出的一套能够快速、准确响应此类问题的解决方案。设计模式描述在各种不同情况下,应如何解决共性问题。
  • 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
  • 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

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

  • 安全模式是在给定的场景中,为控制、阻止或消减一组特定的威胁而采取的通用解决方案。该解决方案需要应对一系列的问题,并且可以使用UML类图、时序图、状态图和活动图等进行表述。
  • 安全模式封装了反复出现的系统问题的解决方案,同时精确地表述了系统要求和解决方案。
  • 采用模式的系统架构描述比较容易让人看懂,也为设计和分析提供了指南,还定义了使架构更安全的方法。
  • 安全模式使得不具备专业安全知识的应用开发人员也可以使用安全措施。

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

  1. 风险确定阶段
    1. 识别和评估风险
  2. 系统安全架构阶段
    1. 浏览模式库
    2. 选择相应安全模式
    3. 评估安全模式
    4. 建立系统高层架构
  3. 系统设计细化阶段
    1. 构建类图,实例化安全模式,整合和重构

7.12 什么是威胁建模?试简述威胁建模的过程。

  • 软件威胁建模是指,通过抽象的概念模型对影响软件系统的威胁进行系统地识别和评价
  • 过程:确定安全目标 创建应用程序概况图 分解应用程序 确定威胁 威胁评估 确定威胁缓解计划或策略 验证威胁 威胁建档

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

采用威胁建模方法,可以系统性地分析其架构、软件体系和程序部署,分析网络和信息系统可能面临的潜在威胁,确认有哪些攻击面,之后提出有针对性的安全防范措施,这才是有效解决网络安全对抗的良策。

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

PxI 排序方法考虑了业务影响(潜在损失和受影响的客户)和发生概率(可再现性、可利用性和可发现性),PxI 排序法对事件发生概率、业务影响及它们合并的影响进行深入分析,使得设计团队能够灵活地掌握如何降低事件发生的概率、减小业务影响或二者同时降低;此外,PxI 排序方法还给出了更精确的风险图谱。

第八章

8.1 软件安全编码阶段的主要工作有哪些?

  • 选择安全的编程语言、版本(配置)管理、代码检测、安全编译

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

//TODO

  • C#语言拥有内建到语言中的许多安全机制,包括类型安全元素、代码访问安全和基于角色的安全,这些安全机制都包括在.NET框架中,因而属于类型安全语言范畴。
  • Java也属于类型安全的语言,它可以确保操作仅能应用于适当的类型,使程序员能够制定新的抽象类型和签名,防止没有经过授权的代码对特定的值实施操作。
  • C语言不是类型安全语言!(指针、隐式类型转换)

8.3 安全编译是指在代码编译阶段采取的哪些安全措施?

  • 采用最新的集成编译环境,并选择使用这些编译环境提供的安全编译选项和安全编译机制。如在VS中编译时,开启/GS选项对缓冲区的安全进行检查。
  • 在一个安全的环境中进行。例如:对代码编译系统实施安全访问控制;使用访问控制列表防止未授权用户的访问;使用软件版本控制方法;尽量使用自动化编译工具和脚本。
  • 对应用环境的真实模拟
  • 多样化编译技术应用

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

  • 验证输入(Validate input)。对于不可信任数据源的输入应当进行验证。正确的输入验证能减少大量软件漏洞。这些数据源包括命令行参数、网络接口、环境变量,以及用户文件。
  • 留意编译器警告(Heed compiler warnings)。应采用实现了安全特性的编译器,并启用编译器的警告和错误提示功能。不仅要处理和解决代码中的错误,而且也应处理和解决所有的警告,确保不将任何一个警告带入到程序的最终编译版本中。
  • 安全策略的架构和设计(Architect and design for security policies)。创建一个软件架构来实现和增强安全策略。例如,如果系统在不同的时间需要不同的权限,则考虑将系统分成不同的互相通信的子系统,每个系统拥有适当的权限。
  • 保持简单性(Keep it simple)。这是第7章中介绍的减少软件被攻击面原则的体现。程序越复杂,控制会越复杂,就会增加代码出错的可能。要尽量使程序短小精悍,代码中的每个函数应该具有明确的功能,在编写函数代码时,应在保持功能完整实现的前提下控制该函数内代码量的多少。对于复杂的功能,应将该功能分解为更小、更简单的功能,确保软件仅包含所要求或规定的功能。
  • 默认拒绝(Default deny)。这是第7章中介绍的默认安全配置原则的体现。默认的访问权限是拒绝,除非明确是允许的。
  • 坚持最小权限原则(Adhere to the principle of least privilege)。这是一个通用的安全原则,在本书第7章已经提及,这里从编码角度再次重申。每个进程拥有完成工作所需的最小权限,任何权限的拥有时间要尽可能短,以阻止攻击者利用权限执行任意代码的机会。

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

通过沙箱将运行的软件与主机操作系统隔离,避免未经测试的、不可信的、未经验证的代码和程序被执行,尤其是要避免那些由第三方发布的程序直接在主机操作系统上运行。

8.7 试谈谈Java提供的安全机制。

  • 语言层安全
    • 语言层安全是通过编译器的编译来实现,即编译成功则说明达到了语言层安全性。 Java在语言层提供如下安全机制:

    • 通过某些关键字(如private、protected)定义代码的可见性范围(即权限)。

    • 通过类型规则确保程序运行时变量的值始终与声明的类型一致,在函数或方法调用时形参与实参的类型匹配。

    • Java还采用自动内存管理、垃圾收集站、字符串和数组的范围检查等方法,来确保Java语言的安全性。

  • 字节码层安全
    • 在字节码层次,Java提供两种保障安全的机制:类加载器、字节码验证器。
  • 应用层安全
    • ​ 一旦类加载器加载了一个类并由字节码验证器验证了它,Java平台的第3种安全机制,即安全管理器就开始运行:

    • 安全管理器是一个由Java API提供的类,即:java.lang. SecurityManager类,它的作用是说明一个安全策略以及实施这个安全策略。

    • 安全策略描述了哪些代码允许做哪些操作。由安全管理器对象定义的安全检查方法构成了当前系统的安全策略。当这些检查方法被调用时,安全策略就得以实施。

第十二章

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

//TODO

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

//TODO

书上P305-316

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

  • 漏洞利用型蠕虫与病毒根本区别在于其是否需要人为干预来触发传播,而在很多其他方面,例如个体独立性、破坏性、隐藏性等,二者区别并不大。
  • 计算机病毒的关键技术是伪装,通过诱导、欺骗用户的手段引导用户的误操作从而实现感染,用户的行为直接决定病毒的感染是否成功。
  • 蠕虫在其感染过程中并不需要用户的主动行为,其感染过程是一种自动化、智能化的过程。
  • 蠕虫的重要特征:对用户的非依赖性。而实现这一功能的基础便是系统漏洞。
  • 补充:书上说传统病毒主要感染计算机的文件系统,而蠕虫影响的主要是计算机系统和网络性能。

12.4 什么是 Rootkit?它与木马和后门有什么区别与联系?

  • 目前通常所说的Rootkit是指:一类木马后门工具,通过修改现有的操作系统软件,使攻击者获得访问权限并隐藏在计算机中。
  • Rootkit与木马、后门等既有联系又有区别。首先,Rootkit属于木马的范畴,它用恶意的版本替换修改现有操作系统软件来伪装自己,从而掩盖其真实的恶意的目的,而这种伪装和隐藏机制正是木马的特性。此外,Rootkit还作为后门行使其职能,各种Rootkit通过后门口令、远程Shell或其他可能的后门途径,为攻击者提供绕过检查机制的后门访问通道,这是后门工具的又一特性。Rootkit强调的是强大的隐藏功能、伪造和欺骗功能,而木马、后门强调的是窃取功能、远程侵入功能。两者的侧重点不一样,两者结合起来则可以使得攻击者的攻击手段更加隐蔽、强大。

12.5 什么是勒索软件?为什么勒索软件成为近年来数量增长最快的恶意代码类型?

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

勒索软件通常会将用户系统中的文档、邮件、数据库、源代码及图片等多种文件进行某种形式的加密操作,使之不可用,或者通过修改系统配置文件,干扰用户正常使用系统的方法,使系统的可用性降低,然后通过弹出窗口、对话框或生成文本文件等方式向用户发出勒索通知,要求用户向指定账户汇款来获得解密文件的密码或者获得恢复系统正常运行的方法。

  • 勒索软件是近年数量增长最快的恶意代码类型。主要原因有以下几个。
    • 加密手段有效,解密成本高。勒索软件都采用成熟的密码学算法,使用高强度的对称和非对称加密算法对文件进行加密。除非在实现上有漏洞或密钥泄密,否则在没有私钥的情况下几乎没有可能解密。当受害者数据非常重要又没有备份的情况下,除了支付赎金没有别的方法去恢复数据,正是因为这点勒索者能源源不断地获取高额收益,推动了勒索软件的快速增长。
    • 使用电子货币支付赎金,变现快,追踪困难。几乎所有勒索软件支付赎金的手段都是采用比特币来进行的。比特币因为匿名、变现快、追踪困难,再加上大众比较熟知比特币,支付起来困难不是很大而被攻击者大量使用。可以说比特币帮助勒索软件解决了支付赎金的问题,进一步推动了勒索软件的发展。
    • 勒索软件即服务(Ransomware-as-a-server)的出现,降低了攻击的技术门槛。勒索软件服务化,开发者提供整套勒索软件的解决方案,从勒索软件的开发、传播到赎金的收取都提供完整的服务。攻击者不需要任何知识,只要支付少量的租金即可租赁他们的服务,从而开展勒索软件的非法勾当。这大大降低了使用勒索软件的技术门槛,推动了勒索软件的大规模爆发。

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

  • 增强法律意识,自觉履行恶意代码防治责任
  • 健全管理制度,严格执行恶意代码防治规定

12.7 试为所在学院或单位拟定恶意代码防治管理制度。

拟定你大爷。建议把院里所有服务器账号密码给我,让我开全南京最大的在线赌场,赚了钱分你一半。

第十三章

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

  • 商业软件作为商品进行销售获得收益的软件,商业软件是版权贸易的典型模式。商业软件通常通过销售软件的使用许可证及技术支持服务向用户收取费用。绝大多数商业软件都是闭源软件,但也可能是免费软件。商业软件也可以部分或全部使用开源软件的代码,如Redhat Linux就包含了大量的开源代码,因此商业软件也可以是开源软件。
  • 免费软件是指不需要以金钱购买而免费得到或使用的软件,开源软件通常是免费软件,但通常在使用上会有一些限制,如禁止反编译软件以研究软件写法、禁止修改软件源码,以及禁止再次散布出去给其他人使用等。使用者没有使用、复制、研究、修改和分发软件的自由。免费软件虽然不需要花钱,但是其源代码不一定会公开,也有可能会限制重制及再发行的自由,所以免费软件不一定是开源软件,也不一定是自由软件。软件企业有时为了让收费版软件扩大市场占有率,往往会发布免费版软件。
  • 共享软件也称试用软件,是以“先使用后付费”的方式销售的享有版权的软件,是商业软件的一种特定形式。根据共享软件作者的授权,用户可以免费获取和安装,也可以自由传播它。共享软件最明显的优点是有免费试用期,用户可以先试用共享软件,认为满意后再向作者付费,也可以在试用期间停止使用。但是免费试用版通常有一些限制,如时间限制、功能限制或添加水印等。共享软件一般不会开放源代码。
  • 闭源软件或专有软件是指源代码在获取、使用和修改上受到特定限制的软件,简单地说就是封闭源代码软件。一般地,它意味着用户仅能获得许可软件的一个二进制版本,而没有这个程序的源代码。商业软件通常是闭源软件。有些闭源软件也会以某种形式公布源代码,如微软的部分产品推出了政府安全计划源代码协议,IBM的WebSphere sMash产品的核心代码也以Project Zero的形式在互联网上公布。不过,公布源代码和开放源代码不是一回事,公布只是让用户看到了源代码,但是通常并不允许用户修改或另作他用,更别说发布了。
  • 自由软件在一定程度上是对商业软件及其强化知识产权保护的批评与叛逆。自由软件是一类可以不受限制地自由使用、复制、研究、修改和分发的软件。不受限制是自由软件最重要的本质。自由软件赋予使用者4种自由:1)不论目的如何,有运行该软件的自由。2)有研究该软件的自由,以及按需改写该软件的自由。3)有重新发布该软件的自由,所以每个人都可以借此来敦亲睦邻。4)有改进该软件的自由,以及向公众发布改写版的自由,这样整个社区都可以受惠。当然,研究和改进软件的前提是取得该软件的源代码。如果某一软件的用户具有上述4种权利,则该软件可以被称为“自由软件”。自由软件的重点在于自由权,而非价格。大部分的自由软件都是在线发布的,并且不收取任何费用;或是以离线实体的方式发行,有时会酌收最低限度的费用(如材料工本费),而人们可用任何价格来贩售这些软件。自由软件与商业软件是可以共同并立存在的。自由软件并不是没有版权。部分自由软件可以免费取得,并且它的源代码可以自由修改并散布,但它并不是没有版权。版权是当某项作品完成时就自然产生了,无需申请或注册。
  • 开源软件也称开放源代码软件,是由开放源代码促进会(Open Source Initiative,OSI)定义且提出的。开放源码促进会OSI对开源软件有着明确的定义,该定义共有10个条款,业界公认只有符合这个定义的软件才能被称作开源软件。与自由软件的概念不同、价值观不同。

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

  • 不论目的如何,有运行该软件的自由。
  • 研究该软件的自由,以及按需改写该软件的自由。
  • 重新发布该软件的自由,所以每个人都可以借此来敦亲睦邻。
  • 改进该软件的自由,以及向公众发布改写版的自由,这样整个社区都可以受惠。

13.3 试简述开源软件与自由软件的联系与区别。

虽然开源软件由自由软件发展而来,但是严格地说,开源软件和自由软件是两个不同的概念,有着不同的价值观,它们是开源运动中两个相交但又不同的流派。开源软件与自由软件的区别主要表现在以下两个方面。

  • 概念不同。自由软件是一个比开源软件更严格的概念,因此所有自由软件都是开放源代码的,但不是所有的开源软件都能被称为自由软件。只有遵守GPL和BSD许可证的开源软件才符合自由软件的定义。BSD和Apache等许可证与GPL等Copyleft型的许可证有很大区别,它们对软件的衍生和再发布的约束十分宽松,这样大大减少了商业公司在使用和参与开源软件时的顾虑。
  • 价值观不同。在追求自由、分享精神的过程中,自由软件始终将自由作为道德标准,而开源软件则更加注重软件的发展。自由软件最重要的特点是,从许可证即法律角度保证了自由软件在演化过程中将始终保持其“自由性”,从而保证了其任何版本都可以为任何人使用、学习和改进。斯托曼认为使用软件专利是非常不道德的事情,只有自由的程序才是符合其道德标准的。斯托曼并不认同开源软件,仍然觉得自由软件更能体现他所倡导的自由使用、修改、共享和发布软件的思想。开源软件则更加注重与软件产业的结合,对商业化更加友好,希望用各种方式来发展软件本身。开源软件的思想首先考虑的是如何发展软件,让更多的人来使用软件,而不是先去保证软件在演化过程中的开源性。

13.4 试列举常见的开源软件,查找并了解这些开源软件的许可证内容。

//TODO

13.5 所开发的软件中使用了带 GPL 许可证的开源软件,那么这个软件是不是就要开源?

GPL许可证的主要内容是,只要在一个软件中使用了(“使用”指类库引用、修改代码或者衍生代码)GPL许可证产品,则该软件产品必须也采用GPL许可证,即必须也是开源和免费的,这就是所谓的“传染性”。这就是说,GPL不允许修改后和衍生的代码作为闭源的商业软件发布和销售。当然,如果用户(包括企业用户)对于GPL软件不再发布,就不受此约束。不过,商业软件或者对代码有保密要求的部门就不适合将GPL开源软件集成/采用作为类库和二次开发的基础。

第十四章

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

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

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

参考1.7

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

概念:

软件版权旨在保护某个特定的计算机程序,以及程序中所包含的信息的完整性、机密性和可用性。

侵权行为:

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

保护措施:

  • 基于硬件的保护技术
    • 对发行介质的保护
    • 软件狗
    • 可信计算芯片
  • 基于软件的保护技术
    • 注册验证
    • 软件水印
    • 代码混淆
    • 软件加壳
    • 虚拟机保护

14.4 软件版权保护的目标有哪些?它与软件保护的目标有什么联系与区别?

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

软件版权保护的目标是软件保护目标的一个子集。软件保护除了确保软件版权不受侵害以外,还要防范针对软件的恶意代码感染、渗透、篡改和执行等侵害。软件版权保护的许多措施同样可以应用于软件保护。

补充:

img