软件安全评估之设计评审入门(上)

基础概念

在软件开发生命周期(Software Development Life Cycle,简称SDLC)中,设计评审(Design Review)是一个关键的阶段,旨在确保软件设计满足项目需求和目标,并且能够高效、可靠地实现预期功能。

设计评审通常在需求分析和系统设计阶段之后进行,是软件开发过程中的一个重要质量保证活动。在设计评审阶段,项目团队会审查和评估软件设计文档,以确保设计满足所有业务和技术要求。

设计评审主要包含以下三个方面:

图片

软件设计基础原理

2.1    算法

软件工程是关于设计、开发算法和数据结构的实践,它强调逻辑性地解决问题。要确保系统安全,我们需要先理解系统的核心算法,并识别可能的安全风险。

2.1.1    业务逻辑

业务逻辑决定了程序处理数据时的规则。软件系统设计需整合执行关键任务的规则与流程。设计中需考虑对用户和资源的安全需求。

例如,具有以下业务逻辑规则的银行软件:

用户可将资金从主账户转账至任何有效账户。

用户可将资金从货币市场账户转账至任何有效账户。

用户每月仅限从货币市场账户转账一次。

若用户主账户余额为负,系统将自动从用户的货币市场账户中转出所需资金以补足余额,前提是该账户有足够资金。

上述例子虽然简单,但暴露了系统设计中的潜在漏洞:客户可能通过使主账户余额降至零以下,来规避货币市场账户每月转账的限制,从而获取额外资金。

2.1.2    关键算法

程序的性能需求对其算法和数据结构的选择具有决定性影响,这些选择直接关联到关键数据片段的管理效率。通过深入分析这些算法,我们可以预见潜在的安全风险,并提前采取措施加以防范。

以一个具体案例为例,假设一个程序使用有序链表来存储一系列记录,该链表支持基本的顺序搜索功能,单向链表的时间复杂度是O(n)。了解到这一点后,我们可以预测,如果面对一个经过特别设计的大量记录列表,程序在执行链表搜索时可能会消耗过多时间。针对这种关键算法的连续攻击,可能会对服务器的稳定性造成影响,进行拒绝服务攻击。合理的搜索算法应该是二分查找算法,其时间复杂度是O(logn)。

2.2    抽象分解

图片

抽象 是指从具体实例中提取共同特征,忽略不相关的细节,从而形成一个更高层次的概念或模型。在计算机科学中,抽象是一种常见的设计原则,它允许开发者专注于系统的核心功能,而不必关注底层的实现细节。例如,编程语言提供了高级抽象,使得程序员可以用更接近自然语言的代码来表达复杂的逻辑,而不必担心硬件层面的操作。

分解 是指将一个复杂的问题或系统分解成更小、更易于管理的部分。通过分解,可以逐个解决这些小问题,然后将解决方案组合起来,形成对原始大问题的解答。分解有助于提高问题解决的效率和质量,因为它使得问题更加具体,也更容易测试和验证。例如,在软件工程中,一个大型项目可能会被分解成多个子系统或模块,每个部分由不同的团队负责开发。这样,每个团队可以专注于自己的任务,同时保持整个项目的协调一致。

2.3    信任关系

在第 1 篇文章《软件漏洞基础》中,介绍了信任概念及其如何影响系统安全。本文进一步扩展这一概念,指出多方之间的每一次通信都必须有一定程度的信任与之相关,这被称为信任关系。对于简单的通信,双方可以假定完全信任,即每一方都拥有完全的信任。

在通信过程中,虽然各方可能提供了对其公开功能的全面访问权限,但为了确保安全性,应当更加关注如何适度地限制各方之间的信任程度。仅允许对对方功能的有限访问,确保每个功能点都受到适当的保护。这种对访问权限的限制,实际上构成了各方之间的信任边界,明确划分了信任域的范围。

信任域是一个共享的信任区域,它通过明确的信任边界来区分。

在软件设计的实践中,我们必须要对系统的信任域、边界和相互之间的关系进行深思熟虑。信任模型,作为一种抽象的代表,成为了应用程序安全策略的关键组成部分。这个模型不仅影响着系统的架构设计,而且通常建议信任应当是有限度的,而非绝对的。这种有限的信任体现在不同层级的权限设置上。

图片

例如,UNIX/Linux 文件系统提供了一套标准的权限管理机制,允许用户针对系统中的其他用户或组设置不同的文件访问权限(自主访问控制模型的一种)。通过这样的机制,文件所有者可以精确控制其他用户对特定文件的读取、写入或执行权限,从而在系统中建立起有限的信任关系。这种基于权限的控制方式,不仅增强了系统的安全性,也为用户提供了灵活的访问控制选项。

2.3.1    简单的信任边界

让我们以 Windows 98 这个经典的单用户操作系统为例,来探讨信任关系的概念。在这个系统里,一旦用户登录,他们就拥有了对整个系统的几乎完全控制权。这意味着,用户可以自由地修改任何文件和系统设置,没有内置的机制来限制他们的行为。因此,在这种环境下,我们不能期望普通用户之间会存在安全保障,因为他们本身就拥有系统的完全访问权限。

在这个例子中,信任边界实际上是关于谁可以物理接触到计算机硬件的问题。只有被授权的人才能使用系统,这就形成了一个由可信用户组成的内部圈子,而那些无法接触系统的人则构成了外部的不可信圈子。

现在,如果我们将场景转移到更先进的多用户操作系统,比如 Windows XP 专业版,情况就会变得更加复杂。在这个系统中,我们期望即使是拥有特权的用户也不能随意干扰其他用户的数据和进程。这种期望是建立在普通用户身份的基础上的,而不是管理员身份。因此,我们在不同用户之间建立了一种信任关系,他们之间存在一个界限,确保各自的数据和进程安全不受侵犯。同时,管理员账户则需要有额外的权限和责任。

这种多用户环境要求我们在用户之间设定明确的界限。如果没有这些界限,系统就会退化成单一用户操作系统的状态,任何用户都可以随意改变系统的状态。在多用户操作系统中,信任关系的图形表示可以帮助我们更清晰地理解这些界限。

图片

最终,我们需要认识到,每个系统都需要一个最终权威的、可以信赖的责任主体。无论是 UNIX/Linux 的 root 账户还是 Windows 的管理员账户,它们的存在是必要的,因为总得有人对系统的状态负责。虽然我们可以对这个最高级别的权限施加各种控制,但不可否认的是,在每个信任边界内,至少有一个拥有绝对权威的实体。这是确保系统有序运行和保障系统安全的基础。

2.3.2    复杂的信任关系

在网络环境中,系统不再是孤立的实体,而是成为了一个互联网络的一部分。这时,我们需要对不同类型的用户和访问者进行区分。例如,本地用户和远程用户可能需要不同的访问权限和安全级别。本地用户,即直接在系统上操作的用户,可能需要更多的权限来执行日常任务,而远程用户则可能受限于特定的服务和数据访问。

此外,网络中的其他实体,如服务和设备,也可能需要被纳入信任模型的考虑范围。防火墙和网关等安全设备在这里扮演着至关重要的角色,它们不仅保护系统免受外部威胁,还帮助定义和实施信任边界,确保只有经过验证和授权的流量才能进入系统。

在软件设计过程中,定义和应用一个有效的信任模型是至关重要的。这项工作应该在设计阶段之前就开始进行。在可行性研究和需求收集阶段,我们必须识别和定义用户对安全性的期望,以及目标环境中可能影响系统的各种因素。得出的模型需要足够强大,能够满足这些需求,同时又不能过于复杂,以免难以实施和维护。安全性的设计需要在保证清晰性和准确性的同时,找到适当的平衡点。

2.3.3    信任链

在第 1 篇文章中,我们讨论了传递信任的概念,这是一种重要的安全机制,它描述了组件之间的信任如何通过整个系统传递。具体来说,如果组件 A 信任组件 B,那么 A 也会间接地信任 B 所信任的所有其他组件。这种关系构成了一个信任链,它是许多系统安全性的基础。

图片

以安全套接字层(SSL)连接为例,我们可以看到一个实际的信任链是如何工作的。当你通过 SSL 连接访问一个网页服务器时,你的浏览器会使用一个本地的证书数据库来验证服务器证书的有效性。这个数据库包含了你信任的证书颁发机构(CA)。这些 CA 可能会颁发证书给其他的 CA,形成一个证书链,直到最终网站的证书具有证书链上的其中一个 CA 签名。为了验证这个连接的安全性,你的浏览器需要沿着这条从服务器证书到你信任的 CA 的信任链进行检查,只有当链条完整无缺,连接才被认为是安全的。

然而,这种信任链也存在潜在的弱点。如果攻击者能够操纵任何环节的证书数据库,无论是访问者的客户端证书数据库,还是目标网站,或者是信任链中的任何一个 CA 的数据库,包括根 CA,他们就能够伪装成任何网站。这是因为,信任链的传递性质意味着只要攻击者破坏了链条上的任何一个环节,他们就能够成功地模仿任何网站。即使那些颁发真实证书的 CA 没有受到损害,攻击者仍然可以利用由有效 CA 颁发的任何证书来进行攻击。这表明,SSL 交易的安全性实际上是由链条中最薄弱的环节决定的。

尽管传递信任链是一种广泛使用的机制,但它的复杂性和潜在的脆弱性需要我们进行仔细的审视。作为安全分析人员,需要深入分析这种信任模型的影响,确保信任链的设置是恰当的,并且要跟踪系统中所有组件之间的信任关系。这样,才能准确评估每个组件的暴露程度,并识别出可能被攻击者利用的复杂和微妙的信任关系。通过这种细致的分析,我们可以更好地保护系统,防止潜在的安全威胁。


 

2.3.4    纵深防御

纵深防御策略是一种综合性的安全方法,它通过在不同层次上部署保护措施来增强系统的安全性。这样,即使攻击者突破了一层防御,仍然有其他层次的安全措施来减轻可能的损害。这种策略的核心在于构建多重防线,确保安全性的全面覆盖。

在实施纵深防御时,一些基本的做法包括使用具有有限权限的账户来运行关键服务和后台进程,这样可以减少攻击者通过这些服务获得更高权限的机会。此外,将系统的不同功能分散到不同的硬件平台上,可以有效地隔离风险,防止单一故障导致整个系统的崩溃。

更高级的纵深防御措施可能涉及建立网络非军事区(DMZ),将对外提供服务的设备放置在一个受限制的子网中,从而保护内部网络不受直接的外部威胁。同时,在 UNIX/Linux 系统中使用 chroot 技术可以限制程序的运行环境,使其只能访问特定的文件和目录,从而降低潜在的安全风险。另外,通过实施栈和堆保护机制,如栈保护和地址随机化,可以有效地防止缓冲区溢出等常见的攻击手段。

在对系统组件进行安全审查时,考虑纵深防御的概念可以帮助我们合理地分配审查资源和确定优先级。例如,一个在内网中运行、使用低权限账户、处于 chroot 环境中、并且在编译时加入了缓冲区保护的组件,可能被认为是相对低风险的,因此可能被赋予较低的评审优先级。相反,一个需要以 root 权限运行、面向互联网的组件,因其潜在风险较高,可能需要更高的评审优先级。

需要注意的是,这并不意味着低风险组件就完全不需要关注,或者高风险组件一定存在问题。关键在于根据证据和风险评估来优先安排安全工作,确保我们的努力能够产生最大的正面影响。

作者:MMM

 2024年4月8日  

 洞源实验室

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/534495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GDAL源码剖析(九)之GDAL体系架构

GDAL源码剖析(九)之GDAL体系架构_gdal 源码-CSDN博客 在GDAL库中包含栅格数据的读写,矢量数据的读写,以及栅格和矢量数据的相关算法。下面主要对GDAL中栅格数据和矢量数据的体系架构做一个简单的说明。本人英文很烂,有…

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型。在当下数字化转型的热潮中,集装箱5G智能制造工厂数字孪生可视化平台成为了推动企业转型升级的重要工具。这一平台将先进的5G技术与智能制造相结合,通过数字孪生技术实现生产过程…

数字化赋能农业创新发展新篇章:数字乡村建设推动农业现代化、提升农业综合效益与竞争力

目录 一、数字乡村建设的内涵与意义 二、数字化赋能农业创新发展的路径 1、推动智慧农业发展 2、加强农村电子商务建设 3、提升农业信息化水平 三、数字乡村建设推动农业现代化与提升综合效益与竞争力 1、推动农业现代化进程 2、提升农业综合效益 3、增强农业竞争力 …

HTML5+CSS3+JS小实例:图片切换特效之模糊变清晰

实例:图片切换特效之模糊变清晰 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, i…

Windows搭建Jellyfin影音服务结合内网穿透实现公网访问本地视频文件

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

大势智慧在出模型时输入七参数可以导出地方坐标系吗?

大势智慧自主研发的网格大师或者DasViewer有坐标转换功能&#xff0c;可以使用七参数计算功能转换到地方坐标&#xff0c;直接输以前的七参是不行的&#xff0c;需要准备源坐标和目标坐标。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自…

【Unity】组件组合使用心得(单行可自动拓展Scroll View)

在这之前&#xff0c;一直是在使用Scroll View进行滑动内容设置&#xff0c;但设置的都是不明不白的&#xff0c;而且有的时候设置好了之后也不知道是为什么&#xff0c;总感觉哪里不对劲&#xff0c;而且好也不知道为什么好&#xff0c;可能是长时间在做管理上的内容&#xff…

淘宝详情API接口文档(java)get调用

淘宝详情API接口是用于获取淘宝商品详细信息的接口&#xff0c;它允许开发者通过发送请求&#xff0c;获取商品的描述、价格、评价等信息。下面是一个关于淘宝详情API接口的示例文档&#xff0c;包括接口地址、请求参数、响应参数等内容。 淘宝详情API接口文档 一、接口地址 …

Lobe UI - 基于 AntDesign 开发的 AIGC Web 应用的开源 UI 组件库

今天推荐一个可以快速开发 ChatGPT UI 界面的组件库&#xff0c;质量很高&#xff0c;拿来就能用。 Lobe UI 是由 lobehub 团队开发的一套 web UI 组件库&#xff0c;和我之前推荐的很多通用型的 UI 组件库不同&#xff0c;Lobe UI 是专门为目前火热的 AIGC 应用开发而打造&am…

分布式 SpringCloudAlibaba、Feign与RabbitMQ实现MySQL到ES数据同步

文章目录 ⛄引言一、思路分析⛅实现方式⚡框架选择 二、实现数据同步⌚需求分析⏰搭建环境⚡核心源码 三、测试四、源码获取⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助…

R语言绘制一次和二次相关性热图

在数据探索的过程中&#xff0c;我们往往会对数据与数据的相关性进行分析&#xff0c;例如我们常用的corrplot包&#xff0c;或者psych包中的corr.test函数&#xff0c;对两两变量间的相关性进行分析。我们常常会看到这样的相关性热图&#xff1a; 但有时变量间的关系并非线性…

在线课程平台LearnDash评测 – 最佳 WordPress LMS插件

在我的LearnDash评测中&#xff0c;我探索了流行的 WordPress LMS 插件&#xff0c;该插件以其用户友好的拖放课程构建器而闻名。我深入研究了各种功能&#xff0c;包括课程创建、测验、作业、滴灌内容、焦点模式、报告、分析和管理工具。 我的评测还讨论了套餐和定价选项&…

Linux基础指令补全,权限问题分析—3

一、命令补全&#xff1a; 1.bc指令&#xff1a; 功能&#xff1a;命令行计算器&#xff0c;使用quit退出语法&#xff1a;bc 算式 2.uname指令&#xff1a; 语法&#xff1a;uname 选项功能&#xff1a;uname原来获取电脑或操作系统的相关信息选项&#xff1a; ①-a选项&am…

深拷贝总结

JSON.parse(JSON.stringify(obj)) 这行代码的运行过程&#xff0c;就是利用 JSON.stringify 将js对象序列化&#xff08;JSON字符串&#xff09;&#xff0c;再使用JSON.parse来反序列化&#xff08;还原&#xff09;js对象&#xff1b;序列化的作用是存储和传输。&#xff08…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别&#xff1a;各目标检测算法评测 论文题目&#xff1a;Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码&#xff1a;https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验&#xff1a;…

【Canvas与艺术】椭圆形五星环绕Premium Quality标志

【关键点】 绘制此标志最难在星星之间间隔整齐&#xff0c;我目前用的是类似四心定位法&#xff0c;用四条圆弧去拟近一个椭圆&#xff0c;这种方法需要不断调试&#xff0c;比较费工。 【成品】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <me…

DCDC 5V2A电源升压芯片FP6276BXR-G1 FP6298XR-G1

一、FP6276BXR-G1 3.7v升5V2A同步升压输入电压:2.4V-4.5V FP6276B是一个具有PWM/PSM控制的电流模式增压直流-直流转换器。它的PWM电路内置40mΩ高侧开关和40mΩ低侧开关使该调节器高高效。内部补偿网络还将外部组件计数最小化到只有6个。一个内部的0.6V电压被连接到误差放大器…

你知道 Java 线程池的原理吗?

Java线程池是用于管理和复用线程的机制&#xff0c;它可以帮助开发者有效地管理线程的生命周期和资源&#xff0c;并提高应用程序的性能和稳定性。 1. 线程池概述 在计算机科学中&#xff0c;线程池是一种可用来执行异步任务的线程队列。它主要包含以下几个组成部分&#xff…

【YOLOv8】Yolov5和Yolov8网络结构的分析与对比

目录 一 YOLOv5 二 YOLOv8 yolo通常采用backbone-neck-head的网络结构。 Backbone 主要负责从输入图像中提取高层次的语义特征,常包含多个卷积层和池化层&#xff0c;构建了一个深层次的特征提取器。Neck通常用来进一步整合与调整backbone提取的特征&#xff0c;有利于将不同…

计算机网络——WEB服务器编程实验

实验目的 1. 处理一个 http 请求 2. 接收并解析 http 请求 3. 从服务器文件系统中获得被请求的文件 4. 创建一个包括被请求的文件的 http 响应信息 5. 直接发送该信息到客户端 具体内容 一、C 程序来实现 web 服务器功能。 二、用 HTML 语言编写两个 HTML文件&#xff0c;并…