最近披露了Bash如何解释环境变量的漏洞CVE-2014-6271.该漏洞依赖于Bash将一些环境变量声明解析为函数定义,但随后继续按照定义执行代码:
$ x='() { echo i do nothing; }; echo vulnerable' bash -c ':'
vulnerable
Run Code Online (Sandbox Code Playgroud)
但我不明白.我在Bash手册中找不到任何关于将环境变量解释为函数的内容(除了继承函数,这是不同的).实际上,正确命名的函数定义只被视为一个值:
$ x='y() { :; }' bash -c 'echo $x'
y() { :; }
Run Code Online (Sandbox Code Playgroud)
但腐败的人什么都不打印:
$ x='() { :; }' bash -c 'echo $x'
$ # Nothing but newline
Run Code Online (Sandbox Code Playgroud)
损坏的函数是未命名的,因此我不能只调用它.这个漏洞是一个纯粹的实现错误,还是这里有一个预期的功能,我看不到?
Per Barmar的评论,我假设函数的名称是参数名称:
$ n='() { echo wat; }' bash -c 'n'
wat
Run Code Online (Sandbox Code Playgroud)
我之前发誓我可以发誓,但我想我没有努力.它现在可以重复了.这是一个更多的测试:
$ env n='() { echo wat; }; echo vuln' bash -c 'n'
vuln …Run Code Online (Sandbox Code Playgroud) security bash function environment-variables shellshock-bash-bug
你如何修复Debian 6.0(Squeeze)上的Shellshock Bash漏洞?
这个ycombinator线程说明了这一点
env X='() { (a)=>\' sh -c "echo date"
Run Code Online (Sandbox Code Playgroud)
允许您删除第一个令牌,然后运行结果,将输出发送到已删除的令牌.我可以看到魔法在这个() { (a)=>\'部分,但这是一个很难找到的东西,所以如果有人能够解释内部的运作方式会很棒.
在链接的可能重复的问题中,变量通过使用导出到环境变量,
env X="() { :;} ;
Run Code Online (Sandbox Code Playgroud)
这真的不一样
env X='{ (a)=>\'
Run Code Online (Sandbox Code Playgroud)
这是我试图了解其运作的部分.那么,这些(a)和=>\'零件做什么?很明显,它正在做一些非常相似的事情,但不同之处在于它绕过了这个漏洞的第一个补丁,请参阅chepner的评论.
有一个bash版本已被修补shellshock
$ bash --version
GNU bash, version 3.2.52(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
$ 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
Run Code Online (Sandbox Code Playgroud)
另一个类似的漏洞利用仍然有效,并已被分配到CVE-2014-7169
$ env X='() { (a)=>\' bash -c "echo date"; cat echo
bash: X: line 1: syntax error near unexpected token `='
bash: X: line 1: `'
bash: error …Run Code Online (Sandbox Code Playgroud) 从 Ubuntu 14.04 迁移到 16.04 时,我注意到我的几个 Bash 脚本由于缺少导出的函数而失败。我想知道这是否与Shellshock 错误的修复有关,即使我只是简单export -f的函数,而不是依赖 Bash 内部函数表示。失败不会发生在直接的 Bash 子 shell 中,只有在两者之间有另一个进程时才会发生。例如,Bash 调用 awk / Perl / Vim 调用另一个 Bash。下面是一个 Perl 的例子:
$ foo() { echo "foobar"; }
$ export -f foo
$ export -f; foo
foo ()
{
echo "foobar"
}
declare -fx foo
foobar
$ bash -c "export -f; foo"
foo ()
{
echo "foobar"
}
declare -fx foo
foobar
$ perl -e 'system("bash -c \"export -f; foo\"")'
foo …Run Code Online (Sandbox Code Playgroud) 我需要从C/C++程序在Bash环境中定义一个Bash函数.在shellshock bug 之前,我可以用这种方式定义一个函数:
my_func='() { echo "This is my function";}'
Run Code Online (Sandbox Code Playgroud)
或等同于C程序:
setenv("my_func", "() { echo \"This is my function\";}", 1);
Run Code Online (Sandbox Code Playgroud)
要么
putenv("my_func=() { echo \"This is my function\";}");
Run Code Online (Sandbox Code Playgroud)
但是使用修复了shellshock的Bash版本,我无法管理如何在环境中定义我的函数.
奇怪的是,如果我运行env,我可以看到我在环境中定义的函数,但如果我调用它,Bash说它不存在.
提前致谢
我在检查Shellshock漏洞时得到了这个:
host1:~$ env x='(){ :;}; echo vulnerable' bash -c "echo hello"
hello
host1:~$ env x='() { :;}; echo vulnerable' bash -c "echo hello"
vulnerable
hello
host1:~$
Run Code Online (Sandbox Code Playgroud)
怪啊?
我在理解以下代码时遇到了问题,这是Shell Shock的"漏洞证明"代码.有人可以向我解释一下吗?特别是这部分" () { :;};"
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Run Code Online (Sandbox Code Playgroud) 我今天早上上班时读到了通过特制环境变量(CVE-2014-6271)的文章A Bash Code Injection Vulnerability.我已经在我负责的大多数系统上更新了Bash,但是,我被要求在几个FreeBSD服务器上升级Bash .
如何检查FreeBSD上运行的Bash版本以及如何修补它以摆脱此漏洞?
刚刚阅读了这个可能严重的基于Linux的错误.看起来Azure应该是安全的,因为基于Windows,并且很可能很快修补,因为这就是我们使用平台即服务(PAAS)的原因.
对于任何想知道这一切是什么的人,Try Hunt都有一篇很好的文章:Troy Hunt的文章
任何人对这个或指针的任何评论?
谢谢.
azure azure-web-sites shellshock-bash-bug azure-sql-database
昨天报告了CVE-2014-6271问题,这是BASH Shellshock漏洞.我试图了解它是否可以通过我的Perl CGI脚本影响我的服务器.
我的代码是否会以恶意方式受到影响 - 我的代码需要做些什么才能受到影响?我应该检查什么来验证这一点?