前天,爆发了Bash安全漏洞,非常恐怖。在网络上开始飞速传播,附带了非常友好的检测工具。
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
看一下运行结果:
vulnerable
this is a test
我的bash是vulnerable。
看一下测试命令。(这个才是我们需要看的东西,从中学习。)开始,我比较蒙。同事给我解释了这个命令的含义和出现问题的原因。
env设置环境变量的命令。给x设置了环境变量'() { :;}; echo vulnerable'。而环境变量经过bash的执行,匿名函数通过了执行,执行了vulnerable。
对于设置环境变量,正常而言是不能执行的。我们可以设置一下函数尝试一下。执行命令
env x='e() { :;}; echo vulnerable'
命令同时会把内容打印出来看
。。。。。。。#省略一些 SHLVL=1 HOME=/root LOGNAME=root QTLIB=/usr/lib64/qt-3.3/lib CVS_RSH=ssh CLASSPATH=.:/usr/jdk1.7.0_07/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin SSH_CONNECTION=192.168.100.231 38730 192.168.100.172 22 LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env OLDPWD=/root x=e(){:;};echo vulnerable
在最后x已经定义成功了。把函数和命令当做字符串进行了处理。
看到了他们当中的不同了吗?这个就是bash的漏洞的原因,引申一下:如果骇客执行了恶意程序,后果不堪设想。当然通过网络等方法是用这个漏洞,git/svn。网络服务器等互联网常用的软件,造成网络的极大不安全。
最后我们看一下,这个列子中使用的一个比较不常用的符号 : (冒号)。在Bash里边:是一个占位符。是一个不执行的命令。这个命令对于命令输入不挑食,可以作为注释方法。
没有输出,可以对文件进行清空。
: > test.file
cat test.file
: your comment