web-dev-qa-db-ja.com

Linuxダイナミックリンカーがパスを検索する順序は?

これは、/etc/ld.so.confを使用したときに気付いた特殊性を扱っているため、重複ではありません。

動的リンカーがライブラリーを検索するパスを取得するには、ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"コマンドを実行します。 /etc/ld.so.confにパスがリストされていない場合。前のコマンドの出力は

/lib
/usr/lib

最初に/libを検索し、次に/usr/libを検索すると考えました。 /usr/local/lib/etc/ld.so.confなどの新しいパスを追加し、/etc/ld.so.cacheを再作成すると、ldconfig -v | grep -v "^"$'\t' | sed "s/:$//g"からの出力は

/usr/local/lib
/lib
/usr/lib

リストされたディレクトリが上から下に検索される順序が正しい場合、/libおよび/usr/libの前に追加のディレクトリが検索されるため、これは奇妙なことに気づきました。信頼できるディレクトリの前に追加のディレクトリが検索されること自体は奇妙ではありませんが、/libの前に/usr/libが検索されると、/bin/sbinが検索されるため、それは奇妙ですPATH/usr/bin/usr/sbinの後。

ldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"によってリストされたパスが下から上に検索されたとしても、/lib/usr/libの後に検索されますが、信頼できるディレクトリの後に追加のディレクトリが検索されるため、順序が歪んでいます。 。

では、ld.soがライブラリのパスを検索する順序は何ですか? /libより前に/usr/libが検索されるのはなぜですか?そうでない場合、/libの後に追加のディレクトリが検索されるのはなぜですか?

14
Melab

順序は、ダイナミックリンカーのマニュアル ld.so に記載されています。それは:

  1. LD_LIBRARY_PATHのディレクトリ
  2. /etc/ld.so.confのディレクトリ
  3. /lib;
  4. /usr/lib

(私は少し簡略化しています。詳細についてはマニュアルを参照してください。)

この順序は、デフォルトの場所にあるライブラリをカスタムライブラリでオーバーライドする唯一の方法であると考える場合に意味があります。 LD_LIBRARY_PATHはユーザー設定です。他の設定よりも優先する必要があります。 /etc/ld.so.confはローカル設定であり、オペレーティングシステムのデフォルトの前にあります。したがって、ユーザーが別のバージョンのライブラリでプログラムを実行したい場合、その異なるライブラリバージョンの場所を含むLD_LIBRARY_PATHでプログラムを実行できます。また、管理者として、/usr/local/libにライブラリの別のバージョンを配置し、/usr/local/lib/etc/ld.so.confをリストすることができます。

信頼はこれには入りません。すべてのライブラリがそこからロードされる可能性があるため、この検索パスにリストされているディレクトリは信頼されている必要があります。理論的には、システムで「より多くの信頼を必要とする」すべてのプログラムで使用されるライブラリ名をリストし、これらのすべてのライブラリが「最も信頼できる」ディレクトリに存在することを確認できます。 「信頼性が低い」プログラムを除いて、検索パス上のより信頼できるディレクトリの後にある場合に使用します。しかし、それは非常に壊れやすいでしょう。また、攻撃者がLD_LIBRARY_PATHの値または/etc/ld.so.confの要素を挿入できる場合、PATHの値を挿入するなど、任意のコードを実行するためのより直接的なルートが確実にあります。 LD_PRELOADなど。ライブラリのロードパスでの信頼は、実行が信頼の境界を越える場合、つまり追加の特権(setuid/setgidプログラム、またはSudoなど)でプログラムを実行する場合に重要です。この場合、何が起きるかは、LD_LIBRARY_PATHが空白になっていることです。

/lib/usr/libについては、それほど重要ではありません。それらは同じエンティティ(オペレーティングシステム)によって提供され、両方に存在するライブラリがあってはなりません。 (非常に小さな)パフォーマンス上の利点を提供するため、最初に/libをリストすることは理にかなっています。最もよく使用されるライブラリー、特に小さな基本プログラムで使用されるライブラリー(ロード時間は実行全体の高い割合です)大規模で実行時間の長いプログラムよりも時間が長い)、/libにあります。