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

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/usr/bin/usr/sbinPATH

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

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

答え1

順序はダイナミックリンカーのマニュアルに記載されており、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値、 などを注入するなど、任意のコードを実行するためのより直接的なルートを確実に持っています。ライブラリ ロード パスの信頼は、実行が信頼境界を越える場合、つまり追加の権限を持つプログラムを実行する場合 (setuid/setgid プログラムなど、または 経由) は重要です。この場合、 が空白になります。PATHLD_PRELOADsudoLD_LIBRARY_PATH

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

関連情報