【发布时间】:2017-01-27 05:38:38
【问题描述】:
编辑#1
到目前为止,“可能的重复”是不是重复的。他们在$PATH 中测试$FILE 的存在,而不是提供第一个有效结果的完整路径;最佳答案使用bash 命令行命令,而不是纯c。
原始问题
在所有 exec 系列函数中,有一些函数会进行 $PATH 查找,而不需要执行二进制文件的绝对路径。
来自man exec:
execlp()、execvp() 和 execvpe() 函数复制操作 如果指定了在搜索可执行文件时的 shell 文件名不包含斜杠 (/) 特点。在 PATH 环境变量中指定的以冒号分隔的目录路径名列表中查找该文件。如果 此变量未定义,路径 list 默认为当前目录,后跟 confstr(_CS_PATH) 返回的目录列表。 (这个 confstr(3) call 通常返回值 “/bin:/usr/bin”。)
是否有一种简单直接的方法来测试第一个“执行的完整路径”将评估为什么,而无需手动遍历 $PATH 环境变量中的所有元素,并将二进制名称附加到路径的尽头?我想使用“事实上的标准”方法来估计要运行的二进制文件,而不是重写过去可能已经实施过多次的任务。
我知道这不能保证,因为有人可能会通过错误的脚本、TOCTOU 攻击等使该检查无效。我只需要一个合适的近似值来进行测试。
谢谢。
【问题讨论】:
-
你为什么要问?实际用例是什么?请编辑您的问题以激发它。
-
@BasileStarynkevitch 我想知道什么程序将(可能)提前执行以进行测试。
-
对安全敏感的应用程序应该做的测试(在我偏执的意见中)是首先找到要执行的实际二进制文件(然后使用确切的完整路径),然后检查文件的所有权,目录和所有父目录,两次。这个想法是验证没有不受信任的用户对它们中的任何一个具有写访问权;第二遍是验证与第一遍(诱饵和转换)相比没有任何变化。 UID 0、GID 0(“root”)始终是受信任的,任何其他受信任的帐户都依赖于应用程序。
标签: bash c c linux exec system-calls execl