Linuxで実行されるプログラムがあります。特定のライブラリがシステム上にある場合、プログラムはクラッシュしますが、ライブラリがない場合はプログラムが正しく実行されます。 (最初の実行時にのみライブラリを探すようですが、見つからなくても構いません。以降実行時にライブラリが存在すればプログラムはこれを無視するようです。)
私のプログラムが実行時に使用できるライブラリを制限したいと思います。この目標をどのように達成できますか?
限界と可能性:
- プログラムを変更できません。
- 私のシステムの既存のライブラリをアップグレードまたは変更することはできません。
- プログラムをシェルスクリプトにラップしたり、自分のプログラムから呼び出すことができます。
編集する:これはFirefoxの修正された派生物であり、公に利用できません。実際、Faheem Mithaが疑ったように、ユーザープロファイルに何かを作成しているようです。今はどうかわかりません。
答え1
からプログラムを実行できますchroot
。これにより、ローダーが制限された環境にコピーしたライブラリのみを使用します。
追加資料:
- ルートディレクトリの変更(アーチ)
- UNIX chroot() 操作のベスト・プラクティス
- chroot(Debian)
- 基本 Chroot(Ubuntu)
- 3.13 Chroot Jailの構成と使用(Oracle Linux)
答え2
プログラムは実行の間にライブラリが使用されるかどうかを覚えているので、この情報を設定ファイルのどこかに保存する必要があります。 〜のようにFahim Misaが提案した最善の方法は、プログラムを実行する前に構成ファイルを見つけて生成することです。
プログラムの実行strace
どのファイルがロードされたかをお知らせします。
strace -o myprogram.strace -e open,access myprogram
プログラムのしくみを本当に変更する必要がある場合は、この状況では以下が必要です。LD_PRELOAD
。ファイルをロードするかどうかを決定するには、プログラムが実行するライブラリ呼び出し(システム呼び出しではない)を見つける必要があります。このltrace
コマンドが役に立ちます。たとえば、プログラムが を呼び出す場合、プログラムがその特定のライブラリをdlopen
開こdlopen
うとするとエラーを返すように関数をオーバーライドします。警告:テストされていないコードです。
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int dlopen(const char *filename, int flags) {
int (*original_dlopen)(const char *, int) = dlsym(RTLD_NEXT, "dlopen");
if (!strcmp(filename, PATH_TO_HIDE)) {
return NULL;
}
return original_fopen(path, mode);
}
コンパイル用
gcc -DPATH_TO_HIDE='"libfoo.so"' -O -Wall -fPIC -shared -o hide_libfoo.so hide_library.c -dl
実行プログラムは次のとおりです。
LD_PRELOAD=./hide_libfoo.so ./myprogram