5

共有オブジェクトをデータ ファイルとして開き、検証チェックを実行したいと考えています。検証は署名チェックで、共有オブジェクトに署名します。検証が成功したら、現在開いている共有オブジェクトを適切な共有オブジェクトとしてロードしたいと考えています。

最初の質問:dlopenコード実行されないように、署名チェック中に共有オブジェクトを呼び出してデータ ファイルとしてロードすることは可能ですか? マニュアルページによると、RTLD_DATA.

共有オブジェクトをデータ ファイルとして開いているので、記述子を使用できます。dlopen検証が成功したら、動的ローダーが共有オブジェクトを適切にロードするように、記述子を渡したいと思います。競合状態が発生する可能性があるため、ファイルを閉じてから再度開きたくありませんdlopen(検証されたファイルが開いて実行されたファイルと同じではない場合)。

dlopen2 番目の質問:ファイル記述子を使用して開いているファイルを渡しdlopen、共有オブジェクトの通常の初期化を実行するにはどうすればよいですか?

4

1 に答える 1

5

Linux では、おそらくdlopenいくつかの/proc/self/fd/15ファイルを作成できます (ファイル記述子 15 の場合)。

RTLD_DATA存在しないようです。したがって、必要に応じて、独自の動的ローダーにパッチを適用する必要があります。おそらく、MUSL Libc内でそれを行うのはそれほど難しくないでしょう。なぜあなたがそれを必要とするのか、私はまだ理解していません。

dlopen-ed プラグインを何らかの方法で信頼する必要があります (そして、そのコンストラクター関数をそのdlopen時点で実行します)。

おそらくlibelfまたは( binutilsから) ; dlopen_ しかし、私はまだあなたがどのような分析をしたいのか理解していません(そして、あなたは本当にそれを説明する必要があります.特に、プラグインが動作の悪いソフトウェアに間接的にリンクされている場合はどうなりますか). つまり、検証手順について詳しく説明する必要があります。共有オブジェクトは自分自身を上書きする可能性があることに注意してください....libbfd

dlopenまたは、ファイルだけを使用しないでください (いくつかのELFを解析し、再配置を処理mmapする必要があります。詳細については、elf(5)および Levine のリンカーとローダーを参照し、GNU glibcなどの のソース コードを調べてください) 。 .ld.so

おそらく、いくつかのJIT生成手法を使用すると便利な場合があります (検証済みのデータからコードをJIT生成します)。

また、同じ共有オブジェクトに対して 2 つのファイル記述子がある場合、おそらく競合状態は発生しません。

オプションは、アドホックの静的 C または C++ ソース コード アナライザーを構築することです (おそらく、提供されたGCC プラグインを使用します)。そのプラグインは (数か月、あるいは数年にわたる開発作業を経て) ユーザーの C++ コードのプロパティをチェックする場合があります。ライスの定理(すべての静的ソース コード アナライザーのプロパティを制限する) に注意してください。次に、あなたのプログラムは (私のmanydl.cのように、または 2020 年半ばにRefPerSysがすぐに行うように、または数年前に廃止されたGCC MELTが行ったように) ユーザーの C++ コードを入力として受け取り、その C++ で静的解析を実行する可能性があります。コード (たとえば、GCC プラグインを使用) を作成し、その C++ コードを一時的な共有オブジェクトにコンパイルし、dlopenその共有オブジェクトを作成します。ドレッパーの論文を読んでください共有ライブラリの書き方.

于 2013-04-24T05:43:36.353 に答える