プログラムを作成し、それを Gtk+ で構築された gui と統合しようとしています。ただし、GUI によって呼び出される exe には setuid ビットが設定されています。ただし、gtk では、この exe を gtk コミュニティの指定どおりに実行することはできません。しかし、別のヘルパー プログラムとすべてを作成する必要があると彼らは言います。それが何を意味するのか本当にわかりません。この問題を克服する方法を教えてください。私は本当に即時の解決策が必要です。
3 に答える
最初の質問: プログラムが setuid になっているのはなぜですか? setuid プログラムを書くことは、自称 Linux 初心者がプレイすべきゲームではありません。彼らは危険です。それらは便利です - 誤解しないでください。しかし、それらは危険であり、安全に書き込むことは困難です。
GTK+ プロジェクトは、「 GTK+ - Using setuid 」で、setuid プログラムに関する見解を非常に率直に述べています。彼らは理由を挙げます - 良いものです。問題を回避する方法を示します。
GTK+ チームの意見では、グラフィカル ユーザー インターフェイスを備えた setuid プログラムを記述する唯一の正しい方法は、パイプなどのメカニズムを介して非 setuid グラフィカル ユーザー インターフェイスと通信し、入力を考慮する setuid バックエンドを持つことです。それは信頼できないと受け取られます。
ヘルパー プログラムを作成することになっているので、例を探しましたか? 与えられている可能性が高いです。あなたのプログラム自体は GUI アプリケーションですか?
ルート権限が必要です [...] いくつかの周辺機器を開き、それらのメモリで利用可能なデータを読み取り、それらを閉じます...これはルート権限なしでは実行できません...また、読み取られたデータは次を使用して同時に処理および表示されますGTK。
したがって、これはまさに GTK+ チームが説明している種類のシナリオです。GUI によって起動され、パイプや Unix ドメイン ソケット、または同様の手法によって接続される小さな setuid ルート プログラムが必要です。
周辺機器からのデータが必要な場合、メイン アプリケーションはデーモン/ヘルパーに要求を書き込み、データを含む応答を待ちます。
概説すると、GUI に次のコードが含まれます。
- LaunchDaemon(): これは配管 (パイプまたはソケット)、フォークを作成し、子はデーモン プロセスを起動する前にファイル記述子を整理します (不要なものを閉じます)。
- RequestDaemon(): デーモン/ヘルパーへのリクエストをパッケージ化し、情報をデーモンに書き込み、レスポンスを読み戻します。
- TerminateDaemon(): デーモン/ヘルパーへの接続を閉じます。やるべき仕事がなくなったことを知り、終了します。
一方、デーモン/ヘルパー プログラムは次のことを行います。
- 次の快適なループに落ち着きます。
- 標準入力からリクエストを読み取ります
- 有効性をチェックします
- リクエストを実行します
- 応答をフォーマットします (エラー、または正常)
- それをメインGUIに書き戻します
- 繰り返す
- 入力から EOF を取得すると終了します。
- 可能であれば、一度デバイスを開き、ルート権限を削除します。
- これにより、攻撃への露出が最小限に抑えられます。
- プログラムが root として実行されなくなった場合、root だけが実行できることを悪用することはできません。
- ファイルが開かれると、権限は再度チェックされません (そのため、ルートとして実行されているデーモンはファイルを開き、ファイルを再度開かない場合はそのルート権限を破棄できます)。
周辺機器のアクセス許可が正しいかどうか、またはルートのみが読み取れるはずのデータを読み取る必要がある理由を確認する必要があります。