Bash 通过特殊环境变量进行代码注入攻击

Posted LemonSec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash 通过特殊环境变量进行代码注入攻击相关的知识,希望对你有一定的参考价值。

Bash 或Bourne again shell,是一个类UNIX shell 脚本,可能是任何Linux系统中最常见的安装组件。从1980年诞生到现在,bash 已经从一个简单的基于终端的命令解释器演进到诸多其他的奇特用途。

在Linux中,环境变量影响着系统软件。它们都是由一个名称和对名称的赋值构成。bash shell也是如此。在程序后台运行bash shell很常见。通常用于向远程用户提供一个shell(例如通过ssh,telnet),为CGI脚本提供解析器(例如Apache),甚至提供有限的命令执行支持(例如git)。

回到主题,你可以在调用bash shell前使用特殊加工的值创建环境变量,这个事实暴露了系统的脆弱。这些变量可以包含代码,随着shell调用执行。这些加工过的变量名并没有什么,主要是它们的内容。在以下的语境中,脆弱暴露无遗:

  • ForceCommand是 sshd中使用的环境变量,它向远程用户提供有限的命令执行权限。这个缺陷可以被绕过并提供任意的命令执行权限。一些Git和Subversion部署使用这样的shell。OpenSSH的常规使用不受影响,因为用户已经进入了shell。

  • 如果CGI脚本使用bash或者产生大量的子shell,使用mod_cgi或mod_cgid的Apache服务器将收到影响。这些子shell可能被C语言的system/popen使用,可能被Python的os.system/os.popen使用,可能被运行在CGI模式下的php的system/exec使用,可能被使用shell的Perl中的open/system使用.

  • 执行mod_php的PHP脚本即使大量产生子shell也不会收到影响。 

  • DHCP客户端调用shell脚本以配置系统,使用来自潜在的恶意服务器的值。这将允许任意的命令运行,尤其作为DHCP客户机上的root.

  • 各式各样的守护进程和SUID/特权程序可能使用用户设置以及被用户影响的环境变量执行shell脚本,可允许任意的命令运行。

  • 任意可能陷入shell险境的其他应用,或是运行shell脚本将bash作为解释器的应用。不引入环境变量的shell脚本是安全的,即使它们处理不安全的内容并存储在(不引入的)shell变量里并打开子shell。

和编程语言一样,Bash也有函数,尽管是有限的实现,这些bash函数可能放入环境变量中。这个缺陷在这些环境变量内部的函数定义尾部附加额外的代码时触发。像这样:

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

补丁修复了这个缺陷,确保bash函数的尾部不允许额外的代码。所以如果你用打过补丁的bash版本运行上面这个例子,应该得到类似这样的输出:

 $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
 bash: warning: x: ignoring function definition attempt
 bash: error importing function definition for `x'
 this is a test

我们相信这不应该影响任何的向后兼容。它当然会影响使用如上所述创建的环境变量的任何脚本,但这么做会被认为是糟糕的编程实践。

Red Hat的安全问题报告修复了Red Hat企业版Linux的这个问题。Fedora也运送了问题修复包。



Gitlab-shell 受 Bash CVE-2014-6271 漏洞影响 

今天 US-CERT 公布了一个严重的 Bash 安全漏洞 (CVE-2014-6271) ,该漏洞同时也影响 OpenSSH 守护进程。而 Gitlab 服务器默认的 git 账号就是使用 Bash 用来执行远程的代码。攻击者只要有 SSH key 就可以利用这个漏洞在 Gitlab 服务器执行任意代码。

检测服务器是否存在这个漏洞的方法:

ssh git@gitlab.example.com '() { ignored; }; /usr/bin/id'

如果输出下面内容表示服务器存在此漏洞:

uid=1001(git) gid=1001(git) groups=1001(git)


如果你看到的是 Not allowed command 说明不存在此漏洞。

解决办法是升级 Bash。

解决完请再通过上述代码测试是否存在漏洞。

你也可以将 shell 改为 csh,安装:

sudo apt-get install csh

如果你正在使用 omnibus-gitlab, 只需要将下面一行代码添加到 /etc/gitlab/gitlab.rb 文件然后运行 sudo gitlab-ctl reconfigure 即可:

user['shell'] = '/bin/csh'

如果你是通过源码方式安装,可使用如下命令来更改 shell:

sudo chsh -s /bin/csh git


再次测试看看漏洞是否解决。




解决办法是升级 Bash

US-CERT 意识到 Bash 存在一个安全的漏洞,该漏洞直接影响基于 Unix 的系统(如 Linux、OS X 等)。该漏洞将导致远程攻击者在受影响的系统上执行任意代码。

US-CERT 建议用户和管理员重新检查这篇红帽的安全博客。更多的详情只能参考相应 Linux 发行商以获取相应补丁。

你可以使用如下命令来检查系统存在此漏洞:

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

受影响的系统包括:

  • CentOS

  • Debian

  • Redhat

  • Ubuntu

红帽系可通过更新 bash 并重启系统来解决这个问题:

# yum update bash

或者:

# yum update bash-4.1.2-15.el6_5.1

此举只是更新了 bash 包,还需要重启系统才能生效。

Ubuntu 用户可以通过如下命令打补丁,无需重启:


apt-get update

apt-get install bash


以上是关于Bash 通过特殊环境变量进行代码注入攻击的主要内容,如果未能解决你的问题,请参考以下文章

Shellshock远程命令注入(CVE-2014-6271)漏洞复现

Bash安全缺陷验证及修复方法

Bash - 使用特殊字符 ($) 导出环境变量

bash shell的基本概述与操作

bash变量

Linux bash基础特性二