長年のUNIXライクなシステム(私に関係の深いLinux)では、.
(現在のディレクトリ)がデフォルトで$PATH
に含まれていないことに気づきました。どうしてこれなの?
何年も前に読んだことを思い出して、それがセキュリティの問題であったことを思い出しましたが、私が読んだ記事では、問題が正確に何であるかを説明していませんでした。誰かがls
またはcp
の悪意のあるバージョンをディレクトリに残し、そこにあることに気付かずに実行してしまうからでしょうか。
あなたはあなた自身の質問に正しく答えました、それがまさにドットがパスにない理由です:
幼稚なウイルスや正直な間違いから保護するため。
もちろん、これは非常に不十分で役に立たないウイルス対策であり、自分でパスにドットを追加することを妨げるものは何もありません。
はい。 「。」を入れればパスでは、現在のディレクトリにあるファイルに大量のコマンド呼び出しを送信することになります。
それが最後だったとしても、まだパイロットエラーがあります。たとえば、Solaris 10には「トップ」がありません。私は「トップ」を備えたシステム上にいると思うので、私のシステムで「トップ」と一日中入力します。
「。」を持つことは、セキュリティ上のリスク以上のものです。 PATHでは、コマンドの実行が意図したとおりに機能することを確認することはほとんど不可能です。ランダムな名前の何千ものファイルを含む巨大なディレクトリで「Zip」のようなコマンドを実行することを考えてください。それらの1つが実際に「Zip」と名付けられている可能性は無視できず、理解するのが非常に難しいエラーにつながります(実際にはファイルは実行可能であるはずですが、発生する可能性があります)。
特にこれは、ユーザーのPATH変数を保持するスクリプトを記述する場合に当てはまります。適切に記述されたスクリプトは、すべてのコーナーケース(スペースが含まれるファイル名や「-」で始まるファイル名など)を処理する必要があります。しかし、システムコマンドの代わりに現在のディレクトリのファイルが実行されるのを防ぐのは非現実的です...
申し訳ありませんが、選択した回答に対するコメントの形式で質問したいのですが、スーパーユーザーの担当者はいません。
セキュリティの答えは理にかなっていますが、「。」を付ければ最後に、PATHで、シェルが実行可能ファイルを検索するときに現在のディレクトリを最後に調べて、セキュリティリスクを減らすべきではありませんか? $ PATHを順番に検索した場合、。/ lsを見つける前に/ bin/lsを見つけます。
つまり、「。」を$ PATH環境変数の末尾に置くのはどの程度安全ではありませんか?
それは私が提案するように動作します。これが私がテストした方法です:
まず、「。」を追加しますPATH環境変数の終わりまで。
次に、以下のファイルを〜/ dir1/dir2/test_which.rbなどのディレクトリに配置します。
#!/your/path/to/Ruby
puts "this file is from the current directory"
そして、このファイルを/usr/bin/test_which.rbに置きます
#!/your/path/to/Ruby
puts "this file is at /usr/bin/test_which.rb"
必ずファイルをchmod + xして実行可能にしてください。
ここで、ディレクトリを〜/ dir1/dir2に変更し、test_which.rbを実行すると、出力が得られます
this file is at /usr/bin/test_which.rb
実際、どこからでも「which test_which.rb」を実行すると、
/usr/bin/test_which.rb
次のように入力すると、現在のディレクトリでファイルを実行できます。
./test_which.rb
$ PATH変数にない理由は、以下のようなささいな悪意のあるコードが原因です-
#! /bin/sh
# make a privileged, hidden copy of the Shell (command interpreter)
cp /bin/sh /tmp/.xxsh
chmod o+s, w+x /tmp/.xxsh
# do what the victim thinks is *all* you’re doing
ls $*
# delete this file
rm ./ls
このファイルを「ls」を実行可能ファイルとして現在のディレクトリとして保存すると、ユーザーは元のシステムコマンドを実行しているかどうかすらわかりません。誤って、この悪意のあるコードは、「その他」グループの現在のユーザーのSETUSERIDを使用して、/ tmp /ディレクトリのシェルのコピーで実行されます。これにより、現在のユーザーのすべての権限がハッカーに与えられます。これはセキュリティ上のリスクです。
そのため、デフォルトでは「現在のパス」は$ PATHにありません。
この例は、コンピュータセキュリティ-芸術と科学、Matt Bishop(第2版のCh23)から借用したものです↩