LD_PRELOADトリックとは何ですか?


341

私は最近proggitでそれへの参照に出くわしました、そして(今のところ)それは説明されていません。

私はこれがそれであるかもしれないと思います、しかし私は確かにわかりません。


1
答えは本当ではないので、1つとして投稿しませんが、Stephen KellはこのビデオのliballocsライブラリにLD_PRELOADを使用しています。前のビットを見ると、方法/理由をよりよく理解できます。liballocsが使用されているように見えるため、他の動的言語は互いに対話できます。この講演では、いくつかの深い内部が説明されています。 youtu.be/LwicN2u6Dro?t=24m10s
Elijah Lynn

回答:


415

LD_PRELOAD共有オブジェクトのパスを設定すると、そのファイルは他のライブラリ(Cランタイムを含む)のにロードされますlibc.sols特別なmalloc()実装で実行するには、次のようにします。

$ LD_PRELOAD=/path/to/my/malloc.so /bin/ls

12
これが存在することを私は知りませんでした...それはセキュリティ攻撃の主要なベクトルになるようです。それがどのように保護されるかについての考えはありますか?
rmeador 2009年

141
ruid!= euid-Joshua
Joshua

18
@ジョシュア:ruidとeuidとは何ですか?
heinrich5991

20
@ heinrich5991実際の有効なユーザーID:lst.de/~okir/blackhats/node23.html
gsingh2011

59
注意すべき重要な点の1つは、通常、への絶対パスを指定することLD_PRELOADです。その理由は、それが環境変数であり、子プロセスによって継承されているためです。子プロセスには、親プロセスとは異なる作業ディレクトリがある可能性があります。したがって、どの相対パスでも、プリロードするライブラリを見つけることができません。
Frerich Raabe 2013

49

同じシンボルでライブラリを作成し、ライブラリをで指定することにより、ストックライブラリのシンボルをオーバーライドできますLD_PRELOAD

一部の人々は、非標準の場所にあるライブラリを指定するためにそれを使用しますがLD_LIBRARY_PATH、その目的には適しています。


17
「標準化されていない場所でライブラリを指定するためにこれを使用する人もいます」...本当に?「一部の人々はそれを間違って使用している」ように聞こえる!
トム

6
LD_PRELOADは、ロード順インターセプトにより、アプリケーションで指定されたハードコードされたパスをインターセプトできます。
Joshua

1
ライブラリの異なるバージョンをプリロードするのは誤用でしょうか-それらが互換性があると仮定しますか?
z0r 2013年

2
他のシステムをエミュレートするかのように、デバッグまたはインストルメントされたバリアントをロードするため、またはベースライブラリとは根本的に異なる何かを実行するライブラリをロードするために使用されるのを見てきました。
ジョシュア

1
ライブラリが正しくコンパイルされていない場合(古いバージョンのシンボリックリンクを上書きする一般的なlibmysql_clientへの疎結合があったときに常にmysqlで実行されていたため、使用したperlのバージョンに応じて、指定する必要がありました。 。/それは非常に便利です..私の記憶が正しければLD_PRELOAD ..便利なトリックでそれを強制する、valgrindの再コンパイルすることなく、バイナリへのデバッグ機能を提供するために、この技術を使用しています。
synthesizerpatel

37

ではLD_PRELOAD、あなたのライブラリに優先度を与えることができます。

たとえばmalloc、およびを実装するライブラリを作成できますfree。そしてこれらをLD_PRELOADあなたmallocと一緒にロードfreeすることにより、標準のものではなく実行されます。


しかし、プログラムが使用している場合はどうなりますcallocか?それはすべてを台無しにしませんか?
Janus Troelsen 2014

7
@JanusTroelsen作成するライブラリが特定の部分を実装していない場合、その部分は元のライブラリからロードされます。
Woodrow Barlow、2014年

@JanusTroelsen、つまり、LD_PRELOADを使用すると、使用する特定のシンボルの実装を指定できます。プリロードされたライブラリがシンボルをエクスポートしない場合は、他の場所で見つかります。
sherrellbc 2017

1
@JanusTroelsen:mallocとfreeはglibcで特別に設計されており、これにより、在庫callocはインポートされたを呼び出すことができますmalloc。他の関数でこれを試さないでください。それはあまりうまくいきません。
ジョシュア

30

多くの人々が言及したように、LD_PRELOADライブラリのプリロードに使用します。ところで、あなたはできるCHECK設定はで利用可能な場合ldd、コマンド。

例:独自のをプリロードする必要があるとしますlibselinux.so.1

> ldd /bin/ls
    ...
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f3927b1d000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f3927914000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f392754f000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f3927311000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f392710c000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3927d65000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f3926f07000)

したがって、プリロード環境を設定します。

  export LD_PRELOAD=/home/patric/libselinux.so.1

ライブラリをもう一度確認してください。

>ldd /bin/ls
    ...
    libselinux.so.1 =>
    /home/patric/libselinux.so.1 (0x00007fb9245d8000)
    ...

9

LD_PRELOADと同様に、標準セットをオーバーライドする関数を持つ共有ライブラリをリストします/etc/ld.so.preload。これらはローダーによって実装され/lib/ld-linux.soます。選択したいくつかの関数のみをオーバーライドする場合は、オーバーライドするオブジェクトファイルを作成してを設定することにより、これを行うことができますLD_PRELOAD。このオブジェクトファイル内の関数は、他の関数をそのままにして、それらの関数だけをオーバーライドします。

共有ライブラリの詳細については、http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.htmlにアクセスしてください。


3

プリロードに関する詳細なブログ投稿は次のとおりです。

https://blog.cryptomilk.org/2014/07/21/what-is-preloading/


13
回答を投稿していただきありがとうございます。回答の本質的な部分をこのサイトに投稿する必要があります。そうしないと、投稿が削除されるリスクがあります。「リンクよりもかろうじて」回答について言及しているFAQを参照してください。必要に応じてリンクを含めることもできますが、これは「参照」としてのみです。答えはリンクを必要とせず、それ自体で成り立つべきです。
タリン

3

mylib.soenv にエクスポートするのは簡単です:

$ export LD_PRELOAD=/path/mylib.so
$ ./mybin

無効にする:

$ export LD_PRELOAD=

7
またはunset LD_PRELOAD
Morten

2

LD_PRELOADが使用されると、そのファイルは他の $export LD_PRELOAD=/path/liblibがプリロードされる前にロードされます。これはプログラムでも使用できます


1

LD_PRELOADpath を使用すると、アプリケーションローダーに、提供されたデフォルトではなく、提供された共有オブジェクトを強制的にロードさせることができます。

開発者はこれを使用して、異なるバージョンの共有オブジェクトを提供することにより、アプリケーションをデバッグします。

準備された共有オブジェクトを使用して既存の関数をオーバーライドすることにより、特定のアプリケーションをハッキングするために使用しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.