软件安全技术
边复习边写的,有错误及时指正
第一章 软件安全概述
零日漏洞
零日漏洞是指未被公开披露的软件漏洞
利用零日漏洞开发攻击工具进行的攻击称为零日攻击
软件安全体系的建立是以漏洞为核心展开的,对漏洞的掌控能力是衡量一个国家信息安全水平的重要因素
安全威胁分类
软件漏洞:通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等
恶意代码:是在未被授权的情况下,以破坏软硬件设备、窃取用户信息、干扰用户正常使用、扰乱用户心理为目的而编制的软件或代码片段。包括:计算机病毒,蠕虫,特洛伊木马,后门,内核套件,间谍软件,恶意脚本,恶意广告,僵尸网络,网络钓鱼,勒索软件
软件侵权:侵犯著作权
CIA安全基本属性
-
保密性:信息仅被合法的实体(如用户、进程等)访问,而不被泄漏给未授权实体的特性。
-
完整性:信息在存储、传输或处理等过程中不被未授权、未预期或无意地篡改、销毁等破坏的特性。
-
可用性:信息、信息系统资源和系统服务可被合法实体访问并按要求使用的特性。
-
可认证性:能够对信息的发送实体和接收实体的真实身份,以及信息的内容进行鉴别的特性。
-
授权:访问主体只能在权限范围内合法访问客体。
-
可审计性:确保一个实体的行为可以被唯一地区别、跟踪和记录
-
抗抵赖性:信息的发送者无法否认已发出的信息或信息的部分内容,信息的接收者无法否认已经接收的信息或信息的部分内容。
-
可控性:对于信息安全风险的控制能力
-
可存活性:计算机系统在面对各种攻击或错误的情况下继续提供核心的服务,而且能够及时地恢复全部服务的能力。
PDRR模型
人、技术和操作是3个核心因素,包括了主机、网络、系统边界和支撑性基础设施等多个网络环节之中,如何实现保护、检测、响应和恢复有机结合的动态技术体系,这就是所谓的PDRR(或称PDR2)模型。
软件安全的主要方法和技术
基本方法
采用多种检测、分析及挖掘技术对安全错误或是安全漏洞进行发现,分析与评价,然后采取多种安全控制措施进行错误修复和风险控制。这是在软件发布运行之时的方法
分析软件安全错误发送的原因,将软件错误的修正嵌入到软件开发生命周期的整个阶段。这是在软件发布之前的方法
主要技术
- 软件安全属性的认知
- 系统安全工程
- 软件安全开发
第二章 软件漏洞概述
概念
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
软件错误:软件开发过程中出现的不符合期望或不可接受的人为差错。
软件缺陷:人为差错或其他客观原因,导致软件隐含能导致其在运行过程中出现不希望或不可接受的偏差
软件故障:软件出现可感知的功能不正常,死机,数据丢失或非正常中断等现象
软件失效:软件丧失完成规定功能的能力的事件。
软件漏洞成因分析
- 计算机系统解构
- 软件趋向大型化,第三方扩展增多
- 新技术,新应用产生之初缺乏安全性考虑
- 软件使用场景更具威胁
- 开发者缺乏安全知识
软件漏洞分类
基于漏洞成因的分类
- 内存破坏类
- 逻辑错误类
- 输入验证类
- 设计错误类
- 配置错误类
基于漏洞利用位置的分类
- 本地漏洞
- 远程漏洞
基于威胁类型的分类
- 获取控制
- 获取信息
- 拒绝服务
软件漏洞的分级
中国国家信息安全漏洞库 CNNVD
第三章 典型漏洞分析
函数的栈帧
ESP :扩展栈指针寄存器,其存放的指针指向当前栈帧的栈顶。
EBP:扩展基址指针寄存器,其存放的指针指向当前栈帧的栈底。
EIP:扩展指令指针寄存器,存放指向下一条将要执行的指令。
栈溢出攻击
JMP ESP覆盖方法是覆盖函数返回地址的一种攻击方式。
SEH覆盖方法就是覆盖异常处理程序地址的一种攻击方式。
堆溢出漏洞及利用
DWORD Shoot 用精心构造的数据去溢出覆盖下一个堆块的块首,使其改写块首中的前向指针(flink)和后向指针(blink),然后在分配、释放、合并等操作发生时伺机获得一次向内存任意地址写入任意数据的机会。
Heap Spray栈溢出和堆溢出相结合的一种技术。首先将shellcode放置到堆中,然后在栈溢出时,控制函数执行流程,跳转到堆中执行shellcode*
格式化串漏洞
**产生源于数据输出函数中对输出格式解析的缺陷,**其根源也是C语言中不对数组边界进行检查的缓冲区错误
通过改变格式化串中输出参数的个数实现修改指定地址的值:可以修改填充字符串长度实现;也可以通过改变输出的宽度实现,如%8d
通过改变格式化串中格式符的个数,调整格式符对应参数在栈中位置,从而实现对栈中特定位置数据的修改。
栈溢出检测选项 /GS
/GS保护机制:调用函数时,将一个随机生成的秘密值存放在栈上,当函数返回时,检查这个堆栈检测仪的值是否被修改,以此判断是否发送了栈溢出
对抗/GS保护:1)猜测这个随机值 2)同时覆盖栈中的Cookie和cookie副本 3)覆盖SEH绕过Cookie检查 4) 覆盖父函数的栈数据绕过Cookie检查
数据执行保护DEP
通过使可写内存不可执行或使可执行内存不可写来消除类似的威胁。
对抗数据执行保护DEP
- 利用ret-to-libc执行命令或进行API调用,如调用WinExec实现执行程序。
- 将包含Shellcode的内存页面标记为可执行,然后再跳过去执行。
- 通过分配可执行内存,再将Shellcode复制到内存区域,然后跳过去执行。
- 先尝试关闭当前进程的DEP保护,然后再运行Shellcode。
地址空间布局随机化ASLR
通过对堆、栈、共享库映射等线性区域布局的随机化,增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止漏洞利用的目的。
ASLR机制的缺陷和绕过方法
- 对本地攻击者无能为力
- 造成内存碎片的增多
- 利用没有采用/DYNAMICBASE选项保护的模块做跳板
安全结构化异常处理SafeSEH
防止覆盖和使用存储栈上的SEH结构。
原理:把所有合法的异常处理函数的地址解析出来制成一张安全的SEH表,保存在程序的IMAGE数据块里面,当程序调用异常处理函数时会将函数地址与安全SEH表中的地址进行匹配,检查调用的异常处理函数是否位于该表中。
对抗SafeSEH机制的方法
- 利用未启用SafeSEH的模块作为跳板进行绕过
- 利用加载模块之外的地址进行绕过
增强缓解体验工具包EMET
- 增强型DEP
- SafeSEH的升级版——SEHOP
- 强制性ASLR
- HeapSpray防护
第四章没写,看看PPT哇
第五章 软件安全开发模型
软件安全问题产生
- 开发者缺乏安全开发的动机
- 开发者缺乏相关知识
- 缺乏安全开发工具
软件安全开发模型
SDL
SDL模型是由软件工程的瀑布模型发展而来的,是在瀑布模型的各个阶段添加了安全活动和业务活动目标
必需的安全活动:安全培训,安全需求分析,安全设计,安全实施,安全验证,安全发布和安全响应。
四个基本原则:安全设计,安全配置,安全部署,沟通。
SDL体系较为完善,和其他安全开发流程相比,它的实施要求严格,适合于大型机构使用。
BSI
核心思想:对软件全声明周期各个阶段产品的安全性进行评估,测试,验证及操作控制,实现面向过程的全生命周期安全质量控制方法。强调对各阶段产生的软件工件的安全性进行分析与检测
三根支柱:风险管理,软件安全接触点,安全知识。
NIST
特点主要体现在两个方面
- 明确提出了软件安全控制的经济性问题
- 明确提出了软件开发控制门的概念
CLASP
是一个用于构建安全软件的轻量级过程。强调安全活动与角色相关联,强调安全开发过程中各角色的职责。安全活动基于角色安排。
SAMM
SAMM以灵活的方式进行定义,可以被应用于大,中,小型组织任何类型的软件开发项目中。强调建立一种迭代的安全保证计划
四个核心业务职能:治理,构造,验证,部署。
对安全知识的要求更低,更适用于非安全专家使用
第六章 软件安全需求分析
目的 描述为了实现信息安全目标,软件系统应该做什么,才能有效地提高软件产品的安全质量,减少进而消减软件安全漏洞
一个缺少安全需求分析的软件开发项目,将威胁到信息的保密新,完整性和可用性,以及其他一些重要安全属性。
主要工作 在软件开发生命周期的需求分析阶段,首先确定目标系统的业务运行环境,规则环境及技术环境,然后再了解各类软件安全需求内容的基础上,通过一定的安全需求获取过程,对软件应该包含的安全需求进行分析。
来源
外部安全需求:通常指法律,法规等遵从性需求
内部安全需求:组织内部需要遵守的政策,标准,指南等,以及与软件业务功能相关的安全需求
软件安全遵从性需求
软件安全需求更多地来自于对组织内部和外部的一些安全政策和标准的遵从。安全需求分析人员对这些政策需求和标准进行深入理解,并将它们转化为软件安全属性需求,是安全需求分析阶段要完成的艰巨任务。
等级保护要求
对信息安全分级保护是客观需求。
等级化保护是信息安全发展规律。
等级保护是国家法律和政策要求。
等级保护内容
- 对网络实施分等级保护,分级监管
- 对网络中使用的网络安全产品实行按等级管理
- 对网络中发送的安全事件分等级响应,处置
等级保护流程
- 定级
- 备案
- 等级测评
- 安全建设整改
- 监督检查
软件安全需求获取方法
头脑风暴,问卷调查和访谈,策略分解,数据分类,主/客体关系矩阵,使用用例和滥用案例建模,软件安全需求跟踪矩阵。
第七章 软件安全设计
软件安全设计的主要工作
目的是将安全属性设计到软件架构中,以实现软件产品本质的安全性。有着举足轻重的作用
软件安全设计就是将软件的安全需求转化为软件的功能解构的过程。
主要工作
- 软件安全架构安全性设计
- 软件架构安全性分析
- 软件安全功能设计
软件安全设计原则
1、减少软件受攻击面原则:软件受攻击面是指:用户或其他程序及潜在的攻击者能够访问到的所有功能和代码的总和,它是一个混合体,不仅包括代码,接口和服务,也包括对所有用户提欧共服务的协议。
2、最小授权原则:系统仅授予(用户,管理员,进程,应用和系统等)完成规定任务所必需的最小权限,并且该权限的额持续时间也尽可能短。
3、权限分离原则:在软件设计中是指,将软件功能设计为需要在两个或更多条件下才能实现,以防止一旦出现问题,整个软件都可能面临风险。
4、纵深防御原则:在软件设计中加入层次化安全控制和风险缓解防御方法。
5、完全控制原则:要求每一次访问受保护对象的行为都应当进行尽可能细粒度地检查。
6、默认安全配置原则:为系统提供默认的安全措施,包括默认权限、默认策略等,尽可能让用户不需要额外配置就可以安全地应用。
7、开放设计原则:软件设计本身应该是开放的,安全防御机制的实现应该不依赖于设计本身。
8、保护最弱一环原则:保护软件系统中的最弱组件。
9、最少共用机制原则:尽量减少依赖于一个以上用户甚至于所有用户的通用机制。
10、安全机制的经济性原则:以较低的开发成本和资源消耗获得具有较高安全质量的软件产品和系统保障。
11、安全机制心理可接受原则:安全保护机制设计得要简单,要让用户易用,要确保用户对资源的可访问,以及安全机制对用户透明,用户才会使用这些保护机制。
12、平衡安全设计原则
基于安全模式的软件安全设计方法
风险确定阶段:识别风险和评估风险
系统安全架构阶段:浏览模式库,选择相应的安全模式,评估安全模式,建立系统高层架构
系统设计细化阶段:构建业务类图,实例化安全模式,整合系统并适当重构。
威胁建模
是什么:即将开发完成的软件系统会面临哪些安全威胁,由此可在接下来的软件设计和软件实现等环节中来防范每一个安全威胁。
为什么:
- 一项在软件设计阶段不应忽视的系统的、可迭代的和结构化的安全技术。
- 在当前超过70%的漏洞来自于应用软件的情况下,解决软件安全问题应该首先明确应用软件面临的威胁,建立威胁模型,然后才能考虑软件的安全设计和编码实现。
- 采用威胁建模方法,可以系统性地分析其架构、软件体系和程序部署,分析网络和信息系统可能面临的潜在威胁,确认有哪些攻击面,之后提出有针对性的安全防范措施,这才是有效解决网络安全对抗的良策。
威胁建模有着重要的存在价值,包括早期发现安全缺陷,理解安全需求,设计和交付更安全的产品,解决其他技术无法解决的问题
步骤
STRIDE威胁分类
威胁 | 涉及安全属性 | 威胁描述 |
---|---|---|
假冒 | 认证性 | 攻击者能够伪装成另一个用户或身份 |
篡改 | 完整性 | 在传输,存储或归档过程中能够修改数据 |
否认 | 不可否认性 | 攻击者能够否认攻击 |
信息泄露 | 机密性 | 信息能够泄露给未授权的用户 |
拒绝服务 | 可用性 | 对于合法的用户拒绝提供服务 |
特权提升 | 授权性 | 攻击者能够跨越最小的权限限制,而以更高级别特权或者管理员权限运行软件 |
第八章 软件安全编码
C语言安全编码
注意的几点
- 对内存访问错误的检测和修改
- 指针引用最灵活,最核心,最复杂,最容易出错
- 随机数的选取和使用问题
- C语言没有听异常处理机制
C语言针对缓冲区溢出的主要解决措施
- 使用安全字符串函数
- 若无法避免使用不安全函数 :三个原则:1)应要求代码传递缓冲区的长度 2)探测内存 3)正确使用函数参数
- 开启编译器的安全编译选项 /GS
Java语言安全编码
内置安全模型—沙箱,核心思想:本地环境中的代码都能搞访问系统中的关键资源,而远程下载的程序则只能访问“沙箱“ 内有限的资源。
语言层安全:1)通过关键字private,public等 2)通过类型规则确保程序运行时变量的值始终与声明的类型一致
字节码层安全:类加载器JVM中执行的所有代码均有加载器从JVM外部的类文件中加载进来
字节码验证器:静态验证:JVM运行字节码前做检测。 动态验证:JVM运行字节码期间所做的检查。
应用层安全 :一旦类加载器加载了一个类并由字节码验证器验证了它,Java平台的第三种安全机制:安全管理器就开始运行
第九章 软件安全测试
软件安全测试的内容
软件安全功能测试和软件安全漏洞测试
软件安全测试的原则
- 应尽早进行软件安全测试,越晚发现漏洞,修复的成本越高
- 在有限的时间和资源下进行测试
- 软件安全没有银弹。测试只能说明软件存在错误而不能证明软件没哟错误
- 程序员应避免检查自己的程序
- 尽量避免测试的随意性
软件安全测试是从攻击者的角度出发 发现漏洞并修复,保证软件不被恶意攻击者破坏。安全测试更多的是考虑反向数据
白盒测试 | 黑盒测试 | |||
---|---|---|---|---|
安全功能测试 | 源码分析 | 漏洞扫描 | 模糊测试 | 渗透测试 |
保密性 可认证性 | 静态分析 | 脆弱点扫描 | 基于生成的模糊测试 | 黑盒渗透测试 |
完整性 授权 | 动态分析 | 威胁内容扫描 | 基于变异的模糊测试 | 白盒渗透测试 |
可用性 审计 | 隐私保证扫描 |
模糊测试
核心思想:通过监视非预期输入可能产生的异常结果来发现软件问题。
方法
- 预生产测试用例
- 随机生成输入
- 手工协议变异测试
- 变异或强制性测试
- 自动协议生成测试
优点
- 模糊测试的测试目标是二进制可执行代码,比基于源代码的白盒测试适用范围广
- 模糊测试是动态执行的,不存在静态分析技术中存在的大量误报问题
- 模糊测试的原理简单
- 模糊测试自动化程度高,不需要逆向工程中大量的人工参与
局限性
- 访问控制漏洞的发现能力有限
- 设计逻辑缺陷的发现能力有限
- 多阶段安全漏洞的发现能力有限
- 多点触发漏洞的发现能力有限
- 模糊测试技术不能保证畸形输入数据能够覆盖到所有的分支
过程