【问题标题】:Shellshock - why is the injection of environment variables allowed?Shellshock - 为什么允许注入环境变量?
【发布时间】:2014-09-27 23:48:18
【问题描述】:

关于 shellshock 漏洞有两点我不明白:

  1. 为什么允许向未经验证的连接注入环境变量?那有什么好处?

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

有什么想法吗?

【问题讨论】:

标签: bash shellshock-bash-bug


【解决方案1】:

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

例如,CGI 协议——它使用环境变量来传达有关 HTTP 请求的信息——将自身限制为一组环境变量名称,这些名称可以松散地描述为 the CGI standard,加上任意环境变量,其名称以字符 HTTP_ 开头。

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

环境变量,如命令行参数,需要小心处理,有时需要设置屏障。 /bin/env 实用程序提供了一种机制来清理赋予可执行文件的环境,例如;如果环境不值得信赖并且如果可执行文件以提升的权限运行时必不可少,这将非常有用。

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

【讨论】:

    【解决方案2】:

    1) 该漏洞是一个实现错误。不允许故意将来自不受信任来源的指令注入环境变量 - 这就是为什么它是一个错误。

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

    【讨论】:

    • 问题不在于环境变量本身;这是一个环境变量的值是evaled,假设它只包含一个函数声明,而不验证这个假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多