为什么环境变量被传递到 sudo 会话,这是一个问题吗?

为什么环境变量被传递到 sudo 会话,这是一个问题吗?

我读到了一些关于当 sudoing 是一个安全问题时如何允许将环境变量传递给 root 的读物。这促使我检查我的环境以确保我的设置正确。

我使用的是 Ubuntu,并且有默认的 sudoers 文件,其中包括:

Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
...
%sudo   ALL=(ALL:ALL) ALL

从我读到的内容来看,似乎应该env_reset从 sudo 会话中删除环境变量(除非用 env_keep 或 SETENV 覆盖),但这似乎没有发生。

$ sudo -u root echo $TERM
xterm-256color
$ export TERM=BLAH
$ sudo -u root echo $TERM
BLAH

我尝试过的每个环境变量都会发生这种情况。这是安全问题吗?如果是这样,我该如何缓解?如果不是,为什么不呢(我了解到有人可以使用它来调整PATH以 root 身份运行恶意代码)?

我的目录中没有任何文件sudoers.d

编辑:

在上面的示例中,shell 似乎在切换用户之前扩展了变量。但是,当我启动交互式 shell 时,我得到了同样的结果:

$ echo $TERM
xterm-256color
$ export TERM=BLAH
$ sudo -i         
# echo $TERM
BLAH

HOME但是,当我使用or运行上面的代码片段时PATH那些变量重置,这符合我的期望文档

除了 env_check 和 env_keep 选项允许的调用进程中的变量之外,新环境还包含 TERM、PATH、HOME、MAIL、SHELL、LOGNAME、USER、USERNAME 和 SUDO_* 变量。

但是,TERM在该列表中,您可以看到我能够将其传递给 root,并且这似乎也适用于其他任意变量。

答案1

的解释$TERM是由父 shell 完成的,sudo甚至在运行之前,正如您可以通过在命令前面添加以下内容来看到的echo

echo sudo echo $TERM 

您可以“转义” $with\以将解释延迟一级:

sudo echo \$TERM

man sudo sudoers bash

相关内容