プログラムが使用できるシステムライブラリを制限します。

プログラムが使用できるシステムライブラリを制限します。

Linuxで実行されるプログラムがあります。特定のライブラリがシステム上にある場合、プログラムはクラッシュしますが、ライブラリがない場合はプログラムが正しく実行されます。 (最初の実行時にのみライブラリを探すようですが、見つからなくても構いません。以降実行時にライブラリが存在すればプログラムはこれを無視するようです。)

私のプログラムが実行時に使用できるライブラリを制限したいと思います。この目標をどのように達成できますか?

限界と可能性:

  • プログラムを変更できません。
  • 私のシステムの既存のライブラリをアップグレードまたは変更することはできません。
  • プログラムをシェルスクリプトにラップしたり、自分のプログラムから呼び出すことができます。

編集する:これはFirefoxの修正された派生物であり、公に利用できません。実際、Faheem Mithaが疑ったように、ユーザープロファイルに何かを作成しているようです。今はどうかわかりません。

答え1

からプログラムを実行できますchroot。これにより、ローダーが制限された環境にコピーしたライブラリのみを使用します。

追加資料:

答え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

関連情報