加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 16:40:13 所属栏目:安全 来源:网络整理
导读:最近的一个漏洞, CVE-2014-6271,如何 Bash解释环境变量 was disclosed.该漏洞利用Bash解析一些环境变量声明作为函数定义,但继续执行代码定义后: $ x='() { echo i do nothing; }; echo vulnerable' bash -c ':'vulnerable 但我不明白。在Bash手册中,我
最近的一个漏洞, 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客户端永远不能进入此门。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读