Setuidとsetgidに問題があります。私はこのCコードを書きました:
int main() {
setuid(0);
setgid(0);
system("/path/to/script.sh");
return 0;
}
Gccを使用してコンパイルしました:
gcc test.c -o test
次に、chmod +s
を使用しました。 script.sh
には、id
コマンドのみがあります。 test
実行可能ファイルの権限は次のとおりです。
-rwxr-sr-x 1 root root 8464 mag 15 20:14 test
プログラムを実行すると、次の出力が得られます。
uid=1000(user) gid=1000(user) gruppi=1000(user)
Rootによって実行されたid
の出力が得られないのはなぜですか?
Setuidとsetgidを使用して、別のユーザーとしてシェルスクリプトを実行することはできません。これはセキュリティ機能であり、詳細を読むことができます このUL投稿に対する非常に包括的なトップアンサーで
setuid()
のMANページからの引用
したがって、root権限を一時的に削除し、権限のないユーザーのIDを想定し、後でroot権限を取り戻すことを希望するset-user-ID-rootプログラムは、setuid()を使用できません。これはseteuid(2)で実現できます。
成功すると、ゼロが返されます。エラーの場合、-1が返され、errnoが適切に設定されます。
Note: there are cases where setuid() can fail even when the caller is
UID 0; it is a Grave security error to omit checking for a failure
return from setuid().
とりわけ、これは、ユーザーがこのコマンドを介してroot
になることができないことを意味します。
投稿されたコードがこれらのコマンドからの戻り値をチェックした場合、コマンドが失敗したことがわかります。