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
これは私が試したすべての環境変数で発生します。これはセキュリティの問題ですか?それでは、どのように軽減できますか?そうでなければ、なぜできないのですか(誰かがこれを使ってPATH
root でマルウェアを実行するように調整できることがわかりました)。
私のディレクトリにファイルがありません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
親シェルによって解釈が実行されます。sudo
echo
echo sudo echo $TERM
解釈を1段階遅らせることで$
「脱出」できます。\
sudo echo \$TERM
読むman sudo sudoers bash
。