计算机等级考试三级信息安全技术章节习题5
五、应用安全
简述软件漏洞概念中包含的3个要素
- 漏洞是计算机系统本身存在的缺陷
- 漏洞的存在和利用都有一定的环境要求
- 漏洞存在的本身是没有危害的,只有被攻击者恶意利用,才能给计算机带来威胁和损失
简述软件漏洞的四个特点
- 危害性大
- 影响广泛
- 存在的长久性
- 隐蔽性
按照软件漏洞被攻击者利用的地方进行分类,软件漏洞可以分为哪几类?
- 本地利用漏洞
- 远程利用漏洞
根据漏洞生命周期不同阶段进行划分,软件漏洞可以分为哪几类?
- 0day 漏洞:指未公开状态的漏洞
- 1day 漏洞:发布补丁时间不长的漏洞
- 已公开漏洞
描述软件漏洞危险等级的划分
- 紧急,危险级别最高的等级,微软定义为严重
- 重要,微软定义为重要
- 中危,微软定义为中等
- 低危,微软定义为警告
简单说明国内外知名漏洞库及其包含漏洞信息的特点
- CVE : 通用漏洞列表,软件漏洞行业标准,安全漏洞命名机制的规范化标准化,成为评价相应入侵检测和漏洞扫描等工具和数据库的基准
- BygTraq :安全焦点的 BugTraq邮件列表, 被认为是互联网上最广泛且最可信的安全信息源,包含的漏洞列表是目前最大的漏洞数据库之一,很多最新的的技术讨论和很多 0day 漏洞都是出现在这里,并以 CVE 交叉索引,漏洞编号 BID
- NVD :美国国家漏洞数据库,目前世界上数据量最大,条目最多的漏洞数据库之一,与 CVE 同步和兼容
- CNNVD :中国国家信息安全漏洞库,是中国信息安全测评中心切实履行漏洞分析和风险评估的职能,负载建设运维国际级信息安全漏洞库,为我国信息安全保障提供基础服务。定向通报服务是测评中心面向各级政府机关及企事业单位,及时、准确推送涵盖以漏洞信息为核心的各类数据及应用服务
- CNVD :国家互联网应急中心,是工信部领导下的国家级安全应急机构,是 CNCERT 联合国内重要信息系统单位、基础电信运营商、网络安全厂商、软件厂商和互联网企业建立的信息安全漏洞信息共享知识库
介绍缓冲区溢出的原理
缓冲区是一块连续的内存区域,用于存放程序运行时加载到内存的运行代码和数据。缓冲区溢出是指程序运行时,向固定大小的缓冲区写入超出其容量的数据,多余的数据会越过缓冲区的边界覆盖相邻内存空间,从而造成溢出。缓冲区的大小是由用户输入的数据决定的,如果程序不对用户输入的超长数据做长度检查,同时用户又对程序进行非法操作或错误输入,就会造成缓冲区溢出。
缓冲区溢出攻击是指发送缓冲区溢出时,溢出的数据会覆盖相邻内存空间的返回地址、函数指针、堆管理结构等合法数据,从而使程序运行失败,或发生转向去执行其他程序代码,或执行预先注入内存缓冲区中的代码。
说明操作系统的内存管理机制
操作系统中的每一个进程都会被分配一块独立的虚拟地址空间,用以保存进程运行时的数据和代码,虚拟地址空间是实际空间的映射。
堆(heap)是先进先出的数据结构,往高地址增长
栈(stack)是后进先出的数据结构,往低地址增长
介绍堆溢出和栈溢出的原理
堆是内存中用于存放动态数据的区域,堆空间由地址向高地址方向增长,堆溢出指堆中发生缓冲区溢出,利用堆溢出向内存单元写入任意数据,实现改写内存中的关键数据,达到攻击目的
栈的存取采用先进后出的策略,程序用它来保存函数调用时的有关信息,如函数参数、返回地址,函数中的非静态局部变量存放在栈中,栈溢出是缓冲区中最简单的一种,通过溢出数据覆盖返回地址,程序会转到覆盖后的地址指向的程序
介绍格式化字符串漏洞、整数溢出漏洞的原理
C 语言中的格式化函数允许可变参数,它根据传人的格式字符串获知可变参数的个数和类型,并依据格式化符号进行参数的输出。如果调用这些函数时,给出了格式符号串,但没有提供实际对应参数,这些函数会将格式化字符串后面的多个栈中的内容弹出作为参数,并根据格式化符号将其输出
整数分为无符号和有符号两类,对整数进行加、乘等运算时,计算的结果大于该类型的整数所表示的范围,就会发生整数溢出,分为:存储溢出、运算溢出、符号问题
介绍数组越界漏洞、写污点值到污点地址漏洞,以及内存地址对象破坏性调用漏洞的原理
-
数组越界漏洞:由于不正确的数组访问造成,通过精心构造超出数组范围的索引值,就能对任意内存地址进行读写操作
-
写污点值到污点地址漏洞:通过精心选择污点地址和污点值,列用这种漏洞就能改写系统内核的关键数据结构。污点值为可能引发漏洞的输入值,污点地址为触发漏洞的潜在地址。
-
内存地址对象破坏性调用漏洞:指某对象保存的内存地址写入一个变量中,攻击者通过调用初始化或释放功能的异常操作,将保存对象的内存地址进行释放,从而导致读取变量中保存的内存地址以期访问某对象的过程,从而触发内存访问异常。
介绍漏洞利用的概念和 shellcode 的编写方法
实施攻击前,需要做大量的调试工作,包括了解存放缓冲区溢出漏洞的程序有几个输入参数,哪个输入参数会造成缓冲区溢出,如何构造输入参数的长度和内容,以便使缓冲区的偏移距离恰好能覆盖返回地址,并将攻击者构造的可执行 shellcode 代码的地址写入到返回地址。根据软件漏洞具体条件构造相应输入参数和 shellcode 代码,最终实现获得程序控制权的工程,就是漏洞利用,一般用 exploit 来表示。
shellcode 代码是一段机器指令,可实现攻击者指定的操作,shellcode 通称缓冲区溢出攻击中植入的一段以获得执行权限的代码
shellcode 可用 C 语言编写,编译后用 OllyDbg加载其可执行文件,在从中选中所需的机器代码,也可通过 IDA Pro 等反编译工具从 PE 文件中得到对应的机器代码
对于Linux 系统 shellcode 中要实现的功能主要是通过系统调用来完成,而每个系统调用都有固定的系统调用号
对于 Windows 系统,虽然 Windows 也有系统调用,但都是封装在高级的 API 中调用的,且不同的 Service Pack 版本的操作系统其 API 都可能有所改动,所以不可能直接调用。需要采用动态的方法获取 API 地址,从而编写 shellcode
针对静态的 shellcode 地址、动态变化的 shellcode 地址分别说明其漏洞利用技术的原理
存在溢出漏洞的程序是一个操作系统每次启动都要加载的程序,操作系统启动时为其分配的内存地址一般是固定的,则函数调用时分配的栈帧地址也是固定的,溢出后写入栈帧的 shellcode 代码其内存地址也是静态不变的,所以可以直接将 shellcode 代码在栈帧中的静态地址覆盖原有返回地址。在函数返回使,通过新的返回地址指向 shellcode 代码地址,从而执行 shellcode 代码
有些软件的漏洞存在与某些动态链接库中,这些动态链接库在进程运行时被动态加载,因而在下一次这些动态链接库被重新装载到内存中,其在内存中的栈帧地址时动态变化的,则植入的 shellcode 代码在内存中的其实地址也时变化的。在这种情况下,需要让溢出发生时,覆盖返回地址后新写入的返回地址能自动定位到 shellcode 的起始地址。
说明针对堆漏洞的 Heap Spray 漏洞利用的技术
Heap Spray 也称为堆喷洒技术,在 shellcode 的前面加上大量的滑板指令,组成一个非常长的注入的代码段。然后向系统申请大量内存,并且反复用这个注入代码段来填充。这样就使得内存空间被大量的注入代码占用,攻击者在结合漏洞利用技术,只要使程序跳转到堆中被填充了注入代码的任何地址,程序指令就会顺者滑板指令最终执行到 shellcode 代码
滑板指令由大量 NOP 空指令 0x90
填充组成的指令序列,当遇到这些 NOP 指令时,CPU 指令指针会一个指令接一个指令地执行,总结不做任何具体操作,直到滑过最后一个滑板指令后,接着执行这些指令后面的其它指令,往往后面接着的时 shellcode代码,Heap Spray 技术通过使用类 NOP 指令来进行覆盖,对 shellcode 地址的跳转准确性要求不大,从而增加来缓冲区溢出攻击的成功率
说明微软操作系统中几种常用的漏洞防护技术
- GS Stack protection :栈保护技术,是一项缓冲区溢出的检测防护技术
- DEP :数据执行保护技术,可以设置内存堆栈区的代码为不可执行状态,从而方法溢出后代码的执行
- ASLR : 地址分布随机化,是一项将系统关键地址随机化,从而使攻击者无法获得需啊唷跳转的精确地址的技术,打乱系统中存在的固定地址
- SafeSEH :Windows 异常处理机制所采用的重要数据结构链表
- SEHOP 结构化异常处理覆盖保护,是微软针对 SEH 攻击提纯的一种防护方案
说明软件开发生命周期的概念和阶段划分
软件编码人员进行软件开放过程中,一般都会遵循相应的软件开发生命周期模型用于指导编码的整个过程。计算机软件产品从需求分析、设计、编码、测试、发布到维护,类似于经历一个生命的孕育、诞生、成长、成熟、衰亡的周期,一般称为软件开发生命周期。
- 问题的定义于规划:确定开发目标,可行性分析,指定开发计划
- 需求分析:对软件需要的各个功能进行详细分析
- 软件设计:对整个软件的系统设计(系统框架设计、各函数模块设计、数据库设计)
- 程序编码:根据软件设计文档完成直接编码,转换成可运行的程序代码,一般要制定统一、符合标准的编写规范
- 软件测试:发现软件设计或软件编码中存在的问题并进行修改,保证软件的质量
- 运行维护:纠错性维护和改进性维护
介绍软件开发生命周期的几种模型
- 瀑布模型/改进的瀑布模型:需求 → 分析 → 设计 → 编码 → 测试 等几个阶段,每个阶段都明确定义了产出物和验证的准则,每个阶段完成后阻止相关的评审和验证,通过后进入到下一阶段。为了提高效率,并行开发适当地重叠各个阶段的过程
- 螺旋模型:需求 → 分析 → 设计 → 开发 → 测试,加强了软件开发各个阶段的管理和控制,多阶段转化到多迭代过程中。每次迭代都包含六个步骤:确定目标和替代方案、识别项目的风险、堆技术方案进行评、开发出本次迭代的交付物、计划下一次迭代过程、提交下一次迭代的步骤和方案。螺旋模型实现了每个阶段过程中的目标制定、风险分析、交付物的评估验证,保证了软件具有较高的代码质量
- 迭代模型:遵循需求 → 设计 → 开发的瀑布模型,开发阶段可以包括多次迭代,逐步精化和修正
- 快速原型模型:也称敏捷开发,根据需求在短时间内完成可以演示的软件产品,只实现部分功能或最重要的功能
说明微软公司采用的软件安全开发生命周期模型12个阶段的内容
- 第 0 阶段,准备阶段:通过教育培训,培养开发团队员工的安全意识
- 第 1 阶段,项目启动阶段:在项目启动时,需要将项目涉及的安全问题都分析到位,以使软件产品更安全可靠
- 第 2 阶段,定义需要遵守的安全设计原则:在编码阶段开始前,需要在设计阶段对软件安全特性进行较多考虑,并定义出安全设计的原则
- 第 3 阶段,产品风险评估:在此阶段对所以开发的产品精心风险评估,以确认开发的软件是否采用了由潜在风险的技术,或者私否有较大的隐私暴露危险性
- 第 4 阶段,风险分析:对于存在高风险的软件产品,有必要通过威胁建模开展深入的风险分析
- 第 5 阶段,创建安全文档、安全配置工具:考虑为用户提供可操作的安全指南和安全配置工具
- 第 6 阶段,安全编码策略
- 第 7 阶段,安全测试策略:协助开发团队发现可以被利用的高危漏洞
- 第 8 阶段, 开发团队自身进行全面安全分析检测:在软件产品进行验证阶段且已完成所以代码与功能开发后的一个阶段
- 第 9 阶段,最终安全评审:做最终的安全评审,以检查是否做号了提交给客户的准备
- 第 10 阶段,组建安全响应团队制定安全响应计划
- 第 11 阶段,产品发布
- 第 12 阶段,安全响应执行
说明主要的软件静态和动态安全检测技术
静态完全检测技术包括词法分析、数据流分析、污点传播分析、符号执行、模型检查、定理证明等
动态安全检测技术主要包括模糊测试、智能模糊车上和动态污点分析等
详细介绍基于软件技术的软件安全保护技术
- 注册信息验证技术
- 软件防篡改技术
- 代码混淆技术
- 软件水印技术
- 软件加壳技术
- 反调试反跟踪技术
说明恶意程序主要的传播技术
- 网站挂马
- 诱骗下载
- 通过移动存储介质传播
- 通过电子邮件和即时通信软件传播
- 通过局域网传播
说明恶意程序的4种检测技术
- 特征码查杀技术:针对已知病毒木马等恶意程序进行分析,提前典型代码特征添加到特征库中,然后根据恶意程序的特征码对文件或内存进行扫描匹配,匹配成功则检测出相应特征码对应的恶意程序
- 启发式查杀技术:通过事先分析恶意程序执行指令的顺序或特定行为的组合情况等特征,建立检测的基准行为或指令的样本库,并以这些基准行为或指令的特征来检测并确定是否是恶意程序
- 虚拟机查杀技术:在扫描恶意程序时,通过将恶意程序加载到虚拟机环境中运行,从而让恶意程序自动脱壳还原为原有状态,再进行检测查杀的技术
- 主动防御技术:通过事先挂钩系统服务派发表 SSDT 中的多个 API 函数,类如进程创建、线程创建、DLL插入等系统函数,实现对恶意程序进行全面监控
介绍10种常见的 Web 安全威胁手段
- 注入
- 跨站脚本
- 跨站请求伪造
- 遭破坏的身份认证和会话管理:攻击者窃听来用户访问 HTTP 时的用户名和密码,或用户的会话。从而得到 SessionID 进而冒出用户进行 HTTP 访问的过程。
- 不安全的直接对象引用:指 Web 应用程序的开发人员将一些不应公开的对象引用直接暴露给用户,使用户可通过更改 URL 等操作直接引用对象,一个用户通过更改 URL 等操作可以成功访问到未被授权的内容。
- 安全配置错误:Web 应用的各个层次都有可能出现安全配置错误。
- 不安全的加密存储: Web 应用系统没有对敏感性资料进行加密,或采用的加密算法复杂度不高可以被轻易破解,或加密所使用的密钥非常容易检测出来。
- 没有限制的 URL 访问:URL 访问限制主要时限制未授权用户访问某些链接,一般通过隐藏来实现保护,然而在某些情况下有可能能够访问被隐藏了的链接,从而可以使用未被授权的功能。
- 传输层保护不足:攻击者利用嗅探方法就可以简单地截获网络上的数据,如果传输层上没有任何的保护措施,那对于用户和 Web 应用系统都是非常危险的。
- 为验证的重定向及转发:未经过验证的重定向将可能使用户被引导到钓鱼网站或挂马网站等恶意站点,而未经过验证的转发将可能导致用户绕过验证和授权机制。