7

実行可能ファイル A.bin が libY.so と libZ.so を使用するシナリオを考えてみましょう。Ac、Yc、Zc はすべて CZc で記述され、Yc はそれぞれの .so ファイルにコンパイルされます。

これはファイルのディレクトリ構造です

$home/bin/A.bin $home/lib/libY.so $home/lib/libZ.so

A.bin を通常のユーザーとして実行すると、A.bin は期待どおりに正常に実行されます。注: $LD_LIBRARY_PATH には $home/lib が含まれています

Ac の一部のコードを変更して、管理者権限が必要な機能を追加しました (1000 未満のポートへのバインドなど)。A.bin、libY.so、および libZ.so の setuid ビットを rwsrwsrws に設定し、ファイルの所有権を root に変更します。A.bin を実行しようとすると、次のエラーが表示されます

ld.so.1: A.bin: 致命的: libY.so: オープンに失敗しました: そのようなファイルまたはディレクトリはありません Killed

これらすべてのファイルから setuid 権限を削除すると、ルート権限が必要な機能が失敗することを除いて、バイナリが実行されます。

この問題を克服するには?

編集:OSはSolaris 5.10です

4

2 に答える 2

11

AProgrammer が言ったように、setuid プログラムの実行中、$LD_LIBRARY_PATH は無視されます。したがって、リンク中にこのフラグを使用して、実行可能ファイル自体にパスをハードコーディングする必要があります

gcc -R $home/lib

-R フラグは、ランタイム検索パス リストを実行可能ファイルに構築します。

参照: http://www.justskins.com/forums/loading-shared-libraries-from-a-setuid-program-116597.html

于 2009-08-21T08:28:33.823 に答える
3

一部の Unix バリアントでは、suid 実行可能ファイルには、無視LD_LIBRARY_PATH、実行可能ファイルおよび使用されている共有ライブラリの所有権とアクセス権のチェックなどのセキュリティ機能があります。Solaris の場合は覚えていませんが、おそらくそれを確認する必要があります。

于 2009-08-21T08:05:07.787 に答える