sudoコマンドで実行ユーザのPATHを引き継がない場合、どういった不都合が起こる可能性があるか


**環境**  
・CentOS7

* * *

**Q1. sudoコマンドで実行ユーザのPATHは、デフォルトではどうして引き継がれないのですか？**  
・sudoは「一般ユーザー」に対して「root権限」を付与するものだと思うのですが、デフォルトでPATHを引き継がない仕様になっている理由としては、何が挙げられるでしょうか？

**Q2. sudoコマンドで実行ユーザのPATHを引き継がない場合**  
・どういった不都合が発生する可能性があるのでしょうか？

**Q3. suコマンドの場合**  
・デフォルトでPATHを引き継ぐ、という認識で合っているでしょうか？  
・suコマンドを使っておけば問題ない？




PATHを気にしない場合、

  * su/sudoを利用できるユーザーが不適切なPATHを設定している(またはさせられている)
  * 悪意あるユーザーがそのディレクトリにファイルを配置できる

という条件が揃うと、root権限で悪意のプログラムを実行させられる可能性があります。簡単な例だと、

  * `PATH`に/tmpを追加する
  * /tmp/shutdownという(悪意の)実行ファイルを用意する
  * sudo shutdownすると死ぬ

こうなります。

suは今どき使うべきではないというのがコンセンサスです。suはユーザーそのものを成り代わらせるためのものなので、

  * パスワードを共有することになる
  * シェルを明け渡すことになる(何でもできる)
  * suを実行したということしかログに残らない

などいろいろ不都合があります。頑張ればある程度制御できないこともないですが、sudo使う方が安全で確実です。




回答ではないのですが、環境変数 PATH の引き継ぎについて少し。

「デフォルト」という言葉の捉え方の問題かもしれませんが、`sudoers(5)` には以下の様に記述されています。

> **sudoers(5)**
>
> **env_reset**  
>  If set, sudo will run the command in a minimal environment containing the
> TERM, **PATH** , HOME, MAIL, SHELL, LOGNAME, USER, USERNAME and SUDO_*
> variables. Any variables in the caller's environment that match the env_keep
> and env_check lists are then added, followed by any variables present in the
> file specified by the env_file option (if any). The default contents of the
> env_keep and env_check lists are displayed when sudo is run by root with the
> -V option. **If the secure_path option is set, its value will be used for
> the PATH environment variable**. **This flag is on by default**.

おそらく、ほぼ全てのシステム・ディストリビューションで `secure_path` を設定しているので PATH
変数が引き継がれない様に見えているのではないかと思います(これを「デフォルト」と呼ぶのかもしれませんが）。

[code]

    $ lsb_release -d
    Description:    CentOS release 6.9 (Final)
    $ grep secure_path /etc/sudoers
    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
    $ sudo sudo -V
            :
    
    Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
    
    $ echo $PATH
    /home/nemo/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/sbin:/usr/sbin
    $ sudo sh -c 'echo $PATH'
    /sbin:/bin:/usr/sbin:/usr/bin
    $ sudo PATH="$PATH" sh -c 'echo $PATH'
    /home/nemo/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/sbin:/usr/sbin
    
[/code]

