1.漏洞简介

Bash 4.3以及之前的版本在处理某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行任意的shell命令,甚至完全控制目标系统

受到该漏洞影响的bash使用的环境变量是通过函数名称来调用的,以“(){”开头通过环境变量来定义的。而在处理这样的“函数环境变量”的时候,并没有以函数结尾“}”为结束,而是一直执行其后的shell命令。这个漏洞导致了CVE-2014-6271,CVE-2014-7169,CVE-2014-6277,CVE-2014-6278,CVE-2014-7186,CVE-2014-7187六个CVE的爆发。

2.POC验证

2.1 CVE 2014-6271

最开始的shell测试脚本如下,主要的代码是第五行,它先使用env命令将() { :;}; echo vulnerable赋值给环境变量x,随后启动一个新的bash进程并执行命令echo test,并将错误信息重定向到null,再查找有无’vulnerable’这个字符串输出,如果输出成功则表示存在漏洞:

#!/bin/bash
EXITCODE=0# CVE-2014-6271
CVE20146271=$(env 'x=() { :;}; echo vulnerable' bash -c "echo test" 2>/dev/null | grep 'vulnerable' | wc -l)echo -n "CVE-2014-6271 (original shellshock): "
if [ $CVE20146271 -gt 0 ]; thenecho -e "\033[91mVULNERABLE\033[39m"EXITCODE=$((EXITCODE+1))
elseecho -e "\033[92mnot vulnerable\033[39m"
fi

执行结果如下,由于在新启动的bash进程会继承父进程的环境变量,所以x也被继承,导致了函数后面的echo vulnerable被执行:

2.2 CVE 2014-7169

打过第一次官网补丁之后还是能够绕过,脚本如下:

#!/bin/bash
EXITCODE=0# CVE-2014-7169
CVE20147169=$(rm -f echo; env X='() { (a)=>\' bash -c "echo date" 2>/dev/null; cat echo 2> /dev/null | grep 'vulnerable' | wc -l)echo -n "CVE-2014-7169 (taviso bug): "
if [ $CVE20147169 -gt 0 ]; thenecho -e "\033[91mVULNERABLE\033[39m"EXITCODE=$((EXITCODE+8))
elseecho -e "\033[92mnot vulnerable\033[39m"
fi

主要代码也是第五行,首先也是利用env命令新生成一个环境变量X,X的值是() { (a)=>\,而这个shell函数并不完整,接着bash -c启动新的一个bash进程,当其加载环境变量X时便会出错,出错的字符(a)=便不会在缓冲区中,缓冲区中就只剩下了>\,而新启动的bash进程又将echo date 输出到缓冲区,这样缓冲区中便是:

>\
echo date

这就相当于执行命令:

date > echo

执行结果如下:

3.漏洞原理及修复分析

3.1 CVE 2014-6271

漏洞原理

这个漏洞原理就是在bash解析环境变量x=() { :;}; echo vulnerable的时候将其命令类型设为cm_connection,也就是由多条命令组成的,随后执行execute_connection:

 case cm_connection:exec_result = execute_connection (command, asynchronous,pipe_in, pipe_out, fds_to_close);break;                                                      

由于两条指令连接的使用分号,execute_connection中执行的代码如下,随后他便会重新执行execute_command_internal函数,而传入的指令则是() { :;};

    case ';':... ...exec_result = execute_command_internal (command->value.Connection->second,asynchronous, pipe_in, pipe_out,fds_to_close);executing_list--;break;

函数定义这条指令执行完成再执行后面的echo vulnerable指令,最终通过execute_simple_command执行完成:

    case cm_simple:{... ...exec_result =execute_simple_command (command->value.Simple, pipe_in, pipe_out,asynchronous, fds_to_close);line_number = save_line_number;... ...}

所以本质上说这个漏洞是传入命令的边界没有控制好,导致定义完函数继续执行后续指令。

修复分析

针对这个漏洞的补丁在ftp://ftp.gnu.org/gnu/bash/bash-4.1-patches/bash41-012,查看补丁修改的代码,主要是三处。第一处是在builtins/common.h文件的宏定义中加入了两个值,用来表示定义的是函数状态和只允许一条命令执行:

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

随后在variables.c文件的initialize_shell_variables函数中调用parse_and_execute之前进行了对函数名进行了合法性检查,而且直接将上面两个标志传入parse_and_execute函数中:

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

最后是builtins/evalstring.c的parse_and_execute函数增加了如下代码,如果当前的flags包括SEVAL_FUNCDEF也就是说正在处理的应该是函数,那么判断命令类型是不是函数类型,像POC中的在函数后面还定义了命令,从上一节漏洞原理可以看到整条命令的类型是cm_connection,遇到自然就无法绕过了:

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;
}

修复之后同一个POC就运行失败了:

3.2 CVE 2014-7169

漏洞原理

这个漏洞的POC是env x='() { (a)=>\' ./bash_vuln -c "echo date",bash_vuln是重新编译的修补了CVE 2014-6271漏洞的程序。与CVE 2014-6271类似,当bash初始化的时候解析环境变量x会调用parse_and_execute函数,然后在这个函数中调用parse_command函数解析传入的命令:

int
parse_and_execute (string, from_file, flags)
{... ...if (parse_command () == 0){ ... ...}
}

parse_command函数代码,在这个函数中则会调用yyparse函数,这个函数由yacc语法分析器分析parse.y文件生成的,会对bash_input流也就是bash的输入命令进行解析,环境变量x的值’() { (a)=>\’就是在这里解析的识货报错,但是由于报错的是’(a)=’,并不会影响到后面的’>\’字符,因此这两个字符也就保留了下来:

int
parse_command ()
{int r;char *command_to_execute;... ...current_command_line_count = 0;r = yyparse ();... ...return (r);
}

而后初始化完成,bash_vuln执行命令echo date则会再次调用parse_command函数进行语法解析,’>\’和后面传入的’echo date’便组成了命令’date > echo’,导致echo文件生成。

修复分析

针对这个漏洞的补丁在ftp://ftp.gnu.org/gnu/bash/bash-4.1-patches/bash41-013,只在parse.y文件中的reset_parser函数添加了一行代码,这个函数是用来重置命令的语法解析器的。查看eol_ungetc_lookahead的定义,这个变量是表明上一次的bash命令输入是否全部处理完了,如果是0则处理完成,否则取上次未处理完的字符,再去读取新的命令:

*** 2812,2815 ****
--- 2812,2817 ----word_desc_to_read = (WORD_DESC *)NULL;+   eol_ungetc_lookahead = 0;
+ current_token = '\n';       /* XXX */last_read_token = '\n';

在未打补丁的程序中当处理完恶意构造的函数环境变量之后,eol_ungetc_lookahead变量并不为0,所以在处理下一次命令时会加上上次未处理完的命令,补丁直接在重置语法解析器的时候将eol_ungetc_lookahead变量置为0,则不会读取上一次剩下的>\字符,而是直接解析echo date,打上补丁之后的运行结果:

4.检测规则

4.1 CVE 2014-6271检测规则

这个漏洞的检测规则如下:

alert http any any -> $HOME_NET any (msg:"Volex – Possible CVE-2014-6271 bash Vulnerability Requested (header)" ; flow:established,to_server; content:"() {"; http_header; threshold:type limit, track by_src, count 1, seconds 120; classtype:current-event; sid:130162711; rev:1;)

规则检测的是发动攻击的http request包,检测http头部是否有”() {“字符。

参考链接

http://www.antiy.com/response/CVE-2014-6271.html
http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-patch-bypass-analysis/
http://seclists.org/fulldisclosure/2014/Oct/9
http://blog.sina.com.cn/s/blog_48ab118d0102v2u2.html
http://www.percona.com/blog/2014/09/26/bash-bug-giving-you-shellshock-cve-2014-6271-update/

Shellshock(破壳)系列漏洞简要分析及检测相关推荐

  1. log4j漏洞原理分析复现检测复盘

    凡事要自发,自然而为,即要顺从一切处于自然状态的事物,允许它们自发地转变.这样,道即达到了一种"无为而无不为"的状态.在日常生活中,道表现为"不自傲"或&quo ...

  2. 蓝牙App系列漏洞原理分析与漏洞利用

    蓝牙App系列漏洞原理分析与漏洞利用 作者: heeeeen 本文系转载,目的是学习,如有侵权,请联系删除 转载出处:http://www.ms509.com/ 蓝牙App漏洞系列分析之一CVE-20 ...

  3. Cisco ASA/FTD未授权文件删除漏洞简要分析

    漏洞简述 思科官方在2020年5月6号发布Cisco Adaptive Security Appliance(ASA)和Firepower Threat Defense(FTD)软件web服务目录遍历 ...

  4. 渗透测试网站漏洞代码分析与检测

    渗透测试这些是经常谈到的问题了,我觉得当有了渗透接口测试之后你就会发现渗透测试这一方面也就是:1.基本漏洞测试:2.携带"低调"构思的心血来潮:3.锲而不舍的信念.我们SINE安全 ...

  5. 漏洞分析与检测技术在物联网安全中的应用

    这里写自定义目录标题 一.引言 二.相关理论 1.物联网系统安全挑战 1.1 网络层安全挑战 1.2 硬件感知层安全挑战 1.3 中间件层安全挑战 1.4 应用功能层安全挑战 2.漏洞挖掘技术 三.漏 ...

  6. 【安全漏洞】简要分析复现了最近的ProxyShell利用链

    前言 近日,有研究员公布了自己针对微软的Exchange服务的攻击链的3种利用方式.微软官方虽然出了补丁,但是出于种种原因还是有较多用户不予理会,导致现在仍然有许多有漏洞的服务暴露在公网中,本文主要在 ...

  7. linux shellshock漏洞,shellshock漏洞原理分析(cve-2014-6271 bash漏洞)

    shellshock漏洞原理分析(cve-2014-6271 bash漏洞) 2014-09-26 10:04:16 阅读:0次 概述: 低于4.3版本的gnu bash存在漏洞,运行本地用户通过构造 ...

  8. 已遭利用的Windows 0day漏洞 CVE-2020-1380分析

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 卡巴斯基发布博客文章,简要分析了微软在8月补丁星期二修复的一个已遭利用 0day CVE-2020-1380.如下内容编译自该文章. ...

  9. 【u-boot】uboot代码简要分析 (u-boot 移植)

    uboot代码简要分析 (u-boot 移植) 2012-12-19 22:46:04 [转] 先来看看源码目录结构,再按照代码的执行顺序简单地分析源码 1.U-boot源码整体框架 源码解压以后,我 ...

最新文章

  1. [转] 利用jemalloc分析内存泄漏
  2. CentOS7安装mysql数据库
  3. TFT显示屏驱动设计与验证
  4. phpStydy配置memcache扩展
  5. Android实现边缘凹凸的View
  6. c语言存储学生信息并显示,C语言实现学生信息管理程序
  7. php mencache扩展,【memcache缓存专题(3)】PHP-memcache扩展的安装以及使用
  8. mysql 主从手动切换
  9. JS调用服务器端方法
  10. [极客]每个极客都应该知道的Linux技巧 (1)
  11. android软键盘挡住输入框问题解决方法
  12. win10相机打不开,qq可以正常打开:Windows 相机应用错误代码 0xA00F4288
  13. [转]多媒体范例: 如何使用CSS来格式化TLF文本
  14. 成功长青——不读此书,愧为人徒,不读此书,愧为人师
  15. 蜂云软件开发微信crm系统的功能点
  16. powermill2020错误代码1603_max2020安装提示1603
  17. FinClip | 2022 年 10月产品大事记
  18. 【数据来源】如何选择合适的第三方数据源
  19. CCM5.0 应用实例(SIP X-lite)
  20. Uploadify上传图片案例

热门文章

  1. java io处理_java之IO处理
  2. 关于echart没有数据显示暂无数据
  3. java byte short_Java Byte shortValue()方法
  4. 中国十大军工集团介绍
  5. 使用 python进行文本处理
  6. 解决Windows中mfc100.dll文件缺少问题
  7. 在MFC中更改View类的基类CView为CScrollView的关键步骤
  8. dnf服务器合并信息,DNF拍卖场系统开放:使徒合区服务器,公共频道物品交易功能...
  9. 4行Python代码监测每行程序的运行时间和空间消耗
  10. 【Redis笔记】发布与订阅