我读到了一些关于当 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
。