2

これが私の問題です。FreeBSD の C コードから、特定のファイルと特定のユーザーの読み取り許可を確認する必要があります。私はコードを書きました:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char *argv[]){
    int r_ok;

    if(setuid(1002)){
        printf("Cant's set uid\n");
        exit(1); 
    }

    r_ok = access("/tmp/dir", R_OK);
    printf("error: %d: %s\n", errno, strerror(errno));
    printf("%d\n", r_ok);
    return 0;
}

一般的には問題なく動作しますが、次のように /tmp/dir のアクセス許可を設定すると:

d---r-x---  2 root  fruit1  512 Sep 10 18:20 /tmp/dir

プログラムの出力

error: 13: Permission denied
-1

UID 1002 を持つユーザーがグループ fruit1 の有効なメンバーである場合:

# groups 1002
orange fruit1

私はどんな助けでも大歓迎です。

4

1 に答える 1

1

setuid()プロセスの実際の有効なユーザー ID を設定しますが、グループ アクセス リストは変更しませsetgid()。そのためには、initgroups()またはを呼び出す必要がありますsetgroups()

したがって、プログラムは、ユーザー 1002 のグループ アクセス リストではなく、使用された ID 1002 と元のグループ ID およびグループ アクセス リストで実行されます。これは、プロセスがディレクトリへの読み取りアクセス許可を持っていない理由を説明しています。

は「セキュリティ ホール」と見なされることに注意してください (access()たとえば、access() セキュリティ ホールを参照)。一般に、事前に読み取り許可を確認するよりも、ファイルまたはディレクトリを開こうとする方が適切です。

于 2013-09-10T19:26:12.433 に答える