環境変数がsudoセッションに渡されるのはなぜですか?これは問題ですか?

環境変数がsudoセッションに渡されるのはなぜですか?これは問題ですか?

sudoingがセキュリティの問題であるときに環境変数がルートに渡されることを許可する方法について読んでみました。これにより、設定が正しいことを確認するために環境を確認するように求められます。

私は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_keepまたはSETENVでオーバーライドされない限り)は、sudoセッションから環境変数を削除する必要があるようですが、env_resetそれは起こらないようです。

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

これは私が試したすべての環境変数で発生します。これはセキュリティの問題ですか?それでは、どのように軽減できますか?そうでなければ、なぜできないのですか(誰かがこれを使ってPATHroot でマルウェアを実行するように調整できることがわかりました)。

私のディレクトリにファイルがありませんsudoers.d

編集する:

上記の例では、シェルはユーザーを切り替える前に変数を拡張しているように見えます。ただし、対話型シェルを実行すると同じ結果が表示されます。

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

HOMEしかし、またはを使って上記のコードを実行するとPATHそれら変わりやすいはいリセット、それは私が期待していたもの文書

env_checkおよびenv_keepオプションで許可される呼び出しプロセスの変数に加えて、新しい環境には、TERM、PATH、HOME、MAIL、SHELL、LOGNAME、USER、USERNAME、およびSUDO_ *変数が含まれます。

しかし、TERMそのリストからルートに渡すことができることがわかります。これは他の任意の変数にも機能するようです。

答え1

コマンドの前に以下を追加すると、見てわかるように、実行前に$TERM親シェルによって解釈が実行されます。sudoecho

echo sudo echo $TERM 

解釈を1段階遅らせることで$「脱出」できます。\

sudo echo \$TERM

読むman sudo sudoers bash

関連情報