软件安全
选择题
-
当4字节压入栈帧时以下哪个选项是正确的(B )
A、ESP=ESP + 4 B、ESP=ESP - 4 C、ESP=ESP * 4 D、ESP=ESP / 4
-
某天某研究员发现了一个软件漏洞,它可能会危及用户数据对机密性,完整性,那么它属于(B)
A、严重漏洞 B、重要漏洞 C、中等漏洞 D、低漏洞
-
BSI模型中,描述性知识包括(B)
A、实例、检测和架构 B、原则、方针、和规则 C、案例、说明、架构 D、需求描述、安全操作和安全原则
-
下列关于软件安全开发中的BSI(Build Secunity In)系列模型说法错误的是(B)
A、BSI含义是指将安全内建到软件开发过程中,而不是可有可无更不是游离于软件开发生命周期之外 B、软件安全的三根支柱是风险管理、软件安全触点和安全测试 C、软件安全触点是软件开发生命周期中一套轻量级最优工程化方法,它提供了从不同角度保障安全的行为方式 D、BSI系列模型强调应该使用工程化的方法来保证软件安全,即在整个软件开发生命周期中都要确保将安全作为软件的一个有机组成部分
-
某公司开发了一个游戏网站,但是由于网站软件存在漏洞在网络中传输大数据包时总是会丢失一些数据,如一次性传输大于2000个字节数据时,总是会有3到5个字节不能传送到对方,关于此案例可以推断的是该网站软件存在(B)方面安全问题。
A、保密性 B、完整性 C、可用性 D、不可抵赖性
-
当前,应用软件安全已经日益引起人们的重视,每年新发现的应用软件漏洞已经占新发现漏洞总数一半以上。下列选项中,哪个与应用软件漏洞成因无关©
A、传统的软件开发工程未能充分考虑安全因素 B、开发人员对信息安全知识掌握不足 C、相比操作系统而言,应用软件编码所采用的高级语言更容易出现漏洞 D、应用软件的功能越来越多,软件越来越复杂,更容易出现漏洞
-
为增强 Web应用程序的安全性,某软件开发经理决定加强Web软件安全开发培训,下面哪项内容不在考虑范围内©
A、关于网站身份签别技术方面安全知识的培训 B、针对 Openssl 心脏出血漏洞方面安全知识的培训 C、针对 SQL注入漏洞的安全编程培训 D、关于 ARM 系统漏洞挖掘方面安全知识的培训
-
最小特权是软件安全设计的基本原则,某应用程序在设计时设计人员给出了以下四种策略,其中有一个违反了最小特权的原则,作为评审专家,请指出是哪一个(D)
A、软件在 Linux下按照时,设定运行时使用nobody用户运行实例 B、软件的日志备份模块由于需要备份所有数据库数据,在备份模例块运行时,以数据库备份操作员账号连接数据库 C、软件的日志模块由于要向数据库中的日志表中写入日志信息,使用了一个日志用户账号连接数据库,该账号仅对日志表拥有权 D、为了保证软件在 Windows下能稳定的运行,设定运行权限为限system,确保系统运行正常,不会因为权限不足产生运行错误
-
某单位计划在今年开发一套办公自动化(OA)系统,将集团公司各地的机构通过互联网进行协同办公,在OA系统的设计方案评审会上,提出了不少安全开发的建设,作为安全专家请指出大家提的建议中不太合适的一条©
A、对软件开发商提出安全相关要求,确保软件开发商对安全足够的重视,投入资源解决软件安全问题 B、要求软件开发人员进行安全开发培训,使开发人员掌握基本软件安全开发知识 C、要求软件开发商使用Java而不是ASP作为开发语言,避免SQL注入漏洞 D、要求软件开发商对软件进行模块化设计,各模块明确输入和输出数据格式,并在使用前对数据进行校验
-
某软件公司准备提高其开发软件的安全性,在公司内部发起了有关软件开发生命周期的讨论,在下面的发言观点中,正确的是(B)
A、软件安全开发生命周期较长,而其中最重要的是要在软件的编码安全措施,就可以解决90%以上的安全问题 B、应当尽早在软件开发的需求和设计阶段增加一定的安全措施这样可以比在软件发布以后进行漏洞修复所花的代价少得多 C、和传统的软件开发阶段相比,微软提出的安全开发生命周期(SDL)最大特点是增加了一个专门的安全编码阶段 D、软件的安全测试也很重要,考虑到程序员的专业性,如果该开发人员已经对软件进行了安全性测试,就没有必要再组织第三方进行安全性测试
-
某单位门户网站开发完成后,测试人员使用模糊测试进行安全性测试,以下关于模糊测试过程的说法正确的是(D)
A、模拟正常用户输入行为,生成大量数据包作为测试用例 B、数据处理点、数据通道的入口点和可信边界点往往不是测试对象 C、监测和记录输入数据后程序正常运行的情况 D、深入分析网站测试过程中产生崩溃或异常的原因,必要时需要测试人员手工重现并分析
填空题
- SDL模型由安全培训、安全需求分析、安全设计、安全实施、安全验证、安全发布、安全响应七个阶段组成
- SDL模型是由软件工程的瀑布模型发展而来的
- 利用零日漏洞开发攻击工具进行的攻击称为零日攻击。
- 软件面临的3大类安全威胁为:软件漏洞、恶意代码、软件侵权
- 软件部署的模式主要分为:单机软件的部署、基于中间件平台的部署、代理的部署三种模式
- 《渗透测试执行标准》将渗透测试过程分为前期交互、情报收集、威胁建模、 漏洞分析 、渗透攻击、后渗透攻击、报告等7个阶段
- 等级保护的五个环节定级、备案、安全测评、安全建设整改和监督检查
- BSI模型将风险管理、软件安全接触点、安全知识作为软件安全的三根支柱
- 现代操作系统中堆的数据结构一般包括堆块和堆表两类。
- 减少软件受攻击面就是去除、禁止一切不需要使用的模块,协议和服务,其目的是减少攻击可以利用的漏洞
- 最小授权原则是指系统仅授予实体(用户、管理员、进程、应用和系统等)完成规定任务所必需的最小权限,并且该权限的持续时间也尽可能短
- 采用高内聚、低耦合的模块化编程方法,也就是模块之间的依赖关系是弱链接,每一个模块只负责执行一个独立的功能
- 安全的编程语言是指那些具有对内存、指针和缓冲区进行管理的能力而避免发生软件安全问题的语言。
- 软件安全设计就是将软件的安全需求转化为软件的功能结构的过程。
- 威胁建模通常有软件为中心的威胁建模、安全为中心的威胁建模、资产和风险为中心的威胁建模三类方法。
- 软件=程序+数据+文档
判断题
- (对)软件安全没有银弹。
- (错)BSI模型中,描述性知识包括需求描述、安全操作和安全原则。
- (对)漏洞都会经历产生、发现、公开、消亡等过程,在此期间,漏洞会有不同的名称或者表示形式。
- (错)软件测试的目的是为了表明程序是正确的
- (错)当组织决定购买而不是自己开发软件时,只需要考虑软件功能需求就可以。
- (错)对于软件安全开发生命周期(SDL)各个阶段而言测试阶段是发现并改正软件安全漏洞的最佳环节过早或过晚检测修改漏洞都将增大软件开发成本
- (错)软件安全开发模型的核心思想是:通过安全活动分散到软件生命周期的各个阶段中来开发出绝对安全的软件和系统。
- (错)零日漏洞指软件发布后被立刻发现的漏洞。
- (对)审计是一种被动的检测控制措施。
- (错)UMLSec建模描述分析法是工程化分析技术最常用的方法。
- (错)某单位门户网站开发完成后,测试人员使用模拟正常用户输入行为,生成大量数据包作为测试用例属于模糊测试法。
- (对)应用软件来考虑多线程技术,在对用户服务时按序排队提供服务,这属于软件开发安全方面的问题原则。
名词解释题目
- 0 Day漏洞(零日漏洞):指的是一种在软件、硬件或固件中存在的安全漏洞,该漏洞在被公开或修复之前已经被攻击者发现并利用。
- 零日攻击:用零日漏洞开发攻击工具,进行的攻击称为零日攻击
- ISMS(Information Security Management System):信息安全管理体系
- APT(Advanced Persistent Threat):高级可持续攻击
- RLIP/RUD:统一过程
- PDRR/PDR(Protect, Detect, Respond, Recover):网络安全中的防护、检测、响应和恢复四阶段模型
- OWASP(Open Web Application Security Project):开放式Web应用程序
- SAMM(Software Assurance Maturity Model):软件保障成熟度模型
- CLASP(Comprehensive, Lightweight Application Security Process):综合的轻量级应用安全过程
- VPN(Virtual Private Network):虚拟专用网
- NIST(National Institute of Standards and Technology):美国国家标准与技术研究院
- CNNVD(China National Vulnerability Database):中国国家信息安全漏洞库
- CVSS(Common Vulnerability Scoring System):通用漏洞评分系统
- CWSS(Common Weakness Scoring System):通用缺陷评分系统
- CVE(Common Vulnerabilities and Exposures):通用漏洞和披露
- CWE(Common Weakness Enumeration):通用缺陷枚举
- BSI(Build Security In):内建安全模型
- SDL(Software Development Lifecycle):软件开发生命周期模型
- STRIDE:威胁建模的一种威胁分类方法,Spoofing(假冒),Tampering(篡改),Repudiation(否认),Information Disclosure(信息泄露),Denial of service(拒绝服务攻击),Elevation of privilege(权限提升)
- PTES(Penetration Testing Execution Standard):渗透测试执行标准,是安全业界在渗透技术领域中正在开发的一种新标准
- IDS(Intrusion Detection System):入侵检测系统
- IPS(Intrusion Prevention System):入侵防御系统
正则化表达式
验证强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)
^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z0-9]{8,10}$
- 不同强密码要求不相同,该正则表达式适用于必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间的强密码
- 至少包含一个大写字母(?=.*[A-Z]) -->使用正先行断言,任意字符出现任意次数后必须跟有大写字符
- 至少包含一个小写字母 (?=.*[a-z]) -->使用正先行断言,任意字符出现任意次数后必须跟有小写字符
- 至少包含一个数字(?=.*\d) -->使用正先行断言,任意字符出现任意次数后必须跟有数字字符
- 不能使用特殊字符,长度在8-10之间[A-Za-z0-9]{8,10}
- .*表示的是任意字符出现任意次数,不能使用特殊字符直接使用[A-Za-z0-9]限制
身份证号
^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$
身份证分为:地址码、年份码、月份码、日期码、顺序码、效验码
- 地址码:
- 年份码
- 长四位
- 以18,19,20开头:(18|19|20)
- 剩余俩位为0-9的数字:\d{2}
- (18|19|20)\d{2}
- 月份码
- 长两位
- 第一位为0开头,第二位为1-9或者第一位为1开头,第二位为0-2
- ((0[1-9])|(1[0-2]))
- 日期码
- 长两位
- 第一位为0-2,第二位为1-9,或者为10|20|30|31–>如果第二位为0-9会出现00这种不合法的日期
- (([0-2][1-9])|10|20|30|31))
- 顺序码
- 长三位
- 顺序码都为数字
- \d{3}
- 校验码
- 长一位
- 可以为数字也可以为X和x
- [0-9Xx]
拼接:3\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31))\d{3}[0-9Xx]$
Email地址
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
-
该答案属于简化写法(允许出现.±_符号),无法严格按照互联网邮件地址规范(如RFC 5322)匹配所有合法邮箱
-
常见的最基础邮箱例如laijunxu559@gmail.com 基础包含一个@和一个.(但是例如网易邮箱Vip邮箱为163.vip.com,教育邮箱stu.fjpsc.com等等会出现多个.)
根据常见邮箱把格式划分
^ \w+([-+.]\w+)* @ \w+([-.]\w+)* \. \w+([-.]\w+)* $
-
\w+表示的是出现一次或者多次字母与数字或者下划线(\w表示字母或数字或下划线)
-
([-+.]\w+)*表示(.xxx|-xxx|+xxx)的格式
- user-name@xxx
- user-name-id@xxx
- user.com@xxx
- user.163.VIP.com@xxx
- user+com@xxx
- user+com+ip+temp@xxx
-
\w+([-.]\w+)*表示与前面相同只是少了个+
-
为什么不能为^\w+([-+.]\w+)*@\w+([-.]\w+)$*的原因是这样会导致ljx@exmple这种非法格式也可以被匹配到,所以要强制加一个.进行匹配
手机号码
^(13[0-9]|14[57]|15[012356789]|17[0-9]|18[012356789]|19[89])\d{8}$
- 手机号码分段
- 13[0-9]
- 14[57]
- 15[012356789]注意没有4号段
- 17[0-9]
- 18[012356789]注意没有4号段
- 19[89]
国内固定电话号码
\d{3}-\d{8}|\d{4}-\d{7}
- 区号三位-八位座机号
- 区号四位-七位座机号
中国邮政编码
[1-9]\d{5}(?!\d)
- 邮政编码:
- 六位数字
- 第一位不能为0
- 后五位任意数字
- 第一位不能为0 -->[1-9]
- 后五位任意数字 -->\d{5}
- 防止匹配到更长字串例如:3600000000000000000 (?!\d)–>负先行断言,后续不再跟有数字
IP地址
^([0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(\.([0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}
-
IPV4
-
4字节 x.x.x.x
-
x∈[0-255]
-
把0-255分为0-9,10-99,100-199,200-249,250-255
[0-9] ->0-9 [1-9]\d ->10-99 1\d{2} ->100-199 2[0-4]\d ->200-249 25[0-5] ->250-255
-
([0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])表达0-255
-
(\.([0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}表达3个.x
-
注意不能漏^和$
-
域名
^(?!-)[A-Za-z0-9-]{1,63}(?<!-)(\.[A-Za-z0-9-]{1,63})+\.[A-Za-z]{2,}$
-
因为域名中可以包含-这种符号例如,但是不可以以-开头且不以-结尾,且限制每个标签的长度1到63个字符
sub-domain.example.co.uk
所以得
^(?!-)[A-Za-z0-9-]{1,63}(?<!-)
-
(.[A-Za-z0-9-]{1,63})+表示多级域名部分
-
.[A-Za-z]{2,}顶级域名部分至少有两个字母
数字
^[0-9]*$
n位的数字
^\d{n}$
至少n位的数字
^\d{n,}$
n位到m位的数字
^\d{n,m}$
代码分析题
- UMR(Uninitialized Memory Read)
- 读取未初始化的内存。这种错误可能导致程序获取未知或不正确的数据,进而引发不可预测的行为。
- ABW(Array Bounds Write)
- 数组越界写入,即试图向数组范围之外的内存位置写入数据。这可能破坏其他数据或程序的结构。
- ABR(Array Bounds Read)
- 数组越界读取,即试图读取数组范围之外的内存位置。可能导致读取到未知数据或非法访问内存。
- FMR(Freed Memory Read)
- 在内存被释放后尝试读取该内存区域的数据。这种行为是未定义的,可能导致程序崩溃或错误数据。
- FMW(Freed Memory Write)
- 在内存被释放后尝试写入该内存区域。这种行为会破坏程序的内存管理,可能引发严重错误。
- FFM(Freed Freed Memory)
- 尝试对已经释放的内存再次释放(重复释放)。这种错误会破坏内存管理机制,可能导致程序崩溃。
书P73
#include <iostream>
using namespace std;
int main (){
char * str1="four";
char * str2=new char[4];
char * str3=str2;
cout<<str2<<endl; //UMR
strcpy(str2,str1); //ABW
cout<<str2<<endl; //ABR
delete str2;
str2[0]+=2; //FMR and FMW
delete str3; //FFM
}
- cout<<str2<<endl,在这里str2没有进行初始化赋值,会导致访问内存得到非法数据
- strcpy(str2,str1),在这里str2在内存开辟了4字节的内存,str1通过字符串赋值在内存的单元为:f|o|u|r|\0,一共5字节(字符串末尾自带\0结束符),所以使用strcpy会产生数组越界写入
- cout<<str2<<endl,因为str2有产生越界写入,相同访问该内存产生越界读取
- str2[0]+=2,str2已经通过delete str2进行释放,+=2访问str2[0]读取并写入产生FMR FMW错误
- delete str3,注意char * str3=str2,str3被初始化为str2的值,所以str3和str2指向的是同一个内存(可理解为str3为str2的别名),在前面已删除str2指向的内存,在这里delete str3会重复删除str2指向的内存
PPT题目
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i;
int cnt;
char *str1 = "Hello";
char str2[32];
char *str3;
scanf("%s",str2); //ABW UMR
scanf("%d",cnt); //UMR
for (i = 0;i <cnt;i++) {
str3 = (char *)malloc(128); //UMR或FMR
scanf("%s",str3);
printf(">> %s\n",str3);
}
strcpy(str2,str3); //ABW
printf(">>> %s\n",str2);
free(str3); //FFM
return 0;
}
- scanf(“%s”,str2),其中scanf可以无限制的输入字符直到输入换行符为止,所以对于str2会产生越界风险
- scanf(“%d”,cnt)和scanf(“%s”,str2),都缺少了&符号,访问了非法地址正确应该为scanf(“%d”,&cnt)
- str3 = (char *)malloc(128),malloc应该判断是否为NULL,负责如果申请内存失败则会等于NULL,后续访问str3都是为访问非法地址
- strcpy(str2,str3),str2内存为32字节,str为128字节,可能存在写越界
- for循环内str3 = (char *)malloc(128)一共申请了cnt次内存,但是在代码末尾只有释放一次free(str3)
威胁建模的应用
在软件开发生命周期中的应用
威胁建模通常被应用于软件开发生命周期(SDLC)的不同阶段,以确保系统设计的安全性:
- 需求阶段:
- 在需求分析时应用威胁建模,可以明确系统的安全需求和可能的威胁。
- 确保在功能设计时充分考虑潜在威胁。
- 设计阶段:
- 在设计阶段分析系统架构和数据流,识别可能的威胁场景(如数据泄露、未授权访问等)。
- 改进系统设计,避免引入高风险的组件或逻辑漏洞。
- 开发阶段:
- 在代码开发时,结合威胁建模提供的风险点,进行代码安全检查(如输入验证、认证机制)。
- 测试阶段:
- 设计测试用例覆盖威胁建模中发现的高风险场景(如模糊测试和渗透测试)。
在系统安全设计中的应用
- 网络安全:
- 在网络架构设计中,通过威胁建模识别潜在的攻击点(如未受保护的开放端口、未加密的通信路径)。
- 为高风险区域部署防火墙、入侵检测系统(IDS)、入侵防御系统(IPS)。
- 身份验证与访问控制:
- 分析认证和授权机制(如OAuth、JWT)的潜在漏洞。
- 改进用户身份验证方式,防止弱密码、会话劫持等攻击。
- 数据保护:
- 在数据流动和存储的威胁建模中,发现可能的泄露路径。
- 使用加密、脱敏等技术确保敏感数据的安全性。
在安全评估和风险管理中的应用
- 风险评估:
- 根据威胁建模分析,评估不同威胁的可能性和潜在影响。
- 对风险进行优先级排序,帮助企业聚焦于关键问题。
- 安全合规性:
- 威胁建模可以帮助识别与法规(如GDPR、PCI-DSS)不符的环节,提前整改。
- 攻击模拟:
- 模拟可能的攻击路径和方式(如社会工程、恶意代码),制定防御策略。
在物联网(IoT)中的应用
- 设备漏洞:识别固件中的潜在漏洞。
- 通信安全:分析设备间的通信是否受到窃听或篡改威胁。
- 数据保护:确保传输和存储的数据是加密的。
在云计算和容器化中的应用
- 云安全:
- 在云架构中识别可能的威胁(如数据隔离不当、权限过高)。
- 评估多租户环境中的潜在攻击场景。
- 容器安全:
- 分析容器与宿主系统的交互,防止逃逸攻击。
- 在CI/CD流水线中发现潜在漏洞。
简答题
什么是威胁建模,简述威胁建模的过程
- 软件威胁建模是指通过抽象的概念模型对影响软件系统的威胁进行系统的识别和评价
- 确立安全目标
- 创建应用程序概况图
- 分解应用程序
- 确定威胁
- 威胁评估
- 确定威胁缓解计划或策略
- 验证威胁
- 验证建档
什么是默认安全配置原则?试举例说明哪些措施采用了默认安全配置原则
默认安全配置原为系统提供默认的安全措施,包括默认权限、默认策略等,尽可能让用户不需要额外配置就可以安全地应用。默认安全原则也是保持系统简单化的重要方式。对任何请求默认加以拒绝。
- 不经常使用的功能在默认情况下关闭。
- 默认检查口令的复杂性。
- 当达到最大登录尝试次数后,默认状态下拒绝用户访问,锁定账户
什么是软件开发(过程)模型,请列举出至少5种软件开发模型?
- 软件开发模型(Software Development Model)是跨越整个软件生存周期的系统开发、运行和维护所实施的全部工作和任务的结构框架,它给出了软件开发活动各阶段之间的关系。
- 开发模型:瀑布模型,快速原型模型,增量模型,螺旋模型,喷泉模型,Rational统一过程,极限编程和敏捷开发,微软过程
为了确保软件的运行安全,常采用的安全策略有哪些?
- 强制修改默认口令
- 重视数据备份
- 注重软件运行期间的漏洞监测与处理
软件安全配置过程中,常采用的安全策略有哪些?
- 提供详细的安装手册
- 可更改的软件安装目录
- 设置默认安装模块
- 提供安全功能
- 启用最小权限用户身份
- 开启应用日志审计
- 记录部署过程
软件应该允许用户根据应用场景和软件运行情况进行安全配置,请举例说明安全配置功能的主要内容(至少5项)
- 口令安全强度策略,如至少10位且必须有大小写字母和数字等。
- 口令修改策略,如必须每3个月修改一次
- 口令历史保存策略,如每次修改口令,不能使用近10次使用过的口令。
- 账号锁定策略,如连续错误登录3次时,锁定该账号,不能再使用。
- 软件目录访问权限策略,如设置软件或配置文件只允许某个系统账号访问。
- 日志保存历史策略,如设置保存近一年内的历史日志。
- 报警策略,如设置当某级别的警告发生时,需通过短信方式通知管理员。
简述软件漏洞的特点
- 持久性与时效性
- 广泛性与具体性
- 可利用性和隐蔽性
简述基于威胁类型的漏洞分类
- 获取控制
- 获取信息
- 拒绝服务
什么是恶意代码?请列举说出恶意代码类型
- 恶意代码(Malicious Soware,Malware)是在未被授权的情况下,以破坏软硬件设备窃取用户信息、于扰用户正常使用、扰乱用户心理为目的而编制的软件或代码片段。
- 恶意代码包括计算机病毒(ComputerVirs)、蠕虫(Womm)、特洛伊木马(TrojianHorse)、后门(Back Door)、内核套件(Rootkit)、间谍软件(Spyware)、恶意广告(Dishonest Adware)、流氓软件(Crimeware)、逻辑炸弹(Lgic Bomb)、僵尸网络(Botet)、网络钓鱼(Phishing)、恶意脚本(Malice Soript)及垃圾信息(Spam)等恶意的或令人讨厌的软件及代码片段。近几年危害甚广的勒索软件(Ransomware)也属于恶意代码范畴。
什么是SD3+C,简述其内容
- 安全设计
- 安全配置
- 安全部署
- 安全沟通