你知道这些sudo
东西:
Defaults env_reset
这使得环境注入变得不可能。我想知道这个功能是否可以直接从 bash 脚本“从内部”获得?
至少部分可以,这是肯定的。例子:
#!/usr/bin/env php
<?php
//...
// sanitizes $PATH
putenv("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin");
// unsets $LD_LIBRARY_PATH, as it should be in Ubuntu
putenv('LD_LIBRARY_PATH');
//...
我们可以env_reset
像那样运行脚本吗sudo
?如何做?
编辑:
我不是在寻找“从外部”执行此操作的方法,
env -i command
而是从脚本本身的内部执行此操作。我的目的是确保安全性,无论谁(什么用户)以及如何(在哪种情况下,即环境变量)运行它。
答案1
bash
本身使用一些环境变量。当bash
启动并准备解释其第一个命令时,已经太晚了,恶意环境可能已经造成了bash
损害。
bash
您需要在调用之前对环境进行清理。您可以在大多数系统上使用 C 函数擦除环境clearenv()
,或者您可以只调用execve()
脚本并在envp
参数中传递一个空列表。
即使脚本包含:
#! /bin/bash -
:
(:
作为一个特殊的内置命令),如果环境包含SHELLOPTS=xtrace PS4='$(reboot)'
,reboot
则将调用该命令:
。
如果bash
是动态链接的,LD_PRELOAD
/LD_LIBRARY_PATH
可以bash
在调用时立即运行任意代码。
bash
还尊重语言环境的字符集进行解析,因此使用LOCPATH
和LC_*
变量,您甚至可以让该#! /bin/bash -
行调用任意代码(#!/bina
例如,通过将字符设为空白)。
也可以看看:
env SHELLOPTS=noexec any-bash-script
这会阻止bash
做任何事情。
这些只是几个例子。
另请注意,环境变量并不是命令在启动时继承的唯一内容,并且可能会影响其行为(如参数、umask、限制、当前工作目录、打开文件描述符、信号配置、控制终端...)。
答案2
export -p
您可以使用或 简单地找到您的导出,并将每行上的export
替换为 以取消导出它:declare -x
declare +x
eval "$(export|sed s/-/+/)"
如果您将其放在脚本的开头,那么除非您自己显式导出环境变量,否则不会将环境变量传递给它执行的程序。您可能想要导出语言环境和TZ
变量,TERM
以及更多...