Bash中的Shellshock漏洞背后的行为是否记录在案或全部故意?

前端之家收集整理的这篇文章主要介绍了Bash中的Shellshock漏洞背后的行为是否记录在案或全部故意?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
最近的一个漏洞, CVE-2014-6271,如何 Bash解释环境变量 was disclosed.该漏洞利用Bash解析一些环境变量声明作为函数定义,但继续执行代码定义后:
$ x='() { echo i do nothing; }; echo vulnerable' bash -c ':'
vulnerable

但我不明白。在Bash手册中,我没有找到任何东西来解释环境变量作为函数(除了继承的功能,这是不同的)。事实上,一个正确的命名函数定义只是作为一个值:

$ x='y() { :; }' bash -c 'echo $x'
y() { :; }

但腐败的一个没有打印:

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

$ # Nothing but newline

腐败函数未命名,所以我不能只是调用它。这个漏洞是一个纯实现bug,还是有一个预期的功能在这里,我只是看不到?

更新

根据Barmar的评论,我假设函数名称是参数名:

$ n='() { echo wat; }' bash -c 'n'
wat

我可以发誓我试过,但我想我没有努力足够。它现在是可重复的。这里有一些更多的测试:

$ env n='() { echo wat; }; echo vuln' bash -c 'n'
vuln
wat
$ env n='() { echo wat; }; echo $1' bash -c 'n 2' 3 -- 4

wat

…因此显然args不是在exploit执行时设置的。

无论如何,我的问题的基本答案是,是的,这是Bash如何实现继承的函数

这似乎是一个实现bug。

显然,bash中导出函数的工作方式是使用特殊格式的环境变量。如果导出函数

f() { ... }

它定义了一个环境变量,如:

f='() { ... }'

可能发生的是,当新shell看到一个值以()开头的环境变量时,它会添加变量名并执行结果字符串。错误是,这包括执行函数定义后的任何东西。

所描述的修复显然是为了解析结果以查看它是否是有效的函数定义。如果不是,则打印关于无效功能定义尝试的警告。

This article确认了我对错误原因的解释。它还详细介绍了解决方案如何解决它:它们不仅更仔细地解析值,而且用于传递导出函数的变量遵循特殊的命名约定。这种命名约定与用于为CGI脚本创建的环境变量的命名约定不同,因此HTTP客户端永远不能进入此门。

原文链接:https://www.f2er.com/bash/391931.html

猜你在找的Bash相关文章