软件安全
第一章:软件安全概述
软件面临的安全威胁
软件漏洞(主要是0day漏洞)
恶意代码:是在未被授权的情况下,以破坏软硬件设备、窃取用户信息、干扰用户正常使用、扰乱用户心理为目的而编制的软件或代码片段。
软件侵权
信息安全三大属性 CIA 及实现机制
①保密性
确保信息资源仅被合法的实体(如用户、进程等)访问,使信息不泄露给未授权的实体。
实现保密性的方法一般是通过对信息加密,或是对信息划分密级并为访问者分配访问权限,系统根据用户的身份权限控制对不同密级信息的访问。
②完整性
信息资源只能由授权方或以授权的方式修改,在存储或传输过程中不被未授权、未预期或无意篡改、销毁,或在篡改后能够被迅速发现。
分为预防和检测两种机制
预防机制通过阻止任何未授权的方法来改写数据以确保数据完整性
检测机制通过分析用户或系统的行为,或是数据本身来发现数据的完整性是否遭破坏。
③可用性
信息资源(信息、服务和IT资源等)可被合法实体访问并按要求的特性使用。
安全措施
采用备份与灾难恢复、应急响应、系统容侵等安全措施。
第二章:软件漏洞概述
软件漏洞是什么?
软件生命周期中与安全相关的设计错误、编码缺陷及运行故障等。
软件漏洞成因分析
①计算机系统结构决定了漏洞的必然性;(数据、指令都用二进制表示,可互相篡改 p27)
②软件趋向大型化,第三方扩展增多;(代码行越多,缺陷也就越多)
③新技术、新应用产生之初即缺乏安全性考虑;(互联互通、开放性)
④软件使用场景更具威胁;(攻击者水平提高)
⑤对软件安全开发重视不够,软件开发者缺乏安全知识。(软件公司倾向功能性开发,忽视安全性)
软件漏洞的分类
基于漏洞成因
①内存破坏类
②逻辑错误类
③输入验证类
④设计错误类
⑤配置错误类
基于漏洞利用位置
①本地漏洞
②远程漏洞
基于威胁类型
①获取控制
②获取信息
③拒绝服务
漏洞扫描
漏洞扫描是指基于漏洞数据库,通过扫描等手段对指定的远程或者本地计算机系统的安全脆弱性进行检测,发现可利用漏洞的一种安全检测(渗透攻击)行为。
漏洞扫描器包括网络漏扫、主机漏扫、数据库漏扫等不同种类。
第三章:Windows 系统典型漏洞
缓冲区(堆区、栈区、数据区)溢出
在向缓冲区写入数据时,由于没有做边界检查,导致写入缓冲区的数据超过预先分配的边界,从而使溢出数据覆盖在合法数据上而引起系统异常的一种现象。
栈溢出漏洞
在函数的栈帧中,局部变量是顺序排序的,局部变量下面紧跟的是前栈帧 EBP 及函数返回地址 RET。
如果这些局部变量为数组,由于存在越界的漏洞,那么越界的数组元素将会覆盖相邻的局部变量,甚至覆盖前栈帧 EBP 及函数返回地址 RET,从而造成程序的异常。
栈溢出攻击
一种利用栈溢出漏洞所进行的攻击行动,目的在于扰乱具有某些特权运行的程序的功能,使得攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。
第四章:Web 漏洞分析
SQL 注入漏洞的可利用性 P84
攻击者能利用现有 web 应用程序,将恶意的数据插入 SQL 查询中,提交到后台数据库引擎执行非授权操作。
主要危害
①非法查询、修改或删除数据库资源
②执行系统命令
③获取承载主机操作系统和网络的访问权限
利用工具
SQL 注入攻击利用的工具是 SQL 语法,针对应用程序开发者编程中的漏洞。
SQL 注入漏洞的防御
①代码层漏洞防护:对数据库配置使用最小权限原则
②使用专业的漏洞扫描工具进行安全性测试:SQLMap、Pangolin
一次 web 访问过程以及可能存在的问题 p76
全过程:DNS 域名解析、TCP 连接、HTTP 请求、处理请求返回 HTTP 响应、页面渲染、关闭连接
可能存在的问题:DNS域名污染、TCP SYN洪范攻击、XSS跨站脚本攻击、SQL注入、Cookies攻击等
第五章:软件安全开发模型
软件安全开发模型 p114
5-6 种:p114,去看看书,共8种
①瀑布模型(线性顺序模型、传统生命周期):一次通过,即每个活动只执行一次,最后得到软件产品。
②快速原型模型:快速构建一个可在计算机上运行的系统,让用户来试用并反馈意见,获取用户真实需求,从而逐渐完善系统,周期长,效率低。
③增量模型:将待开发的软件模块化,将每个模块作为一个增量组件,分批次分析、设计、编码和测试这些增量组件。
④螺旋模型:每一个开发阶段引入非常严格的风险识别、风险分析和风险控制,分解为一个个小项目,从而消除或减少风险的损害。
⑤喷泉模型:以用户需求为动力,以对象为驱动的模型,很好体现了面向对象软件开发过程的无缝迭代。
⑥Rational 统一过程(RUP ):强调采用迭代和检查的方式来开发软件,由多个迭代过程组成。
⑦极限编程和敏捷开发:近螺旋式,分解为小周期,开发人员和客户都有参与;速度快,结队编程。
⑧微软过程(Microsoft Process):由五个阶段组成,规划阶段、设计阶段、开发阶段、稳定阶段和发布阶段
软件安全模型中的内建开发模型 BSI p123
核心思想
对软件全生命周期各个阶段产品(工件)的安全性进行评估、测试、验证及操作控制,实现面向过程的全生命周期安全质量控制方法。
主要内容
风险管理:将减轻风险作为一种贯穿整个生命周期的指导方针
软件安全接触点:每个开发阶段通过一些关键的安全接触点来保证软件开发的安全性,从而实现在整个软件开发生命周期中既保证软件安全,又超脱于具体的开发模型。
安全知识:强调对安全经验和专业技术进行收集汇总,对软件开发人员进行培训,并通过安全接触点实际运用到项目过程中。
第六章:软件安全需求分析
等级保护的工作流程 p145
定级、备案、等级测评、安全建设整改、监督检查
第七章:软件安全设计
软件设计与软件安全设计的区别与联系 P161
软件安全设计就是将软件的安全需求转化为软件的功能结构的过程。
软件设计过程通常包括架构设计、接口设计、构件设计和数据模型设计等工作,这意味着安全设计也不仅要考虑系统架构及相关的安全问题, 同时还要考虑如何将安全需求嵌入到软件的功能结构中,与功能结构相融合并且成为一个有机的整体,为高质量地实现软件的业务目标提供安全保障。
因此,软件安全设计的主要工作包括软件架构安全性设计、软件架构安全性分析及软件安全功能设计。
威胁建模
概念
威胁建模是一项在软件设计阶段不应忽视的、系统的、可迭代的、结构化的安全技术。
通过渗透测试技术验证网络和信息系统可能面临的安全威胁和脆弱点。
威胁建模的流程 p180
①确定安全目标
②创建应用程序概况图
③分解应用程序
④确定威胁
⑤威胁评估
⑥确定威胁缓解计划或策略
⑦验证威胁
⑧验证建档
为什么要实现威胁建模 p179
①早期发现安全风险
②理解安全需求
③设计和交付更安全的产品
④解决其它技术无法解决的问题
第八章:软件安全编码
软件安全编码代码检测类型 p194
代码静态检测
不在计算机上实际执行所检测的程序,而是采用人工审查或类似动态分析的方法,通常借助相关的静态分析工具完成程序员代码的分析与检测。
代码动态检测
实际运行代码时进行检测的方法。通常依靠系统编译程序和动态检查工具实现检测,但完成后可能仍会存在与安全相关的、在编译阶段发现不了的、运行阶段又很难定位的错误。
java 和 shark 语言安全机制 p199
java安全
Shark语言(来自百度百科)书上没 shark
在密码学里,SHARK被认为是一种Rijndael加密法(高级加密标准)前身的区块加密。SHARK有64位元区块大小与128位元密钥长度。它是个6循环SP网络,利用线性与非线性转换层轮换密钥混合阶段。线性转换使用MDS矩阵代表Reed-Solomon错误纠正代码以保证适度散乱。非线性层是以8个来自函数F(x) = x于GF(2)(有限域2的8次方)的8×8位元S-box组成。
5循环的 SHARK 修改版可透过插值攻击(Jakobsen and Knudsen, 1997) 破解。
C语言安全编码
①对内存访问出错的检测和修改
②指针引用是C程序中最灵活、最核心、最复杂、也是最易出错的部分
③随机数的选取和使用问题
④C语言没有提供异常处理机制,其异常检测处理要由程序员预设完成
数据安全保护要注意的问题 p204
注意密码算法和密码函数库的正确应用、密钥管理,以及充分的访问控制和审计等问题。
密码算法
对称加密(也称单密钥加密算法):DES、3DS、AES、IDEA
非对称加密(公钥加密):RSA、ECC
哈希算法:MD5、SHA-1、SHA-256
第九章:软件安全测试
软件安全测试是什么
软件安全测试是在产品发布之前,达到以下目标:
①验证软件系统的安全功能是否满足安全需求
②发现系统的安全漏洞,最终把漏洞数量降到最低
③评估软件的其它质量属性,包括可靠性、可存活性等。
软件安全测试的内容包括软件安全功能测试和软件安全漏洞测试。
模糊测试的方法 p227
①预生成测试用例
②随机生成输入
③手工协议变异测试
④变异或强制性测试
⑤自动协议生成测试
渗透测试的方法 p231
根据测试执行人员对目标系统环境的掌握
①黑盒渗透测试:不知道测试系统任何信息,真实地模拟外来攻击者的攻击方式。
②白盒渗透测试:知道一些执行渗透测试范围,模拟熟知目标系统环境的攻击者的攻击方式。
根据执行渗透测试范围的不同
①内网测试
②外网测试
③不同网段/VLAN之间的渗透测试
渗透测试的安全流程 p232
①前期交互:制定测试计划
②情报收集:主动收集和被动收集,获取目标信息
③威胁建模:确定攻击途径和方法
④漏洞分析:挖掘新的漏洞
⑤渗透攻击:多次尝试,成功入侵目标系统
⑥后渗透攻击:获得或保护有价值的信息
⑦报告:撰写系统测试报告
第十章:软件安全部署
实现部署数据安全保护注意的问题
提高软件配置和运行的安全
确保软件自身的安全和运行环境的安全
软件部署有哪些模式形式 p242
①单机软件的部署模式
②基于中间件平台的部署模式
③基于代理的部署模式
第十一章:恶意代码分析基础
虚拟内存(Virtual Memory)
当程序运行需要的空间大于内存容量时,加载器会将内存中暂时不用的数据写回硬盘,需要时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,硬盘中的部分空间会用于存储内存中暂时不用的数据,这一部分空间就称为虚拟内存(Virtual Memory)。
把部分硬盘空间当作内存使用,用户模式下看到的,让所有进程都认为自己拥有独立的 4GB 内存空间。
PE (Portable Executable)文件
微软Windows环境下可执行文件的标准格式是PE ( Portable Executable,可移植执行体)文件,其目的是为所有Windows平台设计统一的文件格式,即为Windows平台的应用软件提供良好的兼容性和扩展性。Windows系统中使用的可执行文件(如EXE、SCR)、库文件(如DLL、OCX、DRV)、驱动文件(如SYS、VXD)及对象文件(OBJ)等多种文件类型都采用PE文件格式。
可执行文件,exe、scr、dll、ocx、obj 等都采用 PE 文件格式。
虚拟地址计算
虚拟地址 VA = 映像基址 IB + 相对虚拟地址 RVA
软件逆向分析的安全流程 p284
①文件装载
②指令解码
③语义映射:直接代码实现、使用语义描述语言描述指令语义
④相关图构造:控制流图(CFG)、调用图(CG)、依赖图(DG)等
⑤过程分析
⑥类型分析:基于指令语义的方式、基于过程式分析的方式
⑦结果输出
第十二章:恶意代码防治
蠕虫和木马的概念及关系 p307
网络蠕虫(主动出击)
是一种智能化、自动化,综合网络攻击、密码学和计算机病毒技术,不需要计算机使用者干预即可运行的攻击程序或代码,主动扫描和攻击网络上存在系统漏洞的结点主机,通过局域网或因特网传播至其它结点。
网络蠕虫的攻击行为通常可以分为4个阶段:信息收集、扫描探测、攻击渗透和自我推进。
木马(守株待兔)
是一个有用或表面有用的程序或命令过程,但实际包含一段隐藏的、激活时会运行某种有害功能的代码,非法用户达到进入系统并控制系统甚至破坏系统的目的。
基本功能:开机自启动、通信隐藏、绕过杀毒软件和反分析
应用型功能:远程命令执行、远程文件管理、信息窃取、键盘记录、进程/服务管理、远程桌面和摄像头监控等
根据应用性功能
①控制类木马
②信息窃取类木马
③下载者类木马
根据网络架构
①C/S架构
②B/S架构
③P2P结构
蠕虫和木马之间的联系
一般而言,这两者的共性是自我传播,都不感染其他文件。
在传播特性上,它们的微小区别是:
木马需要诱骗用户上当后进行传播,而蠕虫不是。
蠕虫包含自我复制程序,它利用所在的系统进行主动传播。
一般认为,蠕虫的破坏性更多地体现在耗费系统资源的拒绝服务攻击上,而木马更多地体现在秘密窃取用户信息上。
第十三章:开源软件及其安全性
开源软件所涉及到的主要权益 p351
著作权、专利权、商标权
第十四章:软件知识产权保护
软件保护技术中的软件水印技术 p369
软件水印是指把程序的版权信息或用户身份信息嵌入到程序中,以标识作者、发行者、 所有者和使用者等。
软件水印信息可以被提取出来,用以证明软件产品的版权所有者,由此可以鉴别出非法复制和盗用的软件产品,以保护软件的知识产权。
有代码水印、数据水印、静态水印、动态水印(复活节彩蛋、动态数据结构、动态执行序列)
软件版权的技术保护目标
①防软件盗版,即对软件进行防非法复制和使用的保护
②防逆向工程,即防止软件被非法修改或剽窃软件设计思想等
③防信息泄露,即对软件载体及涉及数据的保护,如加密硬件、加密算法的密钥等