繁体   English   中英

不允许第二个setuid

[英]Second setuid not permitted

如果我在一个循环中调用setuid成为root并重置uid,这只能工作一次。 我有以下代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int my_func(int i) {
    int current_uid = getuid();
    int ret;
    fprintf(stderr,
                    "###  i=%d   ###:  My UID is: %d. My GID is: %d,   before 'system(id)'\n",
                    i, current_uid, getgid());
    system("/usr/bin/id");

    fprintf(stderr,"\n\n###  i=%d   ###:  before 'setuid(0)'\n", i);
    if (setuid(0)) {
        perror("setuid");
        return 1;
    }
    fprintf(stderr,"after 'setuid(0)'\n\n");

    //I am now root!
    fprintf(stderr,
                    "###  i=%d   ###:  I an now root:  My UID is: %d. My GID is: %d,   before 'system(id)'\n",
                    i, getuid(), getgid());
    system("/usr/bin/id");


    //Time to drop back to regular user priviledges
    fprintf(stderr,"\n\nbefore 'setuid(%d)'\n",current_uid);
    ret=setuid(current_uid);
    fprintf(stderr,
                    "###  i=%d   ###:  My UID is: %d. My GID is: %d,   before 'system(id)\n",
                    i, getuid(), getgid());
    system("/usr/bin/id");
}

int main(void) {
    int i;
    for (i=0;i<3;i++) {
        my_func(i);
        sleep(5);
        fprintf(stderr,"\n\n");
    }
    return 0;
}

我设置了SUID位并在普通用户上升时运行该程序。 输出是:

rose @ condor:/ home / rose / Txt / src / Test / C / Setuid(5)$ ll / usr / local / bin / multiple_setuid_test -rws - x - x 1 root root 13589 11. Dez 08:41 / USR / local / bin目录/ multiple_setuid_test *

rose @ condor:/ home / rose / Txt / src / Test / C / Setuid(6)$ / usr / local / bin / multiple_setuid_test

i = 0 ###:我的UID是:1203。我的GID是:100,在'system(id)'之前

uid = 1203(玫瑰色)gid = 100(用户)Gruppen = 100(用户),4(adm),6(磁盘),7(lp),10(滚轮),14(uucp),18(音频),19 (CDROM),27(视频),35(游戏),60(MySQL的),250(搬运),1001(haldaemon),1002(plugdev),1008(扫描仪),1027(vboxusers),1028(KVM),1029 (QEMU),1036(GSM),1039(脉冲接入),1040(脉冲),1041(tuntap)

i = 0 ###:在'setuid(0)'之前

在'setuid(0)'之后

i = 0 ###:我现在是root:我的UID是:0。我的GID是:100,在'system(id)'之前

uid = 0(root)gid = 100(用户)Gruppen = 0(root),4(adm),6(磁盘),7(lp),10(wheel),14(uucp),18(音频),19 (CDROM),27(视频),35(游戏),60(MySQL的),100(用户),250(搬运),1001(haldaemon),1002(plugdev),1008(扫描仪),1027(vboxusers),1028 (KVM),1029(QEMU),1036(GSM),1039(脉冲接入),1040(脉冲),1041(tuntap)

在'setuid(1203)'之前

i = 0 ###:我的UID是:1203。我的GID是:100,在'system(id)之前

uid = 1203(玫瑰色)gid = 100(用户)Gruppen = 100(用户),4(adm),6(磁盘),7(lp),10(滚轮),14(uucp),18(音频),19 (CDROM),27(视频),35(游戏),60(MySQL的),250(搬运),1001(haldaemon),1002(plugdev),1008(扫描仪),1027(vboxusers),1028(KVM),1029 (QEMU),1036(GSM),1039(脉冲接入),1040(脉冲),1041(tuntap)

i = 1 ###:我的UID是:1203。我的GID是:100,在'system(id)'之前

uid = 1203(玫瑰色)gid = 100(用户)Gruppen = 100(用户),4(adm),6(磁盘),7(lp),10(滚轮),14(uucp),18(音频),19 (CDROM),27(视频),35(游戏),60(MySQL的),250(搬运),1001(haldaemon),1002(plugdev),1008(扫描仪),1027(vboxusers),1028(KVM),1029 (QEMU),1036(GSM),1039(脉冲接入),1040(脉冲),1041(tuntap)

i = 1 ###:在'setuid(0)'之前

setuid:不允许操作

i = 2 ###:我的UID是:1203。我的GID是:100,在'system(id)'之前

uid = 1203(玫瑰色)gid = 100(用户)Gruppen = 100(用户),4(adm),6(磁盘),7(lp),10(滚轮),14(uucp),18(音频),19 (CDROM),27(视频),35(游戏),60(MySQL的),250(搬运),1001(haldaemon),1002(plugdev),1008(扫描仪),1027(vboxusers),1028(KVM),1029 (QEMU),1036(GSM),1039(脉冲接入),1040(脉冲),1041(tuntap)

i = 2 ###:在'setuid(0)'之前

setuid:不允许操作

rose @ condor:/ home / rose / Txt / src / Test / C / Setuid(7)$ uname -a Linux condor 3.12.4#1 SMP Mon Dec 9 11:37:38 CET 2013 x86_64 Intel(R)Core( TM)2 CPU 6600 @ 2.40GHz GenuineIntel GNU / Linux

任何提示都表示赞赏。

Linux(就像其他unix一样)存储两个值:您的真实用户ID(由setuid设置)对应于您的登录,并且不会被s位更改,您的有效用户ID(由seteuid设置)和执行具有s位设置的程序时会更改。 要允许使用setuid(),您的真实或有效用户ID必须为零,但如果您使用setuid()删除权限(从0更改为其他任何内容),您的有效用户ID也将被更改。 因此,您的第一个setuid(1203)也将有效用户ID设置为1203,这会阻止您以后重新获得权限。

要多次更改from和root,你必须使用setreuid()调用来交换两者 - setreuid(1203,0)会将你的真实用户ID改为1203,有效用户id改为0,从而允许你设置uid以后为0。

请注意,只要两个uid中的任何一个为0,就具有root权限。 使用uid = 1203和euid = 0,您创建的文件将属于您(用户ID 1203),但您仍然具有root访问权限。 因此,请仔细检查您的程序是否有安全隐患。

如果你需要在整个程序中不时地拥有root访问权限,那么在子进程上创建一个pipe(),fork(),保持root权限,删除父进程中的权限,并向下发送一些命令,会更安全当你需要以root身份完成某些事情时,孩子要执行的管道。 这样,您必须仅对子进程进行安全审计,这可能比您的整个程序小得多。

通过使用setuid更改为非root用户来放弃root权限后,您将不再拥有使用setuid再次成为root用户所需的权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM