软件安全
一.软件安全面临的问题
1.历史软件安全的难题
- 传统编程人员没有接受过安全教育
- 操作系统和应用程序一开始就没有建立安全架构
- 软件开发不是面向安全,后期集成很困难
2.不关注安全的主要原因
- 安全不是开发的主要考虑因素
- 很多安全从业人员不是开发人员,无法第一时间提出合理化建议
- 开发软件没有重视安全问题
- 产品投入市场成为第一要素,弱化了安全性、测试步骤
- 软件安全缺陷后续进行修补,形成了习惯
- 客户无法控制所购买软件的缺陷
3.功能性和安全的平衡
4.默认配置的问题
二.软件开发生命周期(SDLC)
软件开发生命周期模型解决五个方面问题
- 需求收集:确定为什么创建软件、软件有什么功能和为谁开发
- 设计:解决软件将如何完成被封装进入功能设计中既定的目标
- 开发:编程软件代码以符合设计阶段的规定
- 测试/验证:验证软件,确保目标实现,软件按照计划工作。
- 发布/维护:部署软件,然后确保它正确配置、打补丁和监控
1.需求收集
项目开发和需求管理团队对现行以及可能的未来功能需求进行复杂的分析以确保新系统满足终端用户要求
项目组员还会审查项目初始阶段输出的文档,并根据需求加以修正和更新。
相对较小的项目而言,以上过程往往包含在在项目初始阶段。
在安全方面,完成以下几方面工作:
- 安全需求
- 安全风险评估
- 隐私风险评估
- 风险级别验收
产品安全需求应该从CIA方面定义
隐私影响评级(privacy impact rating):指明可访问数据或者处理数据的敏感级别,有些已经纳入到需求收集阶段。由高度隐私风险(P1)、适度隐私风险(P2)、低度隐私风险(P3)组成。
- 高度隐私风险(P1):涉及到个人可识别信息;
- 适度隐私风险(P2):一次性用户启动的匿名数据传输,例如用户点击了一个链接后去另一个网站;
- 低度隐私风险(P3):没有影响隐私的行为存在。
2.设计阶段
1)软件需求模型
信息模型:规定要处理信息的类型和处理方式,例如防病毒软件的病毒特征、被修改的系统文件为软件需要的信息类型,文件的校验、病毒隔离为处理方式
功能模型:概述应用程序需要执行的任务和功能,例如全盘扫描
行为模型:解释在具体事务处理发生过程中和发生之后应用程序的状态,例如系统启动时,防病毒会随之启动
2)成果物
- 数据设计
- 结构设计
- 程序设计
3)安全角度
攻击面分析
威胁建模
在系统设计时决定软件实施的功能。而软件的验证必须要考虑所有为系统而设计的背景。
3.开发阶段
1)使用计算机辅助软件工程(CASE)
2)静态分析
- 通常指编程人员和开发人员的自动化工具
- 快速清除已知编程缺陷和脆弱性的源代码
3)人工审查
4.测试/验证阶段
测试按照阶段可分为:
1)单元测试:测试单个组件,验证数据结构、逻辑和边界条件,贯彻始终。
2)集成测试:验证组件是否按设计规范中概述的那样协同工作,验证组件之间的协同。
3)系统测试:验证整体系统功能。
3)验收测试:以用户角度测试,满足用户要求。
4)回归测试:进行变更后的重新测试,确保功能、性能和保护级别。
测试按照类型:
- 功能测试
- 性能测试
静态测试:审核编程代码
动态分析测试:在执行过程中审核代码
测试按照方法:
- 人工测试:通过人员的经验和直觉来分析程序,通常使用计算机技术来判断,测试人员能定位设计错误,如逻辑错误。包括渗透测试。
- 动态分析(Dynamic analysis):动态分析是及时的分析正在运行的程序, 一般是在静态分析之后,程序的基本问题都被解决完后执行。
模糊测试(Fuzzing testing):发送复杂/随机的数据给软件来引起软件的错误,主要用于识别缓存溢出、DOS、注入、验证错误以及其他可能导致软件死机、崩溃或发生各种错误。
脆弱性扫描(Vulnerability scanning):通过自动化工具检查程序的主要错误,如强类型语言的错误、开发和配置错误、交易序列错误( transaction sequence faults )、映射触发条件( mapping trigger conditions. )等,通常在扫描完后需要手工进一步的调查。
安全测试应对针对早期标准的脆弱性
5. 发布和维护阶段
发布阶段:
验证(verification):判断产品是否准确体现和满足了产品规范,设计规范。
确认(validation):判断产品是否为针对实际问题提供必要解决方案,是否满足当初设计问题,管理层认可。
认证 (Certification) :对一个IT系统的技术和非技术安全特性以及其防护措施安全评价,衡量特定设计和实施满足 一套规定的安全需求的程度,为认可过程提供支持。一个检查和评估安全控制的过程,外部独立的检查机构执行,确认对安全策略和标准的合规。
鉴定或认可 (Accreditation):权威机构正式声明,某个IT系统已经得到批准,能够运行于特定的安全模式,该安全模式采用了满足可接受风险等级的一套规定的安全措施,管理层对系统认可。
迁移和修正:系统从验收阶段转换到真实生产环境。
正确配置安全环境,最终安全确认
维护阶段:
持续进行脆弱性测试,监控系统活动和审计事件 (在维护阶段发现发现了漏洞,采取的行动是报告)
如果发生重大变更执行风险评估, 并执行认证和鉴定过程(re-certification, re-accreditation)
三.软件开发模型
1.瀑布模型
- 线性生命周期
- 由可行性、分析、设计、实施、测试、维护阶段组成
- 每个阶段都要等上一个阶段完成才能进入下一个阶段
- 适用于小型需求简单的项目
2.V模型
与瀑布模型类似,增加了每个阶段都要进行验证和确认
3.原型模型
- 快速模型
- 演化模型
- 运行模型
4.增量模型(迭代模型)
风险、程序复杂、资金和功能需求问题使用
5.螺旋模型
原型+迭代
6.快速开发
用户参与其中,不断基于原型迭代,每一步需要用户确认
7.敏捷模型
敏捷宣言
- 个体和互动高于流程和工具
- 工作的软件高于详尽的文档
- 客户合作高于合同谈判
- 响应变化高于遵循计划
开发方法
- 敏捷开发
- 极限编程XP
- scrum
- lean
4.开发模式
探索模型:没有明确的定义项目目标
联合分析开发:在一个面向工作间的环境中采取工作组的方式开发应用程序
重用模型:通过逐渐更改原型
净室模型:试图通过结构化和形式化方法开发和测试,用于高质量和严要求的应用程序
四.集成开发
集成产品和流程开发(Integrated Product and Process Development -IPPD)
- 通过使用多科目团队同时集成所有必要获取活动来优化设计、制造和支持流程的管理技术
- IPPD从产品概念到生产,包括现场支持,促进满足成本和绩效目标
- IPPD的关键原则是集成产品团队(IPTs)的多学科协作模式
DevOps
- 对类似成产系统进行开发和测试
- 以可重复、可靠流程进行部署
- 监控和验证运营质量
- 扩大反馈回路
IPT
- 来自所有各职能科目的代表与Team Leader 一起工作来构建成功和平衡的程序,识别并解决问题,妥善并及时的决策
- 小组成员不一定贡献100%的时间在项目上,一个成员可以在多个IPT团队。
五.软件安全开发标准
开放式WEB应用程序安全项目(OWASP):是一个组织,专门处理应用程序安全问题
ISO/IEC 27034
六.编程语言
1.语言的阶段
第一代:机器语言
第二代:汇编语言 VB
第三代:高级语言 C
第四代:非常高级语言 JAVA
第五代:自然语言
汇编程序、编译器和解析器
汇编程序:将汇编语言源代码翻译成机器代码
编译器:把高级语言转换成所需的机器可理解的形式
2.面型对象
1)多态:当对象给予相同输入但反应不同时
2)封装:最简单的理解就是包装,指隐藏对象的属性和实现细节,仅仅对外公开接口,即对象的内部状态对外界是透明的。
3)内聚和耦合
内聚:内聚越高越容易修改,并且不影响其他模块。
耦合:是一个度量,是一个模块完成其他任务需要进行多少次交互。
优秀的软件一般表现为高内聚松耦合。
4)数据建模:对支持相应系统和软件应用程序的范围内的业务流程所需的数据要求进行定义和分析的一种流程
5)类 (Class)
- 类(Class)定义了一件事物的抽象特点
- 类定义了事物的属性和它可以做到的(它的行为)
- 一个类的方法和属性被称为“成员”
- 规定了对象的类型、结构和可接受的动作
6)对象 (Object)
- 对象(Object)是类的实例。
- 系统给对象分配内存空间,而不会给类分配内存空间; 类是抽象的,系统不可能给抽象的东西分配空间,对象是具体的
- 通过消息彼此进行通信
对象=属性+方法
- 属性:描述了对象的结构和状态特征
- 方法:对象能够执行的功能或过程
- 对象间通信的方法:消息传递
7)封装性 (Encapsulation):将对象信息隐藏
8)继承 (inheritance):是一种由已存在的类创建一个或多个子类型的机制.
9)隐藏:对象内部的数据和操作对其他对象而言是隐藏的
3.分布式计算
1)必要性
- 分布式对象需要注册服务器端、客户端组件
- 组件之间协调应该受到控制和监控
2) 对象请求代理(ORB)
管理对象间的通信,使它们能在异构的网络和分布式环境进行交互
3)类型
a)DCE(分布式计算环境)
- 由开发软件基金会(OSF)开发的一个标准
- 提供一个客户端/服务器框架
- 基于RPC的位于通信层上的管理服务
- 使用通用唯一标识符(UUID)
- RPC功能从发送程序中收集参数和命令
- 很少在环境中应用
b)CORBA(公共对象请求代理架构)
- 由OMG开发
- 面向对象的标准架构
- 定义了标准的API、通信协议和客户端/服务器通信方法
- 不依赖平台
- 由面向系统的组件和面向应用程序的组件组成
c)J2EE
- 提供网络直连服务的API、容错、安全、大型Web服务和多层网络应用程序
- 提供了一个基于java的数据库访问API
- 进程间通信基于CORBA
- 目标是用一个标准化的方法实现后端代码
d)SOA
SOAP是基于XML的协议
WDSL为描述语言
UUID提供注册服务(认证)
基于HTTP方式传输
e)COM
- 是一个允许某个应用程序内或相同计算系统上不同的应用程序之间实现程序间的通信机制
- DCOM
- 使分布式成为可能
- 使用全球唯一标识(GUID)
- 基于RPC,提供ORB服务
- 基本被.net framework替代
- 对象链接和嵌入(OLE)
- 为在本地个人计算机上共享对象提供了一种方式,并使用COM作为基础
- OLE使对象(图片、声音、表格)嵌入到表格中
- 当点击时会调用图片编辑、execl编辑
- 一个程序调用另一个程序的能力成为链接
- 将一段数据放入外部程序或文档的能力成为嵌入
- 在WWW中成为ActiveX
- 可运行在人后COM平台上
f)接口
API是IoT(Internet of Things)的连接器,允许设备互相连接
REST,即Representational State Transfer的缩写。直接翻译的意思是"表现层状态转化"。它是一种互联网应用程序的API设计理念:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。
RESTful API就是REST风格的API,即rest是一种架构风格,跟编程语言无关,跟平台无关,采用HTTP做传输协议。
六.移动代码
通过网络传送由另一端程序执行
1)java applet
运行在一个java的沙箱中
2)ActiveX
基于DCOM的OOP技术和工具组成
提供在线编辑功能
是windows操作系统自身的组件,DLL文件
3)安全问题
ActiveX依赖数字签名和信任认证授权
java applet不能保证完全运行在沙箱中
七.Web安全
1)特定威胁
- 管理接口
- 身份验证与访问控制
- 输入验证
- 路径或目录遍历威胁
- Unicode编码
- URL编码
- 参数验证
- 会话管理
2)故意破坏
用修改过的图片和标题替换核发图片和标题
3)金融欺诈:虚拟环境下的服务和交易的欺骗
4)特权访问:限制特权用户的访问
5)盗窃交易信息
6)盗窃知识产权
7)拒绝服务攻击
8)常见安全方法
a)SAML 安全断言语言(Security Assertion Markup Language): 是一个基于XML的协议, 是一个联合身份标准。 用于传送身份验证和授权信息,可用于实现单点登录。 类似于Kerberos依赖于KDC,SAML依赖于IDP(Identity provider)。 SAML有一项功能叫策略执行(policy enforcement)。
b)OAuth(开放授权):是一个开放标准, 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表), 而无需将用户名和密码提供给第三方应用。OAuth2.0
原先的OAuth,会发行一个 有效期非常长的token(典型的是一年有效期或者无有效期限制),在OAuth 2.0中,server将发行一个短有效期的access token和长生命期的refresh token。这将允许客户端无需用户再次操作而获取一个新的access token,并且也限制了access token的有效期
c)跨站脚本攻击
nonpersistent XSS:利用动态网站缺少正确的输入和输出验证机制。
persistent XSS:攻击者将恶意代码上传到攻击访问的浏览器和服务器
DOM:攻击者用DOM环境来修改原客户端的javascript
八.数据库安全
1.数据库管理系统 (DBMS)
以一定的格式组织并存储数据、记录文件,允许用户存取、管理和更新
控制访问限制、数据完整性、冗余和数据库可用的不同类型操作
最关注完整性,其次是可用性,最后是保密性
特点:
- 数据一致性:操作必须遵守每个数据库的完整性策略,完成交易数据保持一致
- 数据共享:同一时刻可以有多个用户访问数据库,借助并发控制
- 数据恢复:若发生错误或系统崩溃,系统可以恢复。 检查在崩溃时候正处理的交易或者回滚,或者向前已完成一次交易,维护数据的一致性。检查点是一种常见的恢复技术
- 安全控制:提供各种安全控制,以限制用户访问
确保有效途径或过程
- 压缩:节省存储空间和I/O的能力
- 重组:回收不用的空间
- 重构:添加和改变记录、数据、访问控制、 磁盘配置、处理方法的能力
基数是指从数据表、结果集或者索引返回多少行数据
基数=表行数据*选择率
2.数据库模型
1)基础
主键和外键
主键:能唯一标识一条记录。
外键:如果一个表中的某个属性值与另一个表中的主键相匹配, 并且建立了某种关系,那么这个属性就视为外键。
视图:数据库中使用的一种访问控制机制,用于保证只有授权的主体才能访问敏感数据。
数据字典
- 是一种描述数据元素及其关系的中心库,可存储数据用法、数据关系、数据来源和数据格式等关键信息
- 数据字典是一个控制数据库数据的集中管理部分, 描述了数据元素和数据库间的交叉引用
- 描述数据元素定义、模式对象和引用键的集合
- 模式对象包括表、视图、索引、过程、函数和触发器
- 数据管理软件读取数据字典,确定模是否存在,并检查特定 用户进程的访问权限,还定义了对每个用户的视图权限设置
- 需要增加新记录、表、视图或模式时,更新数据字典
数据库完整性由并发机制提供
实体完整性保证行由主键唯一性提供
回滚使数据库取消变更并返回到先前的状态。
提交表示事务处理结果并保存对数据库的所有变更
数据库被描述schema,采用数据定义语言(DDL)
数据库字段可允许的值集合称为数据表域
在数据库信息安全中,多态用于隐藏信息
多实例是允许一个表存在多条具有相同主键值的记录的过程。不同的实例通过其安全级别或分类来区分
2)层次数据库模型
逻辑树结构,由在逻辑树结构中相关联的记录和字段组成
树形结构包含许多分支,每个分支又具有许多叶子或数据字段
使用采用父/子关系的树形结构来定义数据元素之间的关系
访问需要明确路径, 不适合经常更改,适合于经常性查询
示例:轻量级目录访问协议LDAP、注册表结构
3)网状数据库模型
用有向图表示实体类型及实体间联系。类似于网状的冗余结构,非严格树形结构
每个数据元素拥有多个父节点和自己录
比层次模型相比检索速度更快
4)关系数据库模型
使用行(元组)和列(属性)的二维表
特点:以属性/字段(列)和元组/记录(行)
笛卡尔积的组合
基本组件:
数据定义语言(DDL):定义数据库的架构(Structure)和数据架构(Schema),例如:CREATE、DROP、ALTER等语句。
- 结构:说明表的大小、键的位置、视图和数据元素关系
- 架构:描述数据库存储和操作的数据类型及其属性
- 定义数据库的机构、访问操作和完整性过程
数据操作语言(DML):操作命令,例如:SELECT(查询)、INSERT(插入)、 UPDATE(修改)、DELETE(删除)语句。
数据控制语言(DCL):创建用户访问和授权对象,例如:GRANT、REVOKE等语句。
事务控制语句(TCL): 例如:COMMIT、ROLLBACK等语句。
报表生成器:用户定义方式的数据过程输出
关系完整性(RDBMS)
实体完整性 (Entity integrity):每一条记录由主键值唯一确定;
语义完整性 (Semantic integrity) :保证结构化规则和语义规则得到遵守, 防止语义上不正确的数据进入数据库。 可以通过规则约束的规则来实现;
引用完整性 (Referential integrity):任何数据库记录都不能引用一个不存在的主键, 如果一个包含有主键的记录被删除了, 所有被引用的记录都必须删除掉.
记录或者行代表了数据表
面向对象数据库模型
- 将面向对象编程中的对象数据模型与DBMS结合在一起,可存储图像、语音、视频等数据。
- 面向对象的数据库使用类来定义其对象的属性和过程
数据库编程接口
- 开放数据库互连,ODBC
- 对象连接和嵌入数据库,OLEDB
- ActiveX数据对象,ADO
- Java数据库互连,JDBC
5)数据仓库和数据挖掘
ACID原则
- 原子性(Atomicity):要么所有修改都提交,要么数据库回滚
- 一致性(Consistency):遵循数据库完整性, 保证不同数据库中数据的一致性
- 隔离性(Isolation):交易之间互不影响
- 持久性(Durability):一旦提交无法进行回滚
联机分析处理(OLAP):是数据仓库系统的主要应用,适用于决策人员和高级管理人员
数据仓库
- 为了实现信息检索和数据分析, 将多个数据库或数据源组合成一个大的数据库
- 合并多个数据库和数据源的数据
数据挖掘
- 分类:根据共同的相似性对数据分组
- 可能性:标识数据之间的相互依赖关系,并将可能性应用与他们之间的关
- 进一步处理数据仓库中的数据的过程
6)数据库漏洞和威胁
a)完整性 (integrity)
回滚:终止当前事务,取消更改,恢复前一状态
提交:终止当前事务,执行用户进行的修改, 如果不能执行成功则回滚
保存点/检查点 (check point):如果检测到错误,用户可以返回相应的位置。
应对并发操作的威胁使用锁机制
b)聚合 (Aggregation)
一些信息片段分开时并不敏感,但放在一起就敏感。
解决方法
- 严格控制聚合函数的访问
- 禁止用户直接访问数据,可以通过视图方式
c)推理 (Inference)
聚合想要达到的结果,推理得不到显示可用的信息
解决方法:
- 访问控制:基于内容相关的访问控制,基于上下文相关的访问控制
- 单元抑制 (Cell suppression):用于隐藏特定单元的技术
- 数据库分割 (database partition) :将数据库分成不同的部分
- 噪声和扰动 (noise and perturbation):在数据库中插入伪造信息的技术
- 数据库视图
- 多实例 (MRDBMS):建立具有相同主键的多个元组和 由安全级别定义的实例之间的关系
d)死锁 (DeadLocking)
e)其他威胁
九.恶意软件(malware)
1.恶意攻击
a)病毒
宏病毒:引导区病毒,可以删除引导区的数据或重新引导区
压缩病毒:自身附加在可执行程序上,并使用用户的权限进行压缩
隐蔽性病毒:隐藏他对文件盒引导记录所做的修改
变形病毒:制作变化的,但仍然可用的自身副本。通过噪声或伪造指令,变异引擎和随机数生成器来改变指令顺序,逃避检测,传播时会改造自己的特征。
分体病毒:感染硬盘引导区和可执行文件
自乱病毒:通过打乱自身代码来逃避防病毒软件检测
脚本病毒
隧道病毒:将自己安装在防病毒程序下,杀毒软件检测病毒时,拦截这个调用,需要宿主主机进行复制
蠕虫:不需要宿主主机进行复制。通过邮件、web站点下载等方式传播
b)rootkit
一组被放在感染系统的工具,提升管理员权限
c)间谍软件和广告软件
间谍软件是一种隐蔽的恶意软件,安装在目标计算机并收集关于受害者的敏感信息
d)僵尸网络
僵尸程序是一种恶意软件,是一段潜伏的代码,是发起DDOS等攻击的基础。
e)逻辑炸弹
特定事件发生时,逻辑炸弹被执行,例如一段恶意代码,通过计划任务
f)特洛伊木马:一种伪装成另外一个程序的程序
g)拒绝服务攻击(DOS)
smurf攻击:利用ICMP协议的缺陷
fraggle攻击:利用UDP协议的缺陷
smurf和farggle是两种利用协议缺陷和 使用放大网络发动DoS的例子
SYN洪泛攻击
- 利用TCP连接的三次握手
- 超过了连接队列的上限
泪滴攻击:利用发送很小的分片包来利用这个设计缺陷
分布式拒绝服务攻击 (DDOS)
2.防护手段
1)防病毒软件
特征性检测法 (signature):知识库匹配
启发式检测 (heuristic) 检测到异常行为
- 可疑性计数器
- 有的防病毒软件可疑创建一个沙盒, 动态分析可疑代码
审查一段代码有关的信息称为静态分析法
允许一部分代码在虚拟机中运行则称为动态分析法
2)免疫程序
针对某种病毒,使其认为已被感染。
模拟一堆正常程序,诱导病毒认为这是真正的文件
3)行为阻止器
4)防病毒程序:通过行政、物理和技术方法来防止病毒
5)垃圾邮件检测
贝叶斯过滤:通过对单词使用频率、顺序来判断是否为垃圾邮件
防恶意软件
特别声明:
1.以上所有描述内容部分参考链接/文献未逐一列出,若有侵权,请及时告知,有则改之无则加勉。
2.以上仅是学习过程的总结,相信有很多理解偏差的地方,特别希望指出,给予帮助,更新知识体系,共同进步。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">