2009-08-21 20 views
6

実行可能なA.binがlibY.soおよびlibZ.soを使用するこのシナリオを検討してください。 A.c、Y.cおよびZ.cはすべてC言語で書かれています。 Z.cとY.cはそれぞれの.soファイルにコンパイルされています。setuidビットを設定した後にプログラムをロードできない

私が実行すると、ファイルのディレクトリ構造

の$ HOME/binに/ A.bin $ホーム/

libZ.so/libにlibに/ libY.so $ホーム/

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

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

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

を殺していませんこれらすべてのファイルからsetuidパーミッションを削除するだけで、バイナリの実行はroot特権が必要な場所では機能が失敗します。

この問題を解決するにはどうすればよいですか?

編集:いくつかのUnixでOSのSolaris 5.10である

答えて

10

AProgrammerが述べたように、setuidプログラムを実行している間、$ LD_LIBRARY_PATHは無視されます。

GCCの-R $ホーム/ libに

をリンクしながら、そこでパスは、このフラグを使用して実行可能ファイル自体にハードコードされなければなら-Rフラグは、実行可能ファイルに実行時の検索パスのリストを作成します。

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

3

変異体、SUID実行可能ファイルが実行可能で所有権とアクセス権をチェックし、LD_LIBRARY_PATHを無視したようないくつかのセキュリティ機能を持っており、共有ライブラリを使用し、...私はしませんSolarisの場合を覚えていますが、おそらくそれを確認する必要があります。

+4

*どれ* UNIXライクなOSは、setuidバイナリのためにLD_LIBRARY_PATHを無視しているそれ以外の場合は、あなたを介してトラックを運転できるセキュリティホールです。 – caf

+0

@caf:私は遭遇しなかったものに遭遇しました。すべてのsetuidバイナリは静的にリンクされていました。 – Joshua

関連する問題