- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我在循环中调用 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
uid=1203(rose) gid=100(users) Gruppen=100(users),4(adm),6(disk),7(lp),10(wheel),14(uucp),18(audio ),19(cdrom),27(视频),35(游戏),60(mysql),250(portage),1001(haldaemon),1002(plugdev),1008(scanner),1027(vboxusers),1028(kvm ),1029(qemu),1036(gsm),1039(pulse-access),1040(pulse),1041(tuntap)
在“setuid(0)”之后
uid=0(root) gid=100(users) Gruppen=0(root),4(adm),6(disk),7(lp),10(wheel),14(uucp),18(audio ),19(cdrom),27(视频),35(游戏),60(mysql),100(用户),250(portage),1001(haldaemon),1002(plugdev),1008(scanner),1027(vboxusers ),1028(kvm),1029(qemu),1036(gsm),1039(pulse-access),1040(pulse),1041(tuntap)
在“setuid(1203)”之前
uid=1203(rose) gid=100(users) Gruppen=100(users),4(adm),6(disk),7(lp),10(wheel),14(uucp),18(audio ),19(cdrom),27(视频),35(游戏),60(mysql),250(portage),1001(haldaemon),1002(plugdev),1008(scanner),1027(vboxusers),1028(kvm ),1029(qemu),1036(gsm),1039(pulse-access),1040(pulse),1041(tuntap)
uid=1203(rose) gid=100(users) Gruppen=100(users),4(adm),6(disk),7(lp),10(wheel),14(uucp),18(audio ),19(cdrom),27(视频),35(游戏),60(mysql),250(portage),1001(haldaemon),1002(plugdev),1008(scanner),1027(vboxusers),1028(kvm ),1029(qemu),1036(gsm),1039(pulse-access),1040(pulse),1041(tuntap)
setuid: 不允许操作
uid=1203(rose) gid=100(users) Gruppen=100(users),4(adm),6(disk),7(lp),10(wheel),14(uucp),18(audio ),19(cdrom),27(视频),35(游戏),60(mysql),250(portage),1001(haldaemon),1002(plugdev),1008(scanner),1027(vboxusers),1028(kvm ),1029(qemu),1036(gsm),1039(pulse-access),1040(pulse),1041(tuntap)
setuid: 不允许操作
rose@condor:/home/rose/Txt/src/Test/C/Setuid(7)$ uname -aLinux 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用户 ID,由 seteuid 设置,并在您执行设置了 s 位的程序时更改。要允许使用 setuid(),您的真实用户 ID 或有效用户 ID 都必须为零,但如果您使用 setuid() 放弃权限(从 0 更改为其他任何内容),您的有效用户 ID 也将被更改.因此,您的第一个 setuid(1203) 也将有效用户 ID 设置为 1203,这会阻止您稍后重新获得权限。
要多次从 root 切换到 root,您必须使用 setreuid() 调用来交换两者 - setreuid(1203, 0) 会将您的真实用户 ID 更改为 1203,并将有效用户 ID 更改为 0,从而允许您稍后将 uid 设置为 0。
注意,只要两个uid中有一个为0,你就拥有root权限。使用 uid=1203 和 euid=0,您创建的文件将属于您(用户 ID 1203),但您仍然拥有 root 访问权限。因此,请非常仔细地检查您的程序是否存在安全隐患。
如果您需要在整个程序中时不时地获得 root 访问权限,那么在保留 root 权限的子进程中创建 pipe()、fork() 会更安全,在父进程中删除权限,并发送一些当您需要以 root 身份完成某些操作时,命令子进程执行管道。这样,您只需对子进程进行安全审核,这可能比您的整个程序小得多。
关于c++ - 不允许第二个 setuid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20513440/
这其实是一个三段式的问题,下面我会解释,但是问题是: 如何使用 gdb 以 root 权限运行程序的一部分,而其余部分以正常方式运行? 为什么我使用 mkstemp 在/tmp 中创建文件时会得到“权
我不得不为某人做一个肮脏的 Linux hack,这样他们就可以在非根用户的情况下使用 cupsenable printername shell 命令启动打印机。我不希望他们能够以 root 身份使用
我编写的一个 Python 扩展需要 root 访问权限才能执行单个硬件初始化调用。我不想仅仅为了我的扩展中的这个调用而以 root 身份运行整个脚本,所以我想编写一个包装器来执行此初始化,然后再降低
我已经使用 root 运行了一个程序,在其中我为 uid 9999999 调用了 setuid 函数,然后它成功地设置了这个 uid,即使它不存在于/etc/passwd 中。那么 setuid 如何
我有一个要设置 uid 位的 shell 脚本。我将所有者设置为 root 并设置 uid 位。我在 shell 中添加了 'whoami' 以检查它是否正常工作但是当我执行脚本时,whoami 返回
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
如果我在循环中调用 setuid 以成为 root 并重置 uid,这只会工作一次。我有以下代码: #include #include #include int my_func(int i) {
我正在扩展一些在 GNU/Linux (Ubuntu 14.04) 下运行的软件(我不是作者),由一个 manager 进程和几个 worker 组成过程。管理器可以通过我可以在配置文件中指定的命令行
当我在我的程序中尝试 setuid 时,它创建了 2 个进程。一个是父进程,另一个是子进程。 int isRoot() { if (getuid() != 0) {
假设我们正在查看以下场景: 文件 saymyname.c(包括省略) int main(int argc, char** argv){ system("whoami"); } 构建并设置权
正在尝试设置 cap_setgid、cap_setuid、cap_setpcap。 #include #include int main() { cap_t caps; caps
我目前正在尝试了解文件权限中的特殊位的作用,但目前正试图了解 setuid 位的作用。从所有在线资源中,它说: Commonly noted as SUID, the special permissi
我有以下简单代码来检查我的 getuid 函数: uidActual=getuid(); printf ("User id is [%d]\n", ui
我被要求找到一个命令,该命令将仅列出从当前目录(及其下)开始的具有 setuid 位的文件。有人告诉我这是正确的方法: find /home/anyuser -type f \( -perm -400
伙计们。 这是我的问题: 我有一个可执行文件需要在系统的特定位置创建一个文件夹。 无论谁执行它,我都希望它能够这样做。 我的想法是将父文件夹(可执行文件需要在其中创建文件夹的文件夹)提供给用户,并将可
我正在尝试了解缓冲区溢出和 setuid。我使用这个来源: #include #include #include int main(void){ char prog[]="/bin/ls
我在 Linux 中工作,并尝试在 Linux 上使用 setuid 执行 C 程序。这是我的代码: #include #include #include #include int main(
需要一些关于传递 argv 的帮助,以便 shell 脚本可以作为/usr/local/bin/script.sh 用户域运行 #include #include #include #inclu
我一直在努力思考 setuid/setgid 是如何工作的……我想到了这个人为的例子: 用户: 用户A属于A组 用户B属于B组 文件 a.txt 由用户 A 拥有,权限为 rw-rw----- (66
changeIDs() is trying to use setuid() to change the effective user id but it always errors out and I
我是一名优秀的程序员,十分优秀!