0

Ubuntu 11.04 を実行しています。

"C" execlp プログラムを使用して Java プログラムを実行しようとしていますが、Java プログラムが root として実行できるように "C" プログラムで setuid したいと考えています。ここにこの例があります:

http://www.coderanch.com/t/110254/Linux-UNIX/setuid

私は tomcat ユーザーである代わりに root を使用したことを除いて、文字どおりに例に従いました。

ルートは、Java プログラムを実行する「C」プログラムを実行できます。そして、root 所有権を与える前に、ユーザー (私) は Java プログラムを実行する「C」プログラムを実行できます。しかし、setuid を使用するようにセットアップすると、ユーザーはプログラムを実行しようとします。LD_LIBRARY_PATH タイプのエラーと思われるものが表示されます: java: 共有ライブラリのロード中にエラーが発生しました: libjli.so: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません

libjli.so ファイルは Java JRE の下にあります。ユーザーとルートの両方が、個別に実行するときにこのファイルを見ることができます。しかし、root への setuid が行われた後にプログラムを実行すると、ユーザーはそれを見ることができません。

setuid プログラムの実行時にルートの LD_LIBRARY_PATH が設定される別の方法はありますか? これは対話型と非対話型の問題ですか?

何か案は?前もって感謝します。

4

3 に答える 3

0

環境変数はコードをプロセスにロードするために使用できるためLD_*、setuidバイナリではすべて無視されます。おそらく、setuidバイナリをCプログラムを実行するラッパーにする必要があります。

于 2011-06-12T04:10:27.550 に答える
0

ファイルに setuid ビットを設定すると、プロセスの実効 UID は変更されますが、実際の UID は変更されません。動的リンカーは、EUID ≠ RUID かどうかを確認し、そうである場合はすべての環境変数を無視します。ラッパーは環境変数自体をフィルタリングする必要があり (重要!)、完了したら、実際の UID を有効な UID と一致するように変更します。

警告:ボックスの全員に完全なルート アクセス権を与えても問題ない場合を除き、環境変数を十分にスクラブすることを忘れないでください。

于 2011-06-12T04:26:37.563 に答える
0

setuid プログラムの環境制約を回避するにはLD_*、ほとんどの POSIX システムで、ラッパー コード内でこれを実行できるはずです。

setreuid(0, 0);

これにより、実際の UIDと有効な UIDの両方が に設定されますがroot、これは、プログラム自体がsetuidビットを有効にして開始された場合にのみ機能します。

しかし、私はそれをしません。

Java プログラムを root として実行する必要がある理由を調べ、実際に root として実行せずに必要な特権を与えるより良い方法がないか調べてください。

于 2011-06-12T06:25:26.877 に答える