なぜsudoはPATHを変更するのですか?


281

これはPATHsudoなしの変数です。

$ echo 'echo $PATH' | sh 
/opt/local/ruby/bin:/usr/bin:/bin

これはPATHsudo の変数です:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

私の知る限り、手付かずのsudoままにすることになってPATHいます。どうしたの?どうすれば変更できますか?(これはUbuntu 8.04にあります)。

更新:私の知る限り、ルートとして開始されたスクリプトPATHはまったく変更されていません。

からman sudo

コマンドのなりすましを防ぐために、sudoは、ユーザーのPATHでコマンドを検索するときに(一方または両方がPATHにある場合)、「。」と「」(どちらも現在のディレクトリを示す)を最後にチェックします。ただし、実際のP​​ATH環境変数は変更されず、sudoが実行するプログラムに変更されずに渡されることに注意してください。


rootは.bashrcにPATHを設定するものを持っていますか?Linuxを使用しているため、shは本当にbashであると想定しています。
グレッグ・ヒューギル

回答:


241

これは 迷惑な機能 多くのディストリビューションでのsudoの機能

ubuntuでこの「問題」を回避するには、〜/ .bashrcで次のようにします。

alias sudo='sudo env PATH=$PATH'

上記は$ PATH自体をリセットしないコマンドで機能することに注意してください。ただし、 `su 'は$ PATHをリセットするため、-pを使用してしないように指示する必要があります。IE:

sudo su -p

46
この「迷惑な機能」は、トロイの木馬に感染するのを防ぎます。特定の$ PATHを強制することはバグではなく機能であると言います---それは$ PATHの外にあるプログラムへの完全なパスを書き出させます。
Chris Jester-Young、

29
ええ、でもそれは完全に直観に反しています。それはおそらく悪者よりも善人をだますことができます。
ブライアンアームストロング

31
これは直観に反するだけでなく、誤って文書化されています。sudoのmanページを読んで、設定をFedoraボックスと比較して、パスを保持する必要があると思いました。実際、「sudo -V」は「保存する環境変数:PATH」とも言います。
Jason R. Coombs

6
気に障る。限目。sudoによって「トロイの木馬に仕上がる」可能性がある場合、それなしでも同じようにトロイの木馬を仕掛けることができます。確かに難しいですが、通常のユーザーであっても、間違った場所からコードを実行している場合は、事態はすでに十分に悪いものです。
gcb 2012年

7
sudoをエイリアスしないでください。デフォルトのenv_resetについては、@ Jacobからの回答を参照してください。
greg_1_anderson 2012

121

他の誰かがこれを横切って実行し、すべてのユーザーのすべてのパス変数の変更を無効にしたい場合。
次のコマンドを使用して、sudoersファイルにアクセスしますvisudo。次の行がどこかに表示されるはずです。

デフォルトenv_reset

次の行に次を追加する必要があります

デフォルト!secure_path

secure_pathはデフォルトで有効になっています。このオプションは、sudoing時に$ PATHを何にするかを指定します。感嘆符は機能を無効にします。


6
別の方法:Defaults env_keep = "PATH"
gcb 2012年

1
デフォルト!secure_pathは、現代のシステムではうまく機能しました。古いubuntu 8.04ボックスでは、Defaults env_keep = "PATH"がうまくいきました。
greg_1_anderson 2012

29
secure_pathを無効にする代わりに、それに追加できます。たとえば、私の場合、「Defaults secure_path = / sbin:/ bin:/ usr / sbin:/ usr / bin:/ some / custom / directory」という行を追加しました。「some / custom / directory」は必要なパスですsudoで使用できるようにします。
Hector Correa、

@HectorCorreaソリューションは、IMOのより良い方法です。
chakrit 2013

32

PATH は環境変数であるため、デフォルトでsudoによってリセットされます。

これを行うには、特別な権限が必要です。

から man sudo

       -E -E(環境の保持)オプションは、env_resetをオーバーライドします
           sudoers(5)のオプション)。どちらかが一致した場合にのみ使用できます
           ingコマンドにSETENVタグがあるか、sudo-でsetenvオプションが設定されている
           ers(5)。
       コマンドに設定する環境変数も渡すことができますVAR = valueの
       形式のコマンドライン(例:
        LD_LIBRARY_PATH = / usr / local / pkg / lib)。コマンドで渡される変数
       行には、通常の環境変数と同じ制限が適用されます
       重要な例外が1つあります。setenvオプションが設定されている場合
       sudoers、実行するコマンドにSETENVタグが設定されているか、コマンド
       一致したものがすべての場合、ユーザーは、過剰に実行される変数を設定できます。
       入札。詳細については、sudoers(5)を参照してください。

使用例:

cat >> test.sh
env | grep "MYEXAMPLE" ;
^D
sh test.sh 
MYEXAMPLE=1 sh test.sh
# MYEXAMPLE=1
MYEXAMPLE=1 sudo sh test.sh 
MYEXAMPLE=1 sudo MYEXAMPLE=2 sh test.sh 
# MYEXAMPLE=2

更新

man 5 sudoers: 

     env_reset設定されている場合、sudoは環境をリセットして、
                       LOGNAME、SHELL、USER、USERNAMEおよびSUDO_ *変数
                       できます。呼び出し元の環境にある変数
                       env_keepに一致し、env_checkリストが追加されます。
                       env_keepおよびenv_checkのデフォルトの内容
                       sudoをrootで実行すると、リストが表示されます。
                       -Vオプション。sudoがSECURE_PATHを使用してコンパイルされた場合
                       オプション、その値はPATH環境に使用されます
                       変数。このフラグはデフォルトでオンになっています。

したがって、これがコンパイルされているかどうかを確認する必要があります。

Gentooではデフォルトです

# ( From the build Script )
....
ROOTPATH=$(cleanpath /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/opt/bin${ROOTPATH:+:${ROOTPATH}})
....
econf --with-secure-path="${ROOTPATH}" 

17

このバグはかなり前から存在しているようです!役立つと思われるいくつかのバグ参照を以下に示します(サブスクライブ/投票、ヒント、ヒント...):


Debianバグ#85123( "sudo:SECURE_PATHはまだオーバーライドできません")(2001年から!)

Bug#20996はこのバージョンのsudoにまだ存在しているようです。変更ログは、実行時に上書きされる可能性があると述べていますが、まだその方法を発見していません。

彼らはあなたのsudoersファイルにこのようなものを置くことを述べています:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin"

しかし、少なくともUbuntu 8.10でそれを行うと、次のエラーが発生します。

visudo: unknown defaults entry `secure_path' referenced near line 10

Ubuntuバグ#50797(「--with-secure-pathでビルドされたsudoは問題がある」)

さらに悪いことに、私が知る限り、sudoersファイルでsecure_pathを再指定することは不可能です。したがって、たとえば、ユーザーが/ optの下にあるものに簡単にアクセスできるようにしたい場合は、sudoを再コンパイルする必要があります。


はい。再コンパイルせずにこの「機能」をオーバーライドする方法が必要です。何よりも悪いことは、セキュリティの偏見があなたの環境に最適なものをあなたに告げ、それをオフにする方法を与えないことです。


これは本当に迷惑です。セキュリティ上の理由から、デフォルトで現在の動作を維持するのが賢明かもしれませんが、ソースコードから再コンパイルする以外にそれをオーバーライドする方法があるはずです!多くの人がPATH継承を必要としています。なぜメンテナがそれを調べないのか、私は容認できる解決策を考え出すのは簡単に思えます。


私はこのようにそれを回避しました:

mv /usr/bin/sudo /usr/bin/sudo.orig

次に、以下を含むファイル/ usr / bin / sudoを作成します。

#!/bin/bash
/usr/bin/sudo.orig env PATH=$PATH "$@"

次に、通常のsudoは非セキュアパスsudoと同じように機能します


Ubuntuバグ#192651(「sudoパスは常にリセットされる」)

このバグの複製が2006年7月に最初に提出されたことを考えると、効果のないenv_keepがどのくらいの期間動作していたのかはわかりません。ユーザーに上記のようなトリックを強制するメリットが何であれ、sudoおよびsudoersのmanページは、PATHを変更するオプションが事実上冗長であることを反映しているはずです。

実際の実行を反映するようにドキュメントを変更することは、不安定にならず、非常に役立ちます。


Ubuntuのバグ#226595(「PATHを保持/指定できない」)

PATHに追加の非stdバイナリフォルダーを使用してsudoを実行できるようにする必要があります。/ etc / environmentにすでに要件を追加しているので、sudoでコマンドを実行すると、コマンドが見つからないというエラーが表示されて驚いた。

私は成功せずにこれを修正するために以下を試しました:

  1. sudo -E」オプションの使用-機能しませんでした。私の既存のPATHはまだsudoによってリセットされました

  2. / etc / sudoersの「Defaults env_reset」を「Defaults !env_reset」に変更-機能しませんでした(sudo -Eと組み合わせた場合でも)

  3. / etc / sudoersのコメント解除env_reset(例: " #Defaults env_reset")-も機能しませんでした。

  4. 「追加Defaults env_keep += "PATH"には/ etc / sudoersファイル」 -も仕事はしませんでした。

明らかに-manドキュメントにもかかわらず-sudoはPATHに関して完全にハードコーディングされており、ユーザーのPATHを保持することに関して柔軟性を与えません。sudoを使用してroot権限でデフォルト以外のソフトウェアを実行することはできないため、非常に迷惑です。


13

これは私にはうまくいったようです

sudo -i 

非sudoを引き受けます PATH


'sudo -i'はUbuntuでは役に立ちません(私はUbuntu 14.04.3 LTSをチェックしました)。$ PATHは引き続きsudoによって変更されます。
MarcinRaczyński、2016

11

sudoでPATHをリセットすることが実際に望ましいと思います。そうしないと、ユーザーアカウントを侵害した攻撃者がユーザーのPATHにあらゆる種類のツールのバックドアバージョンを配置し、sudoを使用するときに実行されます。

(もちろん、sudoでPATHをリセットすることは、この種の問題の完全な解決策ではありませんが、役立ちます)

これは実際に使用すると何が起こるかです

Defaults env_reset

中には/ etc / sudoersを使用せずexempt_group、又はenv_keep

これは、ユーザーのパスに追加することなく、ルート(/sbinおよびなど/usr/sbin)にのみ役立つディレクトリをsudoパスに追加できるので便利です。sudoが使用するパスを指定するには:

Defaults secure_path="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin"

sudoerアカウントにアクセスする攻撃者は、さらに悪いことをすることができます。
user508546 2012年

まともなアドバイス。ubuntu 12.04サーバーでは、同様の設定がデフォルトです。
Tsutomu

7

カルマリポジトリのsudoを使用して動作します。私の設定の詳細:

root@sphinx:~# cat /etc/sudoers | grep -v -e '^$' -e '^#'
Defaults    env_reset
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/grub-1.96/sbin:/opt/grub-1.96/bin"
root    ALL=(ALL) ALL
%admin ALL=(ALL) ALL
root@sphinx:~# cat /etc/apt/sources.list
deb http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ jaunty-updates main restricted universe

deb http://security.ubuntu.com/ubuntu jaunty-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu jaunty-security main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic main restricted universe

deb http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe
deb-src http://au.archive.ubuntu.com/ubuntu/ karmic-updates main restricted universe

deb http://security.ubuntu.com/ubuntu karmic-security main restricted universe
deb-src http://security.ubuntu.com/ubuntu karmic-security main restricted universe
root@sphinx:~# 

root@sphinx:~# cat /etc/apt/preferences 
Package: sudo
Pin: release a=karmic-security
Pin-Priority: 990

Package: sudo
Pin: release a=karmic-updates
Pin-Priority: 960

Package: sudo
Pin: release a=karmic
Pin-Priority: 930

Package: *
Pin: release a=jaunty-security
Pin-Priority: 900

Package: *
Pin: release a=jaunty-updates
Pin-Priority: 700

Package: *
Pin: release a=jaunty
Pin-Priority: 500

Package: *
Pin: release a=karmic-security
Pin-Priority: 450

Package: *
Pin: release a=karmic-updates
Pin-Priority: 250

Package: *
Pin: release a=karmic
Pin-Priority: 50
root@sphinx:~# apt-cache policy sudo
sudo:
  Installed: 1.7.0-1ubuntu2
  Candidate: 1.7.0-1ubuntu2
  Package pin: 1.7.0-1ubuntu2
  Version table:
 *** 1.7.0-1ubuntu2 930
         50 http://au.archive.ubuntu.com karmic/main Packages
        100 /var/lib/dpkg/status
     1.6.9p17-1ubuntu3 930
        500 http://au.archive.ubuntu.com jaunty/main Packages
root@sphinx:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin
root@sphinx:~# exit
exit
abolte@sphinx:~$ echo $PATH
/home/abolte/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/chromium-17593:/opt/grub-1.96/sbin:/opt/grub-1.96/bin:/opt/xpra-0.0.6/bin
abolte@sphinx:~$ 

ハックを使わずにこれを最終的に解決できるのは素晴らしいことです。


4
おそらく、この特定の問題を解決するために、Karmicをクリーンインストールした人が設定を更新する方法を示すために、これを書き直すことを検討します。
Jason R. Coombs

4
# cat .bash_profile | grep PATH
PATH=$HOME/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
export PATH

# cat /etc/sudoers | grep Defaults
Defaults    requiretty
Defaults    env_reset
Defaults    env_keep = "SOME_PARAM1 SOME_PARAM2 ... PATH"

3

/ etc / sudoersの「Defaults env_reset」をコメント化するだけです


3

編集env_keepするだけ/etc/sudoers

次のようになります。

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE"

最後にPATHを追加するだけなので、変更後は次のようになります。

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L ANGUAGE LINGUAS XDG_SESSION_COOKIE PATH"

ターミナルを閉じて、もう一度開きます。


PATHが2を必要とするのを待ちます**?なぜPATHに**が必要なのですか?
CMCDragonkai 2014年

@CMCDragonkai太字(マークダウン)にフォーマットされていましたが、誰か(スタックオーバーフローによって指を向けることはできません)が編集してコードとしてマークアップしました。
1j01

2

Secure_pathはあなたの友達ですが、Secure_pathを免除したい場合は、

sudo visudo

そして追加

デフォルトexempt_group = your_goup

多数のユーザーを除外する場合は、グループを作成し、すべてのユーザーをグループに追加して、それをexempt_groupとして使用します。男5人以上のsudoers。


1

OpenSUSEディストリビューションのコメントで推奨される解決策は、変更することを提案しています。

Defaults env_reset

に:

Defaults !env_reset

そしておそらくおそらく不要な次の行をコメントアウトする:

Defaults env_keep = "LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASURE    MENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL L    ANGUAGE LINGUAS XDG_SESSION_COOKIE"

1

/ etc / sudoresファイルの「デフォルトのenv_reset」と「デフォルトのsecure_path ...」の両方をコメント化すると、うまくいきます


1

ファイルをsudoers usedディレクトリに移動することもできます:

    sudo mv $HOME/bash/script.sh /usr/sbin/ 

0

ええと、パスに何かを追加しない場合、それは実際にはテストではありません。

bill @ bill-desktop:〜$ ls -l / opt / pkg / bin
合計12
-rwxr-xr-x 1ルートルート28 2009-01-22 18:58 foo
bill @ bill-desktop:〜$ which foo
/ opt / pkg / bin / foo
bill @ bill-desktop:〜$ sudo su
root @ bill-desktop:/ home / bill#foo
root @ bill-desktop:/ home / bill# 

0

ENV_SUPATHの定義、および/etc/login.defsで定義されたENV_PATHの定義によってsuまたはsudoを使用すると、PATHがリセットされます


0

$ PATHは環境変数であり、これは$ PATHの値が別のユーザーによって異なる可能性があることを意味します。

システムにログインしているときは、プロファイル設定によって$ PATHの値が決まります。

今、見てみましょう:-

User       |        Value of $PATH
--------------------------
root                /var/www
user1               /var/www/user1
user2               /var/www/html/private

これらが異なるユーザーの$ PATHの値であるとします。今、あなたがsudoでコマンドを実行しているとき、実際の意味で使用してコマンドを実行すると rootユーザーがそのコマンドを実行します。

端末で次のコマンドを実行して確認できます:-

user@localhost$ whoami
username
user@localhost$ sudo whoami
root
user@localhost$ 

という訳だ。それはあなたには明らかだと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.