これは、 を使用する際に私が気づいた特異性を扱っているため、重複ではありません/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/sbin
PATH
によってリストされたパスが下から上に検索されたとしても、追加のディレクトリは信頼できるディレクトリの後に検索され、は の後に検索されるldconfig -v | grep -Ev "^"$'\t' | sed "s/:$//g"
ため、順序は依然として歪んだものになります。/lib
/usr/lib
ld.so
では、がライブラリのパスを検索する順序は何でしょうか? が/lib
前に検索されるのはなぜですか/usr/lib
? そうでない場合、 の後に追加のディレクトリが検索されるのはなぜですか/lib
?
答え1
順序はダイナミックリンカーのマニュアルに記載されており、ld.so
それは:
- ディレクトリから
LD_LIBRARY_PATH
; - ディレクトリから
/etc/ld.so.conf
; /lib
;/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 プログラムなど、または 経由) は重要です。この場合、 が空白になります。PATH
LD_PRELOAD
sudo
LD_LIBRARY_PATH
と については/lib
、/usr/lib
あまり問題ではありません。これらは同じエンティティ (オペレーティング システム) によって提供されており、両方に存在するライブラリは存在しないはずです。 を/lib
最初にリストすることは、(非常に小さな) パフォーマンス上の利点を提供するため、理にかなっています。最も頻繁に使用されるライブラリ、特に小さな基本プログラムで使用されるライブラリ (大規模で長時間実行されるプログラムよりも、ロード時間が全体の実行時間の大部分を占める) は にあります/lib
。