バイナリ プログラムの共有ライブラリ依存関係の正確なセットを割り当てる必要があります。私は Linux で作業しており、プロジェクトは私の C++ で書かれています。したがって、C++ で再帰的な ldd のような機能が必要です。どうすればいいですか?
2 に答える
ハン・ソロの言葉を引用すると、「これについては嫌な予感がした」. C++ プログラム内から子プロセスの chroot を設定することは、アーキテクチャ上の誤解や失敗のように思えます。申し訳ありませんが、すぐに思いつく既製の C++ ソリューションはありません。もちろん、ltrace / strace / recursive-ldd を実行して出力を解析することもできます...
...しかし、一般的に言えば、動的ではなく静的に(つまり、プロセスが開始される前に) chroot 環境をセットアップするという考え方です。動的なアプローチを使用すると、攻撃者はメイン プロセスをだまして、chroot にあるはずのないものを子プロセスに提供する必要があると信じ込ませることができます。それは目的全体を打ち負かします。
特定の実行可能ファイルの chroot 環境を静的に設定するためのツールはたくさんありますが、動的に設定するためのツールは見つかりませんでした。これ自体がヒントです。
その間に、私は次のことを発見しました:
linux / gcc:
受け入れられた答えが使用を示唆しているC / C ++プログラム内からのldd機能
setenv("LD_TRACE_LOADED_OBJECTS", "1", 1);
FILE *ldd = popen("/lib/libz.so");
:
私はそれを試し、bashとC ++の両方から動作しました(この場合はofcだと思います同等のバージョンの)。ただし、SUIDバイナリ(実際に持っているもの)に対していずれかのバージョンを実行した場合、終了コード5を取得しました(パーミッションの問題だと思います)。
次に、lddが正確に何をするかを追跡し、次のように見えます(少なくともコマンドラインでは):(
LD_TRACE_LOADED_OBJECTS=1 /lib64/ld-linux-x86-64.so.2 binary_name
ダミーの)質問は次のとおりです:C ++でのこれの同等の実装は何ですか?