代码之家  ›  专栏  ›  技术社区  ›  Jonathan Leffler

安全访问由环境变量标识的目录中的文件?

  •  3
  • Jonathan Leffler  · 技术社区  · 17 年前

    有谁能指出一些代码,这些代码处理通过环境变量指定的路径(部分)访问文件的安全性,特别是针对Unix及其变体,但Windows解决方案也很有意思?

    考虑一下这种情况:

    背景:

    • 环境变量$PQRHOME用于标识安装目录。
    • 类似地,$PQRHOME下的所有程序和文件要么属于特殊用户pqrusr,要么属于用户root(这些都是SUID root程序)。
    • 一些程序是SUID pqrusr;还有一些程序是SGID pqrgrp。
    • 大多数目录归pqrusr所有,属于pqrgrp;有些可以属于其他组,这些组的成员可以获得软件的额外特权。
    • 许多特权可执行文件必须由非pqrgrp成员的人员运行;程序必须验证用户是否被允许按照与此问题没有直接关系的神秘规则运行它。
    • 启动后,某些特权程序必须保留其提升的特权,因为它们是长期运行的守护进程,可能在其生命周期内代表许多用户。

    当前检查:

    • 程序当前检查$PQRHOME及其下的键目录是否“安全”(由pqrusr所有,属于pqrgrp,不具有公共写入访问权限)。
    • 此后,程序通过环境变量的完整值访问$PQRHOME下的文件。

    假设$PQRHOME的“安装时”值为/opt/pqr。

    已知攻击:

    • 这实际上是/opt/pqr的符号链接,因此当其中一个pqr程序(称为pqr受害者)检查目录时,它具有正确的权限。
    • 可怕的事情发生在pqr受害者现在访问假定安全目录下的文件时。

    已知的选项包括:

    1. 建立到PQRHOME的直接路径并验证其安全性(详细信息如下),如果不安全则拒绝启动,然后使用直接路径而不是$PQRHOME的值(当它们不同时)。(这要求所有使用$PQRHOME的文件操作不使用getenv()中的值)但是映射的路径。例如,这需要软件确定/home/attacker/pqr是/opt/pqr的符号链接,/opt/pqr的路径是安全的,此后,每当文件被引用为$PQRHOME/some/thing时,使用的名称将是/opt/pqr/some/thing而不是/home/attacker/pqr/some/thing。这是一个庞大的代码库-这可不是小事。)
    2. 确保$PQRHOME上的所有目录(即使通过符号链接进行跟踪)都是安全的(详细信息如下),并且如果有任何不安全的地方,软件将拒绝启动。
    3. 硬编码到软件安装位置的路径。(这对PQR不起作用;如果没有其他功能的话,它会让测试变得非常困难。对于用户来说,这意味着他们只能安装一个版本,升级等需要并行运行。这对PQR不起作用。)

    • 理由:所有者可以随时更改权限,因此必须相信所有者不会随意更改,从而破坏软件的安全性。
    • 理由:如果组成员可以修改目录,则他们可以破坏软件的安全性,因此他们必须无法更改目录,或者必须信任他们不会更改目录。 )
    • 默认情况下,可以信任用户root、bin、sys和pqrusr(其中存在bin和sys)。

    POSIX函数 realpath() 提供将/home/attacker/pqr映射到/opt/pqr的映射服务;它不执行安全检查,但只需要在已解析的路径上执行。

    那么,以所有这些为背景,是否有任何已知的软件通过模糊相关的旋转来确保其安全性?这是不是太偏执了?(如果是,为什么——你真的确定吗?)

    编辑:

    谢谢你的各种评论。

    @S.洛特:攻击(在问题中概述)意味着至少可以让一个setuid根程序使用用户选择的格式字符串,并且至少可以使程序崩溃,因此最有可能获得根shell。幸运的是,它需要本地shell访问;这不是远程攻击。它需要一个不可忽略的知识量到达那里,但我认为这是不明智的假设专业知识不是“在那里”。

    2 回复  |  直到 17 年前
        1
  •  2
  •   C. K. Young    17 年前

    如果为其写入新值,则选项2有效 $PQRHOME

    socketpair 或者类似的。

        2
  •  1
  •   Jonathan Leffler    17 年前

    声音 偏执狂,但是否偏执取决于您的应用程序运行在哪个系统上,以及攻击者会造成什么伤害。

    因此,如果你的用户群可能是敌对的,如果损害可能非常高,我会选择选项4,但修改如下,以消除其缺点。

    让我引述两件相关的事情:

    其下为“安全”(归pqrusr所有, 属于pqrgrp,没有公共 写入访问权限)。

    2)

    此后,程序通过完整的

    您实际上不需要硬编码完整路径,您可以硬编码从1)中提到的“程序”到2)中提到的文件所在路径的相对路径。

    控制问题:

    a) 您必须确保在可执行文件路径和文件路径之间没有任何“攻击者可访问”的内容(例如,符号链接)

    b) 您必须确保可执行文件以可靠的方式检查自己的路径,但这在我所知道的所有Unix中都不是问题(但我不知道所有Unix,也不知道windows)。


    在第3条评论后编辑:

    如果您的操作系统支持/proc,那么syslink/proc/${pid}/exe是解决b)的最佳方法


    睡眠后编辑:

    安装过程是否“安全”?如果是这样,您可以(在安装时)创建一个包装器脚本。此脚本应该是可执行的,但不可写(也可能既不可读)。它会将$PQRHOME env var设置为“safe”值,然后调用您的实际程序(它最终可能还会做其他有用的事情)。因为在UNIX中,运行进程的环境变量 不能 除了运行的进程之外,任何其他东西都可以改变,您是安全的(当然是环境变量) 由家长更改 过程开始)。不过,我不知道这种方法在Windows中是否有效。