本文目的是更新以往资料的时效性和不准确性。2025年的考试范围删除了第四章,新增了第十三章,且之前的资料中存在一些不准确的答案,本人翻阅教材和PPT,补充和修改了之前的复习资料,供大家期末复习参考。
本人并不保证本文内容的绝对正确,也不保证本文内容涵盖了所有复习点。
特别感谢知乎timeErrors学长/学姐提供的参考资料。
说明
高亮的题目是本人认为的重点部分,未高亮的题目本人认为大概率不会考。此外还有几道题目本人认为一定不会考,因此没有整理答案。
引用的内容是一些资料参考 或者关联题目,不作为答案
文章目录
-
- [第一章 软件安全概述](#第一章 软件安全概述)
-
- [==1-1 什么是零日漏洞?什么是零日攻击?==](#==1-1 什么是零日漏洞?什么是零日攻击?==)
- [==1-2 为什么必须对软件安全给予强烈关注?==](#==1-2 为什么必须对软件安全给予强烈关注?==)
- [1-3 零日漏洞反映了软件系统存在的什么问题?](#1-3 零日漏洞反映了软件系统存在的什么问题?)
- [==1-4 软件安全威胁可以分为哪几类?==](#==1-4 软件安全威胁可以分为哪几类?==)
- [1-5 试谈谈对软件漏洞的认识,举出软件漏洞造成危害的事件例子。](#1-5 试谈谈对软件漏洞的认识,举出软件漏洞造成危害的事件例子。)
- [1-6 什么是恶意代码?除了传统的计算机病毒,还有哪些恶意代码类型?](#1-6 什么是恶意代码?除了传统的计算机病毒,还有哪些恶意代码类型?)
- [1-7 有哪些行为侵犯软件版权?](#1-7 有哪些行为侵犯软件版权?)
- [==1-8 谈谈对软件安全概念的理解。==](#==1-8 谈谈对软件安全概念的理解。==)
- [1-9 简述软件和软件工程的概念。](#1-9 简述软件和软件工程的概念。)
- [==1-10 对照一般软件工程的概念,软件安全工程主要增添了哪些任务?==](#==1-10 对照一般软件工程的概念,软件安全工程主要增添了哪些任务?==)
- [1-11 谈谈软件安全与软件危机、软件质量和软件质量保证、软件保障、软件可靠性、应用软件系统安全、可信软件和软件定义安全等概念的区别和联系。](#1-11 谈谈软件安全与软件危机、软件质量和软件质量保证、软件保障、软件可靠性、应用软件系统安全、可信软件和软件定义安全等概念的区别和联系。)
- [==1-12 确保软件安全的基本思路是什么?软件安全涉及的技术主要有哪些方面?==](#==1-12 确保软件安全的基本思路是什么?软件安全涉及的技术主要有哪些方面?==)
- [第二章 软件漏洞概述](#第二章 软件漏洞概述)
-
- [==2-1 软件漏洞的概念,软件漏洞与软件错误、软件缺陷、软件bug的区别和联系==](#==2-1 软件漏洞的概念,软件漏洞与软件错误、软件缺陷、软件bug的区别和联系==)
- [2-2 为什么说安全缺陷或者说Bug是一个需要考虑具体环境、具体对象的概念?](#2-2 为什么说安全缺陷或者说Bug是一个需要考虑具体环境、具体对象的概念?)
- [==2-3 试分析软件漏洞的成因。==](#==2-3 试分析软件漏洞的成因。==)
- [==2-4 软件漏洞如何分类分级管理?==](#==2-4 软件漏洞如何分类分级管理?==)
- [2-5 软件漏洞管理应当遵循怎样的标准?](#2-5 软件漏洞管理应当遵循怎样的标准?)
- [==2-6 软件漏洞买卖合法吗?软件漏洞如何管控?==](#==2-6 软件漏洞买卖合法吗?软件漏洞如何管控?==)
- [2-7 厂商发布漏洞信息的标准过程是怎样的?](#2-7 厂商发布漏洞信息的标准过程是怎样的?)
- [第三章 Windows系统典型漏洞](#第三章 Windows系统典型漏洞)
-
- [==3-1 程序运行时的内存布局时怎样的?==](#==3-1 程序运行时的内存布局时怎样的?==)
- [3-2 在程序运行时,用来动态申请分配数据和对象的内存区域形式称为什么?](#3-2 在程序运行时,用来动态申请分配数据和对象的内存区域形式称为什么?)
- [3-3 什么是缓冲区溢出漏洞?](#3-3 什么是缓冲区溢出漏洞?)
- [==3-4 简述Windows安全漏洞保护的基本技术及其存在的问题==](#==3-4 简述Windows安全漏洞保护的基本技术及其存在的问题==)
- [3-5 本章介绍了Windows的5种典型保护机制,但是每一种保护机制仍然面临着缺陷和许多对抗的方法,这说明了什么问题?应当如何应对这一问题?](#3-5 本章介绍了Windows的5种典型保护机制,但是每一种保护机制仍然面临着缺陷和许多对抗的方法,这说明了什么问题?应当如何应对这一问题?)
- [第五章 软件安全开发模型](#第五章 软件安全开发模型)
-
- [5-1 什么是软件的生命周期?软件生命周期通常包括哪几个阶段?](#5-1 什么是软件的生命周期?软件生命周期通常包括哪几个阶段?)
- [5-2 什么是软件过程?什么是软件开发(过程)模型?为什么从20世纪90年代以后,人们更多使用"软件过程"来替代传统的"软件开发模型"?](#5-2 什么是软件过程?什么是软件开发(过程)模型?为什么从20世纪90年代以后,人们更多使用“软件过程”来替代传统的“软件开发模型”?)
- [5-3 有哪些典型的软件开发模型?这些软件开发模型有什么区别与联系?](#5-3 有哪些典型的软件开发模型?这些软件开发模型有什么区别与联系?)
- [==5-4 SD3+C原则是SDL模型实施的基本原则,试简述其内容==](#==5-4 SD3+C原则是SDL模型实施的基本原则,试简述其内容==)
- [5-5 微软的SDL模型与传统的瀑布模型的关系是怎样的?](#5-5 微软的SDL模型与传统的瀑布模型的关系是怎样的?)
- [==5-6 什么是敏捷SDL?敏捷SDL和经典SDL的主要区别是什么?==](#==5-6 什么是敏捷SDL?敏捷SDL和经典SDL的主要区别是什么?==)
- [第六章 软件安全需求分析](#第六章 软件安全需求分析)
-
- [6-1 为什么要进行需求分析? 通常对软件系统有哪些需求?](#6-1 为什么要进行需求分析? 通常对软件系统有哪些需求?)
- [==6-2 为什么要进行安全需求分析? 通常对软件系统有哪些安全需求?==](#==6-2 为什么要进行安全需求分析? 通常对软件系统有哪些安全需求?==)
- [==6-3 软件安全需求分析的主要工作是什么? 它和软件需求分析有什么区别与联系?==](#==6-3 软件安全需求分析的主要工作是什么? 它和软件需求分析有什么区别与联系?==)
- [6-4 为什么说软件安全需求更多地来源于遵从性需求?](#6-4 为什么说软件安全需求更多地来源于遵从性需求?)
- [6-5 本章中介绍的安全需求遵从性标准有哪些类别,它们之间有何联系与区别?](#6-5 本章中介绍的安全需求遵从性标准有哪些类别,它们之间有何联系与区别?)
- [6-6 我国为什么要实行网络安全等级保护制度? 网络安全保护能力划分为哪些等级?具体每个等级有什么要求?](#6-6 我国为什么要实行网络安全等级保护制度? 网络安全保护能力划分为哪些等级?具体每个等级有什么要求?)
- [6-7 对网络安全等级划分通常有两种描述形式,即根据安全保护能力划分安全等级的描述,以及根据主体遭受破坏后对客体的破坏程度划分安全等级的描述这两种形式。试谈谈这两种等级划分的对应关系。](#6-7 对网络安全等级划分通常有两种描述形式,即根据安全保护能力划分安全等级的描述,以及根据主体遭受破坏后对客体的破坏程度划分安全等级的描述这两种形式。试谈谈这两种等级划分的对应关系。)
- [6-8 简述网络等级保护与信息安全管理体系的联系和区别。](#6-8 简述网络等级保护与信息安全管理体系的联系和区别。)
- [6-9 软件安全需求获取过程中涉及哪些相关方人员?他们各自主要的职责是什么?](#6-9 软件安全需求获取过程中涉及哪些相关方人员?他们各自主要的职责是什么?)
- [==6-10 软件安全需求的获取方法有哪些?==](#==6-10 软件安全需求的获取方法有哪些?==)
- [6-11 软件安全需求的获取方法中的策略分解是指什么?](#6-11 软件安全需求的获取方法中的策略分解是指什么?)
- [6-12 软件安全需求的获取方法中的数据分类是指什么?](#6-12 软件安全需求的获取方法中的数据分类是指什么?)
- [==6-13 针对信息系统中的数据生命周期,通常应当考虑的安全需求有哪些?==](#==6-13 针对信息系统中的数据生命周期,通常应当考虑的安全需求有哪些?==)
- [6-14 软件安全需求的获取方法中的主/客体关系矩阵是指什么?](#6-14 软件安全需求的获取方法中的主/客体关系矩阵是指什么?)
- [第七章 软件安全设计](#第七章 软件安全设计)
-
- [==7-⭐ 列出至少3条软件安全设计原则,并简单介绍。==](#==7-⭐ 列出至少3条软件安全设计原则,并简单介绍。==)
- [7-1 软件设计阶段的主要工作是什么?](#7-1 软件设计阶段的主要工作是什么?)
- [==7-2 软件安全设计阶段的主要工作是什么?==](#==7-2 软件安全设计阶段的主要工作是什么?==)
- [==7-3 为什么要进行软件架构设计?软件架构设计的主要工作是什么?软件架构安全性设计的主要工作是什么?==](#==7-3 为什么要进行软件架构设计?软件架构设计的主要工作是什么?软件架构安全性设计的主要工作是什么?==)
- [==7-4 为什么要进行软件架构安全性分析?软件架构安全性分析的基本过程是什么?==](#==7-4 为什么要进行软件架构安全性分析?软件架构安全性分析的基本过程是什么?==)
- [==7-5 软件受攻击面是指什么?举例说明软件设计时可以采取哪些策略来降低受攻击面。==](#==7-5 软件受攻击面是指什么?举例说明软件设计时可以采取哪些策略来降低受攻击面。==)
- [==7-6 什么是最小授权原则?试举例说明软件设计时哪些措施是采用了最小授权原则。==](#==7-6 什么是最小授权原则?试举例说明软件设计时哪些措施是采用了最小授权原则。==)
- [==7-7 什么是权限分离原则?试举例说明软件设计时哪些措施是采用了权限分离原则。==](#==7-7 什么是权限分离原则?试举例说明软件设计时哪些措施是采用了权限分离原则。==)
- [7-8 针对第6章介绍的核心安全需求,软件安全功能设计通常有哪些内容?](#7-8 针对第6章介绍的核心安全需求,软件安全功能设计通常有哪些内容?)
- [7-9 什么是软件设计模式?**有哪些软件设计模式?**](#7-9 什么是软件设计模式?有哪些软件设计模式?)
- [==7-10 什么是安全模式? 为什么说能够利用安全模式来快速、准确地进行软件安全设计?==](#==7-10 什么是安全模式? 为什么说能够利用安全模式来快速、准确地进行软件安全设计?==)
- [7-11 试给出一种利用安全模式进行软件安全设计的方法。](#7-11 试给出一种利用安全模式进行软件安全设计的方法。)
- [==7.12 什么是威胁建模? 试简述威胁建模的过程。==](#==7.12 什么是威胁建模? 试简述威胁建模的过程。==)
- [7-13 为什么说组织自身的威胁建模能力水平对提升组织的整体安全保障能力起到至关重要的作用?](#7-13 为什么说组织自身的威胁建模能力水平对提升组织的整体安全保障能力起到至关重要的作用?)
- [7-14 在威胁排序的几种计算方法中,为什么说相比 Delphi法和平均排序法,PxI排序方法更科学?](#7-14 在威胁排序的几种计算方法中,为什么说相比 Delphi法和平均排序法,PxI排序方法更科学?)
- [第八章 软件安全编码](#第八章 软件安全编码)
-
- [==8-1 软件安全编码阶段的主要工作有哪些?==](#==8-1 软件安全编码阶段的主要工作有哪些?==)
- [==8-2 什么是类型安全语言? 哪些程序开发语言是类型安全的?==](#==8-2 什么是类型安全语言? 哪些程序开发语言是类型安全的?==)
- [==8-3 安全编译是指在代码编译阶段采取的哪些安全措施?==](#==8-3 安全编译是指在代码编译阶段采取的哪些安全措施?==)
- [==8-4 试列举几条安全编码原则,并举例说明这些原则的重要意义。==](#==8-4 试列举几条安全编码原则,并举例说明这些原则的重要意义。==)
- [8-5 为什么要避免使用C语言中原有的字符串函数?所谓的安全字符串函数解决了原有C字符串函数的什么安全漏洞?](#8-5 为什么要避免使用C语言中原有的字符串函数?所谓的安全字符串函数解决了原有C字符串函数的什么安全漏洞?)
- [8-6 Java提供的沙箱安全机制的核心思想是什么?](#8-6 Java提供的沙箱安全机制的核心思想是什么?)
- [==8-7 试谈谈Java提供的安全机制。==](#==8-7 试谈谈Java提供的安全机制。==)
- [第十二章 恶意软件防治](#第十二章 恶意软件防治)
-
- [12-1 试解释以下与恶意代码程序相关的计算机系统概念,以及各概念之间的联系与区别:进程、线程、动态链接库、服务、注册表。](#12-1 试解释以下与恶意代码程序相关的计算机系统概念,以及各概念之间的联系与区别:进程、线程、动态链接库、服务、注册表。)
- [==12-2 从危害、传播、激活和隐藏4个主要方面分析计算机病毒、蠕虫、木马、后门、Rootkit及勒索软件这几类恶意代码类型的工作原理==](#==12-2 从危害、传播、激活和隐藏4个主要方面分析计算机病毒、蠕虫、木马、后门、Rootkit及勒索软件这几类恶意代码类型的工作原理==)
- [==12-3 病毒程序与蠕虫程序的主要区别有哪些?==](#==12-3 病毒程序与蠕虫程序的主要区别有哪些?==)
- [==12-4 什么是Rootkit? 它与木马和后门有什么区别与联系?==](#==12-4 什么是Rootkit? 它与木马和后门有什么区别与联系?==)
- [==12-5 什么是勒索软件?为什么勒索软件成为近年来数量增长最快的恶意代码类型?==](#==12-5 什么是勒索软件?为什么勒索软件成为近年来数量增长最快的恶意代码类型?==)
- [12-6 恶意代码防范的基本措施包括哪些?](#12-6 恶意代码防范的基本措施包括哪些?)
- [第十三章 开源软件及其安全性](#第十三章 开源软件及其安全性)
-
- [==13-1 试从软件的权益处置角度,谈谈对商业软件、免费软件、共享软件(或试用软件)、闭源软件、自由软件及开源软件概念的理解。==](#==13-1 试从软件的权益处置角度,谈谈对商业软件、免费软件、共享软件(或试用软件)、闭源软件、自由软件及开源软件概念的理解。==)
- [==13-2 自由软件赋予软件使用者哪些"自由"?==](#==13-2 自由软件赋予软件使用者哪些“自由”?==)
- [==13-3 试简述开源软件与自由软件的联系与区别。==](#==13-3 试简述开源软件与自由软件的联系与区别。==)
- [==13-4 试列举常见的开源软件,查找并了解这些开源软件的许可证内容。==](#==13-4 试列举常见的开源软件,查找并了解这些开源软件的许可证内容。==)
- [13-5 所开发的软件中使用了带GPL许可证的开源软件,那么这个软件是不是就要开源?](#13-5 所开发的软件中使用了带GPL许可证的开源软件,那么这个软件是不是就要开源?)
- 第十四章
-
- [14-1 我国对于软件的知识产权有哪些法律保护途径?](#14-1 我国对于软件的知识产权有哪些法律保护途径?)
- [==14-2 根据我国法律,软件著作权人有哪些权利?在日常学习和生活中,有哪些违反软件著作权的行为?==](#==14-2 根据我国法律,软件著作权人有哪些权利?在日常学习和生活中,有哪些违反软件著作权的行为?==)
- [==14-3 试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?==](#==14-3 试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?==)
- [==14-4 软件版权保护的目标有哪些?它与软件保护的目标有什么联系与区别?==](#==14-4 软件版权保护的目标有哪些?它与软件保护的目标有什么联系与区别?==)
第一章 软件安全概述
1-1 什么是零日漏洞?什么是零日攻击?
- 零日漏洞是指未被公开披露的软件漏洞。没有给软件的作者或厂商以时间去为漏洞打补丁或是给出建议解决方案,从而攻击者能够利用这种漏洞发动攻击。
- 利用零日漏洞 开发攻击工具进行的攻击称为零日攻击。零日攻击针对的漏洞由于软件厂商还没有发现或是还未及提供相应的补丁,所以零日攻击的成功率高 ,造成的破坏大。
1-2 为什么必须对软件安全给予强烈关注?
- 软件无处不在。现在是信息化时代,软件己融入日常生活的方方面面,成为国家和社会关键基础设施的重要组成部分。
- 软件规模日益庞大。随着软件应用范围日益广泛,软件规模也大幅增加。
- 软件漏洞普遍存在,零日漏洞成为主要安全威胁。软件漏洞是普遍存在的,它们在开发、部署和应用中的问题层出不穷。
- 软件安全应当引起重视,应当成为当务之急,甚至成为国家的一项竞争优势。软件已经渗透到社会、经济与国防建设的方方面面,软件安全关乎到国家竞争力。
1-3 零日漏洞反映了软件系统存在的什么问题?
零日漏洞反映了软件系统的脆弱性,存在漏洞的隐秘性、修复的滞后性。
1-4 软件安全威胁可以分为哪几类?
软件面临的安全威胁分为3大类:软件自身的安全(软件漏洞)、恶意代码以及软件侵权
-
软件漏洞(第二章)
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
-
恶意代码(第十二章)
恶意代码是在未被授权的情况下,以破坏软硬件设备、窃取用户信息、干扰用户正常使用目的而编制的软件或代码片段。
-
软件侵权(第十四章)
主要指侵犯软件版权(著作权),常见软件侵权行为如软件盗版、逆向工程、信息泄露。
14-3 试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?
1-5 试谈谈对软件漏洞的认识,举出软件漏洞造成危害的事件例子。
定义
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
举例
- 导致有害的输出或行为 。软件漏洞可能会造成软件在运行过程中出现错误结果或运行不稳定、崩溃等现象,甚至引起死机等情况。
- 应用软件由于存在内存泄露,运行时系统内存消耗越来越大,直至最后崩溃。
- 操作系统启动时发现未能驱动的硬件而导致蓝屏。
- 被攻击者所利用来攻击系统 。软件漏洞会被黑客发现、利用,进而实施窃取隐私信息、甚至破坏系统等攻击行为。
- 软件存在缓冲区溢出漏洞,黑客利用溢出攻击而获得远程用户权限。
- 软件将用户输入的数据直接拼接进 SQL 查询语句,攻击者通过SQL注入对数据库执行恶意指令。
1-6 什么是恶意代码?除了传统的计算机病毒,还有哪些恶意代码类型?
定义
恶意代码是在未被授权的情况下,以破坏软硬件设备、窃取用户信息、干扰用户正常使用为目的而编制的软件或代码片段。
举例
蠕虫、木马、后门、Rootkit、勒索软件
12-2 从危害、传播、激活和隐藏4个主要方面分析计算机病毒、蠕虫、木马、后门、Rootkit及勒索软件这几类恶意代码类型的工作原理。
1-7 有哪些行为侵犯软件版权?
-
侵犯发表权
- 未经软件著作权人许可,发表、登记其软件;
-
侵犯署名权
-
将他人软件作为自己的软件发表或者登记,在他人软件上署名或者更改他人软件上的署名;
-
未经合作者许可,将与他人合作开发的软件作为自己单独完成的软件发表或者登记;
-
-
侵犯复制权
- 复制或者部分复制著作权人的软件;
- 向公众发行、出租、通过信息网络传播著作权人的软件;
-
侵犯修改权
-
侵犯保护作品完整权
14-2 根据我国法律,软件著作权人有哪些权利?在日常学习和生活中,有哪些违反软件著作权的行为?
- 软件盗版。对软件进行防非法复制和使用。
- 逆向工程。非法修改软件或剽窃软件设计思想。
- 信息泄露。窃取软件载体及涉及数据。
14-3 试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?
1-8 谈谈对软件安全概念的理解。
定义
软件工程与软件保障的一个方面,它提供一种系统的方法来标识、分析和追踪对危害以及具有危害性的功能(例如数据和命令)的软件缓解措施与控制。
信息安全的三大基本属性CIA
-
保密性(Confidentiality)。
信息仅被合法的实体(如用户、进程等)访问,而不被泄漏给未授权实体。(加密数据)
-
完整性(Integrity)
信息在存储、传输或处理等过程中不被未授权、未预期或无意地篡改、销毁等破坏。(不仅仅要考虑数据的完整性,还要考虑操作系统的完整性)
-
可用性(Availability)
信息、资源和系统服务可被合法实体访问并按要求使用的特性。(备份与灾难恢复、应急响应)
其他安全属性
- 可认证性:能够对信息的发送实体和接收实体的真实身份进行鉴别(用户登录)
- 授权:根据访问主体的身份和职能为其分配一定的权限(访问控制)
- 可审计性:确保实体的行为可以被区别、跟踪和记录(日志)
- 抗抵赖性:信息的发送者无法否认已发出的信息或信息的部分内容(数字签名)
- 可控性:对安全风险进行事前识别、预测,并通过一定的手段来防范、化解风险,以减少遭受损失的可能性(威胁建模)
- 可存活性:计算机系统在面对各种攻击或错误的情况下继续提供核心的服务,而且能够及时地恢复全部服务(灾备与恢复)
1-9 简述软件和软件工程的概念。
不可能考
1-10 对照一般软件工程的概念,软件安全工程主要增添了哪些任务?
软件工程方法
- 软件安全开发------软件漏洞
- 软件安全检测------恶意代码
- 软件版权保护------软件侵权
软件安全开发过程
- 软件安全需求分析
- 软件安全设计
- 软件安全编码
- 软件安全测试
- 软件安全部署
1-11 谈谈软件安全与软件危机、软件质量和软件质量保证、软件保障、软件可靠性、应用软件系统安全、可信软件和软件定义安全等概念的区别和联系。
-
软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题:对软件开发成本和进度的估计不准确,用户对开发完成的软件系统不满意,软件产品的质量不可靠,软件不能适应新的硬件环境,软件中的错误难以改正等等
-
软件质量是"软件与明确的和隐含的定义需求相一致的程度"。软件质量是软件符合明确叙述的功能和性能需求、文档中明确描述的开发标准,以及所有专业开发的软件都应具有的和隐含特征相一致的程度。
-
软件质量保证是建立一套有计划、有系统的方法,向管理层保证拟定出的标准,步骤,实践和方法能够正确地被所有项目所采用。
-
软件保障是指提供一种合理的确信级别,确信根据软件需求,软件执行了正确的、可预期的功能,同时保证软件不被直接攻击或植入恶意代码。包括软件质量、软件安全性、软件可靠性、软件验证与确认等学科领域
-
软件可靠性指在规定条件下,在规定的时间内软件不引起系统失效的概率。该概率是系统输入和系统使用的函数,也是软件中存在的缺陷的函数。系统输入将确定是否会遇到已存在的缺陷;在规定的时间周期内所述条件下程序执行所要求的功能和能力。
-
应用软件系统安全,应用软件系统位于信息系统上层,是在信息系统的硬件系统、操作系统、网络系统和数据库管理系统的支持下运行的,是构成信息系统的最重要部分,是信息系统中直接为用户提供的部分。为了实现应用软件系统的安全,需要其余部分的安全。
-
可信软件,具有可信性的软件,可信指一个实体在实现既定目标的过程中,行为及结果可以预期,它强调目标与实现相符,强调行为和结果的可预测性和可控制性。软件可信是指软件系统的动态行为以及其结果总是符合人们的预期,在收到干扰时仍能提供连续的服务。
-
软件定义安全,其基本思想是把当前IP网络互连结点中决定报文如何转发的复杂控制逻辑从交换机/路由器等设备中分离出来,以便通过软件编程实现硬件对数据转发规则的控制,最终达到对流量进行自由操控的目的。
1-12 确保软件安全的基本思路是什么?软件安全涉及的技术主要有哪些方面?
基本思路
-
将安全保障实施于软件运行之时
挖掘安全漏洞,分析后给出安全措施进行修复。例如补丁、防火墙等。
这一方式被广泛采用,事实证明这种方式性价比低,很难从根本改善软件安全问题。
-
将安全保障实施于软件发布之前
从软件生命周期的早期阶段开始安全考虑,从而减少后期系统运行过程中安全运维的工作量,提高安全保障效果。
从系统开发需求阶段就引入安全要素要比在系统维护阶段才考虑安全问题所花费的错误修复成本要低很多。
软件安全技术
-
软件安全属性的认知
- 三个基本安全要素:保密性、完整性、可用性
- 软件安全的核心属性:保密性、完整性、可用性、可用性、授权、可审计性
- 其他熟悉:抗抵赖性、可信性、可控性、可靠性
-
系统安全工程
运用系统工程 的思想和方法,系统地分析信息系统存在的安全漏洞和风险,对信息系统的安全性进行分析与评价,以建立一个有效的安全防御体系。
-
软件安全开发
运用系统安全工程的思想,将安全要素嵌入软件开发生命周期的全过程,减少软件产品潜在的漏洞数量,提高软件系统的整体安全性。
第二章 软件漏洞概述
2-1 软件漏洞的概念,软件漏洞与软件错误、软件缺陷、软件bug的区别和联系
软件漏洞(Vulnerability)是软件的一个弱点,攻击者可以利用这个弱点来进行未授权的操作或访问。它不一定总是导致直接的故障,但可能会造成安全风险。
软件错误(Error)是软件开发过程中的人为失误,如设计错误或逻辑错误。软件错误可能导致软件行为异常,但并非所有的软件错误都会变成漏洞。
软件缺陷(Defect)/ 软件Bug是导致软件行为偏离预期的缺陷或错误。当软件错误被实施(编码)到实际的软件产品中时,软件错误就变成了软件缺陷。缺陷通常会导致软件无法正常工作,如崩溃、产生错误结果等。
概念
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。软件漏洞 是指软件系统或产品在设计、开发、配置和运行等过程中,由操作实体有意或无意产生的缺陷、瑕疵或错误。它们以不同的形式存在于信息系统的各个层次和环境,且随着信息系统的变化而改变。
区别
-
安全性
软件漏洞特指那些可以被恶意利用以侵害系统安全的软件缺陷,而软件错误、软件缺陷和Bug则通常指导致软件行为异常的一般问题。
-
范围
软件漏洞是软件缺陷的子集,软件漏洞一定是软件缺陷,但并非所有的软件缺陷都是软件漏洞。
-
后果
软件漏洞通常涉及安全风险,可能导致数据泄露 、系统入侵等严重后果;而软件错误、软件缺陷和Bug通常只会影响软件的正常功能。
联系
- 它们都与软件的质量问题有关
- 它们都需要通过软件测试、审查和维护进行识别和修复
- 一个软件错误在编码后可能成为一个软件缺陷(软件Bug),而这个缺陷如果涉及到安全问题,则可能被视为一个软件漏洞
2-2 为什么说安全缺陷或者说Bug是一个需要考虑具体环境、具体对象的概念?
安全性功能实际为软件系统的一种需求,所以也被称为安全性需求。是否将安全性功能加人到项目需求中,还需要根据项目的具体情况考虑,如项目经费等。
举例:一般Web应用不使用HTTPS协议不算Bug,但电子商务或者网上银行不加密传输则会严重影响安全。
6-3 软件安全需求分析的主要工作是什么?它和软件需求分析有什么区别与联系?
2-3 试分析软件漏洞的成因。
-
计算机系统结构决定了软件漏洞存在的必然性。数据和指令可能发生混淆,人为因素导致编码错误等。
-
软件趋向大型化,第三方扩展增多。软件漏洞数量的增长和软件复杂度、代码行数的增长呈正相关。
-
新技术、新应用产生之初即缺乏安全性考虑。
-
软件使用场景更具威胁。网络技术的引入使得软件的使用环境变得复杂多变。
-
对软件安全开发重视不够,软件开发者缺乏安全知识。
1-3 零日漏洞反映了软件系统存在的什么问题?
2-4 软件漏洞如何分类分级管理?
通常可以从漏洞利用的成因、利用的位置、和对系统造成的直接威胁进行分类。
软件漏洞分类
-
基于漏洞成因的分类。内存破坏类、逻辑错误类、输入验证类、设计错误类、配置错误类。
-
基于漏洞利用位置的分类。
- 本地漏洞。需要操作系统级的有效帐号登录到本地才能利用的漏洞
- 远程漏洞。无需系统级的帐号验证即可通过网络访问目标进行利用的漏洞。
-
基于威胁类型的分类。
- 获取控制。劫持程序,执行攻击者指定的任意指令,控制应用或操作系统。主要来源:内存破坏类。
- 获取信息。访问预期外的资源并泄露给攻击者。主要来源:输入验证类、配置错误类漏洞。
- 拒绝服务。使目标应用或系统失去响应正常服务的能力。主要来源:内存破坏类、逻辑错误类漏洞。
软件漏洞分级
-
按照漏洞严重等级进行分级:低、中等、重要、严重
-
利用通用漏洞评分系统(CVSS)进行分级:依据对3种度量评价标准来对一个已知的安全漏洞危害程度进行打分。
- 基本度量。用于描述漏洞的固有基本特性,这些特性不随时间和用户环境的变化而改变
- 时间度量。用于描述漏洞随时间而改变的特性,这些特性不随用户环境的变化而改变。
- 环境度量。用于描述漏洞与用户环境相关的特性。
2-5 软件漏洞管理应当遵循怎样的标准?
国际、国内
标识、描述、分类、分级、管理
- 软件漏洞管理国际标准
- 安全漏洞标识、描述及分级规范
- 安全漏洞管理规范
- 软件漏洞管理国内标准
- 安全漏洞标识与描述规范
- 安全漏洞分级规范
- 安全漏洞分类规范
- 安全漏洞管理规范
2-6 软件漏洞买卖合法吗?软件漏洞如何管控?
2016 年左右,像"乌云 (WooYun)"这样的漏洞报告平台非常活跃。白帽(正义黑客)发现漏洞后会提交到平台并公开。但这种做法存在法律灰色地带:未经厂商允许测试漏洞可能涉嫌"非法侵入计算机信息系统罪"。后来这些平台纷纷进入"维护"或"暂停"状态,标志着民间自发、无序的漏洞披露时代结束。
不合法
-
案例一:漏洞平台陷入"暂停"风波
-
案例二:阿里巴巴员工利用漏洞刷月饼获利。
如何管控
- 认识到漏洞是一种"武器"。漏洞交易市场日趋成熟,大量流动的高危漏洞造成危害。这种问题逐渐形成规模,必须加以重视。
- 让白帽的漏洞发现有章有法让软件厂家与"白帽"双赢。
- 漏洞管控势在必行。加强法律建设,完善漏洞管理规范。国家和企业都应建立专门的部分来系统地收集、分析和修复软件漏洞。
2-7 厂商发布漏洞信息的标准过程是怎样的?
-
识别漏洞
发布漏洞前,厂商需要识别已发行的产品中是否有漏洞。厂商可以使用安全审查、公开的漏洞库、专家审核或第三方安全公司的测试方法来识别可能存在的漏洞。
-
评估漏洞
厂商通过对漏洞的深入分析,评估漏洞的重要性,比如触及的用户数量、受到影响的系统级别、漏洞公开的危害性及复杂度等。
-
选择漏洞补救措施
厂商需要根据漏洞的重要性以及对用户和系统的安全程度,选择有效的补救措施,比如客户端热更新、软件补丁、本地防火墙配置 或者禁用恶意软件。
-
发布漏洞信息
随后厂商需要发布漏洞信息,推动相应的补丁或者更新,同时公布有关的安全提示或者工作。使用户能够及时采取措施对付漏洞,尽可能减少漏洞对用户系统和安全的影响。
第三章 Windows系统典型漏洞
3-1 程序运行时的内存布局时怎样的?

-
栈区
栈区的内存由系统自动分配,用于动态存储函数之间的调用关系。
-
堆区
堆区的内存由进程利用相关函数或运算符动态申请,用完后释放并归还给堆区。
例如,C语言中用malloc/free函数,C++语言中用new/delete运算符申请的空间就在堆区。
-
代码区
存放程序汇编后的机器代码和只读数据。
-
数据区
用于存储全局变量和静态变量。
3-2 在程序运行时,用来动态申请分配数据和对象的内存区域形式称为什么?
堆区
3-3 什么是缓冲区溢出漏洞?
缓冲区溢出漏洞就是在向缓冲区写入数据时,由于没有做边界检查,导致写入缓冲区的数据超过预先分配的边界,从而使溢出数据覆盖在合法数据上而引起系统异常的一种现象。
3-4 简述Windows安全漏洞保护的基本技术及其存在的问题
1. 栈溢出检测选项(/GS)
调用函数时将一个随机生成的Cookie存放在栈上(副本保存在数据区),当函数返回时,检查这个Cookie是否被修改,以此判断是否发生了栈溢出。
问题
- Cookie值可以被猜测
- Cookie值可以被修改:同时修改栈中的Cookie和数据区中的Cookie副本
- Cookie检查可以被跳过:
- 覆盖SEH绕过Cookie检查
- 覆盖父函数的栈数据绕过Cookie检查。
2. 数据执行保护(DEP)
通过使可写内存不可执行 或使可执行内存不可写来消除类似的威胁
问题
执行已加载模块中的指令或调用系统函数则不受DEP影响,而栈上的数据只需作为这些指令/函数的参数即可。例如:
- 将包含Shellcode的内存页面标记为可执行,然后再跳过去执行
- 通过分配可执行内存,再将Shellcode复制到内存区域,然后跳过去执行
- 先尝试关闭当前进程的DEP保护,然后再运行Shellcode
3. 地址空间布局随机化(ASLR)
对堆、栈、共享库映射等线性区域布局 进行随机化,增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置。
问题
- 对本地攻击者无能为力。
- 攻击者可以利用没有采用该保护的模块做跳板
- 缺点:造成内存碎片增多
4. 安全结构化异常处理(SafeSEH)
编译器在编译过程中,把所有合法的异常处理函数的地址 解析出来制成一张安全的SEH表,保存在数据块里面。
当程序调用异常处理函数时,会将函数地址与安全SEH表中的地址进行匹配,检查调用的异常处理函数是否位于该表中。
问题
- 可以利用未启用SafeSEH的模块作为跳板进行绕过
- 利用加载模块之外的地址进行绕过
5. 增强缓解体验工具包(EMET)
- 增强型DEP
- 强制性ASLR
- SafeSEH升级版SEHOP
问题
- EMET不是操作系统的一部分,会给操作系统的性能,可靠性以及会给其上运行的应用程序带来副作用
- 未跟上windows发展的步伐
3-5 本章介绍了Windows的5种典型保护机制,但是每一种保护机制仍然面临着缺陷和许多对抗的方法,这说明了什么问题?应当如何应对这一问题?
考了随便写吧。
第五章 软件安全开发模型
5-1 什么是软件的生命周期?软件生命周期通常包括哪几个阶段?
定义
软件生命周期是指从软件的设计、开发、实施、维护等一系列过程的总和。
八个阶段
- 软件定义时期:问题定义、可行性研究和需求分析。
- 软件开发时期:总体设计,详细设计,编码和单元测试,综合测试
- 软件维护时期:软件维护
5-2 什么是软件过程?什么是软件开发(过程)模型?为什么从20世纪90年代以后,人们更多使用"软件过程"来替代传统的"软件开发模型"?
软件过程
所谓软件过程,是指为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项任务的工作步骤。通常使用软件生命周期模型简洁地描述软件过程,因此,也称为软件过程模型。
软件开发模型
软件开发模型是跨越整个软件生存周期的系统开发、运行和维护所实施的全部工作和任务的结构框架,它给出了软件开发活动各阶段之间的关系。
为什么
20世纪90年代以后,因为**"软件过程模型"能够更快更有效地完成软件产品**,人们更多地使用它来代替传统的"软件开发模型"。
-
支持灵活的插入及替换,使开发人员可以避免在开发的任何一个阶段中做出决定
-
能实现更高的精度,减少了质量问题的风险。
-
能够更好地利用团队的能力,实现分配任务的整个程序和过程。
5-3 有哪些典型的软件开发模型?这些软件开发模型有什么区别与联系?
典型软件开发模型
-
瀑布模型
瀑布模型是最传统的软件开发模型,它将软件开发过程划分为一系列严格定义的阶段,如需求分析、设计、编码、测试和维护。每个阶段完成后才开始下一个阶段。
适用于需求明确,不太可能发生变化的项目;但是不适用于需求不断变化的项目。
-
螺旋模型
螺旋模型是一个迭代的模型,将软件开发过程划分为多个迭代,每次迭代都包含瀑布模型的阶段。它结合了瀑布模型和原型模型的有点,强调风险分析。
适用于大型复杂、风险较高的项目;但成本较高
-
快速原型模型
原型模型着重于快速开发 一个可工作的软件原型,用于验证用户需求和设计。
适用于需求不太明确的项目,可以快速得到用户反馈;但原型可能不够完善,需要重构
-
增量模型
增量模型将项目分解成多个小的模块,每个模块被视为一个小的软件项目,逐渐增加功能。
适用于需求逐渐明确,但是希望早点看到成果的项目;但是需要良好的模块规划和接口设计
-
敏捷模型
敏捷模型强调快速响应变化 ,支持快速迭代开发 ,强调团队协作 与客户沟通。
适用于需求频繁变化,需要快速交付的项目;但是在文档和设计方面可能比较薄弱。
区别
它们的迭代次数 与迭代时机 不同,以及对开发时间的要求不同。
联系
- 它们都旨在提高软件开发的效率和质量。
- 随着软件开发的事件,后来的模型往往视图克服前面模型的局限性 ,而将其优点融于新的方法中。
5-4 SD3+C原则是SDL模型实施的基本原则,试简述其内容
安全设计(Secure By Design)
在架构设计和实现软件时,需要考虑保护其自身 及其存储和处理的信息,并能抵御攻击。
安全配置(Secure By Default)
在现实世界中,软件达不到绝对的安全。因此设计者应当假定其存在安全缺陷。为了在受到攻击时受到的损失最小,软件在默认状态下应该有较高的安全性。例如,软件应该在最低的所需权限下运行,非广泛需要的服务和功能应该被禁用或者仅可由少数用户访问。(最小授权原则)
安全部署(Secure By Deployment)
软件需要提供相应的文档和工具,帮助用户安全地使用软件。另外,软件的更新应该易于部署。
沟通(Communication)
软件开发人员应该为软件漏洞的发现准备响应方案,并于用户不断沟通,帮助他们采取保护措施(如打补丁)。
5-5 微软的SDL模型与传统的瀑布模型的关系是怎样的?
SDL模型是由软件工程的瀑布模型发展而来,是在瀑布模型的各个阶段添加了安全活动和业务活动目标。
5-6 什么是敏捷SDL?敏捷SDL和经典SDL的主要区别是什么?
定义
微软对SDL进行调整,使其能够快速利用敏捷开发流程更好地实现安全需求,这就是敏捷SDL。
主要区别
- 敏捷SDL不采用传统的瀑布模型而是采用无阶段的迭代开发模型,以实现软件版本的快速更新和发布。
- 在敏捷SDL中,并不是每个发布版本都需要达到所有的要求。
第六章 软件安全需求分析
6-1 为什么要进行需求分析? 通常对软件系统有哪些需求?
为什么
为了开发出真正满足用户需求的软件产品,首先必须知道用户的需求。对软件需求的深入理解是软件开发工作获得成功的前提条件。
需求类型
功能需求、性能需求、可靠性和可用性需求、出错处理需求、接口需求、约束、逆向需求、将来可能提出的要求。
6-2 为什么要进行安全需求分析? 通常对软件系统有哪些安全需求?
为什么
- 目的 。描述为了实现信息安全目标 ,软件系统应该做什么 ,才能有效提高软件产品的安全质量 ,进而减少软件漏洞。
- 导致漏洞。如果不考虑安全需求,会导致开发的应用系统存在大量的漏洞。
- 影响软件安全 。不进行安全需求分析,将威胁到软件安全的保密性、完整性和可用性,以及其他一些重要安全属性。
- 软件产品被攻破可能就只是一个时间早晚的问题,而不是条件的问题。这取决于攻击者对于这个软件系统价值的判断。
安全需求来源分类
-
外部安全需求:主要指法律法规等遵从性需求。包括相应国家和地区关于安全技术与管理的法规、标准及要求等。
这些安全技术和管理的合规性要求往往是对已有安全威胁的经验性对策的总结,因而遵循这些要求不仅是法规制度上的要求,也是软件安全性保障的要求
-
内部安全需求 :内部安全需求通常包括两个部分,一是组织内部 需要遵守的政策和标准,另一部分是与软件业务相关的安全需求。
6-3 软件安全需求分析的主要工作是什么? 它和软件需求分析有什么区别与联系?
主要工作
- 首先确定目标系统的业务运行环境、规则环境及技术环境
- 然后在了解各类软件安全需求内容的基础上,通过一定的安全需求获取过程,对软件应该包含的安全需求进行分析,
区别
-
客观性
安全需求并不是从使用者的要求和兴趣出发,而是由系统的客观属性所决定的。软件安全需求分析需要更多的安全知识。
-
系统性
软件安全需求分析不能只从软件本身出发,必须从系统角度进行分析。安全需求分析的重点为软件功能设计缺陷 ,以及软件使用过程中软件、硬件和操作人员的相互作用。
这对软件安全分析人员提出了较高的要求。分析时要求有专门知识的软件安全性分析人员、熟悉系统结构的系统总体设计人员、软件设计人员、领域专家参加,共同工作。
-
经济性和适用性
软件安全的需求内容非常丰富,并不是所有的应用安全需求控制都要采纳和实施。组织应当根据具体业务的重要性,对安全措施进行成本控制。
联系
-
软件安全需求是软件需求的一个必要组成部分。
安全需求应该与业务功能需求具有同样的需求水平 ,并对业务功能需求具有约束力。
-
将安全需求作为与业务需求同样重要的系统需求来处理已经成为一种必然的趋势。
传统的周边安全方法所提供的安全保证不足以抵御无处不在的安全威胁,应用软件本身应该被设计为能够感知安全风险,并对安全问题具有自主控制和自我防御的能力。
6-4 为什么说软件安全需求更多地来源于遵从性需求?
在软件安全性需求分析中,软件用户由于安全知识的缺乏,很难从专业角度提出安全需求 。因此,软件安全需求更多来自于对组织内部和外部的安全政策和标准的遵从。
6-5 本章中介绍的安全需求遵从性标准有哪些类别,它们之间有何联系与区别?
不可能考
6-6 我国为什么要实行网络安全等级保护制度? 网络安全保护能力划分为哪些等级?具体每个等级有什么要求?
为什么
- 对信息安全分级保护是客观需求。信息系统的建立是为社会发展、社会生活的需要而设计、建立的,是社会构成、行政组织体系及其业务体系的反映,这种体系是分层次和级别的。因此,信息安全保护必须符合客观存在。
- 等级化保护是信息安全发展规律。按组织业务应用区域、分层、分类、分级进行保护和管理,分阶段推进等级保护制度建设,这是做好国家信息安全保护必须遵循的客观规律。
- 等级保护是国家法律和政策要求。
等级
- 第一级,属于一般网络,其一旦受到破坏,会对公民、法人和其他组织的合法权益造成损害,但不危害国家安全、社会秩序和社会公共利益。
- 第二级,属于一般网络,其一旦受到破坏,会对公民、法人和其他组织的合法权益造成严重损害,或者对社会秩序和社会公共利益造成危害,但不危害国家安全。
- 第三级,属于重要网络,其一旦受到破坏,会对公民、法人和其他组织的合法权益造成特别严重损害,或者会对社会秩序和社会公共利益造成严重危害,或者对国家安全造成危害。
- 第四级,属于特别重要网络,其一旦受到破坏,会对社会秩序和社会公共利益造成特别严重危害,或者对国家安全造成严重危害。
- 第五级,属于极其重要网络,其一旦受到破坏,会对国家安全造成特别严重危害。
6-7 对网络安全等级划分通常有两种描述形式,即根据安全保护能力划分安全等级的描述,以及根据主体遭受破坏后对客体的破坏程度划分安全等级的描述这两种形式。试谈谈这两种等级划分的对应关系。
- 一个系统的安全保护能力决定了它在遭受攻击时对客体的潜在破坏程度。换句话说,一个具有较高安全保护能力的系统在遭受攻击时,其对客体的破坏程度通常较低。
- 另外,根据系统承受的风险等级和业务重要性,组织会提高其安全防护能力,以减少潜在的破坏程度。例如,一个负责处理敏感数据的系统可能会被分配更高的安全等级,不仅因为它需要更强的安全保护能力,同时也因为一旦遭受攻击,其对客体的破坏程度将非常严重。
6-8 简述网络等级保护与信息安全管理体系的联系和区别。
信息安全管理体系是站在管理的角度上对信息进行管理,而等级保护则是管理体系中的一部分,是基础性的工作,两者在管理目标上具有一致性,而且还有相辅相成的作用。
- 工作重点 不同。信息安全管理体系是站在管理的角度 上对信息进行保护的,而等级保护则是站在技术及管理两个方面来开展工作的。
- 所依据的标准 不同。信息安全管理体系依据的是CB/T22081一2016等标准 ,等级保护在每个地区可以根据自身实际情况来确定测评规范。
- 实施对象不同。信息安全管理体系针对的主要群体是企业,而等级保护的针对的主要对象是需要使用信息安全管理体系的政府部门。
6-9 软件安全需求获取过程中涉及哪些相关方人员?他们各自主要的职责是什么?
相关人员
业务负责人、最终用户、客户、安全需求分析人员、安全技术支持等。
职责
- 最终用户和客户在安全需求确定时应发挥重要作用。
- 业务负责人是业务风险的最终责任人,负责确定可接受的风险阈值,明确哪些残余风险是可以接受的,给风险排序。
- 安全需求分析人员要负责软件安全需求的收集和分析,并帮助软件开发团队将安全需求转化为功能说明。
- 安全技术支持(运维小组和信息安全小组等)提供支持与帮助。
6-10 软件安全需求的获取方法有哪些?
1. 头脑风暴
是指无限制的自由联想和讨论,其目的在于产生新观念或激发创新设想。
头脑风暴应当只是在应用程序需要快速实现的情况下使用,因为它有两个明显的缺点。在需要初步确定安全需求的情况下是可以接受的,但必须有更多系统化、结构化的方法来全面地决定安全需求。
2. 问卷调查和访谈
可以直接用于生成安全需求,有效性取决于如何向被调查对象提出合适的问题。
在整个调查过程中,调查人和被调查人之间的协作和沟通是很重要的
3. 策略分解
将组织需要遵守的内部和外部政策,包括外部法律法规、隐私和遵从性命令分解成为详细的安全需求 。策略分解过程是一个连续和结构化的过程。
在分解过程中往往会出现很多歧义。因此,需要确保分解过程是客观的、符合安全策略的 ,而不是某个人主观上的意见。
4. 数据分类
根据数据的重要性来进行分类,实际上也就是根据数据的敏感程度 ,同时根据对数据泄露、或破坏的影响 ,为数据资产分配标签 ,以此来确定保护数据资产的不同安全需求。
在数据创建和使用、传输、存储和存档这一生命周期中,都需要采取适当的保护机制。根据数据的重要程度分级保护,可以降低数据保护的成本,使数据保护的投资-回报率最大化。
5. 主/客体关系矩阵
采用主/客体关系矩阵 来刻画一个基于使用用例 的主/客体之间的操作关系。这一方法在确定软件安全认证、授权相关需求的时候最为有用。
主/客体关系矩阵是角色和组件的二维表示 ,主体(角色)作为列,客体(对象/组件)作为行。当主/客体关系矩阵产生后,与主/客体关系矩阵所允许的对应动作相违背的事件 就可以判定为威胁,在此基础之上可以确定安全需求。
6. 使用用例和滥用案例建模
使用用例模型可以描述软件或系统的预期行为 ,而预期行为描述了完成业务功能所需要的行为和事件的顺序 ,据此可以有效地确定业务需求,包括安全需求。
从使用用例出发,可以开发滥用案例 。滥用案例可以通过对负面场景进行建模来帮助确定安全需求。
7. 软件安全需求跟踪矩阵
通过数据分类、主/客体关系矩阵、使用用例和滥用案例建模以及其他需求获取过程,可以将软件安全需求编制成一个需求跟踪矩阵(Requirement Traceability Matrix,RTM)。
一个通用的RTM是一个信息列表,可以采用管理决策理论的Zachman框架来描述。
6-11 软件安全需求的获取方法中的策略分解是指什么?
策略分解是指将组织需要遵守的内部和外部政策,包括外部法律法规、隐私和遵从性命令分解成详细的安全需求。
6-12 软件安全需求的获取方法中的数据分类是指什么?
根据数据生命周期管理对数据的分阶段划分来决定响应的安全需求;也可以根据数据的重要性对保护级别的划分来决定相应的安全需求。
6-13 针对信息系统中的数据生命周期,通常应当考虑的安全需求有哪些?
- 谁可以创建数据?谁可以对数据进行访问、访问权限是什么(授权)
- 当数据被处理时,是否需要数据泄露保护?
- 当数据被传输时,是否需要采用传输层或网络层安全协议来保护数据?
- 当数据被存储时,数据存储和使用环境面临哪些安全威胁?
- 从数据的可访问性和可用性角度来看,频繁访问的数据必须存储在更快的存储介质 上,如何应对这些存储介质的可靠性,易失性等安全问题?
- 当数据被归档时,需要遵从数据保留政策的要求。当数据失去效用时,是否被安全地处理?
6-14 软件安全需求的获取方法中的主/客体关系矩阵是指什么?
采用主/客体关系矩阵来刻画一个基于使用用例的主/客体之间的操作关系。主/客体关系矩阵是角色和组件的二维表示,主体(角色)作为列,客体(对象/组件)作为行。当主/客体关系矩阵产生后,与主/客体关系矩阵所允许的对应动作相违背的事件就可以判定为威胁,在此基础之上可以确定安全需求。
第七章 软件安全设计
7-⭐ 列出至少3条软件安全设计原则,并简单介绍。
- 减少软件受攻击面原则。去除、禁止一切不需要使用的模块、协议和服务,其目的是减少攻击可以利用的漏洞。
- 最小授权原则。系统仅授予实体完成任务所必需的最小权限,并且该权限的持续时间也尽可能短。
- 权限分离原则。将软件功能设计为需要在两个或更多条件下才能实现,避免出现问题时整个软件都面临风险。
- 纵深防御原则/分层防御原则。在软件设计中加入层次化安全控制和风险缓解/防御方法,有助于减少系统的单一失效点。
- 默认安全配置原则。为系统提供默认的安全措施,包括默认权限、默认策略等,尽可能让用户不需要额外配置就可以安全地应用。默认安全原则也是保持系统简单化的重要方式。
- 保护最弱一环原则。保护软件系统中的最弱组件,降低最弱链接和单点失效带来的风险。
- 完全控制原则。要求每一次访问受保护对象的行为都应当进行尽可能细粒度地检查。
- 开放设计原则。软件设计本身应该是开放的,安全防御机制的实现应该不依赖于设计本身。
- 最少共用机制原则。尽量减少依赖于一个以上用户甚至于所有用户的通用机制,设计应该根据用户角色来划分功能或隔离代码。
- 安全机制的经济性原则。以较低的开发成本和资源消耗获得具有较高安全质量的软件产品和系统保障。
- 安全机制心理可接受原则。安全保护机制设计得要简单,要让用户易用,要确保用户对资源的可访问,以及安全机制对用户透明,用户才会使用这些保护机制。
- 平衡安全设计原则。以上介绍的这些安全设计原则每一项都有自己的侧重点,将所有这些安全原则都设计到软件中是不可能的,因此有必要在这些安全原则间进行决策折中,即平衡安全设计原则。
7-1 软件设计阶段的主要工作是什么?
定义数据结构、算法确定、架构设计、接口设计、模块分解,编写数据库设计文档、构件编写、实现原型设计、测试设计等。
7-2 软件安全设计阶段的主要工作是什么?
-
软件架构安全性设计
-
软件架构安全性分析
-
软件安全功能设计
考虑如何将安全需求融入软件架构和设计方案中,将它们转化为可实现的功能组件。
7-3 为什么要进行软件架构设计?软件架构设计的主要工作是什么?软件架构安全性设计的主要工作是什么?
软件架构设计-为什么
可以为软件开发和使用提供强制一致的方法,以:
- 提高软件质量,保证软件性能、可靠性和稳定性
- 简化开发
- 降低使用和维护的成本
软件架构设计的主要工作
使用特定的方法和策略建立一个软件解决方案 。这个解决方案面向未来,可以考虑面向服务、面向网络结构和用户等范畴,并满足可靠性和可维护性等要求,实现灵活性和可扩展性。
软件架构安全性设计的主要工作
- 进行系统描述。包括系统功能、安全要求、系统部署,确定软件系统的安全级别。
- 设计软件网络、数据库等应具备的安全功能。根据软件具体安全需求的不同,设计的安全功能包括加密、完整性验证、数字签名、访问控制以及安全管理等等。
- 解决软件安全功能的易用性、可维护性和独立性问题。
7-4 为什么要进行软件架构安全性分析?软件架构安全性分析的基本过程是什么?
为什么
在软件架构安全性设计的过程中,将安全属性一次性设计到软件架构中是一项非常具有挑战性 的工作。为此,软件架构安全性设计完成后,需要对软件安全架构和设计方案进行检查,以确保设计能够满足软件的安全需求。
检查可以帮助开发人员在编码之前对安全设计要素进行验证,提供一个识别和处理安全漏洞 的机会,减少后续阶段重新设计软件的需要。
基本过程
- 进行架构建模
- 分析架构模型是否满足软件的安全需求描述或相关标准。如果不满足,需要修改设计架构
- 如此反复,直至满足所有安全需求和相关标准。

分析方法
-
形式化分析技术
使用形式化方法描述软件架构和安全需求,最终的分析结果精确、可量化,且自动化程度高 ,但实用性较差。形式化分析主要包括UMLSec建模描述分析法等。
-
工程化分析技术
从攻击者的角度考虑软件面临的安全问题,实用性强,但自动化程度较低。
软件架构的工程化分析主要包括场景分析法、错误用例分析法和威胁建模。相对而言,威胁建模方法实用程度较高。
7-5 软件受攻击面是指什么?举例说明软件设计时可以采取哪些策略来降低受攻击面。
定义
用户或其他程序以及潜在的攻击者都能够访问到的所有功能和代码的总和。它是一个混合体,不仅包括代码、接口、服务,也包括对所有用户提供服务的协议。一个软件的攻击面越大,安全风险就越大。
举例
减少软件受攻击面就是去除、禁止一切不需要使用的模块、协议和服务,其目的是减少攻击可以利用的漏洞。
- 重要性低的功能可取消;
- 重要等级为中的功能可设置为非默认开启,需要用户配置后才予以开启;
- 重要性高的功能则增加一些安全措施进行限制。
- 重用那些经过测试、已证明安全的现有库和通用组件,减少使用用户自己开发的共享库。
- 苹果公司的iOS不支持Java和Flash,一个重要原因就是减小了iOS的受攻击面。
7-6 什么是最小授权原则?试举例说明软件设计时哪些措施是采用了最小授权原则。
定义
系统仅授予实体完成任务所必需的最小权限 ,并且该权限的持续时间也尽可能短。
举例
- 将超级用户的权限划分为一组细粒度的权限,分别授予不同的系统操作员/管理员。对管理员账户分配安全资源的访问权限也要设置为受限访问,而不是超级用户权限。
- 采用高内聚、低耦合的模块化编程方法。也就是模块之间的依赖关系是弱链接(低耦合),每一个模块只负责执行一个独立的功能(高内聚)。
- Windows系统的用户账户控制,实际上就是最小授权原则的运用。
7-7 什么是权限分离原则?试举例说明软件设计时哪些措施是采用了权限分离原则。
定义
将软件功能设计为需要在两个或更多条件下才能实现,避免出现问题时整个软件都面临风险。
举例
- 清晰的模块划分,将风险分散到各个模块中。
- 不允许程序员检查自己编写的代码。
- Linux将敏感操作分成26个特权,由一些特权用户分别掌握这些特权,每个特权用户都无法独立完成所有的敏感操作。
7-8 针对第6章介绍的核心安全需求,软件安全功能设计通常有哪些内容?
一个基本Web应用系统通常可以划分为终端用户、网络、主机系统、应用程序和数据这5个层次,信息系统在安全防护设计过程中应从这5个层面进行针对性的安全设计:
- 终端安全防护
- 网络安全设计
- 主机安全设计
- 应用安全设计
- 数据安全设计
7-9 什么是软件设计模式?有哪些软件设计模式?
定义
是对软件设计中普遍存在、反复出现的各种问题 ,根据多次处理的经验 ,提出的一套能够快速、准确响应此类问题的解决方案。设计模式描述在各种不同情况下,应如何解决共性问题。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
举例
工厂方法模式、抽象工厂模式、单例模式、适配器模式、代理模式、观察者模式等。
7-10 什么是安全模式? 为什么说能够利用安全模式来快速、准确地进行软件安全设计?
定义
在给定的场景中,为控制、阻止或解决一组特定的安全威胁而采取的通用解决方案,可以使用UML类图、时序图、状态图和活动图等进行表述。
为什么
- 安全模式封装了 反复出现的系统问题的解决方案。
- 采用模式的系统架构描述,比较容易让人看懂,也为设计和分析提供了指南。
- 安全模式使得不具备专业安全知识的应用开发人员也可以使用安全措施。
7-11 试给出一种利用安全模式进行软件安全设计的方法。
-
风险确定阶段。识别和评估风险
-
系统安全架构阶段
- 浏览模式库
- 选择相应安全模式
- 评估安全模式
- 建立系统高层架构
-
系统设计细化阶段。构建类图,实例化安全模式,整合和重构
7.12 什么是威胁建模? 试简述威胁建模的过程。
定义
软件威胁建模是指,通过抽象的概念模型 对影响软件系统的威胁 进行系统地识别和评价。
过程

- 确定安全目标 。包括确定软件系统涉及的资产,以及围绕这些资产的业务目标和安全目标。
- 创建应用程序概况图 。是应用程序的图形化表示过程,包括识别物理拓扑结构、识别网络拓扑结构、识别应用程序使用者中人类和非人类角色等。
- 分解应用程序 。通过分解应用程序的结构来确定信任边界、数据流、数据入口点和数据出口点。
- 确定威胁。确定可能影响应用程序和危及安全目标的威胁,包括确定常见威胁和深入分析其他可能威胁。
- 威胁评估 。
- Delphi排序:由威胁建模团队的每一个成员给出对特定威胁的风险水平的最佳估计值
- 平均排序:即DREAD法,通过计算这些值的平均值给出风险排序
- 概率×影响因子排序:由风险发生的概率和威胁对业务产生的可能影响而得出。
- 风险=事件发生的概率×商业影响
- 确定威胁缓解计划或策略 。针对评估为高风险的威胁,需要制定缓解策略,包括修改系统设计、制定应急响应计划等。
- 验证威胁 。验证的内容包括威胁模型、列举的威胁、缓解措施等。
- 验证威胁是说明列举出的威胁如何进行攻击,攻击的内容及影响。
- 验证缓解措施是指检验缓解措施能否有效降低威胁影响,是否正确实施。
- 威胁建档。威胁和控制可以用图表记录或以文本的方式存档。威胁归档时,建议使用模板保持威胁文档的一致性。
7-13 为什么说组织自身的威胁建模能力水平对提升组织的整体安全保障能力起到至关重要的作用?
采用威胁建模方法,可以系统性地分析其架构、软件体系和程序部署,分析网络和信息系统可能面临的潜在威胁,确认有哪些攻击面,之后提出有针对性的安全防范措施,这才是有效解决网络安全对抗的良策。
7-14 在威胁排序的几种计算方法中,为什么说相比 Delphi法和平均排序法,PxI排序方法更科学?
1. 评价维度更全面:
- Delphi 法:仅依赖专家主观经验,标准模糊且易受背景差异影响。
- 平均排序法:虽引入 DREAD 框架,但只是对各维度数值进行简单的"加和平均",忽略了风险发生的可能性与后果之间的本质逻辑关系。
- P × I P \times I P×I 法 :将风险明确拆解为**发生概率(Probability)与业务影响(Impact)**两个核心维度,符合风险管理的本质逻辑。
2. 计算逻辑更严谨:
- 该方法再次通过 DREAD 框架量化指标,但采用乘法逻辑。
- 它能准确识别出那些"发生概率虽小但一旦发生即造成毁灭性后果"或"发生频率极高但单次损失较小"的威胁,避免了平均法可能带来的风险稀释。
第八章 软件安全编码
8-1 软件安全编码阶段的主要工作有哪些?
-
选择安全的编程语言
所谓安全的编程语言是指那些具有对缓冲区、指针和内存进行管理能力而避免发生软件安全问题的语言。
-
版本(配置)管理
保证开发团队正在使用的程序版本是正确的,同时在必要的情况下也能提供回退到上一个版本的功能;还提供了跟踪所有权和程序代码变化的能力。
-
代码检测
对代码质量进行检查,发现是否存在可利用漏洞。根据代码检测时代码所处的状态,可以将代码分析分为两种类型:代码静态检测和代码动态检测。
-
安全编译
8-2 什么是类型安全语言? 哪些程序开发语言是类型安全的?
定义
提供类型安全保障机制 的语言是类型安全语言,它们能确保操作仅能作用于适当的类型,本质上是对未被授权的内存区域的访问进行禁止。在类型安全语言中,类型错误(例如尝试将字符串用作整数)不仅在编译时 被捕获,而且通常也会在运行时被检测到。
举例
- Java:Java 强调强类型检查,所有的类型转换都在编译时或运行时被严格检查。
- C#:C# 类似于 Java,在类型安全方面有严格的规定。
- Rust:Rust 特别关注安全性,其所有权和借用机制提供了额外的内存安全保障。
- TypeScript:作为 JavaScript 的超集,TypeScript 引入了严格的类型系统,增强了 JavaScript 的类型安全性。
8-3 安全编译是指在代码编译阶段采取的哪些安全措施?
- 采用最新的集成编译环境。选择使用这些编译环境提供安全编译机制,如在VS中编译时,开启/GS选项对缓冲区的安全进行检查。
- 在安全的环境中进行编译 。例如:对代码编译系统实施安全访问控制;尽量使用自动化编译工具和脚本。
- 对应用环境的真实模拟。很多软件在开发和测试环境中运行得很好,而到了生产环境中就会出现很多问题,主要原因就是开发和测试环境与实际开发环境不匹配。
- 多样化编译技术应用。多样化编译技术作为一种提高软件安全性的方法已经得到了应用。
8-4 试列举几条安全编码原则,并举例说明这些原则的重要意义。
- 保持简单性。减少软件被攻击面原则的体现。要尽量使程序短小精悍,代码中的每个函数应在保持功能完整实现的前提下控制该函数内代码量。
- 坚持最小权限原则。最小授权原则的体现。每个进程仅拥有完成工作所需的最小权限,任何权限的拥有时间要尽可能短。
- 默认拒绝。默认安全配置原则的体现。默认的访问权限是拒绝,除非明确是允许的。
- 纵深防御。纵深防御原则的体现。加入层次化安全控制和风险缓解/防御方法,有助于减少系统的单一失效点。
- 验证输入。对于不可信任数据源的输入应当进行验证,正确的输入验证能减少大量软件漏洞。
- 留意编译器警告。
- 安全策略的架构和设计。
- 清洁发送给其他系统的数据。
- 使用有效的质量保证技术。
- 采用安全编码标准。
8-5 为什么要避免使用C语言中原有的字符串函数?所谓的安全字符串函数解决了原有C字符串函数的什么安全漏洞?
C语言中原有的字符串函数有可能破坏接受字符串的缓冲区,导致程序出错或者数据丢失,存在安全性问题。
安全字符串函数就是为了解决这个漏洞而设计的,它们会检查字符串的长度,通过将空格截断字符串,或扩充缓冲区的大小来保护数据的完整性。
8-6 Java提供的沙箱安全机制的核心思想是什么?
Java提供的沙箱安全机制是Java平台的一个重要特征,其核心思想是在一个受控的环境中执行代码。通过类加载器,Java使本地环境中的代码能够访问系统中的关键资源,而从远程下载的程序则只能访问"沙箱"内的有限资源,从而保障系统的安全性和稳定性。
8-7 试谈谈Java提供的安全机制。

-
语言层
语言层安全是通过编译器的编译来实现,即编译成功则说明达到了语言层安全性。安全机制如通过类型保障机制确保程序运行时变量始终与声明的类型一致、通过关键字定义代码可见性范围等。
-
字节码层
在字节码层次,Java提供两种保障安全的机制:
- 类加载器:检查类的来源(本地、网络下载),放置到不同的"逻辑区域"。
- 字节码验证器:检查代码中是否存在违规操作,比如访问非法内存,缓冲区溢出等。
-
应用层
安全管理器的作用是定义系统的安全策略并实施安全策略。
- 安全管理器定义的安全检查方法构成了当前系统的安全策略
- 安全策略描述了哪些代码允许做哪些操作
- 当安全检查方法被调用时,安全策略就得以实施。
第十二章 恶意软件防治
12-1 试解释以下与恶意代码程序相关的计算机系统概念,以及各概念之间的联系与区别:进程、线程、动态链接库、服务、注册表。
-
进程(Process)
进程是正在执行的程序实例。在操作系统中,每个进程都有自己的内存空间和资源,包括文件、网络连接、打开的设备等。恶意代码通常会启动一个或多个进程来运行恶意代码,以便在系统中执行各种操作,如窃取数据、操纵系统等。
-
线程 (Thread)
线程是进程中的执行单元。每个进程都可以有多个线程,这些线程共享进程的内存和资源。恶意代码可以通过在进程中创建线程来实现并行执行,从而提高恶意代码的效率和速度。
-
动态链接库(Dynamic Link Library,DLL)
动态链接库是一种可重用的代码库,它包含可以被多个程序共享的代码和数据。DLL可以被其他程序动态加载和链接,从而提供相应的功能。恶意代码可以利用DLL来执行一些隐藏的操作,如窃取密码、截取网络流量等。
-
服务(Service)
服务是在后台运行的程序,它们不需要用户交互并且可以在计算机启动时自动启动。恶意代码可以创建服务来在系统中保持存在,从而可以在用户不知情的情况下持续运行,以实现各种目的。
-
注册表(Registry)
注册表是Windows操作系统中的一种层次结构数据库,用于存储系统和程序配置信息。恶意代码可以修改注册表中的键和值,以实现各种目的,如启动恶意代码,隐藏恶意代码等。
12-2 从危害、传播、激活和隐藏4个主要方面分析计算机病毒、蠕虫、木马、后门、Rootkit及勒索软件这几类恶意代码类型的工作原理
计算机病毒
- 危害: 破坏文件、系统性能下降、泄露隐私信息。
- 传播: 通过感染文件、电子邮件附件、可移动媒体等传播。
- 激活: 用户执行被感染的文件或程序时激活。
- 隐藏: 可隐藏在合法软件或文件中,难以被普通用户发现。
蠕虫
- 危害: 自我复制导致网络拥堵,降低系统性能,可能携带恶意负载如删除文件。
- 传播: 利用网络、操作系统漏洞,自动在计算机网络中传播。
- 激活: 通常无需用户干预,利用系统漏洞自动执行。
- 隐藏: 利用网络传播,不需附着于文件,难以察觉。
木马
- 危害: 偷窃信息、破坏系统。
- 传播: 伪装成合法软件,诱导用户下载和安装。
- 激活: 用户安装或运行木马程序时激活。
- 隐藏: 伪装成正常软件或文件,用户难以区分。
后门
- 危害: 允许远程访问和控制,可能导致信息泄露和系统破坏。
- 传播: 可通过木马、病毒等恶意软件安装
- 激活: 通常在恶意软件安装或运行时被激活。
- 隐藏: 隐藏在正常软件或操作系统中,难以被用户发现。
Rootkit
- 危害: 隐藏其他恶意活动,提供持久的系统访问。
- 传播: 通过漏洞利用、木马等方式安装,或直接由软件开发者植入。
- 激活: 安装后自动激活,隐藏在系统深层。
- 隐藏: 深度集成于操作系统,难以被普通防病毒软件检测到。
勒索软件
- 危害: 加密用户文件并要求赎金,可能导致数据丢失。
- 传播: 通过钓鱼邮件、漏洞利用等方式传播。
- 激活: 用户下载并执行恶意文件时激活。
- 隐藏: 初期可能隐蔽,加密过程中可能被发现。
12-3 病毒程序与蠕虫程序的主要区别有哪些?
蠕虫与病毒根本区别在于其是否需要人为干预来触发传播。
- 危害
- 病毒通常旨在修改或损坏数据、文件,或者破坏系统功能。
- 蠕虫可能会对网络造成重大影响,例如通过消耗带宽或使网络设备过载。某些蠕虫同样具有破坏性(比如删除文件)
- 传播
- 病毒依赖于宿主文件或程序进行传播。它必须附加到一个文件或程序上,当用户运行或打开该文件时,病毒被激活并可以执行其恶意代码。
- 蠕虫是自包含的恶意程序,它们不需要附着在宿主文件上。蠕虫能够自我复制并自行传播到其他系统,通常通过网络连接,不需要用户的直接干预。
- 激活
- 病毒依赖于宿主文件的执行来激活。
- 蠕虫作为独立的实体,不需要宿主文件,可以自行在系统间传播。
- 隐藏
- 病毒由于病毒附着在宿主文件上,有时候它们更容易被发现。
- 蠕虫通常更难以检测,因为它们可以在网络中悄无声息地传播,并且可以通过多种方式感染系统。
12-4 什么是Rootkit? 它与木马和后门有什么区别与联系?
定义
目前通常所说的Rootkit是指:一类木马后门工具,通过修改现有的操作系统软件,使攻击者获得访问权限并隐藏在计算机中。
区别
-
Rookit强调的是强大的隐藏功能
-
木马强调的是欺骗用户,窃取信息
-
后门本身没有攻击行为,它强调的是远程侵入功能,创建一个秘密的访问通道。
联系
- Rootkit属于木马的范畴。它用恶意的版本替换修改现有操作系统软件来伪装自己,而这种伪装和隐藏机制正是木马的特性。
- Rootkit作为后门行使其职能。Rootkit为攻击者提供绕过检查机制的远程访问通道,这是后门工具的特性。
- 它们相互配合则可以使得攻击者的攻击手段更加隐蔽、强大。
12-5 什么是勒索软件?为什么勒索软件成为近年来数量增长最快的恶意代码类型?
定义
勒索软件是黑客用来劫持用户资产或资源 并以此为条件向用户勒索钱财的一种恶意软件。
为什么
- 加密手段有效,解密成本高。勒索软件都采用成熟的密码学算法,在没有私钥的情况下几乎没有可能解密。当受害者数据非常重要又没有备份的情况下,除了支付赎金没有别的方法去恢复数据。正是因为这点勒索者能源源不断地获取高额收益,推动了勒索软件的快速增长。
- 使用电子货币支付赎金,变现快,追踪困难。几乎所有勒索软件支付赎金的手段都是采用比特币来进行的。比特币因为匿名、变现快且追踪困难,被攻击者大量使用。可以说比特币帮助勒索软件解决了支付赎金的问题,进一步推动了勒索软件的发展。
- 勒索软件即服务的出现,降低了攻击的技术门槛。勒索软件服务化,开发者提供整套勒索软件的解决方案,从勒索软件的开发、传播到赎金的收取都提供完整的服务。攻击者不需要任何知识,只要支付少量的租金即可租赁他们的服务,从而开展勒索软件的非法勾当。这大大降低了使用勒索软件的技术技术门槛,推动了勒索软件的大规模爆发。
12-6 恶意代码防范的基本措施包括哪些?
- 加强法制宣传,促进行业内人员明确恶意代码相关的法律责任,自觉履行恶意代码防治责任。
- 健全管理制度,严格执行恶意代码防治规定。
- 开展面向恶意代码检测的软件可信验证 。从以下四个方面开展验证:
- 软件特征可信:通过比对软件特征码与病毒特征码,或比对软件Hash值是否改变来进行软件的特征可信验证
- 软件身份可信:通过代码签名技术进行代码来源可信性的判断。
- 软件能力可信:从软件的静态行为和动态行为两大方面进行软件的能力可信验证。
- 软件环境可信
第十三章 开源软件及其安全性
13-1 试从软件的权益处置角度,谈谈对商业软件、免费软件、共享软件(或试用软件)、闭源软件、自由软件及开源软件概念的理解。
1. 商业软件
-
商业软件是作为商品进行销售获得收益的软件。
-
绝大多数商业软件都是闭源软件,但也可能是开源软件或免费软件。
-
商业软件通常通过销售软件的使用许可证 及技术支持服务向用户收取费用。商业软件也可以部分或全部使用开源软件的代码,如Redhat Linux就包含了大量的开源代码。
2. 免费软件
- 免费软件是指不需要以金钱购买而免费得到或使用的软件。软件企业有时为了让收费版软件扩大市场占有率,往往会发布免费版软件。
- 免费软件不一定是开源软件,也不一定是自由软件。
- 免费软件的源代码不一定会公开,也有可能会限制重制及再发行的自由,在使用上会有一些限制,如禁止反编译软件以研究软件写法、禁止修改软件源码,以及禁止再次散布出去给其他人使用等。使用者没有使用、复制、研究、修改和分发软件的自由。
3. 共享软件
- 共享软件也称试用软件,是以"先使用后付费"的方式销售的享有版权的软件。根据共享软件作者的授权,用户可以免费获取和安装,也可以自由传播它。
- 共享软件是商业软件的一种特定形式。
- 共享软件最明显的优点是有免费试用期,用户可以先试用共享软件,认为满意后再向作者付费,也可以在试用期间停止使用。但是免费试用版通常有一些限制,如时间限制、功能限制或添加水印等。
4. 闭源软件
- 闭源软件或专有软件是指源代码在获取、使用和修改上受到特定限制的软件,简单地说就是封闭源代码软件。一般地,它意味着用户仅能获得许可软件的一个二进制版本,而没有这个程序的源代码。
- 商业软件通常是闭源软件。
- 有些闭源软件也会以某种形式公布源代码,比如Unreal引擎 。不过,公布源代码和开放源代码不是一回事,公布只是让用户看到了源代码,但是通常并不允许用户修改或另作他用,更别说发布了。
5. 自由软件
- 自由软件是一类可以不受限制地自由使用、复制、研究、修改和分发的软件。不受限制是自由软件最重要的本质。自由软件赋予使用者4种自由,如果某一软件的用户具有4种自由,则该软件可以被称为"自由软件"。
- 自由软件与商业软件是可以共同并立存在的。自由软件的重点在于自由权,而非价格。大部分的自由软件都是在线(Online)发布的,并且不收取任何费用;或是以离线(Off-line)实体的方式发行,有时会酌收最低限度的费用(如材料工本费),而人们可用任何价格来贩售这些软件(比如拷贝一份免费获得的源码然后卖给别人)。
- 自由软件并不是没有版权。部分自由软件可以免费取得,并且它的源代码可以自由修改并散布,但它并不是没有版权。版权是当某项作品完成时就自然产生了,无需申请或注册。
- 自由软件许可证的类型主要有GPL许可证和BSD许可证两种。
6. 开源软件
- 开源软件有着明确的定义,该定义共有10个条款,业界公认只有符合这个定义的软件才能被称为开源软件。比如自由再发布、源代码、衍生产品等。
- 这些条款实际上是在定义开源软件的许可证。定义中的每一个条款都是在说明软件许可证如何规范开源软件的行为,包括软件的使用、发布、复制和派生等整个过程。如果一个软件的许可证符合了这个定义,并通过了开源软件促进会的认证,那么该软件就是开源软件,反之就不是。
13-2 自由软件赋予软件使用者哪些"自由"?
- Run:不论目的如何,有运行该软件的自由。
- Study:有研究该软件的自由,以及按需改写该软件的自由。
- Redistribute:有重新发布该软件的自由。
- Improve & Release:有改进该软件的自由,以及向公众发布改写版的自由。
13-3 试简述开源软件与自由软件的联系与区别。
联系
都具有同一种理想主义的色彩,即无论是保证软件的自由,还是强调可用性,都是为了追求开发可以为更多的人使用、学习和改进的软件。
区别
-
概念不同:自由软件是一个比开源软件更严格的概念。
- 所有自由软件都是开放源代码的,但只有遵守GPL和BSD许可证的开源软件才符合自由软件的定义。
- 开源软件的许可证对软件的衍生和再发布的约束十分宽松,这样大大减少了商业公司在使用和参与开源软件时的顾虑。
-
价值观不同:自由软件始终将自由作为道德标准,而开源软件则更加注重软件的发展。
-
自由软件最重要的特点是,从许可证即法律角度保证了自由软件在演化过程中将始终保持其"自由性",从而保证了其任何版本都可以为任何人使用、学习和改进。
-
开源软件则更加注重与软件产业的结合 ,对商业化更加友好,希望用各种方式来发展软件本身。开源软件的思想首先考虑的是如何发展软件,让更多的人来使用软件,而不是先去保证软件在演化过程中的开源性。
-
13-4 试列举常见的开源软件,查找并了解这些开源软件的许可证内容。
-
Linux Kernel(Linux 内核)------GPL v2
最著名的开源项目,是所有 Linux 发行版的心脏。
因为 GPL 的"传染性"和强制开源,防止了像IBM这样的巨头把 Linux 内核据为己有。他们为了让 Linux 支持自家的硬件,修改了内核代码,就必须把这些修改贡献回来回馈社区。这造就了 Linux 今天无法撼动的生态壁垒。
-
glibc (GNU C Library)------LGPL
几乎所有 GNU/Linux 用户态程序都绕不开的 C 标准库
LGPL 允许动态链接 。商业软件可以"调用" glibc 而不需要开源自己。但如果你修改了 glibc 本身(比如为了优化性能改了它的源码),那你必须开源 glibc 的那部分。
-
FreeBSD- (操作系统) ------BSD
一个以稳定和高性能著称的 Unix 类操作系统。
只要求保留版权/免责声明,不要求你把自家代码开源。苹果公司拿走了 FreeBSD 的部分核心代码(Darwin内核),进行了大量修改和优化,然后封装成闭源的 macOS 。苹果只需要在文档里声明"部分代码来自 FreeBSD",而不需要把 macOS 的源码公开给 FreeBSD 社区。
-
Mozilla Firefox (火狐浏览器)------MPL
曾经挑战 IE 霸权的开源浏览器,Mozilla 公司的核心产品。
改动了 MPL 覆盖的文件,发布时就要公开这些文件的源码;但可以与闭源代码并存(只要闭源部分不落进 MPL 文件里)。比如,如果只是给 Firefox 写了一个扩展,或者把 Firefox 引擎嵌入到你的商业软件里作为一个展示网页的窗口,只要你自己的代码文件是独立的,就不需要开源。
-
React(前端 UI 库)------MIT
最宽松的主流许可之一,核心义务通常就是保留版权与许可声明。开发者希望无论谁(哪怕是竞争对手)都能无门槛地使用这些代码,从而最大化技术的市场占有率。
13-5 所开发的软件中使用了带GPL许可证的开源软件,那么这个软件是不是就要开源?
- 只要在一个软件中使用了("使用"指类库引用,修改代码或者衍生代码)GPL许可证产品,则该软件产品必须也采用GPL许可证,即必须也是开源和免费的,这就是所谓的"传染性"。这就是说,GPL不允许修改后和衍生的代码作为闭源的商业软件发布和销售。
- 不过,如果用户(包括企业用户)对于GPL软件不再发布,就不受此约束。比如只作为公司内部工具使用,而不向外部发布。
SaaS(软件即服务)的"漏洞":
如果你的软件通过网页(Web)提供服务(比如在线文档工具、云服务),用户只是通过浏览器访问,并没有把软件下载到本地。这通常被认为不属于"分发"。
因此,很多互联网公司可以在服务端使用 GPL 代码而无需开源。(注:为了堵住这个漏洞,后来诞生了 AGPL 协议,强制要求服务端运行的代码也必须开源,但普通的 GPL v2/v3 不要求)。
第十四章
14-1 我国对于软件的知识产权有哪些法律保护途径?
- 《中国人民共和国专利法》
- 《中华人民共和国商标法》
- 《计算机软件保护条例》
- 《商业秘密所有权保护法》
- 《互联网著作权行政保护办法》
- 《信息网络传播权保护条例》
- 《移动互联网应用程序信息服务管理规定》
14-2 根据我国法律,软件著作权人有哪些权利?在日常学习和生活中,有哪些违反软件著作权的行为?
著作人权利
- 发表权。决定作品是否公之于众。
- 署名权。表明作者身份,在作品上署名的权利。
- 修改权。修改或授权他人修改作品的权利。
- 保护作品完整权。保护作品不受篡改、歪曲的权利。
- 复制权。以复印、数字化等方式将作品制作一份或多份的权利。
侵权行为
-
用盗版/破解版
下载并安装破解的 Office、Adobe、IDE、3D 软件、付费插件用"破解器"绕过激活
-
传播盗版
把安装包、破解补丁上传网盘/群文件,或者发给同学;
-
未经许可分发/出租
把正版软件拷贝多份分给同学;通过账号共享等方式让他人使用;
14-3 试述软件版权的概念。针对软件的版权,有哪些侵权行为?有哪些保护措施?
概念
软件版权是指软件的开发者或者其他权利人,依据有关著作权法律 的规定,对于软件作品所享有的各项专有权利。 软件版权是软件知识产权的一部分,指软件著作权。
侵权行为
- 软件盗版。对软件进行防非法复制和使用。
- 逆向工程。非法修改软件或剽窃软件设计思想。
- 信息泄露。窃取软件载体及涉及数据。
保护措施
- 基于硬件 的保护技术
- 对发行介质的保护。比如防止光盘拷贝,在光盘中放置秘密信息等。
- 软件狗。软件狗必须插在计算机上,用于对软件授权,拔出后停止运行。
- 可信计算芯片。在计算机中安装可信计算模块安全芯片,用于对程序加密,保证一台机器上的程序和数据在另一台机器上不能运行或打开。
- 基于软件 的保护技术
- 注册验证。安装序列号、用户名+序列号、许可证保护等,如windows系统。
- 软件水印。把程序的版权信息嵌入到程序中,可以被提取出来用以明软件产品的版权所有者,由此可以鉴别出非法复制和盗用的软件产品,以保护软件的知识产权。
- 代码混淆。将源代码转换为与之功能上等价,但是逆向分析难度增大的目标代码。可以抵御逆向工程、代码篡改等攻击行为。
- 软件加壳。在原二进制文件(如可执行文件、动态链接库)上附加一段专门负责保护该文件不被反编译或非法修改的代码或数据。加壳后的程序能够增加逆向分析和非法修改的难度。
- 虚拟机保护。先模拟产生自己定制的虚拟机,然后将软件程序集代码翻译为这个模拟产生的虚拟机才能解释执行的虚拟机代码。
14-4 软件版权保护的目标有哪些?它与软件保护的目标有什么联系与区别?
软件版权保护的目标
- 防软件盗版。即对软件进行防非法复制和使用的保护。
- 防逆向工程。即防止软件被非法修改或剽窃软件设计思想等。
- 防信息泄露。即对软件载体及涉及数据的保护,如加密硬件、加密算法的密钥等。
区别
软件版权保护的目标是软件保护目标的一个子集。
- 目标 。版权保护的目标是**"防盗版",维护开发者的商业收益;软件保护的目标是"防破坏"**,确保软件按照设计预期运行。
- 防御对象。版权保护防御的是非法使用者和盗版商,软件保护防御的是黑客和恶意攻击者。
- 技术侧重。版权保护常采用序列号、加密狗、数字水印、DRM等技术,软件保护常采用漏洞扫描、沙箱隔离等技术。
联系
- 技术手段具有通用性。许多用于保护版权的技术(如代码混淆、加壳、加密)同时也是软件保护的重要手段。它们既能防止盗版商逆向分析算法,也能增加黑客挖掘安全漏洞的难度。
- 完整性校验是共同基础。防篡改技术(如数字签名、校验和)是两者的交集。它既能防止破解者修改代码绕过验证(版权保护),也能防止攻击者植入木马或后门(软件保护)。
- 相互依存。软件版权保护通常是软件保护体系中的一部分。如果一个软件缺乏基础的安全性(如容易被逆向和篡改),那么其版权保护机制也会轻易失效。
完
复习完了心情大好,可以给窝点个赞吗
