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) 关于该错误的一些上下文:CVE-2014-6271
Bash 不仅支持将 shell 变量导出,还支持将 shell 函数导出到其他 bash 实例,通过进程环境到(间接)子进程。当前的 bash 版本使用由函数名称命名的环境变量,以及变量值中以“() {”开头的函数定义,以通过环境传播函数定义。该漏洞的出现是因为bash在处理函数定义后没有停止;它会按照函数定义继续解析和执行 shell 命令。例如,环境变量设置
Run Code Online (Sandbox Code Playgroud)VAR=() { ignored; }; /bin/id
将环境导入 bash 进程时执行 /bin/id 。
资料来源:http : //seclists.org/oss-sec/2014/q3/650
该错误是什么时候引入的,完全修复它的补丁是什么?(参见CVE-2014-7169)
除了 CVE(最初)(3.{0..2} 和 4.{0..3})中提到的易受攻击版本之外,还有哪些易受攻击的版本?
有问题的源代码是否在其他项目中重用?
需要额外的信息。
我正在将 Ubuntu 16.04 与 Bash 一起使用,我尝试在Wikipedia中阅读此处和此处,但我无法理解一般 shell 脚本中“命令替换”的含义,特别是在 Bash 中,如下所示:
$(command)
Run Code Online (Sandbox Code Playgroud)
或者
`command`
Run Code Online (Sandbox Code Playgroud)
这个词的含义是什么?
编辑:当我第一次发布这个问题时,我已经知道替换的纯概念以及变量替换的 Linux 概念(通过执行替换变量的值),但我仍然从文档中错过了这个 shell 特性的目的原因或原因组。
命令替换是一种具有专用语法的操作,用于执行命令并将该命令的输出保存(存储)在变量中以备后用。
date
:thedate="$(date)"
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用以下命令打印结果printf
:
printf 'The date is %s\n' "$thedate"
Run Code Online (Sandbox Code Playgroud)
$()
.date
.$(date)
,它的值是替换的结果(我们可以在执行后得到)。$thedate
以备后用。printf
根据上面的命令,我们使用 , 显示变量保存的输出值。注意:\n
inprintf
是换行符。
我知道在 shell 脚本中,“退出”通常意味着自愿或至少成功终止会话(或会话中的进程),并且有几种不同的退出模式;以下是我所知道的:
exit
命令如果我在第一个 shell 会话(shell-session 0)中,它通常会导致 shell CLI窗口关闭,但如果我在某个子会话(如 shell-session 1 或更高版本)中,执行通常只会将我的用户移回上一个会话(例如1 ? 0
)。
exit SOME_EXIT-CODE
命令我发现在这种退出中使用的三个主要退出代码:
exit 0
(成功)。exit 1
(一般错误,例如“除以零”和其他不允许的操作)。exit 2
(如在 Bash 4.xx 中 - 滥用 shell 内置函数,一个例子是空函数;myFunc() {}
)。我经常发现这些添加到命令序列的末尾作为其执行结果的指标;有时作为单元测试的一部分,例如:
domain="$1" && test -z "$domain" && exit 2
# Test if a user passes only one domain as a parameter, …
Run Code Online (Sandbox Code Playgroud) 我试图理解斯蒂芬基特对这个问题的回答,他用以下代码创建了一个临时目录:
#!/bin/bash
scripttmp=$(mktemp -d) # Create a temporary directory (these will usually be created under /tmp or /var/tmp/)
Run Code Online (Sandbox Code Playgroud)
每次我运行这个命令时,我都会看到一个新的临时目录/tmp/
(我不知道它会出现在那里,直到在这里阅读 Roaima 的回答):
IIUC,常规目录和临时目录之间没有编程上的区别(唯一的区别在于如何使用这些目录,即每个目录在机器上停留的时间)。
如果没有程序上的差异,为什么要优先mktemp -d
于更小mkdir
?
bash ×3
shellshock ×2
directory ×1
exit ×1
exit-status ×1
function ×1
mkdir ×1
mktemp ×1
security ×1
shell-script ×1