1

我有一个 C++ 程序,它将以 root 身份运行某些非常特定的命令。需要这样做的原因是因为在 Node.js 下运行的另一个程序需要执行设置系统时间、设置时区等需要 root 权限才能完成的事情。在使用 setuid 命令后,我正在使用 C++ 中的函数 execve 以 root 权限进行系统调用。我特地选择了 execve 命令,因为我想隔离环境,所以我不会创建环境变量漏洞。

 setuid(0);
 execve(acExeName, pArgsForExec2, pcEnv);

我想要做的是准确找出 pcEnv ,它是我的程序需要的程序执行的环境变量列表。例如,如果我想像从控制台运行它一样运行工具 time-admin,我如何才能确定它需要哪些环境变量。我知道我可以使用命令 printenv 打印出环境变量,但这给了我所有这些。我很确定我不需要它们,并且想要尽可能小的子集。

我知道我可以全部使用它们,然后慢慢评论每一个,看看它是否继续工作,但我真的不想走那么远。

任何人都有一个聪明的方法来弄清楚程序使用了哪些环境变量?我应该补充一下,我是在 Ubuntu 12.04 LTS 安装上执行此操作的。

谢谢你的帮助。

4

1 回答 1

2

没有通用的方法来确定某些程序使用的环境变量。例如,可以想象一个程序有一些配置文件,这些文件给出了环境变量的名称。

实际上,许多类似 shell 的程序(或脚本解释器)都在这样做。

更一般地,可以计算getenv(3)的参数。所以理论上你无法猜测它的可能值。(我可能是错的,但是一些非常旧的版本libcbash曾经玩过这样的把戏;不幸的是,我忘记了细节,但有时使用了名称中带有一些 pid 号的环境变量)。

而且,正如其他人评论的那样,您可能想使用ltrace(或LD_PRELOAD玩花样)或使用gdb, 来找出如何getenv调用...

并且应用程序也可能使用environ变量(参见environ(7) ...)或第三个参数来main....

然而,在实践中,一个合理编写的程序应该清楚地记录它正在使用的所有环境变量......

如果您可以访问该程序的源代码,如果它是由 GCC 编译的,则可以使用MELT 插件(刚刚发布的 1.0 版) 。MELT 是一种扩展 GCC 的领域特定语言,可用于在编译程序时探索 GCC 处理的内部 Gimple 表示。特别是在它的新findgimple模式下,您可以在一个命令中找到所有对getenv常量字符串的调用。

于 2013-10-29T17:42:01.813 回答