web-dev-qa-db-ja.com

現在のディレクトリをパスに追加する

これは私が良いの答えを見つけることができないように思われる質問です。

Windows/DOSでは、パスにプレフィックスを付けることなく、現在のディレクトリからプログラムを起動できるように使用しても問題がないことを「教えられています」。

ただし、Linuxのデフォルトの動作では、現在のディレクトリのアプリケーション/スクリプトの前に./を付ける必要があります。

人々は、ディレクトリにプレフィックスを付けずにプログラム/スクリプトを実行できるようにすることは悪いセキュリティ慣行であると言います。 「悪いセキュリティ慣行」はたくさんありますが、これは私には意味がありません。たとえば、/ some/unfamiliar/directoryにアクセスして、lsなどのプログラムの実行を開始するつもりはありません。 (ホームディレクトリに移動するために)cdしてから、ls -la/some/unfamiliar/directoryと入力します。もちろん、悪い日にはそうします。

誰かがlsという名前のプログラムをディレクトリに置き、不正なシステム管理者がそのディレクトリにcdしてlsをrootとして実行し、lsがバックドアユーザーやその他の邪悪なものを追加すると、「脅威」がわかります。結構です。しかし、通常、その場合、ユーザーは「ああ、動作していません。チェックインできますか?」と文句を言うでしょう。私は須藤su「ユーザー」と彼としてlsを試してみます。

何かが完全に欠けていない限り、「。」を追加しています。あなたのPATHに本当にそんなに悪いですか?

編集:

これまでのすべての答えは、セキュリティリスクを指摘するのに問題ありませんが、Windowsの議論は誰もが見逃しています。 Windowsでは、現在のディレクトリがパスにないため、program.exeafaikを実行する機能を無効にする方法はありません。ただし、コマンドPromptは、コマンドの前に。\を付ける機能を受け入れます(。\は機能しているようですが、\を使用する必要があります。そうしないと、何らかのエスケープシーケンスが発生する可能性があります)。 Windowsでは、常にコマンドのプレフィックスを付ける必要がありますか?また、マイクロソフトに連絡して、この予想される動作を移植するのは悪いことを伝える必要がありますか?

私の経歴はWindowsであるため、Unixの世界ではそうではないことはわかっていますが、現在のディレクトリ内のプログラムが実行できることを期待することに偏っています。それが私がそこに質問を提示した理由です。

「悪いセキュリティ慣行」(およびそれらが引用符で囲まれている理由)について私が意味することを拡張するのは、人々が行うべき数十億ではないにしても数百万のセキュリティ慣行を引用できるからです... 、人は確かに狂気になります。ユーザーエクスペリエンスを妨げる可能性のあるすべてのセキュリティリスクを軽減する必要がありますか?私はノーと言いますが、それはセキュリティがユーザーに対して透過的であるべきだと信じているからですが、私はハウスの最初の文が「他の何よりもそれは考え方です」と答えたのが好きです。そして、私たちはそれをそのままにしておくべきだと思います。

2
Natalie Adams

他の何よりもそれは考え方です。

パスの一部として現在のディレクトリを使用することにより、実際にリスクが高まります。トロイの木馬プログラムが実行されたからといって、それが期待どおりに機能しないという意味ではありません。言い換えれば、lsの例を使用すると、トロイの木馬プログラムは、劣等生によって設計されていない限り、要求したディレクトリリストを実際に提供するため、そこにあるファイルを言わない限り、それを期待する理由はありません。何かがうまくいかなかった(おそらくそれは賢く、提供されたディレクトリリストから自分自身を削除して、検出の可能性をさらに下げることにするだろう)。

これが発生するためには、誰かがすでに特定のシステムに侵入して、ファイルをファイルシステムに配置できるようになっていることを意味します。したがって、あなたはすでに悪い状態にありますが、事態がさら​​に悪化する余地はまだあります。

一般的な慣習として、現在のディレクトリをlinux/unixシステムのパスに配置していません。これは、大きな問題ではありません。頻繁に使用したいプログラムやスクリプトを書くときは、自分のパスにあるフォルダーに入れて、そのファイルへの書き込み権限を制限します。

短い回答者、現在のディレクトリをパスに追加すると、特権のないユーザーにとって特定の運命につながる可能性がありますが、なぜチャンスをつかむのですか?

ルートについては、それをしないでください。

7
haus

ルートにとって、それは致命的です。他のユーザーには、「。」を追加しないことをお勧めする理由。パス(およびセキュリティ)への道は、奇妙で紛らわしい問題につながることです。パスを検索するプロセスは、非常にさまざまな時間がかかるか、同じ名前の別のプログラムを見つける可能性があります。たとえば、solarisの/ usr/ucbには、BSDバージョンのpsコマンドが含まれています。新しいファイルシステムを作成し、膨大な数のファイルを入力してから「。」を入力します。パスで「grep」のbash補完を実行してみてください。なので時間がかかります。検索する必要があり、そこには百万のファイルがあります。 「。」また、非常に離れたNFSマウントなどの非常に遅いメディア上にある可能性もあります。あなたはそれを避けて、それが問題を引き起こすのを見ることは決してないかもしれませんが、それが問題を引き起こすとき、根本的な原因が何であるかすぐには明らかでないかもしれません。遠い過去に多くのパフォーマンスの問題が非常に長いPATHによって引き起こされるのを見てきました、PATHは異なる環境間で同じではありませんなど。私の2D:あなた自身のユーザーと一緒にあなた自身の箱で、それが人生を楽にするならそれを選んでください。本番環境では、ドットをパスに入れないでください。

3
davey

前述のように、最も明らかなセキュリティリスクは、既存の実行可能ファイルに取って代わる悪意のあるコードが現在のディレクトリにあることです。これが悪用可能かどうかは、「未確認のディレクトリからコマンドを実行しない」ポリシーをどの程度厳しくしているかによって異なります。

ただし、発生する可能性のある、より微妙で潜在的により深刻な問題は、コマンドの解決が予測不可能であるということです。たとえば、BASHでrunc<tab>と入力するだけでruncommandを使用することに慣れている場合、これはほとんどのディレクトリで機能しますが、実行可能ファイルruncomのあるディレクトリにいる場合は失敗します。繰り返しになりますが、これはあなたが何をしているのかを正確に認識することで回避できますが、私の経験では、問題なくrunc<tab>を50回入力した後、51回目は簡単にレーダーの下に滑り込む可能性があります。

これについての厄介な部分は、悪意がないことです。システムに感染するウイルスはなく、ホームディレクトリに密かにトロイの木馬が植えられることもありません。これは、2つの異なるディレクトリにある2つの異なるコマンドであり、2つの異なることを実行します。 runcomは、ホームディレクトリからファイルの半分を削除するだけで十分な場合がありますが、誤って実行したいという意味ではありません。

スクリプトを扱っている場合、これはさらに危険な場合があります。コマンドラインから一般的なシェルスクリプトを実行すると、$ PATH変数が採用されます。上記の例と同様に、これは、異なるディレクトリからスクリプトを実行すると、スクリプトの動作が異なる可能性があることを意味します。たとえば、/usr/binバージョンを使用する代わりに、/usr/local/binを使用している場合は、特定のコマンドの異なるバージョンを実行することになります。または、代わりに、通常は欠落しているときに正当なエラーにフラグを立てるコマンドを使用できるようにすることもできます-重要なスクリプトが予期せず失敗するよりも悪いことの1つは、スクリプトが予期せず失敗すると言われています思考それは成功しました。適切に記述されたスクリプトは、独自の$ PATHを設定するか、フルパス名が前に付いたコマンドを明示的に呼び出すことで、これを回避します。

すべてのスクリプトが適切に記述されているわけではありません。

これらの問題の多くは、現在のディレクトリをパスの最初の解決ポイントではなく最後の解決ポイント(PATH=$PATH:.ではなくPATH=.:$PATH)として設定するだけで対処できますが、それでも完全ではありません。解決。ローカルディレクトリバージョンを実行するためにコマンドの前に./を明示的に付けることは、とにかく余分な2回のキーストロークにすぎないので、これに固執します。

1
goldPseudo

巧妙な攻撃は、おそらくまれですが、「。」内の偽の実行可能ファイルを使用して、非特権環境から開始する複数の手法を組み合わせることができます。私の質問/回答と同様の手法を使用して環境にエイリアスを挿入するためのcurrent-directoryPATH here これは特権環境にあなたをフォローします。

  1. 非特権ユーザーのパスに「。」が含まれています。 -現在のディレクトリ
  2. 共通名の悪意のある実行可能ファイルがユーザー書き込み可能なディレクトリに作成されます
  3. 今、誰かがcdでそのディレクトリに入り、自分の便利なプログラムを実行していると思ってマルウェアを実行します
  4. 悪意のある実行可能ファイルは、ユーザーの~/.bashrcに書き込むことにより、suの隠しエイリアスを作成します
  5. また、目立たない名前の悪意のあるrcファイルを作成します(これを「badrc」と呼びます)。
  6. 誰かがログインして、alias su='Sudo bash --rcfile /path/to/badrc'のようなことを行うエイリアス定義を実行します
  7. ユーザーはsu -を実行し、シェルプロンプトを取得し、非表示のエイリアス手法を使用して「badrc」でエイリアスされたコマンドの使用を開始します
  8. 利益(攻撃者向け)

これは確かに複雑なシーケンスであり、他のバリエーションも可能ですが、なぜ自分を開いたままにしておくのですか?パスから「ドット」を省略すると(さらに、sudoersを厳密に制御し、適切な習慣を維持する)、攻撃者の基準が引き上げられます。

1