ユーザーが特定のパラメータ、環境変数設定、およびコンテキスト設定でのみ実行できるsuid-to-root実行可能ファイルがあります。 exeファイルを修正できません。
許容されるパラメータ化、環境、およびコンテキスト設定ごとに、パラメータなしのスクリプトでexeをラップします。問題は、ユーザーがこれらのスクリプトを実行できるようにしますが、そうでなければexeを実行できないようにする方法です。
以下に提案するソリューションやより良い代替案にセキュリティ上の問題がありますか?
polkitやsudoがこれを行うことができるかどうかはわかりませんが、方法を知っている人がいる場合は興味があります。
3つの解決策があります。
マウントネームスペースを使用してください。 exe nosuidをグローバルにマウントします(euid = 0を実行していない場合はすぐに終了します)。プライベートマウントの名前空間を作成し、exe suidを再マウントします。プライベートネームスペースに移動して権限を削除し、スクリプトを実行するarg =ラッパースクリプト名で小さなsuid exeを作成します。ラッパースクリプトはすべて専用ディレクトリ(/usr/local/bin/safescripts)に保存され、新しい小さなsuid exeでハードコードされます。新しいexeは常にこのディレクトリのスクリプトのみを呼び出しますが、これには他の内容は含まれていません。
「vault」ディレクトリを使用してください。親とサブディレクトリのペア/usr/local/lockと/usr/local/lock/vaultを作成します。どちらもroot:rootが所有しており、/usr/local/lockは750、/usr/local/lock/vaultは755です。ユーザーは助けなしに金庫に入ることができません。ただし、Vaultに入ると、ユーザーはそのコンテンツにアクセスできます。元の suid exe を /usr/local/lock/vault に移動します。スクリプトの 1 つである chdirs のデフォルト名を /usr/local/lock/vault にインポートし、権限を削除してスクリプトを実行する小さな suid exe を作成します。ラッパースクリプトの設定は1と同じですが、cwd(ライブラリ)に残っている間に「./」プレフィックスが付いたパス名を使用して元のexeを呼び出す必要があります。
高い権限(euid = 0)に切り替えます。元のexeからsuidビットを削除します。スクリプトの1つ(たとえば、上記の1と2)のデフォルト名を取り、権限を削除せずに(#!/ bin / bash -pが必要です)、そのスクリプトを呼び出して元のexe自体を削除できる小さなsuid exeを書くと権限があります。
スクリプトを含む多くのものがeuid = 0で実行されているため、3は危険すぎると思います。
1と2の小さな実行可能ファイルを比較すると、2はeuid = 0のchdirのみを実行しますが(どのように悪いですか?)、1はバインドマウントされたsuid名前空間を開き、setnsを対応するfdに設定します。まだ小さいが、結果はより複雑である。また、1の設定にはsuidマウントネームスペースを作成し、それをどこかにバインドマウントするサービスも必要です。多くはありませんが、何か。あるいは、新しいexeはマウントネームスペース自体を生成することができますが、これは状況をより複雑にします。高い権限でunshareとmountを呼び出す必要があり、両方ともopenとsetnsよりも多くのオプションがあります。
私はボルトの設定が這うように見えますが、最も安全で簡単なような2つの側面に傾いています。誰かがより良いアプローチを提供したり、2の問題を見ることができない場合。
答え1
名前空間のマウントは機能しますが、必要以上に複雑です。
ロック/ボルトディレクトリのトリックは安全ではありません。ボルト内のプロセスの/proc/PID/cwdマジックシンボリックリンクを介して他のプロセスがボルトに入ることができるからです(同じuid / gidがある場合)。
解決策3に似ていますが、代わりにsgidを使用してください。小さなsgid exeを書く。メンバーを持たない専用システムグループを使用します。これをmygrといいます。元の suid exe を root:mygr 4750 に変更します。元のsuid exeはmygrのメンバーによってのみ呼び出すことができ、これは新しい小さなsgid-to-mygrを呼び出すに過ぎません。新しい小さなsgid exeは、まだsuid exeの使用を制御することによって許可されているいくつかのターゲットスクリプトのいずれかを実行します。元のsuid exeは完全に一般的な方法(オプション)で権限を削除するため、egidをrgidに戻し、euidをruidに戻すので、egid = mygrは一時的です。
ターゲットsuid exeを実行する前にegid = mygrが元に戻されないように、スクリプトはまだ#!/ bin / bash -pでなければなりません。
新しい小さなexeは役に立たないグループ(mygr)にsgidされているため、権限の昇格のために悪用される可能性は、ルートにある場合よりもはるかに少ないです。