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