zoukankan      html  css  js  c++  java
  • 错误注入学习笔记

    错误注入的概念

    在我们做软件测试的时候,除了保证正常情况下功能的完整性,有时也要考虑到在某些极端情况下软件的鲁棒性。然而当我们想去构造某些极端情况来验证程序的鲁棒性时,经常会发现这些极端情况很难构造

    在软件测试领域,错误注入技术是通过注入错误来覆盖那些正常情况下不太容易出现的情况,以期增加测试的覆盖率。此技术对于建立一个健壮的系统是十分重要的。而在我们的实际工作中,由于某些极端情况下的环境不太好构造(如磁盘损坏),使得测试的过程中很难进行极端环境下的软件测试,同时,也给重现和定位问题带来极大的麻烦。

    这里还想顺便提一下,即使测试覆盖率达到100%了,也不能说明软件就没有问题了。因为可能还有一些异常情况,程序里没有考虑到,而对应的也没有这样的测试用例。而这些往往是软件的鲁棒性甚至安全性所疏忽的地方。

    动态错误注入

    动态错误注入是指软件在运行过程里进行错误注入,相较于静态错误注入(这里不作讨论),它更加灵活实用。其基本原理是软件运行时对其相关环境如环境变量、寄存器、内存、磁盘文件系统、网络、注册表及系统调用等进行错误注入。其中最常用的实现方法是对系统调用进行HOOK,HOOK到后通过修改调用参数、返回值等来注入错误。HOOK的系统调用主要涉及文件操作、内存操作、网络操作等。

    目前的动态错误注入大多需要人工参与(如:需要人工分析什么时候注入什么样的错误),而且人工参与分析的时间成本也是比较高的,而程序自动生成的错误注入往往又带有一定的盲目性。所以这也是可以考虑的问题。不过,总的来说,软件的智能化是发展的趋势,以后错误注入的测试需要更加自动化和智能化。

    错误注入的原理

    错误注入的基本原理是:拦截原来的调用,转而调用错误注入程序自定义的代码,由错误注入程序来决定是否注入错误以及注入什么样的错误,并决定是直接返回还是继续调用程序原本要调用的系统函数。

    错误注入的方法

    至少有三种:

    第一种是替换到程序所依赖的系统dll。例如,我们可以通过工具打开一个软件的二进制文件,然后搜索kernal32.dll字符串,并将其替换为mykernal32.dll,这样所有原本要调用kernal32.dll里API的都转调到mykernal32.dll了。

    第二种方法是修改内存里“函数输入表”,将要调用的API的地址修改为我们自己要注入错误的函数地址。但是这种方法仅仅适用于所有系统调用都使用“函数输入表”这种机制的情况。这种方法相对于第一种方法的一个好处就是不需要再修改二进制文件了。

    第三种方法是修改目标函数的第一条汇编代码,比如说就可以增加一条jmp语句来跳转到注入错误的函数的地方去,这也是我们最常见的动态hook技术所使用的方法。

    错误的选择

    错误注入分为两种。第一种方法是记录下程序中所有的系统调用,然后一个个的使各个调用的地方失败,这种方法被称为基于系统调用的错误注入,但是,显然这种方法是费时费力的。第二种方法的思路是模拟特殊环境下的错误,记录下函数调用出错时的情况,然后将这种情况放到程序的其他模块去模拟,这种方法称为基于模式的错误注入。例如,我们也许会通过断开网络来模拟网络无响应时的错误情况,那我们就可以通过错误注入来模拟网络无响应的情况,而不需要手工断开网络。

    基于模式的错误注入

    错误注入的终极问题是:什么样的错误需要被注入?问题的答案有很多种:

    第一种是错误需要覆盖到所有的错误和异常情况。这个答案是典型的以开发为中心的答案。

    第二种是只需要模拟实验室里能够易于模拟到的错误。这个答案是从测试的角度来考虑的。

    第三种是模拟真实环境中会出现的错误。这个答案是从用户的角度来考虑的。

    基于系统调用的错误注入

    由于有些情况下用户需要对指定情况注入特定的错误,所以一个好用的错误注入工具也需要提供这样的功能,由用户来决定注入的时机和注入的错误。

    Canned HEAD 工具简介

    Canned HEAD工具是由Florida Insitute of Technology开发的错误注入实验工具,它主要能模拟两种错误:内存错误和网络错误。

    内存错误:

    内存错误的模拟有以下四个步骤:

    1.监控所有的内存分配,找到内存消耗大户;

    2.通过分析第一步的数据就大概能够找到程序所需要的最小内存了;

    3.在程序运行的过程中随机改变程序可用内存的大小,检查程序是否会因为内存分配失败导致崩溃等严重问题;

    4.最后在程序执行的过程中由用户来决定何时注入何种错误(如空间不足),用这种方法来看还有没有其他问题。

    网络错误:

    网络错误的模拟也有四个步骤,如下:

    1.记录下程序所使用的所有网络相关的系统调用;

    2.通过增加网络延迟的方法来检查程序所能接受的最低网络;

    3.随机改变网络延迟(甚至断开网络)来检查程序是否会出问题;

    4.通过前面的测试,再注入一些指定的错误来查看程序是否会出问题;

  • 相关阅读:
    解析库之 beautifulsoup模块
    请求库之 selenium模块
    请求库之 requests模块
    一句话
    JPA学习03
    JPA学习02
    JPA学习01
    SpringData学习04
    SpringData学习03
    SpringData学习02
  • 原文地址:https://www.cnblogs.com/jeJee/p/2803930.html
Copyright © 2011-2022 走看看