bash 脚本可以重置和清理*整个*环境吗?如何?

Mil*_*vić 3 shell security bash shell-script environment-variables

你知道这个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');
//...
Run Code Online (Sandbox Code Playgroud)

我们可以env_reset像运行脚本一样sudo做吗?如何做?

编辑:

我不是在寻找“从外面”env -i command而是从脚本本身内部来做这件事的方法。我的目的是确保无论谁(什么用户)以及如何(在哪种情况下,即环境变量)运行它的安全性。

Sté*_*las 5

bash本身使用一些环境变量。当bash开始并准备好解释它的第一个命令时,已经太晚了,恶意环境可能已经bash造成损害。

您需要在bash调用之前对环境进行消毒。您可以clearenv()在大多数系统上使用C 函数擦除环境,或者您可以调用execve()脚本并在envp参数中传递一个空列表。

即使使用包含以下内容的脚本:

#! /bin/bash -
:
Run Code Online (Sandbox Code Playgroud)

:作为一个特殊的内置函数),如果环境包含SHELLOPTS=xtrace PS4='$(reboot)'reboot则将在 上调用该命令:

如果bash是动态链接,LD_PRELOAD/LD_LIBRARY_PATH可以在bash调用后立即运行任意代码。

bash还尊重语言环境的字符集进行解析,因此使用LOCPATHLC_*变量,您甚至可以让该#! /bin/bash -行调用任意代码(例如,通过将#!/bina字符设置为空白)。

也可以看看:

env SHELLOPTS=noexec any-bash-script
Run Code Online (Sandbox Code Playgroud)

这停止bash做任何事情。

这些只是几个例子。

另请注意,环境变量不是命令在启动时继承的唯一内容,并且可能会影响其行为(如参数、umask、限制、当前工作目录、打开的文件描述符、信号处理、控制终端......)。