Shellshock - 为什么允许注入环境变量?

时间:2014-09-27 23:48:19

标签: bash shellshock-bash-bug

有两件事我不了解shellshock漏洞:

  1. 为什么注入环境变量允许未经验证的连接?这有什么用?

  2. 哪些实际服务提供了注入变量的能力?

  3. 有什么想法吗?

2 个答案:

答案 0 :(得分:1)

环境变量是与子进程通信的一种非常常见的方式。您也可以问“为什么允许将参数传递给子进程?”当然,对于环境变量,需要更多的预防措施,因为一些环境变量(例如PATH)会影响某些系统调用的语义。因此,通常的惯例是将可以从不可信输入设置的环境变量限制为一组已知名称。

例如,CGI协议 - 使用环境变量来传递有关HTTP请求的信息 - 将自身限制为一组环境变量名称,这些名称在松散的可能被描述为the CGI standard,以及任意环境中指定名称以字符HTTP_开头的变量。

虽然CGI可能拥有最大的用户输入环境变量库存,但这种技术非常普遍。一个成熟的例子是使用TERM来定义远程终端的终端类型,但还有更多。

环境变量(如命令行参数)需要小心处理,有时需要障碍。例如,/bin/env实用程序提供了一种清除给予可执行文件的环境的机制;如果可执行文件以提升的权限运行,那么环境不值得信任且非常有用。

除了特定情况(如PATH)之外,任何应用程序都不应依赖于环境变量是否干净。在没有首先检查其有效性的情况下,基于环境变量的值执行某些操作与使用用户提供的任何其他未经验证的数据一样多。 (q.v. SQL注入攻击。)这就是我们在这里所拥有的:一个简单明了的bug。这些事情发生了。我们并不完美。 (事实上​​,这个错误已经存在了20多年,显然没有人注意到,至少是有趣的。)

答案 1 :(得分:-1)

1)漏洞是一个实施错误。不会故意允许从不受信任的来源向环境变量中注入指令 - 这就是它成为错误的原因。

2)有关如何利用此漏洞的一个很好的示例,请参阅http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html#.VCNyvfmSx8E