赞
踩
收回我上一篇的话,这科挂人还是挺狠的,去年好像挂了四十号人 =(
老师没有划重点,这篇是我自己根据之前的博主的和课本总结的一些重点,本篇为理解性带背。(。ì _ í。)
### 第一章:软件安全基础
- **零日攻击**:未公开的软件漏洞和利用这些漏洞的攻击。
- **软件漏洞**:软件设计或实现中与安全相关的错误。
- **恶意代码**:未经授权的软件或代码片段,目的在于破坏或窃取信息。
- **软件安全**:标识、分析和控制软件中的危害和风险。
- **CIA三原则**:保密性、完整性、可用性,是信息安全的基本属性。
- **软件安全相关概念**:软件可靠性、可信软件、软件定义网络(SDN)和软件定义安全(SDS)。
### 第二章:软件漏洞
- **软件漏洞成因**:系统结构、大型化、新技术缺乏安全考虑等。
- **软件漏洞特点**:持久性、广泛性、可利用性等。
- **软件漏洞分类**:基于成因、利用位置、威胁类型等多维度分类。
- **软件漏洞分级**:根据漏洞的严重性进行分级。
### 第三章:程序运行时的结构
- **内存布局**:代码区、数据区、堆区、栈区的概念和作用。
- **缓冲区溢出**:发生在缓冲区写入数据超过其容量时。
- **栈溢出和堆溢出**:栈溢出攻击和利用分析。
- **Windows安全漏洞保护**:栈溢出检测、数据执行保护(DEP)、地址空间布局随机化(ASLR)、安全结构化异常处理(SafeSEH)。
### 第四章:Web安全
- **Web基本架构**:Web访问过程的各个阶段。
- **Web漏洞概述**:Web应用安全漏洞的概念和影响。
- **SQL注入漏洞**:原理、危害、利用方法。
- **XSS跨站脚本漏洞**:反射型和存储型XSS的原理和防范。
### 第五章:软件生命周期与安全开发模型
- **软件生命周期**:定义、开发、维护时期的各个阶段。
- **安全开发生命周期SDL**:微软的SDL模型和其他相关模型。
- **软件安全开发模型**:内建安全模型BSI、美国NIST模型、OWASP的CLASP模型。
### 第六章:软件安全需求分析
- **软件安全需求分析**:与一般需求分析的区别、来源、目的和作用。
- **等级保护**:网络安全等级保护的概念、2.0时代的要求、政策体系、标准体系。
### 第七章:软件安全设计
- **软件安全设计原则**:减少受攻击面、最小授权、纵深防御等。
- **软件架构安全性设计**:逻辑架构、物理架构、系统架构的设计。
- **软件架构安全性分析**:重要性、基本过程、分析技术和方法。
### 第八章:软件安全编码
- **安全编码实践**:选择安全的编程语言、版本管理、代码检测、安全编译。
- **CERT安全编码建议**:10条最重要的编码安全建议。
- **Java语言安全编码**:语言层安全、字节码层安全。
### 课后题目与考试题型
- **题目类型**:选择题、名词解释、简答题、分析与论述题。
- **重点复习内容**:课后习题、安全模型、安全设计原则、编码实践、测试方法。
目录
6.软件安全相关概念(这一部分我认为不考简答,大概知道一下意思)
2.软件漏洞的分类(找了前几年的几个博客,太多太乱了看不懂,这里重新总结一下)
3.软件安全需求的获取(这种的大概理解一下,可能会出分析题,给个情景让写对策这种 :) 猜的)
那么现在,开始吧
标红为拿分点,灰色为通俗的理解
零日漏洞是指未被公开披露的软件漏洞,没有给软件的作者或厂商以时间去为漏洞打补丁或是给出解决方案建议,从而使攻击者能够利用这种漏洞破坏计算机程序、数据及设备。注意,零日漏洞并不是软件发布后被立刻发现的漏洞。
利用零日漏洞开发攻击工具进行的攻击称为零日攻击。零日攻击所针对的漏洞由于软件厂商还没有发现或是还未提供相应的补丁,所以零日漏洞攻击的成功率高,造成的破坏大。
想象一下,你有一个非常安全的保险箱,这个保险箱有一个密码,只有你知道。但是,如果有人发现了这个保险箱的一个秘密漏洞,比如一个隐藏的开关,可以不用密码就能打开它,那么这个漏洞就相当于一个“零日漏洞”。
“零日”这个词的意思是指,从这个漏洞被发现到被公开,这段时间是零天。也就是说,当这个漏洞被发现的时候,没有人知道它的存在,包括保险箱的制造商。所以,这个漏洞没有被公开,也就没有补丁可以修补它。
现在,如果有人利用这个未知的漏洞打开了保险箱,偷走了里面的宝贝,这种行为就叫做“零日攻击”。因为漏洞是未知的,所以这种攻击很难被防御,攻击者往往能够成功得手。
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等
恶意代码是未在授权的情况下,以破坏硬件设备、窃取用户信息、干扰用户正常使用、扰乱用户心理为目的而编制的软件或代码片段。
包括计算机病毒、蠕虫、特洛伊木马、后门、勒索软件等等。
软件安全是软件工程与软件保障的一个方面,它提供一种系统的方法来标识、分析和追踪对危害及具有危害性功能(例如数据和命令)的缓解与控制。
信息安全的三大基本属性CIA——保密性(不偷听)、完整性(不篡改)、可用性(不罢工)
1)软件可靠性:在规定条件下,在规定时间内不引起系统失效的概率,在规定时间周期内所述条件下程序执行所要求的功能的能力。(能够正常工作,不会突然坏掉)
2)可信软件:软件的“可信”是指软件系统的动态行为及其结果总是符合人们的预期,在受到干扰时仍能提供连续的服务。这里的“干扰”包括操作错误、环境影响和外部攻击等。(能够按照你的期望运行,结果总是符合用户预期)
3)软件定义网络(SDN):把当前IP网络互联结点中决定报文如何转发的复杂控制逻辑从交换机/路由器等设备中分离出来,以便通过软件编程实现硬件对数据转发规则的控制,最终达到对流量进行自由操控的目的。(就像是一个智能交通系统,它把控制交通的逻辑从交通灯和路标中分离出来,通过一个中央计算机来控制。这样,交通流量可以根据需要灵活调整)
4)软件定义安全(SDS):
SDS是适应SDN复杂网络的安全防护新思想,基本原理是将物理及虚拟的网络安全设备预期接入模式、部署方式和实现功能进行解耦,底层抽象为安全资源池里的资源,顶层统一通过软件编程的方式进行智能化、自动化的业务编排和管理,以完成相应的安全功能,从而实现一种灵活的安全防护。SDS可以分解为软件定义流量、软件定义资源和软件定义威胁模型。(这就像是有一个智能安全机器人,它可以自动分析网络流量和行为,发现潜在的威胁,并根据这些信息来调整安全策略,实现动态和闭环的安全防护)
5)软件定义流量/资源/威胁模型:
目前有两种方法:采用多种检测、分析及挖掘技术对安全错误或是安全漏洞进行发现、分析与评价,然后采取多种安全控制措施进行错误修复和风险控制(类似于亡羊补牢,羊死了才发现问题去修栅栏);分析软件安全错误发生的原因,将安全错误的修正嵌入到软件开发生命周期的整个阶段(在建栅栏时候就考虑好各种问题)
软件安全属性的认知,系统安全工程,软件安全开发
软件安全需求分析、软件安全设计、软件安全编码、软件安全测试、软件安全部署
软件漏洞通常被认为是软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等
软件漏洞的成因有很多:计算机系统结构决定了漏洞的必然性、软件趋向大型化,第三方扩展增多等
软件漏洞具有:持久性与时效性(会不断造成影响,但一段时间后漏洞威胁也会逐渐消失)、广泛性与具体性(影响范围很大,但总是存在于具体的环境或条件中)、可利用性与隐蔽性(攻击者可以利用这些漏洞,不容易被发现)
1)输入验证错误:在软件中,如果输入数据没有得到正确的验证,攻击者就可能通过发送恶意数据来执行未授权的操作(好比是门卫没有仔细检查访客的身份,导致任何人都可以进入)
2)缓冲区溢出:在软件中,如果程序试图在一个小的存储空间里存入过多的数据,超出的部分就会溢出到相邻的内存区域,可能会覆盖重要的数据或指令,导致程序崩溃或执行攻击者的代码(一个只能装一定量水的杯子,但你往里面倒的水超出了它的容量,结果水就溢出来弄湿了桌子)
3)权限提升:在软件中,如果存在权限提升的漏洞,攻击者可能利用这些漏洞获得更高级别的访问权限,比如从普通用户变成管理员(这就像是有人拿到了不应该属于他的钥匙,可以打开更多的门)
4)跨站脚本攻击(XSS):XSS漏洞允许攻击者将恶意脚本注入到网页中(这也是为什么XSS漏洞多于前端相关),当其他用户访问这个页面时,脚本就会在他们的浏览器上执行(你在网站上看到一个有趣的链接,点击后却发现它在你的浏览器上执行了一些恶意操作)
5)SQL注入:SQL注入允许攻击者在输入框中输入恶意的SQL命令,如果数据库没有进行适当的过滤,这些命令就会被执行,导致数据泄露或被篡改(你向数据库管理员提问,但你的提问中包含了一些特殊指令,管理员没有意识到这些指令,就按照你的问题去操作数据库了)
6)拒绝服务攻击(Dos/DDos):让目标系统无法响应合法用户的请求,通常是通过发送大量的请求来消耗系统资源(攻击者堵住了你家门口的路,让你无法正常进出)
在Win32环境下,由高级语言编写的程序经过编译、链接,最终生成可执行文件,即PE 文件。在运行PE文件时,操作系统会自动加载该文件到内存,并为其映射出4GB的虚拟存储空间,然后继续运行,这就形成了所谓的进程空间
1)代码区:这部分内存存放的是程序的机器代码,也就是高级语言代码编译后的结果(你可以把它想象成一本已经写好的剧本,包含了所有的指令和只读数据。如果有人试图修改这些指令,就像试图在演出中改变剧本一样,是不被允许的,会引发错误。)
2)数据区:这里存放的是程序中的全局变量和静态变量,它们在整个程序的运行期间都存在(你可以将数据区想象成舞台布景,为整个演出提供了持续的背景)
3)堆区:堆区是程序运行时动态申请和释放内存的地方(这就像是一个道具仓库,演员(函数)在需要时可以从这里借道具(内存),用完后归还)
4)栈区:栈区是用于存储函数调用时的局部变量和函数调用的上下文信息,比如参数和返回地址(你可以把它想象成一叠盘子,每个函数调用就像是往盘子上放东西,当函数执行完毕后,这些东西就会被取走,盘子也被清空,为下一个函数调用做准备)
堆:堆是一块用于动态内存分配的内存区域。当你的程序在运行时需要额外的内存空间时,他可以从堆上申请内存(当你需要存储的数据量在程序运行前无法确定,或者数据需要在多个函数之间共享时,可以使用堆)
栈:栈是一块用于存储函数调用时的局部变量和调用上下文的内存区域。每当一个函数被调用,它的局部变量和返回地址就会被推入栈中(用于存储函数的局部变量、函数参数、返回地址等,这些数据在函数调用结束后就不再需要了)
缓冲区是一块内存空间,用于存储临时数据。它通常用于处理输入/输出操作,或者在函数调用中存储数据
在函数的栈帧中,局部变量是顺序排列的,局部变量下面紧跟着的是前栈帧EBP及函数返回地址RET。如果这些局部变量为数组,由于存在越界的漏洞,那么越界的数组元素将会覆盖相邻的局部变量,甚至覆盖前栈帧EBP及函数返回地址 RET,从而造成程序的异常。就像水桶里的水溢出,如果水桶满了还继续倒水,水就会溢出来,可能会损坏周围的物品(影响程序的其他部分或安全)
格式化字符串漏洞是一种常见的安全漏洞,主要出现在使用C语言编程时,如果不正确地处理用户输入的字符串用于格式化输出,就可能引发这种漏洞。
利用:通过改变格式化串中输出参数的个数实现修改指定地址的值,通过改变格式化串中格式符的个数,调整格式符对应参数在栈中的位置,从而实现对栈中特定位置数据的修改。
1)栈溢出检测选项/GS:(相当于是房子的门锁,确保只有授权的人才可进入,但是小偷也有可能翻窗户进去)
2)数据执行保护DEP:(像是保安一样,确保他们保护的区域不被入侵)
3)地址空间布局随机化ASLR:(搬家了以后重新安排了房子的布局,所以你家的惯偷没法一下就找到保险柜的位置了,因为已经变化)
4)安全结构化异常处理SafeSEH:(像是一份授权名单,只有名单上的人才可以在紧急情况下进入特定房间,但如果找到了后门也可以偷偷进入)
Web三层架构:
一次Web访问过程分析:在这整个过程中,大致可以分为以下几个阶段:DNS域名解析、TCP连接、HTTP请求、处理请求返回HTTP响应、页面渲染和关闭连接。
Web应用安全漏洞是Web应用程序在需求、设计、实现、配置、维护和使用等过程中,有意或无意产生的缺陷,这些缺陷一旦被攻击者所利用,就会造成对网站或用户的安全损害,从而影响构建于Web应用之上正常服务的运行,危害网站或用户的安全属性
攻击者能够利用现有Web应用程序,将恶意的数据插入SQL查询中,提交到后台数据库引擎执行非授权操作。(你在和一个自动售货机交互,你输入一些指令(比如“可乐”或“1”),售货机就会给出相应的商品。如果售货机没有正确地检查你的指令,你可能会输入一些特殊的指令(比如“给我所有商品”),这样你就能得到不应该得到的东西)
主要危害:非法查询、修改或删除数据、执行系统命令、获取访问权限
利用方法:
XSS,全称跨站脚本攻击(Cross-Site Scripting),是一种常见的网络安全漏洞,它允许攻击者将恶意脚本注入到其他用户会浏览的页面中。主要分为反射型XSS和存储型XSS。
原理这里只做理解,原话自己看书吧:
反射型XSS:当用户“做出动作”如点击链接等时候,恶意脚本才会触发
存储型XSS:就像是在社交媒体上发表的帖子,发表后只要不处理一直在那,其他人只要浏览就会触发
概括地说,软件生命周期由定义、开发和维护3个时期组成,每个时期又可进一步划分成若干个阶段。
SDL模型由软件工程的瀑布模型发展而来。包括七个阶段:安全培训、安全需求分析、安全设计、安全实施、安全验证、安全发布、安全响应。
1)软件安全需求的特点:客观性(安全需求不是用户主观愿望,而是系统固有的安全属性决定的),系统性(要全面考虑软硬件等等因素,不止是软件本身),经济性和适用性(要根据重要性和成本效益来,不能“花一万元去保护十块钱”)
2)软件安全需求分析的目的和作用:确保软件系统能够有效地提高安全性,减少安全漏洞;安全需求分析有助于保护信息的保密性、完整性和可用性,防止软件被攻击。
等级保护(记不住,感觉不考):
信息安全管理体系与等级保护的联系与区别(也乱七八糟的,感觉不考):
相关方:
挑战:
方法:
调查示例问题:
将需求分析得出的规格说明书转化为具体的软件架构和设计方案。
架构安全性设计、安全性分析、安全功能设计
软件架构可分为三类:逻辑架构(描述软件系统中组件之间的关系,如用户界面、数据库和外部系统接口等)、物理架构(描述软件组件在硬件上的部署方式)、系统架构(说明系统的非功能性特征,如可扩展性、可靠性、灵活性和性能等)
软件架构安全设计首先需要进行系统描述,包括系统功能、安全要求、系统部署和技术需求,确定软件系统的安全级别。接着,设计软件网络、数据库等应具备的安全功能,根据软件具体安全需求的不同,设计的安全功能包括加密、完整性验证、数字签名、访问控制及安全管理等。在架构安全设计过程中,还需要解决软件安全功能的易用性、可维护性和独立性问题。
重要性:
基本过程:
分析方法:
主要内容:
这里只说MH 13条设计原则:
减少受攻击面:移除或限制不必要的功能、服务和协议,减少潜在的攻击点(可被攻击的方面少了,被攻击的可能也就少了)。
最小授权原则:仅授予用户或系统执行任务所需的最小权限,减少权限滥用风险(不会用就别用,省的用错)。
权限分离:将关键功能分散至多个条件或角色,避免单一故障点(新中国不能只有一个皇帝)。
纵深防御:多层次安全措施,确保即使一层防御失败,系统仍受保护(老千层饼了)。
完全控制:对所有访问受保护资源的行为进行细粒度的权限检查(不错杀,不放过)。
默认安全配置:系统默认设置应安全,减少用户配置需求(这样就好了!每次配置东西累死!)。
开放设计:安全性不应依赖于设计的保密性,而应基于公开、标准化的机制(给日记上锁没用的,但是你要是用火星文写,咱妈就读不懂了,“不保密”才是最牛逼的保密)。
保护最弱环节:识别并加固系统中的薄弱部分,提高整体安全性(水桶中最短的木板)。
最少共用机制:减少共享机制,根据角色划分功能或隔离代码(重要的秘密别跟别人说)。
经济性原则(KISS原则):简单设计减少复杂性,降低成本,提高安全性(甭用个金锁锁个铁盒)。
心理可接受原则:安全机制应用户友好,易于接受和使用(甲方最重要原则)。
平衡安全设计:在不同的安全原则之间找到平衡,根据业务需求做出合理折衷(不能坡脚,各方面都得均衡)。
威胁建模是一种系统化的方法,用于识别、评估和缓解系统中的潜在安全威胁
选择安全的编程语言、版本(配置)管理、代码检测、安全编译
语言层安全:
private
、protected
等关键字限制代码的可见性,增强封装性。字节码层安全:
验证过程:
看着多其实真的还好,自己顺一遍,结合上一篇课后题,名词解释和简答差不多就能答个七七八八了,明天再出实验里的东西和大题。
另外别再问我考啥了,我又不是出题我是真不知道 :-D 我上课又不听,说不定还不如你们
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。