导图社区 软件开发安全
这是一篇关于软件开发安全的思维导图,包含创建数据库和数据仓储、存储器威胁、理解基于知识的系统、恶意软件等。
编辑于2024-02-22 13:31:52软件开发安全
系统开发控制概述
为防范这些漏洞,有必要在系统开发生命周期内引入安全控制。有组织、有条理的过程 有助千确保解决方案满足功能需求以及安全规范。制订解决方案的信息安全专业人员应重点关注安全性
软件开发
编程语言
某些语言(例如 C 、 Java 和 FORTRAN)是编译型语言。使用编译型语言时,编程人员使用称为编译器的工具将高级语言的源码转换成在特定操作系统中使用的可执行文件。可执行文件随后被分发给最终用户,最终用户在合适时使用这些文件。一般而言,用户不能查看或更改可执行文件中的指令。然而,逆向工程领域的专业人员可以借助反编译器和反汇编器来逆转编译过程。反编译器尝试将二进制可执行文件转换回源代码形式,而反汇编器则尝试将其转换成汇编语言(编译过程中的中间步骤)。当你分析恶意软件或竞争情报,并且试图在无法访问源码的情况下确定可执行文件的工作方式时,这些工具尤其有用。代码保护技术寻求通过各种技术来防止或阻止反编译器和反汇编器的使用。例如,模糊处理技术试图修改可执行文件,以增加从中检索可理解代码的难度。
库
开发人员通常依赖于包含可重用代码的共亨软件库。这些库包含各种功能,从文本操作 到机器学习,应有尽有,因而可以有效提高开发人员的工作效率。毕竟,当你可以使用标准的排序库进行排序时,就不需要自己动手再写一遍了。
共享库问题
Heartbleed 漏洞 (CVE-2014-0160)
为了防止类似的漏洞,开发人员应该知道他们使用的共享代码的来源,并随时了解这些库中出现的安全漏洞。这并不意味着共享库本质上是坏的。事实上,很难想象一个没有广泛使用共享库的世界。我们只是呼吁软件开发人员和网络安全专业人员保持警惕和关注。
面向对象编程
消息
消息是对象的通信或输入。
方法
方法是定义对象执行响应消息操作的内部代码。
行为
由对象呈现的结果或输出是一种行为。行为是通过方法处理消息的结果。
类
定义对象行为的一组对象的公共方法的集合就是类。
实例
对象是包含对象方法的类的实例或例子。
继承
某个类(父类或超类)的方法被另一个子类继承时就会出现继承性。
委托
托是指某个对象将请求转发给另一个对象或委托对象。如果某个对象没有处理 特定消息的方法,就需要委托。
多态性
多态性是对象的特性,当外部条件变化时,多态性允许对象以不同的行为响应 相同的消息或方法。
内聚
内聚描述相同类中各方法的目的之间关系的强度。当所有方法都有相似的目的 时,就有了高内聚性,这是促进良好软件设计原则的理想条件。当类的方法具有低内聚性时,这表明系统设计得不好。
耦合
耦合是对象之间的交互级别。低耦合意味着较少的交互。因为对象更独立,所以 低耦合提供了更优的软件设计。低耦合更易千检测故障和更新。内聚程度较低的对象需要来自其他对象的大量帮助才能完成任务,并且具有高耦合的特点
保证
避免和抑制系统故障
无论开发团队的技术多么先进,其系统仍有可能在某个时间点出故障。在实施软件和硬 件控制时,应该为这类故障做好准备,确保系统能做出适当的响应。有多种方法可用来避免故障,包括使用输入验证和创建失效关闭或失效打开过程
输入验证
输入验证核实用户输入的值是否匹配程序员的期望,然后才允许进一步处理
输入验证通常应该在处理事务的服务器端进行。发送给用户浏览器的代码容易受到用户 的操纵,从而被轻易规避。
身份认证与会话管理
错误处理
记录
输入验证失败
身份认证尝试,尤其是失败的
访问控制失败
篡改尝试
使用无效或过期的会话令牌
操作系统或应用程序引发的异常
管理特权的使用
传输层安全(TLS)故障
加密错误
系统开发生命周期
1.概念定义
2.功能需求确定
3.控制规范制订
4.设计审查
5.编码
6.代码审查演练
7.系统测试审查
8.维护和变更管理
所有系统开发过程都包含一些相同的活动。虽然可能名称不尽相同,但是这些核心活动对千开发可靠、安全的系统来说都是必不可少的。
生命周期模型
瀑布模型
螺旋模型
敏捷软件开发
能力成熟度模型
Carnegie Mellon 大学的软件工程学院 (SEI) 提出的软件能力成熟度模型 (SoftwareCapability Maturity Model,缩写为 SW-CMM 、CMM 或 SCMM) ,主张所有从事软件开发的组织都将依次经历不同的成熟阶段。 SW-CMM 描述了支持软件过程成熟度的原则与惯例,该模型旨在通过将临时的、混乱的软件过程发展为成熟的、规范的软件过程,以帮助软件组织改善软件过程的成熟度和质量。SW-CMM 背后的理念是软件的质量依赖千其开发过程的质量。SW-CMM 没有明确地解决安全问题,但网络安全专业人员和软件开发人员有责任将安全需求糜成到软件开发工作中。
SW-CMM
初始级
可重复级
定义级
管理级
优化级
软件保证成熟度模型
软件保证成熟度模型(SAMM)是一个由开放式 Web 应用程序安全项目 (OWASP)维护的开源项目。它试图提供一个框架,将安全活动集成到软件开发和维护过程中,并为组织提供评估其成熟度的能力。
SAMM
治理
设计
实施
验证
运营
IDEAL模型
启动
诊断
建立
行动
学习
甘特图与PERT
甘特图是一种显示项目和调度之间随时间变化的相互关系的条形图,提供了帮助计划、 协调和跟踪项目中特定任务调度的图表说明
变更和配置管理
一旦软件被发布到生产环境,用户必然要求增加新功能,纠正漏洞,并对代码执行其他 变更。正像组织开发软件的严密过程一样,同样必须以有组织的方式管理所要求的变更。这些变更必须被集中记录,以支持将来的审计、调查、故障排除和分析需求
变更流程管理
请求控制
变更控制
发布控制
跟踪与控制
配置标识
配置控制
配置状态统计
配置审计
DevOps方法
DevOps 方法通过将这三种职能集中在一个运营模型中来解决这些问题。 DevOps 这个词是 Development(开发)和Operations(运营)的组合,表示这些职能必须剧合和合作才能满足业务需求
应用编程接口
为使这些跨站点功能正常工作,网站必须彼此交互。许多组织为了这个目标而提供应用 编程接口 (API) 。 API 允许应用程序开发人员绕过传统的网页,并通过功能调用直接与底层服务进行交互
发布状态
关注用户
取消关注的用户
喜欢/最喜欢的发布
软件测试
白盒测试
黑盒测试
灰盒测试
代码仓库
代码仓库提供了支持这些协作的几个重要功能。首先,它们充当开发人员存放源代码的 中心存储点。此外,代码仓库(如 GitHub 、Bitbucket 和 SourceForge)还提供版本控制、错误跟踪、Web 托管、发布管理和可支持软件开发的通信功能。代码仓库通常与流行的代码管理工具集成。例如git 工具在许多软件开发人员中很流行,并且与 GitHub 和其他仓库紧密集成。
服务水平协议
系统正常运行时间(如总运行时间的百分比)
最大连续停机时间(以秒、分钟等为单位)
高峰负荷
平均负荷
责任诊断
容灾切换时间(若冗余到位)
第三方软件采购
注意
当组织采用某种类型的软件时,无论它是 COTS 还是 OSS, 无论在本地还是云中运 行,都应该测试它们是否存在安全届洞。组织可以自行测试,也可以依赖供应商提 供的测试结果,和/或雇用笫三方进行独立测试。
创建数据库和数据仓储
数据库管理系统的体系结构
层次式数据库和分布式数据库
关系数据库
数据库事务
关系数据库事务都具有 4 个必需的特征:原子性(atomicity)、一致性(consistency)、隔离性(isolation) 以及持久性(durability) 。这些属性合称为 ACID 模型,这是数据库管理系统开发中的一个关键概念
多数据库的安全性
使用视图限制访问
并发性
丢失更新
脏数取
开放数据库的互连
开放数据库互连(open database connectivity, ODBC)是一种数据库特性,在不必分别针对交互的每种数据库类型直接进行编程的情况下,允许应用程序与不同类型的数据库通信。ODBC 扮演了应用程序和后端数据库驱动程序之间代理的角色,使应用程序编程人员能够更加自由地创建解决方案,而不必考虑后端具体的数据库系统
NoSQL
键值存储可能是最简单的数据库形式。它们在键/值对中存储信息,其中键本质上是 用千唯一标识记录的索引,该索引由数值组成。键/值存储适用千高速应用程序和非 常大的数据集,在这种情况下,关系模型的刚性结构将需要大量的(甚至不必要的) 开销。
图数据库存储图形格式的数据,其中用节点表示对象,用边缘表示关系。它们可用千 表示任何类型的网络,例如社交网络、地理位置和其他可用图形表示的数据集。
文档存储类似千键/值存储,因为它们使用键存储信息,但是它们存储的信息类型通 常比键/值存储的信息更复杂,并以文档形式存在。文档存储中常用的文档类型包括 XML 和 JSON
由千对数据库系统的依赖程度日益增加,信息安全专业人员必须确保其具备适当的安全控制,从而确保数据免受未授权的访问、篡改或破坏。接下来将讨论数据库管理系统(DBMS)的体系结构,包括不同的 DBMS 类型及特性。随后会讨论数据库安全注意事项,包括多实例、ODBC 、聚合、推理以及机器学习。
存储器威胁
无论正在使用哪类存储,都存在对存储资源的非法访问
如果管理员不实施恰当的文件系统访问控制,那么入侵者可能通过浏览文件系统发现敏感数据
隐蔽存储通道准许通过直接或间接地操纵共享存储介质,在两个分类级别之间传输敏感数据
理解基于知识的系统
专家系统
专家系统试图把人类在某个特殊学科累积的知识具体化,并以一致的方式将它们应用千未来的决策
机器学习
机器学习 (machine learning, ML)技术使用分析能力从数据集中发现知识,而不直接应用人类洞察力。机器学习的核心方法是允许计算机直接从数据中分析和学习,从而开发和更新活动模型
神经网络
在神经网络中,计算单元链用千尝试模仿人脑的生物学推理过程。在专家系统中,一系 列规则被存储在知识库中,而神经网络中则建立了互相插入和最终合计生成预期输出结果的计算决策长链。神经网络是机器学习技术的延伸,通常也被称为深度学习或认知系统。
恶意软件
恶意代码的来源
恶意软件开发的最新趋势是高级持续性威胁(APT)的兴起。APT 是富有经验的对手,通常拥有先进的技术和雄厚的资金。这些袭击者通常是军事单位、情报机构或隶属于政府机构的影子团体。
病毒
病毒传播技术
主引导记录病毒
主引导记录(master boot record, lVIBR)病毒是已知最早的病毒感染形 式。这些病毒攻击 MBR一可启动介质(如硬盘或 U 盘)上用于在计算机启动过程中加载操作系统的部分。由千 MBR 非常小(通常只有 512 字节),因此它装不下实现病毒传播和破坏功能所需的全部代码。为避开空间的限制,MBR 病毒将主要的代码保存在存储介质的其他部分。系统读取受感染的 MBR 时,病毒会引导系统读取并执行存储在其他地方的代码,从而将病毒载入内存,并可能触发病毒有效载荷的传递。
文件感染病毒
许多病毒感染不同类型的可执行文件,并且在操作系统执行这些文件时 被激活。在 Windows 系统上,文件感染病毒通常影响可执行文件和脚本,例如以. exe 、.com和msc 扩展名结尾的文件和脚本。文件感染病毒的传播程序可能只会稍微改动可执行程序的代码,从而植入病毒复制和破坏系统所需的技术。某些情况下,病毒实际上可能用玻感染的版本替换整个文件。标准的文件感染病毒没有使用隐形或加密等技术(参见本章稍后的“病毒技术”部分),通过比较感染前后的文件(如大小和修改日期)或哈希值,通常可以轻易查出这种病毒。
宏病毒
一些应用程序为了自动执行重复任务而实施了某些脚本功能
服务注入病毒
最近爆发的恶意代码使用另一种感染系统并逃脱检测的技术一将自己注入可信的操作系统运行进程中,如 svchost.exe 、winlogon.exe 和 explorer.exe。通过破坏这些可信进程,恶意代码可绕过主机上运行的反病毒软件的检侧。让系统免受服务注入病毒的 最佳技术是确保为浏览 Web 内容的所有软件(如浏览器、媒体播放器、帮助程序)打上最新的安全补丁。
病毒技术
复合病毒
隐形病毒
多态病毒
加密病毒
病毒恶作剧
社交媒体形势的变化仅仅改变了恶作剧流传的方式。除了电子邮件外,恶意软件恶作剧 现在主要通过 Facebook 、Twitter 、WhatsApp 、Snapchat 和其他社交媒体和消息平台传播。
逻辑炸弹
逻辑炸弹是感染系统并且在满足一个或多个条件(如时间、程序启动、 Web 站点登录、某些按键等)前保持休眠状态的恶意代码对象。大多数逻辑炸弹都由软件开发人员植入用户定制的应用程序中,这些开发人员的目的是在被突然解雇时破坏公司的工作。
特洛伊木马
逻辑炸弹是感染系统并且在满足一个或多个条件(如时间、程序启动、 Web 站点登录、某些按键等)前保持休眠状态的恶意代码对象。大多数逻辑炸弹都由软件开发人员植入用户定制的应用程序中,这些开发人员的目的是在被突然解雇时破坏公司的工作。
蠕虫
蠕虫给网络安全带来了重大风险。它们和其他恶意代码对象有相同的破坏潜力,并且另 有变化一一不需要人为干预就可以传播它们自己。
Code Red 蠕虫
RTM 与互联网蠕虫
震网病毒
间谍软件与广告软件
佪谍软件和广告软件都属于潜在有害程序(PUP),用户可能会同意将此类软件安装在其系统上,然后,这些软件在背地里执行用户不希望或未授权的功能。
勒索软件
勒索软件是一种利用加密技术的恶意软件。它感染系统所用的技术和其他类型的恶意软 件采用的技术大多相同,然后,勒索软件生成一个只有勒索软件作者知道的加密密钥,并使用该密钥加密系统硬盘和任何已安装的驱动器上的关键文件。加密使授权用户或恶意软件作者以外的任何人都无法访问数据。
恶意脚本
恶意脚本通常也存在千一类名为“无文件恶意软件”的软件中。这些无文件攻击从不将 文件写入磁盘,使其更难被检测到。例如,用户可能在网络钓鱼浩息中收到恶意链接,该链接可能利用浏贤器漏洞执行只在内存中下载和运行 PowerShell 脚本的代码,从而触发恶意负载。因为没有数据被写入磁盘,所以依赖于磁盘活动检测的反恶意软件控件通常不会注意到这种攻击。
零日攻击
许多形式的恶意代码利用了零日 (zero-day)漏洞(黑客发现的还没有被安全社区彻底修复的安全漏洞
从攻击者发现新型恶意代码,到安全社区发布补丁和反病毒库更新,期间必然存在延迟。这被称为脆弱性窗口。
系统管理员应用更新的速度缓慢。
恶意软件预防
易受恶意软件攻击的平台
反恶意软件
如果检测到病毒,防病毒软件将执行以下操作之一:
如果该软件能够根除病毒,它将处理受影响的文件,并将机器恢复到安全状态。
如果软件识别出病毒,但不知道如何处理被照染的文件,它可能会隔离这些文件,直 到用户或管理员手动处理它们。
如果安全设置/策略未提供隔离,或者文件超出了预定义的危险阙值,防病毒软件可 能会删除受感染的文件,以保持系统的完整性。
反恶意软件还包括集中式监视和控制功能,管理员可以从集中控制台强制执行配置设置 和监控警报。这可以通过反恶意软件供应商提供的独立控制台来完成,也可以作为更广泛的安全监控和管理解决方案的集成组件来完成。
完整性监控
这些工具旨在提醒管理员文件可能遭到了未经授权的修改。它通常用千检测网页篡改和类似的攻击,但如果关键的系统可执行文件(如 command.com)被意外修改,它也可能提供一些有关病毒感染的警告
高级威胁保护
端点检测和响应(EDR)包超越了传统的反恶意软件防护方案,帮助端点抵御攻击。它们 将传统防病毒软件中的反恶意软件功能与旨在更好地检测威胁并采取措施消除威胁的先进技术相结合
分析端点内存、文件系统和网络活动是否存在恶意活动迹象
自动隔离可能的恶意活动以控制潜在损害
与威胁情报源集成,以实时了解互联网其他地方的恶意行为
与其他事件响应机制集成以自动化响应工作
应用程序攻击
缓冲区溢出
当开发人员没有正确验证用户的输入以确保用户输入适当大小的内容时,就会存在缓冲 区溢出漏洞。输入太多而“溢出“原有的缓冲区,就会覆盖内存中相邻的其他数据。
检查时间到使用时间
计算机系统以严格的精度执行任务。计算机擅长可重复的任务。攻击者可以根据任务执行的可预测性发起攻击
后门
后门是没有被记录到文档中的指令序列,它们允许软件开发人员绕过正常的访问限制。 在开发和调试过程中,后门常用于加快工作流程,以免系统不断要求开发人员进行身份认证。有时,开发人员在系统上线后仍选择保留这些后门,这样,他们既可以在出现意外故障时使用它们,也可以“偷看”系统中正在处理但他们没有访问权限的敏感数据。除了开发人员植入的后门外,许多恶意代码感染系统后也会留后门,以允许恶意代码的开发者远程访问受感染的系统。
特权提升和rootkit
攻击者一旦在系统上站稳脚跟,通常会迅速向第二个目标迈进—计各他们的访问权限从 普通账号提升为管理员账号。他们通过特权提升攻击来实现此目标。
系统管理员可采用简单预防措施来帮助他们的系统抵御特权提升攻击,这其实并不新鲜。系统管理员必须关注厂商针对操作系统发布的最新补丁,并持续应用这些补救措施。这一简单方法将使网络更有能力应对几乎所有 rootkit 攻击和许多其他潜在的漏洞。
注入漏洞
SQL注入攻击
基于内容的盲注
基千计时的盲注
攻击者向 Web 应用程序提供输入,然后监视该应用程序的输出以查看结果
代码注入攻击
SQL 注入攻击是代码注入攻击一般类别中的具体示例。这些攻击试图将攻击者编写的代码插入 Web 应用程序开发人员创建的合法代码中。任何将用户提供的输入插入应用程序开发人员编写的代码中的环境都可能受到代码注入攻击。
命令注入攻击
在某些情况下,应用程序代码可能返回到操作系统以执行命令。这尤其危险,因为攻击 者可能会利用应用程序中的漏洞进行攻击,从而获得直接操纵操作系统的能力
利用授权漏洞
不安全的直接对象引用
如果应用程序不执行授权验证,用户则可能查看超出其权限的信息
目录遍历
某些 Web 服务器存在安全配置错误,允许用户浏览目录结构并访问本应保密的文件。当Web 服务器允许包含导航目录路径的操作符,并且文件系统访问控制未正确限制对存储在服务器上其他位置的文件的访问时,目录遍历攻击就会起作用。
文件包含
文件包含攻击将目录遍历提升到下一个级别。文件包含攻击不是简单地从本地操作系统 检索文件并将其显示给攻击者,而是实际执行文件中包含的代码,从而使攻击者能够欺骗Web 服务器执行其目标代码。
利用Web应用程序漏洞
跨站脚本
当 Web 应用程序允许攻击者执行 HTML 注入,将他们自己的 HTML 代码插入网页时,就会发生跨站脚本(cross-site scripting, XSS)攻击。
反射 XSS
存储/持续 XSS
请求伪造
跨站请求伪造
服务器端请求伪造
请求伪造攻击利用信任关系,并试图让用户无意中对远程服务器执行命令。它们有两种 形式:跨站请求伪造(cross-site request forgery, CSRF)和服务器端请求伪造(server-side requestforgery,SSRF)
会话劫持
当恶意的个人拦截授权用户和资源之间的部分通信,然后使用劫持技术接管会话并假冒 授权用户的身份时,即发生了会话劫持攻击
应用程序安全控制
输入验证
允许用户输入的应用程序应该对输入进行验证,以降低其包含攻击的可能性。不正确的输入处理方法会使应用程序遭受注入攻击、跨站点脚本攻击和其他类型的攻击。
Web应用程序防火墙
Web 应用程序防火墙(WAF)在确保 Web 应用程序免受攻击方面也发挥着重要作用。开发人员必须建立强大的应用程序级防御措施,如输入验证、转义输入和参数化查询,以保护其应用程序,但现实情况是,应用程序有时仍然包含注入缺陷。当开发人员测试不足或供应商没有及时向易受攻击的应用程序提供补丁时,可能会发生这种清况。
数据库安全
安全应用程序需要安全数据库提供必要的内容和事务处理以支持业务运营。关系数据库是大多数现代应用程序的核心,对这些数据库的保护并非仅限千使它们免受 SQL 注入攻击。
代码安全
代码签名
代码签名为开发人员提供了一种向最终用户确认其代码真实性的方法
代码重用
许多组织不仅在内部重用代码,而且会以使用第三方软件库和软件开发工具包(SDK) 的 方式重用代码。第三方软件库是开发人员共享代码的一种常见方式
软件多样性
安全专业人员致力千避免其环境中的单点故障,以免单个组件出现问题时影响可用性。
代码仓库
代码仓库是用于存储和管理应用程序源代码的集中位置。代码仓库的主要目的是将软件 开发中使用的源文件存储在一个集中的位置,以便安全存储和协调多个开发人员做出的更改。
完整性度量
代码仓库是应用程序安全性的重要组成部分,但只是代码管理的一个方面。网络安全团 队还应与开发人员和运营团队合作,确保通过组织批准的发布管理流程,以安全的方式提供和撤销应用程序。
应用程序韧性
安全编码实践
源代码注释
注释是优秀开发人员工作流桯的重要组成部分。它们战略性地贯穿于整个代码,记录各 种设计选项,解释工作流程,并给其他开发人员提供至关重要的细节,这些开发人员随后可能会被要求修改代码或排查代码中的问题。当注释被正确使用时,它是至关重要的
错误处理
攻击者利用代码中的错误进行攻击。开发人员必须认识到这一点,在编写代码时,使它 能够应对攻击者为了测试代码的边界而创造的意外情况
硬编码凭证
硬编码凭证的第二种变体发生在开发人员使其源代码包含其他服务的访问凭证时
内存管理
资源耗尽
指针解引用
应用程序通常负贞管理自己使用的内存,在这神情况下,槽糕的内存管理做法可能会破坏整个系统的安全性。