赞
踩
从一位同学那里要到的以前的复习资料,比较精简,大家搭配我前一个看看
按照漏洞严重等级进行分级:严重、重要、中等、低
利用通用漏洞评分系统(CVSS)进行分级:
Win32系统中,进程使用的内存按功能可以分为4个区域:代码区、数据区、堆区、栈区
ESP(扩展栈指针寄存器):存放的指针指向当前栈帧的栈顶
EBP(扩展基址指针寄存器):存放的指针指向当前栈帧的栈底
EIP(扩展指令指针寄存器):存放指向下一条将要执行的指令
参数入栈。将被掉函数的实际参数从左到右依次压入主调函数的函数栈中
返回地址RET入栈。将当前指令的下一条指令地址压入主调函数的函数栈中
代码区跳转。CPU从当前代码区跳转到被掉用函数的入口,EIP指向被调用函数的入口处
将当前栈帧调整为被调用函数的栈帧:
主调函数的栈底指针EBP入栈,以便调用函数返回时恢复主调函数的栈帧
更新当前栈底:将主调函数的栈顶指针ESP的值赋值给EBP,作为被调函数的栈底
为新栈帧分配空间:ESP减去适当的值,作为新的当前栈帧的栈顶
通过覆盖程序中的函数返回地址和函数指针等值,攻击者直接将程序跳转到其预先设定的或已经注入到目标程序的代码上执行。
目的在于扰乱具有某些特权运行的程序的功能,使得攻击者取得程序的控制权,如果该程序有足够的权限,那么整个主机将被控制
方法: JMP ESP覆盖方法是覆盖函数返回地址的一种攻击方式
SEH覆盖方法是覆盖异常处理程序地址的一种攻击方法
原理:通过对堆、栈和共享映射库等线性区域布局的随机化,增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置
ASLR进行随机化的对象主要有:映像随机化、堆随机化、栈随机化
缺陷:对本地攻击者无能为力,造成内存碎片增多
绕过:利用没有采用/DYNAMICBASE保护的模块作为跳板
原理:编译器在链接生成二进制IMAGE时,把所有合法的异常处理函数的地址解析出来制成一张安全的SEH表,保存在程序的IMAGE数据块里面,当程序调用异常处理函数时会见函数地址与安全的SEH表中的地址进行匹配,检查调用的异常处理函数是否在表中。
原理:利用现有的Web应用程序,将恶意的数据插入SQL查询中,提交到后台数据库引擎执行非授权操作
注入点选择:表单提交、URL参数提交、Cookie参数提交、HTTP请求头部的一些可修改的值
数字型注入:输入的参数为整数时
字符型注入:输入的参数为字符串时
实验
微软的软件安全开发模型:安全开发生命周期SDL、敏捷SDL
McGraw的软件内建安全开发模型:内建安全BSI
NIST的软甲安全开发生命周期模型
OWASP的软件安全开发模型:综合的轻量级应用安全过程CLASP、软件保证成熟度模型SAMM
没有考虑安全需求,导致所开发的应用系统存在大量的漏洞。
一个缺少安全需求分析的软件开发项目,将威胁到信息的保密性、完整性和可用性,以及其他一些重要安全属性。
软件产品被攻破可能就只是一个时间早晚的问题,而不是条件的问题,这取决于攻击者对于这个软件系统价值的判断。
软件受攻击面是指,用户或其他程序以及潜在的攻击者都能够访问到的所有功能和代码的总和,它是一个混合体,不仅包括代码、接口、服务,也包括对所有用户提供服务的协议,尤其是那些未被验证的或远程用户都可以访问到的协议。
一个软件的攻击面越大,安全风险就越大。减少软件受攻击面就是去除、禁止一切不需要使用的模块、协议和服务,其目的是减少攻击可以利用的漏洞。
举例:
重要性低的功能可取消;
重要等级为中的功能可设置为非默认开启,需要用户配置后才予以开启;
重要性高的功能则关闭或增加一些安全措施进行限制。
重用那些经过测试、已证明安全的现有库和通用组件,而不是用户自己开发的共享库。
苹果公司的iOS不支持Java和Flash,一个重要原因就是相对于Mac OS X(或其他智能手机)减小了iOS的受攻击面。
最小授权原则是指,系统仅授予实体(用户、管理员、进程、应用和系统等)完成规定任务所必需的最小权限,并且该权限的持续时间也尽可能短。
举例:
将超级用户的权限划分为一组细粒度的权限,分别授予不同的系统操作员/管理员。对管理员账户分配安全资源的访问权限也要设置为受限访问,而不是超级用户权限。
采用高内聚、低耦合的模块化编程方法,也就是模块之间的依赖关系是弱链接(低耦合),每一个模块只负责执行一个独立的功能(高内聚)。
Windows系统用户账户控制(User Account Control,UAC),实际上就是最小授权原则的运用。
权限分离原则在软件设计中是指,将软件功能设计为需要在两个或更多条件下才能实现,以防止一旦出现问题,整个软件都可能面临风险。
实际上这一原则也是最小权限原则的一种体现。
举例:
清晰的模块划分,将风险分散到各个模块中。
不允许程序员检查自己编写的代码。
Linux将敏感操作(如超级用户的权利)分成26个特权,由一些特权用户分别掌握这些特权,每个特权用户都无法独立完成所有的敏感操作。
纵深防御又称为分层防御是指,在软件设计中加入层次化安全控制和风险缓解/防御方法。
纵深防御原则有助于减少系统的单一失效点。
举例:
在使用预处理语句和存储过程的同时应用输入验证功能,不允许使用用户输入的动态查询结构,以防止注入攻击。
不允许活动脚本与输出编码、输入或请求验证相结合,以防止跨站脚本攻击XSS。
使用安全域,根据被授权访问的软件或者人员级别来划分不同的访问域。
完全控制原则是指,要求每一次访问受保护对象的行为都应当进行尽可能细粒度地检查。
举例:
应该避免仅仅依赖于客户端或者基于Cookie缓存的认证凭证进行身份验证。
不允许没有经过访问权限验证的浏览器进行数据回传。
默认安全配置原则是指,为系统提供默认的安全措施,包括默认权限、默认策略等,尽可能让用户不需要额外配置就可以安全地应用。默认安全原则也是保持系统简单化的重要方式。
举例:
对任何请求默认加以拒绝。
不经常使用的功能在默认情况下关闭。
默认检查口令的复杂性。
当达到最大登录尝试次数后,默认状态下拒绝用户访问,锁定账户。
软件的开放设计原则是指,软件设计本身应该是开放的,安全防御机制的实现应该不依赖于设计本身。
举例:
软件的安全性不应该依赖于设计的保密。
保护机制的设计应该对团队成员的审查工作开放,让一个团队成员发现系统漏洞总比让攻击者发现要好。
应用于加密设计的柯克霍夫(Kerckhoff)原则,即密码的安全性不依赖于对加密系统或算法的保密,而依赖于密钥。利用经过公开审查的、已经证明的、经过测试的行业标准,而不是仅采用用户自己开发的保护机制是值得推荐的做法。
是指保护软件系统中的最弱组件。
该原则类似于“木桶原理”,描述了软件抵御攻击时的弹性主要依赖于最弱组件的安全性,它们可能是代码、服务或者接口。
与最弱链接相关的一个概念是“单点失效”,在软件安全问题中,最弱链接常常是多个单点故障的超集。
软件必须被设计为不存在单点的完全失效。当软件被设计为纵深防御时,可以降低最弱链接和单点失效带来的风险。
举例:
进行风险分析,标识出系统最薄弱的组件。
对开发人员或者用户进行充分的安全告知、培训和教育。
最少共用机制原则是指,尽量减少依赖于一个以上用户甚至于所有用户的通用机制。
设计应该根据用户角色来划分功能或隔离代码,因为这可以限制软件的暴露概率,提高安全性。
举例:
不使用成员与管理员和非管理员之间共享的函数或库,而推荐使用两个互相区分的功能,每一个功能为每一个具体的角色服务。
使诸如文件以及变量等共享资源尽可能的少。
安全机制的经济性原则是指,以较低的开发成本和资源消耗获得具有较高安全质量的软件产品和系统保障。
保证代码与设计尽可能简单、紧凑是经济性原则的体现。
安全机制的经济性原则并不是要求压缩安全上的投入。
安全机制心理可接受原则是指,安全保护机制设计得要简单,要让用户易用,要确保用户对资源的可访问,以及安全机制对用户透明,用户才会使用这些保护机制。
举例:
配置和执行一个程序应该尽可能的简单和直观,输出应该直接而且有用。
通过明确的错误信息和标注通知用户,例如消息框提示、帮助对话框以及直观的用户界面。
以上介绍的这些安全设计原则每一项都有自己的侧重点,将所有这些安全原则都设计到软件中是不可能的,因此有必要在这些安全原则间进行决策折中,即平衡安全设计原则。
是对软件设计中普遍存在、反复出现的各种问题,根据多次处理的经验,提出的一套能够快速、准确响应此类问题的解决方案。设计模式描述在各种不同情况下,应如何解决共性问题。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
1)确定安全目标
包括确定软件系统涉及的资产,以及围绕这些资产的业务目标和安全目标。
2)创建应用程序概况图
实际上是应用程序的图形化表示过程
3)分解应用程序
通过分解应用程序的结构来确定信任边界、数据流、数据入口点和数据出口点。
4)确定威胁
确定可能影响应用程序和危及安全目标的威胁的最大难题是系统性和全面性
5)威胁评估
6)确定威胁缓解计划或策略
假冒、篡改、否认、信息泄露、拒绝服务、提权提升
7)验证威胁
验证的内容包括威胁模型、列举的威胁、缓解措施等
8)威胁建档
威胁和控制可以用图表记录或以文本的方式存档。威胁归档时,建议使用模板保持威胁文档的一致性。
语言层安全
语言层安全是通过编译器的编译来实现,即编译成功则说明达到了语言层安全性。Java在语言层提供如下安全机制:
通过某些关键字(如private、protected)定义代码的可见性范围(即权限)。
通过类型规则确保程序运行时变量的值始终与声明的类型一致,在函数或方法调用时形参与实参的类型匹配。
Java还采用自动内存管理、垃圾收集站、字符串和数组的范围检查等方法,来确保Java语言的安全性。
字节码层安全
在字节码层次,Java提供两种保障安全的机制:
类加载器:类加载器主要分为四类:启动类加载器、标准扩展类加载器、路径类加载器和网络类加载器。
字节码验证器:验证分成静态和动态两个阶段。
应用层安全
一旦类加载器加载了一个类并由字节码验证器验证了它,Java平台的第3种安全机制,即安全管理器就开始运行:
安全管理器是一个由Java API提供的类,即:java.lang. SecurityManager类,它的作用是说明一个安全策略以及实施这个安全策略。
安全策略描述了哪些代码允许做哪些操作。由安全管理器对象定义的安全检查方法构成了当前系统的安全策略。当这些检查方法被调用时,安全策略就得以实施。
验证软件系统的安全功能是否满足安全需求。
发现系统的安全漏洞,并最终把这些漏洞的数量降到最低。
评估软件的其他质量属性,包括可靠性、可存活性等。
软件安全功能测试。
软件安全漏洞测试。
应尽早进行软件安全测试,越晚发现漏洞,修复的成本越高。
在有限的时间和资源下进行测试,找出软件所有的错误和缺陷是不可能的,软件测试不能无限进行下去,应适时终止。在软件安全测试中同样如此,应该通过威胁建模等方法,优先测试高风险模块。
软件安全没有银弹。
程序员应避免检查自己的程序。同样,软件安全测试也应该如此。
尽量避免测试的随意性。
软件测试主要是从最终用户的角度出发发现缺陷并修复,保证软件满足最终用户的要求。
软件安全测试则是从攻击者的角度出发发现漏洞并修复,保证软件不被恶意攻击者破坏。
通过监视非预期输入可能产生的异常结果来发现软件问题。
就是使用大量半有效的数据作为应用程序的输入,以程序是否出现异常作为标志,来发现应用程序中可能存在的安全漏洞。
所谓半有效的数据是指,对应用程序来说,测试用例的必要标识部分和大部分数据是有效的,这样待测程序就会认为这是一个有效的数据,但同时该数据的其他部分是无效的。这样,应用程序就有可能发生错误,这种错误可能导致应用程序的崩溃或者触发相应的安全漏洞。
1)预生成测试用例
2)随机生成输入
3)手工协议变异测试
4)变异或强制性测试
5)自动协议生成测试
版权归原作者所有,我只是搬运,侵删。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。