system() による SuSE の suid ビットは効果がありません。

system() による SuSE の suid ビットは効果がありません。

[編集:質問に戻り、まだ重複して誤ってマークされていることを確認しました。] SEに関する次の質問は、suidビットでbashを実行する方法を尋ねるため、重複ではありません。これは特別なケースであり、機能しません。すべて: setuid ビットは bash に影響を与えないようです。 最初の違いは、私の例ではbashではなくwhoamiを実行することです。 2番目の違いは、実際にUbuntuでは期待どおりに機能しますが、SuSEでは機能しないことです。

SuidビットはUbuntuを実行しているPCではうまく機能しますが、SLESテストインスタンスでは機能しません。 SLESシステムにマウントされたxfsファイルシステムにはnosuidフラグが設定されていません。lsこれは、私のシステムとSLEサーバーだけが実行可能ファイルに対して同じ権限セットを持っていることを示しています。それでは、実行可能ファイルが所有者ではなく現在のユーザーとして実行され続けるのはなぜですか?

execsudo.c:

#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[]) {
    system(argv[1]);
    return 0;
}

大きな打撃:

gcc -o setuid-test execsudo.c ;
sudo chown nobody ./setuid-test;
sudo chmod +s ./setuid-test;
./setuid-test "whoami" 
# Outputs current user instead of nobody

[EDIT 2]まだ問題を解決していませんが、SuSEマシンが仮想マシンだからではないかと思います。回避策は、/ etc / sudoersを介してこの動作を設定することです。

ベストアンサー1

これはsetuid「動作」できますが、後で簡単に検出して元に戻すことができます。同様の目的のプログラムと比較してみましたsue、代替アカウントdickey(プログラム名dickey)でローカルに使用します。

私のDebian 7システムでは、次のような出力を取得します(システムは「foo」です):

$ ./foo id;dickey id
uid=1001(tom) gid=100(users) euid=1006(dickey) egid=50(staff) groups=100(users),27(sudo)
uid=1006(dickey) gid=100(users) groups=100(users),27(sudo)

OpenSUSE 13では、他の結果が表示されます。

$ ./foo id;dickey id
uid=1000(thomas) gid=100(users) groups=100(users),10(wheel)
uid=1003(dickey) gid=100(users) groups=100(users),10(wheel)

違いがあるのは、プログラムがその項目を設定していないためです。本物uid/gid 値の一致効果的なuid / gid値と有用なプログラム(おそらく衣類)が不要な権限を削除しています。

これはまだ完璧なソリューションではありません。他の有用なプログラムがsetuidプログラムを妨げるCentOS 7のバックログがあります。しかし、正しい方向を教えてください。

追加資料:

おすすめ記事