zoukankan      html  css  js  c++  java
  • 破壳漏洞(CVE-2014-6271)分析

    受影响版本:GNU Bash 4.3及之前版本

    影响范围:主流的Linux和MacOSX操作系统,与bash交互的各种应用程序,如HTTP,FTP,DHCP等等。

    漏洞原理及POC验证

    1.bash基础知识

    1.1局部变量

    此变量在另一bash进程中无效,因此为局部变量。

    1.2全局变量

    export命令可设置全局变量,env命令也有此功能。

     1.3局部函数

    foo(){echo "111";}

     

    同里,可判断为局部函数。

    1.4全局函数

    2.目前bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题的是 以“(){”开头定义的环境变量在env中解析为函数后,bash执行没有退出,而是继续解析后面的shell命令。当然,核心原因是在输入过程中没有严格地限制边界,也没有做出合法的参数判断。

     2.1POC验证

    env x='() { :;}; echo vulnerable' ./bash -c "echo this is a test"

     

    POC中,env解析(){为函数,继续解析后面的代码,经过尝试,必须要有./bash -c "echo this is a test",否则前面的echo vulnerable不会执行。

    2.2结合bash代码做POC分析

    2.2.1POC中定义变量x为() { :;}; echo vulnerable,它会变成函数,于bash中的函数定义有关。

    bash中函数定义为

    function function_name() {
    body;
    }

     因此,当bash解析发现(){时,就认为它是函数。

     2.2.2bash解析函数后,会继续执行后面的代码,原因在于parse_and_execute函数。
    builtins/evalstring.c的parse_and_execute函数中,

    else if (command = global_command)
    {
    struct fd_bitmap *bitmap;

    ... 

     首先,输入的命令代码走这条分支,这条分支并没有对命令的类型进行判断,从而导致bash能继续解析执行后面的代码。

    补丁

    第一处,在builtins/evalstring.c的parse_and_execute函数中,

    else if (command = global_command)
    {
    struct fd_bitmap *bitmap;

    ... 

    加入

    if ((flags & SEVAL_FUNCDEF)  && command->type != cm_function_def)

    第二处,在/builtins/common.h加入

    #define SEVAL_FUNCDEF  0x080                 /* only allow function definitions */
    #define SEVAL_ONECMD  0x100                 /* only allow a single command

    第三处,在/builtins/evalstring.c加入

    if (flags & SEVAL_ONECMD)
                       break;

    它们主要对命令代码的函数属性和命令个数做了限制。如果是这个命令没有创建函数的功能,那它必须是一个命令【即命令中间不能存在;】。这有效的遏制了POC的攻击。

  • 相关阅读:
    JavaWeb 【介绍】
    Python3 【解析库XPath】
    Python【类编程】
    Python3【正则表达式】
    Java GUI【记事本】
    Java 【笔记本】
    Python3 【requests使用】
    Java 【食品库存管理】
    AGC027 C
    AGC027 A
  • 原文地址:https://www.cnblogs.com/HYWZ36/p/10878813.html
Copyright © 2011-2022 走看看