web-dev-qa-db-ja.com

setuidとsetgidが機能しない

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の出力が得られないのはなぜですか?

1
Deci

Setuidとsetgidを使用して、別のユーザーとしてシェルスクリプトを実行することはできません。これはセキュリティ機能であり、詳細を読むことができます このUL投稿に対する非常に包括的なトップアンサーで

1
Kefka

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になることができないことを意味します。

投稿されたコードがこれらのコマンドからの戻り値をチェックした場合、コマンドが失敗したことがわかります。

0
user3629249