web-dev-qa-db-ja.com

グループメンバーシップとsetuid / setgidプロセス

setuid()およびsetgid()を介してde-escalate特権を持つプロセスは、設定したuid/gidのグループメンバーシップを継承していないようです。

特権ポートを開くためにrootとして実行する必要があるサーバープロセスがあります。その後、特定の非特権uid/gidにエスカレートし、1 -たとえば、ユーザーfoo(UID 73)のユーザー。ユーザー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

ただし、次のCプログラム(コンパイルstd=gnu99)、ルートを実行すると:

#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呼び出し)。

10
goldilocks

問題は、setuidsetgidが、プロセスに必要なすべての認証情報を提供するには不十分であることです。プロセスの承認は、

  • そのUID
  • そのGID
  • その補足グループ
  • その機能。

見る man 7 credentialsより詳細な概要を取得します。したがって、あなたの場合、問題はUIDとGIDを正しく設定しているが、プロセスの補足グループを設定していないことです。また、グループbarのGIDは54、73ではないため、プロセスが所属するグループとして認識されません。

やったほうがいい

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <grp.h>

int main (void) {
    gid_t supplementary_groups[] = {54};

    setgroups(1, supplementary_groups);
    setgid(73);
    setuid(73);
    int fd = open("/test.txt", O_RDONLY);
    fprintf(stderr,"%d\n", fd);
    return 0;
}  
14
lgeorget

OK、ネットを少し巡りました。最初は [〜#〜] apue [〜#〜] がすべての回答を保持すると思っていましたが、それは誤りでした。そして、私のコピー(旧版)が動作しているので... nixおよびLinuxの管理ハンドブック の第5章は有望に見えますが、それがわかりません(最初の2つのコピーだけ)エディション、作業中も)。

私が見つけた小さなリソース(「デーモンライティングUNIX」のグーグル)はすべて、ttyから切り離す方法などの重要なステップについて話します。しかし、UID/GIDについては何もしません。奇妙なことに、 http://tldp.org にある広範なHOWTOコレクションでさえ、詳細はないようです。唯一の例外はJason Shortの Let's Write a Linux Daemon-part I です。 SUID/SGIDとすべての混乱がどのように機能するかの詳細は、Chen、Wagner、Deanの SUID demystified (USENIX 2002の論文)です。ただし、Linuxには追加のUID、つまりFSUIDがあります(詳しくは、Wolterの nix非互換性ノート:UID設定関数 を参照してください)。

プロセスをデーモン化することは、気の弱い人には絶対にありません。一般的なセキュリティの考慮事項は、D。Wheelerの LinuxおよびUnix向けの安全なプログラミングHOWTO-安全なソフトウェアの作成 に記載されています。 Systemd は、そのほとんどを単純化することを約束します(したがって、セキュリティ上の問題につながるミスの余地を減らします)。 デーモンマニュアル を参照してください。

0
vonbrand