13. 软件安全性测试
黑客、病毒、蠕虫、间谍软件、后门程序、木马、拒绝服务攻击等。
安全产品:指在系统的所有者或者管理员的控制下,保护用户信息的保密性、完整性、可获得性,以及处理资源的完整性和可获得性。
安全漏洞:产品不可行的缺陷,正确使用产品时来防止攻击者窃取系统的用户权限、调节操作、破坏数据、或建立未授权的信任。
13.3 威胁模式分析
找出产品可能会引起安全漏洞的地方
构建威胁模型分析小组:隔离安全威胁,设计解决方案。
确认价值:计算损失。
创建一个体系结构总体图:了解技术模块之间如何通讯。
记录威胁:每个威胁都必须用文档记录,并且应进行跟踪以确保其解决。
威胁等级评定:DREAD 公式
损害度(Damage Potential):指黑客或攻击者在成功利用漏洞后可能对系统、数据或用户造成的潜在损害程度。这包括数据泄露、服务中断、信息篡改等。
可重现性(Reproducibility):指攻击是否容易被复现,以及是否可以在多个环境或条件下进行复现。如果攻击容易被复现,那么它的威胁级别更高。
可利用性(Exploitability):指利用漏洞进行攻击的难易程度。如果漏洞易于被利用,那么应用程序的安全风险也就更高。
受影响的用户数(Affected Users):指受到潜在攻击的用户数量。如果攻击影响的用户数量较大,则安全风险相应增加。
发现时间(Discoverability):指攻击者发现漏洞并能够利用它的时间。如果漏洞很容易被攻击者发现,那么应用程序的安全性也就更低。
13.4 软件测试是一项功能还是缺陷
并不是非黑即白,主动添加是功能,主动测试是缺陷。
13.5 缓冲区溢出
使用没有正确声明和初始化的变量、常数、数组、字符串或记录引起的缺陷,缓冲区溢出就是这种缺陷。比如:声明字符串的大小,但实际存储大于声明,会导致多余字符溢出覆盖。
13.6 使用安全的字符串函数
每个函数接收目标缓冲的长度作为输入。
函数空字符中止所有的输入字符串,即使操作截断了预计的结果。
所有函数返回一个 NTSTATUS 值,该值只有一个可能成功的代码。
每个都提供版本,比如字符类型。
13.7 计算机取证
文件写入磁盘保存分区如下
以下是对上述软件安全性测试相关内容的一些补充说明和解释:
13.3威胁模式分析
- 构建威胁模型分析小组:小组通常应由具备不同专业知识的人员组成,包括安全专家、软件开发人员、系统管理员等。他们需要从不同角度审视产品,比如安全专家能从攻击手法和漏洞利用的角度出发,软件开发人员能深入了解软件内部架构和可能存在的风险点,系统管理员则能从实际运行和管理的角度提供见解,共同隔离安全威胁并设计出全面的解决方案。
- 确认价值 计算损失:要对系统中的各种资产进行评估,确定其价值,例如用户数据、业务流程、品牌声誉等。然后分析一旦这些资产受到安全威胁,可能带来的经济损失、业务影响、声誉损害等,以便更直观地了解安全漏洞可能造成的后果,为后续的应对策略提供依据。
- 创建一个体系结构总体图:通过图形化的方式展示软件系统的各个技术模块,以及它们之间的通信方式、数据流向等。这有助于清晰地呈现系统的架构,便于发现潜在的安全薄弱环节,例如哪些模块之间的通信可能存在风险,哪些数据在传输过程中容易受到攻击等。
- 记录威胁:对每个威胁都要详细记录其发现时间、威胁描述、可能影响的范围、当前状态等信息。通过跟踪这些记录,可以确保每个威胁都能得到及时处理,并且在处理后可以进行验证,确认威胁已被有效消除。
- 威胁等级评定(DREAD公式)
- 损害度(Damage Potential):损害程度可以从多个维度评估,如数据的敏感性和重要性,如果涉及到用户的金融信息、医疗记录等高度敏感数据,泄露后的损害度就极高;服务中断可能导致业务停顿,造成直接的经济损失和客户流失;信息篡改可能影响业务的正常运营和决策的准确性。
- 可重现性(Reproducibility):可重现性高的攻击意味着攻击者可以较为容易地反复利用该漏洞进行破坏,例如某个漏洞在特定的系统环境和操作步骤下总是能被触发,那么它的威胁性就更大,相比之下,那些只能在非常特殊、罕见的情况下才会出现的漏洞,可重现性低,威胁相对较小。
- 可利用性(Exploitability):如果漏洞利用不需要复杂的技术和工具,或者利用条件在常见的环境中容易满足,那么可利用性就高。例如,一个不需要用户特殊权限就能触发的漏洞,比需要管理员权限才能利用的漏洞更容易被攻击者利用,安全风险也就更高。
- 受影响的用户数(Affected Users):对于面向大量用户的软件,如社交媒体平台、在线支付系统等,一旦出现安全漏洞,受影响的用户数量可能非常庞大,会引发严重的安全事件;而一些仅供内部使用、用户数量有限的软件,在相同漏洞情况下,受影响的范围相对较小,但也不能忽视其安全风险。
- 发现时间(Discoverability):如果软件的漏洞具有明显的特征或者存在于容易被攻击者探测到的位置,那么发现时间就可能较短,威胁等级相应提高。例如,一些暴露在互联网上的未经过充分安全配置的接口,很容易被攻击者发现和利用,相比之下,隐藏较深、需要特定知识和技术才能发现的漏洞,发现时间可能较长,威胁相对较低。
13.5缓冲区溢出
- 缓冲区溢出是一种常见且危险的安全漏洞。除了声明字符串大小不当导致的问题外,在使用数组时,如果对数组的访问超出了其定义的边界,也会发生缓冲区溢出。例如,在C语言中,如果程序员没有正确检查数组索引的范围,当访问一个超出数组大小的元素时,就可能会覆盖相邻的内存区域,可能导致程序崩溃,或者更严重的是,被攻击者利用来执行恶意代码。
- 一些不良的编程习惯也容易引发缓冲区溢出,比如在循环中没有正确控制循环次数,导致对缓冲区的写入超出了其实际大小;或者在使用一些库函数时,没有正确传递参数,使得函数对缓冲区的操作超出了预期范围。
13.6使用安全的字符串函数
- 每个函数接收目标缓冲的长度作为输入:这样可以确保函数在操作字符串时,不会超出目标缓冲区的边界。例如,在C语言中,
strncpy
函数就接收目标缓冲区的长度作为参数,它会将源字符串复制到目标缓冲区中,最多复制指定的长度,从而避免了缓冲区溢出的风险。 - 函数空字符中止所有的输入字符串,即使操作截断了预计的结果:这是为了确保字符串在存储和处理过程中的完整性和安全性。以C语言为例,字符串是以空字符
\0
作为结束标志的,安全的字符串函数会在复制或处理字符串时,自动在字符串末尾添加空字符,即使实际复制的内容因为缓冲区长度限制等原因被截断,也能保证字符串以正确的格式存储,避免后续操作出现错误。 - 所有函数返回一个NTSTATUS值,该值只有一个可能成功的代码:通过返回特定的状态值,可以让程序员清楚地了解函数的执行情况。在Windows系统中,许多安全的字符串函数会返回NTSTATUS值,当返回值表示成功时,说明函数正确执行并完成了预期的操作;如果返回值表示失败,程序员可以根据具体的错误代码来判断问题所在,例如是否是缓冲区长度不足、参数错误等,从而采取相应的措施。
- 每个都提供版本,比如字符类型:不同的字符类型可能需要不同的处理方式,提供不同版本的函数可以满足各种需求。例如,在C语言中,有针对窄字符(如
char
类型)的字符串函数,也有针对宽字符(如wchar_t
类型)的字符串函数。根据实际使用的字符类型选择相应的函数版本,可以确保字符串的处理正确无误,提高软件的安全性和兼容性。
13.7计算机取证
遗憾的是内容未完整给出文件写入磁盘保存分区的具体信息,但一般来说,计算机取证中涉及文件写入磁盘保存分区时,需要关注文件系统的类型(如FAT32、NTFS等),不同的文件系统有不同的存储结构和特点。在NTFS文件系统中,文件的元数据(如文件名、创建时间、修改时间等)和数据内容会分别存储在不同的区域,取证人员需要了解这些结构,以便准确地获取和分析文件信息。同时,还需要注意磁盘的分区表,它记录了磁盘上各个分区的起始位置、大小等信息,对于确定文件所在的具体分区以及恢复丢失或损坏的分区非常重要。