bash 中明显存在漏洞(CVE-2014-6271):Bash 特制环境变量代码注入攻击
我试图弄清楚发生了什么,但我不完全确定我理解它。如何echo在单引号中执行?
$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
vulnerable
this is a test
Run Code Online (Sandbox Code Playgroud)
编辑 1:打补丁的系统如下所示:
$ 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)
编辑 2:有一个相关的漏洞/补丁:CVE-2014-7169,它使用了一个稍微不同的测试:
$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c …Run Code Online (Sandbox Code Playgroud) 我认为这很简单 - 但事实证明它比我预期的要复杂。
我想遍历目录中特定类型的所有文件,所以我这样写:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
Run Code Online (Sandbox Code Playgroud)
只要目录中至少有一个匹配的文件,这就会起作用。但是,如果没有匹配的文件,我会得到:
current file is *.zip
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
Run Code Online (Sandbox Code Playgroud)
当没有文件时循环体不执行,我从 ls 收到错误:
ls: *.zip: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如何编写一个干净地处理没有匹配文件的循环?
有几次,当我阅读有关编程的内容时,我遇到了“回调”概念。
有趣的是,对于“回调函数”这个术语,我从来没有找到我可以称之为“教学”或“清晰”的解释(在我看来,我读到的几乎所有解释都与另一个解释完全不同,我感到困惑)。
Bash 中是否存在编程的“回调”概念?如果是这样,请用一个小的、简单的 Bash 示例来回答。
由于此错误影响了如此多的平台,我们可能会从发现此漏洞的过程中了解到一些信息:它是 ?????? (尤里卡)时刻还是安全检查的结果?
由于我们知道 Stéphane 发现了 Shellshock 错误,其他人也可能知道这个过程,我们会对他如何找到这个错误的故事感兴趣。
有一个类似的问题涉及“包装”场景,例如您想cd用调用 builtin 的命令替换cd。
但是,鉴于 shellshock 等人并知道 bash 从环境中导入函数,我进行了一些测试,但找不到cd从脚本中安全调用内置函数的方法。
考虑这个
cd() { echo "muahaha"; }
export -f cd
Run Code Online (Sandbox Code Playgroud)
在此环境中使用调用的任何脚本cd都会中断(考虑类似 的效果cd dir && rm -rf .)。
有用于检查命令类型的命令(方便地称为type)和用于执行内置版本而不是函数的命令(builtin和command)。但是,瞧,这些也可以使用函数覆盖
builtin() { "$@"; }
command() { "$@"; }
type() { echo "$1 is a shell builtin"; }
Run Code Online (Sandbox Code Playgroud)
将产生以下结果:
$ type cd
cd is a shell builtin
$ cd x
muahaha
$ builtin cd x
muahaha
$ command …Run Code Online (Sandbox Code Playgroud) read -p "Enter yes/no " SOMEVAR
SOMEVAR=`"echo ${SOMEVAR,,}"`
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我一个${SOMEVAR,,}: bad substitution错误。
我正在阅读这篇关于在 bash shell 变量中使用函数的文章。我观察到要使用 shell 函数,必须导出它们并在子 shell 中执行它们,如下所示:
$ export foo='() { echo "Inside function"; }'
$ bash -c 'foo'
Inside function
Run Code Online (Sandbox Code Playgroud)
我想问一下是否可以在 bash shell 变量中定义函数,以便它们可以在当前 shell 中执行而不使用 export & running new shell?
我试图了解可能存在的安全问题CVE-2014-6271,我看到的所有链接都只提供了以下命令。
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
Run Code Online (Sandbox Code Playgroud)
如果我得到的输出为
vulnerable
this is a test
Run Code Online (Sandbox Code Playgroud)
这意味着我的 bash shell 很脆弱。
但它与安全有什么关系呢?换句话说,会对我的系统造成什么损害?
我想在预定的时间执行 Bash 函数。我认为正确的工具是at命令。
但是,它似乎不起作用。
function stupid () {
date
}
export -f stupid
cat << EOM | at now + 1 minute
stupid
EOM
Run Code Online (Sandbox Code Playgroud)
等待一分钟后,我检查了我的邮件,这是我看到的错误:
sh: line 41: syntax error near unexpected token `=\(\)\ {\ \ date"
"}'
sh: line 41: `"}; export BASH_FUNC_stupid()'
Run Code Online (Sandbox Code Playgroud)
我不明白这里出了什么问题,尤其是因为我知道该功能有效。
$ stupid
Fri May 29 21:05:38 UTC 2015
Run Code Online (Sandbox Code Playgroud)
查看错误,我认为使用了不正确的 shell 来执行函数(sh而不是bash),但是如果我检查$SHELL它/bin/bash,我看到它指向,并且手册页at说:
$ echo $SHELL
/bin/bash
$ man at
...
SHELL The value of …Run Code Online (Sandbox Code Playgroud) 命令可以在任何 shell 中执行之前写入日志文件吗?我知道 ssh 有一个补丁可以记录来自 ssh 会话的所有命令,但我什至想记录通过 cgi 或 php-scripts 从网络服务器执行的命令。
bash ×9
security ×3
shellshock ×3
function ×2
at ×1
bugs ×1
logs ×1
monitoring ×1
parameter ×1
shell ×1