任何人都可以指向一些代码来处理文件访问的安全性,通过一个环境variables指定的path(特别是Unix和它的变体),但Windows解决scheme也是有趣的吗?
这是一个很长的问题 – 我不确定它是否适合SO范式。
考虑这种情况:
背景:
目前的检查:
假定$ PQRHOME的'as installed'值是/ opt / pqr。
已知的攻击:
鉴于PQR目前的行为如上所述,并且是一个大型的软件包(数十万行代码,十多年来发展到各种编码标准,无论如何都经常被忽略),您将使用什么技术来修复问题?
已知的选项包括:
build议的安全path标准:
POSIX函数realpath()提供了一个映射服务,它将/ home / attacker / pqr映射到/ opt / pqr; 它不会执行安全检查,但只需要在已解决的path上完成。
那么,以这些背景为基础,是否有任何已知的软件会经历模糊的旋转以确保其安全? 这是过分偏执吗? (如果是这样,为什么 – 你确定吗?)
编辑:
感谢各种意见。
@ S.Lott:攻击(在问题中概述)意味着至less有一个setuid root程序可以使用(非特权)用户select的格式string,并且至less可以使程序崩溃,因此最有可能获取一个root shell。 幸运的是,它需要本地shell访问。 这不是一个远程攻击。 它需要一个不可忽视的数量的知识才能到达那里,但我认为假设专业知识不是“在那里”是不明智的。
所以,我所描述的是一个“格式化string漏洞”,已知的攻击path包括伪造程序,所以尽pipe它认为它正在访问安全的消息文件,但实际上它会使用消息文件(包含格式string)在用户的控制下,不在软件的控制下。
如果您在解析其真实路径并检查其安全性后为$PQRHOME写入新值,则选项2将起作用。 这样你的代码很少需要改变。
就保持setuid特权而言,如果你可以做某种特权分离,这将有所帮助,这样任何涉及真实用户输入的操作都会在真实的uid下运行。 然后特权进程和真实用户进程使用socketpair或类似的东西进行交谈。
好吧,这听起来是偏执的,但是如果是的话,取决于你的应用程序在哪个系统上运行,以及攻击者可以造成哪些破坏。
所以,如果你的用户基础可能是敌对的,如果损害可能很高,我会去选项4,但修改如下,以消除其缺点。
让我引用两个相关的东西:
1)
程序目前检查$ PQRHOME及其下的关键目录是否安全(由pqrusr拥有,属于pqrgrp,没有公共写权限)。
2)
之后,程序通过环境变量的全部值访问$ PQRHOME下的文件。
您不需要实际硬编码完整路径,您可以硬编码从1)中提到的“程序”到2)文件所在路径中的相对路径。
问题来控制:
a)您必须确保在可执行文件路径和文件路径之间没有任何“攻击者可访问”(例如,符号链接)
b)你必须确保可执行文件以可靠的方式检查自己的路径,但是在我所知道的所有Unix中,这不应该是一个问题(但是我不知道他们是谁,我也不知道windows在所有)。
在第三条评论之后编辑:
如果你的操作系统支持/ proc,syslink / proc / $ {pid} / exe是解决问题的最好方法。b)
睡觉后编辑:
安装过程是否安全? 如果是这样,你可以创建(在安装时)包装脚本。 这个脚本应该是可执行的,但不可写(也可能不可读)。 它会将$ PQRHOME env var设置为“安全”值,然后调用您的实际程序(最终可能还会做其他有用的事情)。 由于在UNIX中,正在运行的进程的环境除了运行的进程之外不能被其他任何东西改变,所以你是安全的(当然,在进程启动之前 ,环境可以被父进程改变)。 不过,我不知道这种方法是否可以在Windows中使用。