检查shellshock的命令的说明

Modified on: Sat, 09 Jun 2018 21:21:53 +0800

这是我用来检查我的bash shell以获取Shellshock错误的命令:

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

有人可以详细解释一下这个命令吗?

最佳答案

这个答案是关于Fedora杂志的原创文章的衍生产品。 Matthew Miller,根据知识共享署名 - 相同方式共享4.0许可证授权。

让我解释一下:

env x='() { :;}; echo OOPS' bash -c :

这将在易受攻击的系统上打印“OOPS”,但如果已修补bash,则会以静默方式退出。

env x='() { :;}; echo OOPS' bash -c "echo this is a test"

这将在易受攻击的系统上打印“OOPS”,但如果已修补bash,则打印“this is a test”

你可能听说它与环境变量有关。但是,为什么环境变量中的代码会被执行?好吧,它不应该是 - 但是,由于我很想为自己的好处调用一点太聪明的功能,因此存在一些缺陷的余地。 Bash是您看到的终端提示,但它也是一种脚本语言,并且能够定义函数。你这样做:

$ Ubuntu()  { echo "Ubuntu is awesome."; }

然后你有了一个新命令。请记住,这里的echo实际上还没有运行;它只是保存为运行新命令时会发生的事情。这在一分钟内很重要!

$ Ubuntu
 Ubuntu is awesome.

有用!但是,让我们说,出于某种原因,我们需要执行一个新的bash实例,作为一个子进程,并希望在其下运行我真棒的新命令。语句bash -c somecommand就是这样做的:在新shell中运行给定的命令:

$ bash -c Ubuntu
  bash: Ubuntu: command not found

哦。伤心。孩子没有继承函数定义。但是,它确实固有环境 - 从shell导出的键值对的集合。 (这是一个完整的'概念;如果你不熟悉这个,请相信我。)事实证明,bash也可以导出函数。所以:

$ export -f Ubuntu
$ bash -c Ubuntu
  Ubuntu is awesome.

哪一切都很好 - 除了完成这项工作的机制是 sorta dodgy 。基本上,由于在环境变量中没有用于执行函数的Linux / Unix魔术,导出函数实际上只是创建一个包含函数定义的常规环境变量。然后,当第二个shell读取“传入”环境并遇到一个看起来像函数的内容的变量时,它会对它进行评估。

理论上,这是完全安全的,因为,请记住,定义一个函数实际上并不是执行它。除了 - 这就是为什么我们在这里 - 代码中存在一个错误,当达到函数定义结束时,评估没有停止。它只是开始。

当使用export -f合法地存储在环境变量中的函数时,这种情况永远不会发生。但是,为什么要合法?攻击者可以组成任何旧的环境变量,如果它看起来像一个函数,新的bash shell会认为它是!

所以,在我们的第一个例子中:

env x='() { :;}; echo OOPS' bash -c "echo this is a test"

env命令运行具有给定变量集的命令。在这种情况下,我们将x设置为看起来像函数的东西。该函数只是一个:,它实际上是一个简单的命令,定义为什么都不做。但是,在发出函数定义结束信号的semi-colon之后,有一个echo命令。那不应该存在,但没有什么能阻止我们这样做。

然后,使用这个新环境运行的命令是一个新的bash shell,再次使用“echo this is a test”或“什么都不做:”命令,之后它将完全无害地退出。

但是 - 哎呀!当新的shell启动并读取环境时,它会转到x变量,因为它看起来像一个函数,所以它会对它进行评估。功能定义无害地加载 - 然后我们的恶意负载也被触发。因此,如果您在易受攻击的系统上运行上述操作,则会向您打印“OOPS”。或者,攻击者可能比打印东西更糟糕。


相关问答

添加新评论