プロセスデエスカレート経由権限setuid()
とsetgid()
UID / GID彼らはセットのグループメンバーシップを継承していないようです。
特権ポートを開くためにrootとして実行する必要があるサーバープロセスがあります。その後、特定の非特権uid / gid 1にエスカレートします-たとえば、ユーザーfoo
(UID 73)のuid / gid 。ユーザーfoo
はグループのメンバーですbar
:
> cat /etc/group | grep bar
bar:x:54:foo
したがって、としてログインするとfoo
、/test.txt
次の特性を持つファイルを読み取ることができます。
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
ただし、std=gnu99
ルートを実行すると、次のCプログラム(コンパイル)が表示されます。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main (void) {
setgid(73);
setuid(73);
int fd = open("/test.txt", O_RDONLY);
fprintf(stderr,"%d\n", fd);
return 0;
}
常にアクセス許可が拒否されたことを報告します。これは非ログインプロセスに関係していると思いますが、許可が機能すると想定されている方法をハムストリングのように扱います。
1.これはサーバーのSOPであることが多く、Apacheを使用して誰かが報告したため、これを回避する方法があるはずだと思います。Apacheはオーディオグループに追加されており、サウンドシステムを使用できるようです。もちろん、これはおそらく元のプロセスではなくフォークで起こりますが、実際には私のコンテキストでは同じです(それはsetuid呼び出しの後にフォークされた子プロセスです)。
setgid(54)
代わりにを使用した場合setgid(73)
(のように/etc/groups
、グループにbar
はgid 54があります)、それは機能しますか?
setuid()
した後、あなたは再びできないことに注意してください...しかし、うーん...私はあなたと一緒にできると思いますseteuid()
...
setuid()
/setgid()
呼び出しを切り替えます。