1、创建好的代码
质量在某种意义上来讲意味着适用性。换句话说,质量指的是某事务能否满足其预期使用目标。当我们从整体上来看时,我们会发现,在开发安全软件时,质量是最重要的概念。
代码审查和接口测试是确保安全质量的关键。我们也讨论过滥用案例测试,其目标是让我们确定对手可能试图破坏代码的方式,然后找出可阻止他们的控制措施。因此,鉴于控制措施对系统安全至关重要,我们必须在整体软件质量的背景下对其进行考虑。
由于开发目的的不同,软件控制也形成很多不同风格。它们可控制输入、加密、逻辑处理、数字处理方法、进程间通信、访问、输出以及与其他软件的接口。在开发过程中考虑这些功能的潜在风险:在开发的不同阶段,应进行多种威胁模型和风险的分析。它们的目标是降低脆弱性和系统破损的可能性。控制可能是预防性、检测性或纠正性的。其表现方式可能是行政管理方便或物理控制方便,不过更多的情况是技术方便的安全控制。
特定的软件控制依赖于软件本身、它的目的、相关安全策略的安全目标、它将处理的数据类型、它所执行的功能和软件所在的环境。如果应用程序纯粹是私有的,并且运行在封闭的可信任的内网环境中,那么相对于在互联网上提供业务和财务交易的应用程序而言,就不需要考虑太多的安全控制。安全的诀窍在于:理解应用程序的安全需求,实现正确的安全控制和安全机制,彻底测试这些安全机制以及它们在应用程序中的集成方式,遵循结构化开发方法,提供安全可靠的分发方法。
(1)应用程序和计算机系统开发的首要目的往往是满足功能而非安全。
(2)安全的诀窍在于:
理解应用程序的安全需求,实现正确的安全控制和安全机制,彻底测试这些安全机制以及它们在应用程序中的集成方式,遵循结构化开发方法,提供安全可靠的分发方法。
(3)结构化程序设计
- 自顶向下的分析设计,自底向上的逐步实施
- 面向客户的观点,严格区分工作阶段
- 缺点:开发周期长、开发过程繁琐和复杂、审计比较困难、用户交流不直观
(4)面向对象程序设计
- 采用类和对象两部分组成
- 类(class),类定义了一件事情的抽象特点,类定义了事物的属性和它可以做到的(它的行为),一个类的方法和属性被称为“成员”
- 对象(object),对象是类的实例,系统给对象分配内存空间,而不会给类分配内存空间,类是抽象的,对象是具体的
- 对象=属性+方法,属性描述了对象的结构和状态特征,方法能够执行的功能和过程
- 对象间通信的方法,消息传递
- 多态性,封装最简单的理解就是包装,指隐藏对象的属性和实现细节,仅仅对外公开接口,即对象的内部状态对外界是透明的
- 封装性,意味着将对象信息隐藏,公有成员,私有成员
- 继承,是一种由已存在的类创建一个或多个子类型的机制
2、软件开发生命周期(SDLC)
(1)需求收集阶段
- 安全方面:
- 安全需求
- 安全风险评估
- 隐私风险评估
- 风险级别验收
- 隐私影响评级:
- P1高度隐私风险
- P2适度隐私风险
- P3低度隐私风险
(2)设计
这是一个把理论用于实际的阶段,设计是让产品真正的实现需求。
- 软件需求:
- 信息模型,规定要处理的信息类型和处理方式。
- 功能模型,概述应用程序需要执行的任务和功能。
- 行为模型,解释在具体事务处理发生过程中和发生之后应用程序的状态。
- 安全角度:
- 攻击面分析
- 威胁建模
(3)开发阶段
- CWE
MITRE组织的常见漏洞枚举(CWE)计划被称为“社区开发的软件漏洞词典”,与SANS研究所合作,维护了最危险的软件漏洞列表。 - 编程人员需要检查输入长度,以防止缓冲区溢出;检查代码,防止隐蔽通道的出现;检查适当的数据类型,确保检查点不会被用户绕过;核查语法和核实效验。
- 静态分析
静态分析是一种调试技术,在不执行程序的情况下检查代码,因此在程序被压缩之前进行。人工做的审查叫做代码审核。
静态分析和代码审核需要指定程序的源代码,而且静态代码分析从不暴露逻辑错误和设计缺陷,因此必须与人工代码审核结合使用,确保透彻的评估。
(4)测试/验证阶段
- 成熟的开发者,会在开始编码前或者在编码的同时,为模块开发单元测试,使产生高质量代码和明显更少的漏洞。
- 职责分离,不同的环境类型(开发、测试和生产)应当被正确分离,并且功能性和操作不应该重叠。
- 测试类型
- 单元测试,模拟一个范围的输入来验证哪些代码可能被利用。模拟个体组件位于一个受控的环境中,编程人员在这里确认数据结构、逻辑和边界条件。
- 集成测试,验证组件是否按设计规范中概述的那样协同工作。
- 验收测试,确保代码满足客户的要求。
- 回归测试,进行系统变更后重新测试,以确保功能性、性能和保护级别。
- 系统测试,功能和性能
- 功能测试
- 性能测试,负载测试、压力测试
- 模糊测试,发送复杂或随机的数据给软件来引起软件的错误,主要用于识别缓存溢出、DOS、注入、验证错误以及其他能引起软件死机崩溃或发生的各种错误
- 脆弱性扫描,通过自动化工具检查程序的主要错误,如强类型语言的错误、开发或配置错误、交易序列错误、映射触发条件等,通常在扫描后需要手工进一步调查
- 人工测试,需要人员的经验和直觉来分析程序,通常适用计算机技术来判断,测试人员能定位设计错误,如逻辑错误。包括渗透测试
- 动态分析,动态分析是及时的分析正在运行的程序,一般在静态分析之后,程序的基本问题都被解决完后执行
(5)发布/维护阶段
验证和确认,验证是判断产品是否准确体现和满足了产品的规范。确认是判断产品是否为所针对的实际问题提供了必要的解决方案。
3、软件开发模型
(1)开放式web应用程序安全项目(OWASP):它是一个组织,专门处理web安全问题。它除了提供开发人员开发安全软件时参考的工具、文章和资源列表外,在世界各地还有很多单个的会员协会。这个组织提供了开发指南、测试流程和代码审核步骤,但最出名的还是它维护的十大web应用安全风险列表。下面是2013年以来最新的TOP10问题清单:
- A1:注入
- A2:无效的认证和会话管理
- A3:跨站脚本攻击(XSS)
- A4:不安全的直接对象引用
- A5:安全配置错误
- A6:敏感数据泄露
- A7:功能级权限控制缺失
- A8:跨站请求伪造(CSRF)
- A9:使用已知安全隐患组件
- A10:未经验证的重定向和转发
(2)边做边改模型,基本上边做边改模型没有架构设计,而是在很少或者根本没有计划的情况下立即开发。
(3)瀑布模型,瀑布模型采用线下生命周期方法,每个阶段必须完全完成,才能开始下一阶段。瀑布模型适用于较小的项目而且能够充分理解需求的情况,这种十分严谨的方法比较适合。
(4)V形模型,V形模型在瀑布模型基础上开发,在软件开发过程中不在按照平面的线形方法,强调在每个阶段进行验证和确认,并为每个编码阶段实施提供正式的开发测试计划。V形模型也像瀑布模型一样,在一下阶段开始前,之前的每个阶段必须完成。
(5)原型模型(demo),在投入大量时间和资源之前,可以开发软件代码的样品来探索特定问题的解决之道。在软件开发行业有3个主要的原型模型已经被发明和普及,他们是快速原型、演化原型、运行原型。
快速模型原型完成服务目的后会被丢弃,是为了能够快速理解建议性的解决方案,演化型原型是在实验室环境中创建和改进的,运行原型是在生产环境中开发和改进的。
(6)增量模型,如果一个开发团队遵循增量模型,这能让他们在一个软件开发全过程进行多个开发周期。
(7)螺旋模型,螺旋模型使用了一个迭代方法来开发软件并把重点放在风险分析上。该模型由四个主要阶段组成:计划、风险分析、开发和测试、评估。
(8)快速应用开发,快速应用开发(PAD)模型更多的依赖快速原型的使用,而不是大量的前期规划。改进软件的计划与快速开发软件的过程交织在一起,允许客户在开发初始阶段就参与其中,目的在于最终结果能以更现实的方式满足它们的需求。
(9)敏捷模型
敏捷模型是几种开发方法的总称。他的重点不在严格的、线形的阶梯式的过程,而在增量和法代的开发方法上,具有灵活敏捷的特点,足以适应每个项目的需求。敏捷模型的另一个特点是开发团队可以采用所有的SDLC方法,并可以根据特定项目需求组合它们。
- 敏捷开发
- 极限编程
- 看板管理
- Scrum,Scrum是迭代式增量软件开发过程,通常用于敏捷软件开发。
Scrum的三种角色:
产品负责人 Product Owner: 负责维护产品订单的人,代表利益相关者的利益。
Scrum主管 Scrum Master: 为Scrum过程负责的人,确保scrum的正确使用并使得Scrum的收益最大化。一般不翻译。
开发团队 Team: 由负责自我管理开发产品的人组成的跨职能团队。 - 敏捷宣言:
个体和互动 高于 流程和工具
工作的软件 高于 详尽的文档
客户合作 高于 合同谈判
响应变化 高于 遵循计划
(10)其他模型
- 探索性模型:是一种还没有明确定义项目目标的实例中使用的方法。
- 联合分析开发(JAD):在一个工作组中,采用团队协作的方法开展应用程序开发的方法。
- 重用模型:它是一个采用先进开发模型的近似软件开发的模型。可重复使用的程序通过逐渐修改先前的原型进化为客户要求的规格。
- 净室模型:它是一种方法,视图通过结构化和形式化方法的开发和测试,以防止错误和失误。
(11)集成产品开发团队
- DevOps:DevOps是将开发、IT、质量保证(QA)工作人员组成同一软件开发项目团队的实践,这将统一目标,提高效率,并减少对软件产品的依赖。
4、能力成熟度模型以及变更控制
(1)能力成熟度模型集成(CMMI):能力成熟度模型集成CMMI集成了一整套产品和软件开发指南。它涉及软件开发周期的不同阶段,包括概念定义、需求分析、设计、开发、集成、安装、操作、维护等阶段,以及每个阶段需要做什么。
- CMM成熟度模型:
初始:开发过程随意,甚至非常混乱
可重复:正式的管理结构、变更控制和质量保证
已定义:有正式流程,其中描述和定义了在不同项目中的过程
已管理:有一个正式的过程,可收集和分析定性数据,度量被定义并提供给过程改善程序
优化:公司对持续改善过程有了预算和整体计划 - CMMI成熟度模型集成:
1,3,5与CMM相同,2是已管理,4是量化已管理
初始、已管理、已定义、量化已管理、优化 - CMMI V2.0:
level0:不完整级、level1:初始级、level2:已管理级、level3:已定义级、level4:量化已管理级、level5:优化级 - IDEAL:
CMM/CMMI模型讲的是5个不同的成熟度阶段,而IDEAL模型给出了一个具体实施改进活动的方法
lnitiating启动
Diagnosing诊断
Establishing建立
Acting行动
Learning学习
(2)变更控制
一个产品生命周期中的变更如果实施不当或失控,可能造成很大的损失。变更必须获得批准、记录和测试。
变更控制过程的必要步骤:
- 为变更提出正式申请
- 分析变更申请
- 开发实现策略
- 计算实现成本
- 审查任何安全问题
- 记录变更申请
- 提交变更申请以获批准
- 开发变更
- 重新编码产品程序段,并添加或删减功能
- 将这些变更的代码链接到正式的变更控制申请中
- 为测试和质量审核提交软件
- 重复过程直到能够保障质量
- 记录变更版本
- 报告结果给管理层
(3)代码仓库
软件开发协作工具,支持版本控制、错误跟踪、web托管、发布管理
5、编程语言与分布式计算
(1)编程语言
所有软件都是由某种类型的编程语言写成。编程语言由这几种类型:机器语言、汇编语言和高级语言。
- 编程语言的发展
- 机器语言:直接使用的二进制语言。
- 汇编语言:它被认为是低级编程语言,是机器级别指令集,汇编语言通常使用汇编编译器将计算机语言转化为机器代码,汇编语言依赖于硬件体系。
- 高级语言:如c,c++,python..
(2)汇编程序、编译器和解释器
- 汇编程序将汇编语言源代码转换成机器语言的工具。
- 编译器将高级语言转换成处理器所能理解的机器级别格式的语言(.exe、.dll等)。
- 解释器在执行过程中,将高级语言翻译成机器指令。
(3)面向对象概念OOP
- 非OOP类似巨大的实体,应用程序就是一大块代码,OOP由许多小的模块组成。
- OOP的优点:模块化、延迟承诺、可重用性、自然性。
- 内聚和耦合
- 内聚是反应某个模块可执行多少种不同类型的任务。高内聚:对象尽量独立并执行单一逻辑功能,即高内聚。
- 耦合表明某个模块需要多少交互才能完成其任务。低耦合:对象间不应彼此高度影响,即低耦合。
(4)分布式计算
COM和DCOM
- COM
COM(组件对象模型):允许同一应用内的进程间或相同计算机系统内不同应用的进程之间的通信。由微软发布,并标准化API、组件命名机制和通信标准。 - DCOM
DCOM(分布式组件对象模型):DCOM已经逐步退出历史舞台,取代的是.NET框架,此框架主要应用于Windows环境下的应用程序,提供了丰富的资源库供程序员调用。
(5)面向服务的架构SOA
- SOA,提供了标准化访问,这样可以在同一时刻访问不同应用程序中最需要的服务。SOA更多是基于web的方法。
- SOAP,SOA的服务通常通过web服务提供,基于web的服务允许使用基于web的标准,如简单对象访问协议SOAP。SOAP是一种基于XML的协议,它用于在网络服务环境下为信息编码。它实际定义了在XML模式下通信是如何发生的。SOAP的一个优点是该程序调用将最有可能防火墙,因为通常允许HTTP通信。这有助于确保客户机/服务器模型中不同实体之间的通信在通过防火墙时不会被拦截。
6、移动代码与web安全
(1)移动代码
通常是作为病毒、蠕虫或者特洛伊木马的一部分被传到客户计算机,并且移动代码可利用系统的漏洞进行入侵。
传播:漏洞、电子邮件、文件共享、web浏览、社会工程等
- 典型的移动代码
Applets:agent是从用户端发送数据到远程服务端,Applets则相反,是从服务端发送到客户端执行某种操作。
Jaca Applets:独立于平台,可在JVM上执行。有sandbox来约束Java代码的特权。
ActiveX Controls:微软技术,可用任意语言来实现。只能运行在微软系统上,且没有sandbox约束,可对操作系统完全访问,因而需要特别小心。 - JVM
Java的虚拟主机,JVM虚拟机是Java平台的核心,为了让编译产生的字节码能够更好的解释和执行。
JVM解释器:该虚拟机处理字段码的CPU
JVM指令系统:一条指令分为操作码和操作数两部分
寄存器:JVM有自己的虚拟寄存器
JVM栈:指令执行时数据和信息存储的场所和控制中心,它提供给JVM解释器运算所需要的信息
存储区:JVM存储区用于存储编译过后的字节码等信息
碎片回收区:JVM碎片回收是指将使用过的Java的具体实例从内存中进行回收
(2)web安全
- web安全所面临的威胁
- a.信息收集
信息收集往往是攻击者攻击的第一步;
应对信息收集的主要手段:应限制给予公众的最小量的可用信息;
开发者应意识到编写的代码可能会被组织机构的人看到,应定期检查搜索引擎,检查是否存在web站点、邮件地址、文件类型和数据等。 - b.管理接口
web管理可以通过本地也可以通过远端进行管理,甚至可以基于web的页面进行管理;
应对的主要手段:
尽量去除和限制管理界面的使用,使用强鉴别机制;
访问时使用固定IP或网络ID来允许管理访问;
最安全的系统访问时带外管理,如VPN、SSH独立加密通道等。 - c.身份验证和访问控制
web访问控制依然使用传统的用户名和密码;
应对访问控制风险的主要手段:
分析日志文件确定入侵系统;
通过安全机制来传递身份验证信息,如在web站点使用SSL。 - d.输入验证
目录/路径遍历攻击(../)、统一代码编码(%c1%1c…)、网址编码(%20表示空格)、缓冲区溢出、客户端验证、SQL注入、SXX等; - e.XSS跨站脚本攻击:
非持久性XSS或者称为反射XSS,攻击者欺骗受害者处理一个用流氓脚本编写的URL,从而盗取受害者信息。这个攻击的原理是利用动态网站上缺失适当的输入或输出确认。
持久性XSS也称为存储或第二顺序XSS,通常针对的是那些让用户输入存储在数据库或其他地方(如论坛、留言板等)的数据的网站。攻击者张贴一些包含恶意Javascript的文本,在其他用户浏览这些帖子时,他们的浏览器会呈现这个页面并执行攻击者的恶意代码。
基于文档对象模型(DOM)XSS也叫本地跨站点脚本,DOM是标准结构布局,代表浏览器中的HTML和XML。在这样的攻击中,像表单字段和cookie这样的文档组件可通过Javascript被引用。攻击者利用DOM环境来修改最初的客户端Javascript。这使受害者的浏览器执行由此而导致的Javascript代码。 - f.参数验证
类似于输入验证,参数验证首先确认接受的数据在定义的限制范围内,然后再进行处理; - g.会话管理
web服务器管理客户的会话是为每个会话分配一个会话ID,如果攻击者获得或者猜测出验证的ID那么就可以欺骗web服务器。
- a.信息收集
- web应用安全原则
分析web站点的架构;
加密有助于web站点输入/输出操作的安全;
当错误发生时,web站点被设计成可预测的行为和不泄密的方式;
考虑安全和用户友好性的平衡;
使用匿名安全方法实现安全保护通常是一种糊涂和无效的方法;
需要有安全的战略意识。
7、数据库管理
(1)数据库管理系统
数据库是以某种有意义的方式存储的数据的集合,它允许用户和应用程序在需要时访问、查看和更改数据。
数据库由能提供这些功能的软件管理。
任何类型的数据库都具备以下特征:
- 它不是将数据保存在网络中的几台不同服务器上,从而方便进行集中化管理
- 它的备份过程更容易
- 它提供事务处理持续化
- 它提供恢复和容错
- 它允许多个用户共享数据
- 它提供安全控制,以实现完整性检查、访问控制和必要的机密性级别
最关注完整性,其次是可用性,最后是保密性。
元数据(metadata):
- 本质是有关数据的数据;
- 有关数据源定义、目标定义,转换规则等相关的关键数据。
数据库管理系统(DBMS)的特点:
- 数据一致性,操作必须遵守每个数据库的完整性策略,完成交易数据保持一致
- 数据共享,同一时刻可以有多个用户访问数据库,借助并发控制
- 数据恢复,若发生错误或系统崩溃,系统可以恢复。检查在系统崩溃时候正在处理的交易取消更改,或者回滚至前一次完成交易的保存点,维护数据的一致性。检查点是一种常见的恢复技术,它与保存点非常类似,当数据库软件占用了一定的内存空间时,检查点开始工作,它会将内存中的数据保存到一个临时文件中。
- 安全控制,提供各种安全控制限制用户访问
- 确保有效途径或过程,压缩(检索数据并节省存储空间和I/O的能力)、重组(回收不用的空间)、重构(添加和改变用户记录、数据、访问控制、磁盘配置、处理方法的能力)
(2)数据库模型
数据库模型不仅提供了一个使用概念化形式表示数据的正式方法,还提供数据库中存储的数据的必要操作方式。数据库模型有关系数据库模型、层次数据库模型、网络数据库模型、面向对象的数据库模型、对象-关系数据库模型。
- 层次数据模型
逻辑树结构,由在逻辑树结构中相关联的记录和字段组成;
树形结构包含许多分支,每个分支又具有许多叶子或数据字段;
访问需要明确路径,不适合经常更改,适合于经常性查询;
是人们最开始创建的数据库模型之一;
示例:轻量级目录访问协议LDAP、注册表结构。 - 网状数据模型
用有向图表示实体类型及实体间联系;
类似于网状的冗余结构,非严格树形结构;
每个数据元素拥有多个父节点和子节点;
与层次模型相比检索速度更快。 - 关系数据库模型
- 使用属性(列)和元组(行)来包含和组织信息,关系数据库模型是今天使用最广泛的模型;
一个关系数据库模型由若干个二维表组成,每个表都包含独特的行、列和存储单元(行和列的交汇点);
主键是将一条记录内的所有数据与某个独特值相链接的字段,当一个应用程序或其他记录引用这个主键时,实际引用的是指定行内的所有数据;
外键是一个表中的某个属性,与其他表的主键相关联; - 关系数据库语言:
数据定义语言(DDL,定义数据库的结构和模式、访问操作和完整性过程。
例如CREATE、DROP、ALTER等语句。)、数据库操作语言(DML,包含使用户能查看、操作和使用数据库的所有命令,例如view、add、modify、sort、select查询、update修改、insert插入和delete删除命令。)、查询语言(QL,使用户可对数据库提出查询请求。)、数据控制语言(DCL,例如GRANT、REVOKE等语句)、事物控制语句(TCL,例如COMMIT、ROLLBACK等语句) - 关系完整性(RDBMS):
语义完整性(semantic integrity),保证结构化规则和语义规则得到遵循;
参考(引用)完整性(referential integrity),所有外键都参考现有的主键,应通过某种机制确保没有外键引用不存在的记录的主键或者空值;
实体完整性(entity integrity),保证元组由主键值唯一确定。 - 数据字典:
是一种描述数据元素及其关系的中心库,可存储数据用法、数据关系、数据来源和数据格式等关键信息;
数据字典是一个空值数据库数据的集中管理部分,描述了数据元素和数据库间的交叉引用;
描述数据元素、模式对象和引用键的集合;
模式对象包括表、视图、索引、过程、函数和触发器;
数据管理软件读取数据字典,以查明所存在的模式对象,并检查特定用户进程的访问权限,还定义了对每个用户的视图权限设置;
需要增加新纪录、表、视图或模式时,更新数据字典。
- 使用属性(列)和元组(行)来包含和组织信息,关系数据库模型是今天使用最广泛的模型;
- 面向对象数据库模型
将面向对象编程中的对象数据模型与DBMS结合在一起;
可设计为管理不同类型的数据(图像、语言、文档和视频等),比关系数据库更具动态性;
面向对象的数据库使用类来定义其对象的属性和过程;
建立这种模型的目的在于突破关系数据库在保存和处理大量数据时所遇到的限制;
面向对象数据库并不依赖SQL进行交互,因此非SQL客户端的应用程序也可以使用这种数据库。 - 对象-关系数据库模型
是一种具有以面向对象编程语言编写的软件前端的关系数据库。
(3)数据库编程接口
如果不能访问和处理数据,那么数据就没有用处。应用程序不仅需要与存储在数据库中的数据交互,还需要某种接口和通信机制。
- 开放数据库连接(ODBC)
一个应用编程接口(API),允许应用程序与本地或远程的数据库通信。 - 对象链接和嵌入数据库(OLEDB)
作为中间件运行在客户端或服务器上,将数据分成多个组成部分。它提供一个底层接口,以链接不同数据库的数据以及提供对不同位置或不同格式数据的访问。
OLEDB以COM为基础因此限于Windows的客户端工具使用。 - ActiveX数据对象(ADO)
一个允许应用程序访问后端数据库系统的API。它是一组ODBC接口的集合,使用可访问对象来展示数据来源的功能。 - Java数据库互连(JDBC)
是一个允许Java应用程序与数据库通信的API。
(4)数据库漏洞与威胁
- 完整性
回滚,终止当前事务,取消更改,恢复前一状态。
提交,终止当前事务,执行用户进行的修改,如果不能执行成功则回滚。
保存点/检查点,如果检查到错误,用户可以返回相应的位置。
应对并发操作的威胁使用锁机制 。 - 聚合
一些信息片段分开时并不敏感,聚合在一起就敏感。
解决方法:严格控制聚合函数的访问;禁止用户直接访问数据,可以通过视图的方式。 - 推理
推理是聚合想要达到的效果。
解决方法:单元抑制,用于隐藏特定单元的技术;数据库分割,将数据库分割成不同的部分;噪声和扰动,在数据库插入伪造信息的技术;数据库视图;多实例,建议具有相同主键的多个元组和由安全级别定义的实例之间的关系。 - 死锁
(5)数据库安全
- 安全应用程序依赖安全数据库来提供支持业务运营所需的内容和事务处理。关系数据库构成了大多数现代应用程序的核心。保护这些数据库不仅仅保护它们免受SQL注入攻击,网络安全专业人员应该对安全数据库管理实践有深入的了解。
- 参数化查询和存储过程
参数化查询:
参数化查询提供了另一种保护应用程序免受注入攻击的技术。在参数化查询中,开发人员准备了一个SQL语句,然后允许将用户输入作为精心定义的变量传递到该语句中,不允许插入代码。不同的编程语言具有不同的功能来执行此任务。例如,Java使用PreparedStatement()函数,而PHP使用bindParam()函数。
存储过程:
存储过程和参数化查询的工作方式类似,主要区别于存储过程的SQL代码不包含在应用程序中,而是存储在数据库服务器上。客户端不直接向数据库服务器发送SQL代码,而是发送参数,然后服务器将这些参数插入到预编译的查询模板中。这种方法可以防止SQL注入攻击,还可以提高数据库性能。 - 混淆和伪装
在数据库中维护敏感的个人信息会使组织面临信息被攻击者窃取的风险。数据库管理员应采取以下措施来防止数据泄漏:
数据最小化,数据最小化是最好的防御,组织不应该收集他们不需要的敏感信息,并且应在合法业务目的不需要时立即处置他们收集的任何敏感信息。
令牌化,使用查找表将可能直接揭示个人身份的个人标识符替换成唯一标识符。
使用散列,散列使用加密散列函数将敏感标识符替换成不可逆的替代标识符。对口令进行散列之前用随机数对其进行加盐,能够抵抗彩虹表攻击。
(6)联机事务处理(OLTP,用于集群数据库以提供容错和高性能)
ACID原则
- 原子性(Atomicity):要么所有修改都提交,要么数据库回滚
- 一致性(Consistency):遵循数据库完整性,保证不同数据库中数据的一致性
- 隔离性(Isolation):交易之间互不影响
- 持久性(Durability0):一旦提交无法进行回滚
(7)联机分析处理(OLAO)
- OLAP是数据仓库系统的主要应用
- 适用于决策人员和高级管理人员
(7)数据仓库和数据挖掘
- 数据仓库:指的是为了信息检索和数据分析,将多个数据库或数据源组成一个大的数据库。来自不同的数据库的数据被提取和传输到一个称为仓库的中央数据存储设备。数据将被范式化,这意味着冗余信息被去除,并且数据以数据仓库期望的方式被范式化。
- 数据挖掘:是对数据仓库中的数据进行进一步处理以得到更多有用信息的过程。
(8)NoSQL
- 泛指非关系型数据库,它们不保证关系数据的ACID原则特性。
- 随着数据库技术的发展,许多组织在需要提高速度或数据不能很好的适应表格形式的情况下正在放弃关系模型。
NoSQL数据库是一种使用关系数据库模型以外的模型来存储数据的数据库。 - 有许多不同类型的NoSQL数据库,例如:
键/值存储:可能是最简单的数据库形式。它们将信息存储在键值对中,其中键本质上是一个索引,用于唯一标识一条记录,它由一个数据值组成。键值存储对于高速应用程序和非常大的数据集很有用,在这些应用程序中如果使用关系模型的严格结构需要大量的且有可能是不必要的开销。
图形数据库:以图形格式存储数据,使用节点表示对象,使用边表示关系。它们可用于表示任何类型的网络,例如社交网络、地理位置和其他适合图形表示的数据集。
文档存储:类似于键值存储,因为它们使用键存储信息,但它们存储的信息类型通常比键值存储中的信息类型更复杂,并且以文档的形式存在。文档存储中使用的常见类型包括 XML 和 JSON。 - NoSQL数据库使用的安全模型对比关系数据库使用的安全模型有很大不同。使用此技术的安全专业人员应该熟悉他们使用的解决方案的安全功能,并在设计安全控制时咨询数据库团队。
8、恶意软件(代码)
(1)恶意软件的组件
恶意软件一般有6个主要的组件,虽然这些组件不一定全部出现:
- 插入:在受害系统中安装自身
- 躲避:使用各种方法避免被检测出来
- 清除:在执行负载后删除自身
- 复制:复制自身并传播到其他受害系统中
- 触发:利用一个事件开始执行负载
- 负载:执行它的功能(如删除文件、安装后门、利用脆弱性等)
(2)病毒病毒是可感染应用程序的一个小程序或一串代码。病毒的主要功能是复制,它需要借助一个宿主应用程序来进行复制。
- 宏病毒:
宏(macro)是使用Visual Basic编写的程序,通常应用在Microsoft Office产品中,宏自动执行用户需要的不同任务。宏病毒是使用这些编程语言中的一种而编写的与平台无关的病毒,它们可感染模板并在文档中复制。 - 引导区病毒:
可以删除引导区内的数据或者以新的信息重写引导区。 - 压缩病毒:
自身附加在可执行程序上,并使用用户的权限进行压缩。 - 隐蔽性病毒:
隐藏它对文件和引导记录所做的修改。 - 变形病毒:
制作变化的,但仍然可用的自身副本,通过噪声或伪造指令来改变指令与其他有用指令的顺序,它们也使用变异引擎和随机数生成器来改变指令顺序,以躲避检测。 - 分体病毒:
同时感染硬盘引导区和可执行文件。 - 自乱病毒:
通过打乱自身代码来躲避防病毒软件检测。 - 脚本病毒:
脚本是由解释器执行的文件,一度非常流行。 - 隧道病毒:
将自己安装在防病毒程序下,杀毒软件检测病毒时,拦截这个调用。
(3)蠕虫
蠕虫不同于病毒,因为它不需要宿主程序就可以进行自我复制,是一种独立的病毒程序。通过邮件、web站点下载等方式传播。
(4)僵尸网络
僵尸程序(bot)是一种类型的恶意软件,它是完成作者意图的一段隐藏的代码。一旦bot被加载到受害者系统上,该bot可以登录到IRC服务器或被编码的web服务器开展通信,通常发送一条消息表明已成功入侵。它通常处于休眠状态,等待激活指令。僵尸网络可用于垃圾邮件、蛮力破解和DDOS攻击、点击攻击、fast flux技术和传播非法材料。
(5)特洛伊木马
一种伪装成另外一种程序的程序。
(6)rootkit
rootkit仅是一组被放在受感染系统中的工具,一旦加载rootkit,攻击者就可以利用这些工具攻击系统或链接到任何想要的链接。
(7)逻辑炸弹
特定事件发生时,逻辑炸弹被执行。
(8)勒索病毒
- 勒索病毒是一种将密码学武器化的恶意软件。
在通过许多其他类型的恶意软件感染受害者系统后,勒索软件会生成一个只有勒索软件作者知道的加密密钥,并使用该密钥加密受害者系统硬盘驱动器和任何已安装驱动器的文件。
这种加密使得除攻击者以外没有任何人可以访问被加密的数据。
然后向用户显示一条信息,告诉他们的数据已经被加密,需要在指定时间支付赎金等。 - 除了围绕赎金支付的道德问题以外,还有严重的法律问题。2020年美国财政部外国资产控制办公室(OFAC)发布向勒索软件作者支付赎金是非法的。
(9)恶意脚本
- 技术人员通过脚本的自动化来提高工作效率和效果。
- 不幸的是,同样的脚本技术可用于提高恶意行为者的效率。特别是APT组织经常利用脚本来自动执行恶意活动的例行部分。
- 恶意脚本常被列入无文件恶意软件这一类别。这些无文件攻击从不将文件写入磁盘,从而更难被检测。
9、恶意软件的预防
(1)防病毒软件
- 特征性检测法:
也称指纹检测,它对新出现的威胁的响应时间有所延迟。 - 启发式检测:
这种方法会分析恶意代码的总体结构,评估编程指令和逻辑功能,并研究病毒或蠕虫内的数据类型。 - 免疫程序:
针对某种病毒,使其认为已被感染。 - 行为阻止器:
检测出潜在的恶意活动后,防病毒程序可以阻止相应的软件并向用户发出报警信息。
新一代的行为阻止器在确定系统被感染之前会首先分析这些操作序列。
(2)完整性监控文件完整性监控工具也提供辅助防病毒功能。这些工具旨在提醒管理员注意未经授权的文件修改。这些系统通过为存储在系统上的所有文件维护哈希值数据库来工作。通过比较以检测出相关修改过的任何文件。
(3)高级威胁防护
- 端点检测与响应(EDR):
超越了传统的反恶意软件保护,有助于端点免受攻击。它们将传统防病毒软件包中的反恶意软件功能与旨在更好的检测威胁并采取措施的先进技术相结合。 - EDR的一些具体功能:
分析端点内存、文件系统和网络活动以寻找恶意活动的迹象;
自动隔离可能的恶意活动以遏制潜在的损害;
与威胁情报源集成,实时了解互联网上其他地方的恶意行为;
与其他事件响应机制集成以自动化响应工作。 - MDR:
许多安全供应商将EDR功能作为托管服务提供,这些托管EDR产品称为托管检测与响应(MDR)服务。 - UEBA:
此外用户和实体行为分析(UEBA)特别关注端点和其他设备上基于用户的活动,UEBA分析重点是用户,EDR分析重点是端点。 - 下一代端点保护工具:
通常包括传统反恶意软件保护、文件完整性监控、端点检测与响应、用户和实体行为分析的模块。
10、密码攻击
(1)密码猜测攻击
(2)字典攻击
(3)社会工程
- 网络钓鱼(phishing):
鱼叉式钓鱼(预先有针对性的信息收集和调研,更容易成功)
捕鲸(Whaling,针对高级管理层的鱼叉式攻击)
Vishing(使用语言电话的钓鱼攻击) - 垃圾搜寻
- 肩窥
- 密码嗅探:捕获计算机之间发送的密码
11、应用程序攻击
(1)缓冲区溢出(buffer overflows)
- 开发人员未正确验证用户输入以确保其大小合适时,就会存在缓冲区溢出漏洞。
太大的输入会“溢出”数据结构,从而影响存在在计算机内存中的其他数据。 - 对策
输入验证,良好的编程实践和开发教育,自动化扫描源代码,增强编程库,采用强语言类型不允许缓冲区溢出。
(2)TOC/TOU
- 竞态条件
在电路设计、软件开发、系统构建中,如果一个模块的输出与多个不可控事件发生的先后时间相关,则称这种现象为“竞争条件”(Race condition),又称“竞争冒险”(race hazard)。 - 从计算机安全考虑,许多竞争条件都会产生漏洞——攻击者通过访问/竞争共享资源,从而使利用该资源的其他参与者出现故障,导致包括拒绝服务和违法权限提升等后果。而一种常见的起因就是代码先检查某个前置条件(例如认证),然后基于这个前置条件进行某项操作,但是在检查和操作的时间间隔内条件却可能被改变,如果代码的操作与安全相关,那么就很可能产生漏洞。这种安全问题也被称做TOCTTOU(time of check and the time of use)。
(3)Trapdoor / Backdoor(陷门/后门)
如果一个登陆处理系统允许一个特定的用户识别码,通过该识别码可以绕过通常的口令检查,直观的理解就是可以通过一个特殊的用户名和密码登陆进行修改等操作。这种安全危险称为陷门。
12、其他攻击
(1)伪装攻击
- IP欺骗:
攻击者不想让其他人指定自己的真实IP地址,从而改变数据包IP地址,使其指向另一个地址。
应对措施:具有内部(外部)源IP地址的包不能从外部(内部)进入网络(流出)。 - 会话劫持:
中途拦截已授权用户与资源之间的通信数据,使用劫持技术接管会话,并伪装成授权用户的身份。
(2)salami攻击
攻击者实施几个小型的犯罪,希望它们结合起来的较大犯罪不会引起人们的注意。
(3)数据欺骗
内部人员在输入数据时做了手脚。