11

私は安全なことをしようとしています、そしてそれがそれらを必要としないときにその特権を落とすためにrootとして実行する必要があるプログラムを持っています。chmodこれは、SUIDビットを使用してバイナリをrootに属する場合にうまく機能します。これは、UID =一部のユーザー、EUID = rootであるため、とを使用seteuid(0)seteuid(getuid())て管理者権限をそれぞれ上げたり下げたりできます。

しかしsudo、SUIDを設定する代わりにを使用すると、UID == EUID == 0になるため、呼び出しseteuid(getuid())ても効果はありません。UIDまた、ランダムなユーザーから値を変更することはできません。mansetuid()ページには、rootとして実行されているプログラムから呼び出された場合、特権が永久に失われ、元に戻される見込みがないことが明記されています。

では、を使用して実行すると、プログラムの特権が一時的に失われるようにするにはどうすればよいsudoですか?

4

4 に答える 4

10

seteuid(some random uid)として実行しているときに、特権を削除し、特権seteuid(0)を取り戻すroot

于 2010-02-16T18:31:17.717 に答える
6

seteuid(x)は、privをドロップして再レイズするために機能するはずです...

$ cat > t12.c
#include <stdio.h>
#include <unistd.h>

void p(void) { printf("euid=%4d uid=%4d\n", geteuid(), getuid()); }

int main(void) { p(); seteuid(100); p(); seteuid(0); p(); return 0; }
$ cc -Wall t12.c
$ sudo chown root a.out && sudo chmod 4555 a.out
$ sudo ./a.out
euid=   0 uid=   0
euid= 100 uid=   0
euid=   0 uid=   0
$ ./a.out
euid=   0 uid= 501
euid= 100 uid= 501
euid=   0 uid= 501
$ 
于 2010-02-16T18:48:14.553 に答える
3

直接的な答えではなく、特権分離の考え方を示したいと思います。これは、OpenBSDの創設者であるTheodeRaadtによる素晴らしいプレゼンテーションです。

于 2010-02-16T18:32:43.223 に答える
1

特権を削除する前にFork()。権限が削減された子が完了するまで親タスクで待機してから、rootを使用して親で再開します。

seteuidはすべてのユニスに移植できるわけではなく、他の欠点もあります。

于 2011-09-04T21:59:00.447 に答える