相关疑难解决方法(0)

什么 env x='() { :;}; 命令' bash 做,为什么不安全?

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)

bash vulnerability shellshock

246
推荐指数
5
解决办法
11万
查看次数

shellshock (CVE-2014-6271/7169) 错误是什么时候引入的,完全修复它的补丁是什么?

关于该错误的一些上下文:CVE-2014-6271

Bash 不仅支持将 shell 变量导出,还支持将 shell 函数导出到其他 bash 实例,通过进程环境到(间接)子进程。当前的 bash 版本使用由函数名称命名的环境变量,以及变量值中以“() {”开头的函数定义,以通过环境传播函数定义。该漏洞的出现是因为bash在处理函数定义后没有停止;它会按照函数定义继续解析和执行 shell 命令。例如,环境变量设置

  VAR=() { ignored; }; /bin/id
Run Code Online (Sandbox Code Playgroud)

将环境导入 bash 进程时执行 /bin/id 。

资料来源:http : //seclists.org/oss-sec/2014/q3/650

该错误是什么时候引入的,完全修复它的补丁是什么?(参见CVE-2014-7169

除了 CVE(最初)(3.{0..2} 和 4.{0..3})中提到的易受攻击版本之外,还有哪些易受攻击的版本?

有问题的源代码是否在其他项目中重用?

需要额外的信息。


相关:什么是 env x='() { :;}; 命令' bash 做,为什么不安全?

security bash shellshock

122
推荐指数
2
解决办法
2万
查看次数

什么是 shell 中的命令替换?

我正在将 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)
  1. 命令替换语法是$().
  2. 命令本身是date.
  3. 结合我们得到的$(date),它的值是替换的结果(我们可以在执行后得到)。
  4. 我们将该值保存在变量 中$thedate以备后用。
  5. printf根据上面的命令,我们使用 , 显示变量保存的输出值。

注意:\ninprintf是换行符。

command-substitution

11
推荐指数
1
解决办法
4万
查看次数

通常在 shell 脚本中存在哪些退出模式,特别是在 Bash 中?

我知道在 shell 脚本中,“退出”通常意味着自愿或至少成功终止会话(会话中的进程),并且有几种不同的退出模式;以下是我所知道的:

1.一个简单的exit命令

如果我在第一个 shell 会话(shell-session 0)中,它通常会导致 shell CLI窗口关闭,但如果我在某个子会话(如 shell-session 1 或更高版本)中,执行通常只会将我的用户移回上一个会话(例如1 ? 0)。

2.exit SOME_EXIT-CODE命令

我发现在这种退出中使用的三个主要退出代码

  1. exit 0 (成功)。
  2. exit 1 (一般错误,例如“除以零”和其他不允许的操作)。
  3. 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)

bash shell-script function exit exit-status

2
推荐指数
1
解决办法
1279
查看次数

使用 mktemp -d 或 mkdir 创建的目录之间是否存在编程差异?

我试图理解斯蒂芬基特对这个问题的回答,他用以下代码创建了一个临时目录:

#!/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

directory mkdir mktemp

1
推荐指数
1
解决办法
1271
查看次数