标签: setgid

'chmod g+s' 命令

你好我想了解chmod g+s命令在Unix中的作用。

我还想知道它在这种特定情况下的作用:

cd /home/canard;
touch un;
chgrp canard .;
chmod g+s .;
touch deux ;
Run Code Online (Sandbox Code Playgroud)

我了解所有命令角色,除了chmod g+s我想知道文件之间的差异un以及deux由这一系列命令产生的差异。

permissions chmod files setgid

74
推荐指数
3
解决办法
19万
查看次数

组成员资格和 setuid/setgid 进程

其流程去缓和权限通过setuid()setgid()似乎没有继承的UID / GID他们设置了组成员。

我有一个必须以 root 身份执行才能打开特权端口的服务器进程;之后,它降级为特定的非特权 uid/gid,1——例如,用户的foo(UID 73)。用户foo是组的成员bar

> cat /etc/group | grep bar
bar:x:54:foo
Run Code Online (Sandbox Code Playgroud)

因此,如果我以 身份登录foo,则可以读取/test.txt具有以下特征的文件:

> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar  8 16:22 /test.txt
Run Code Online (Sandbox Code Playgroud)

但是,std=gnu99当运行 root 时,以下 C 程序(编译):

> cat /etc/group | grep bar
bar:x:54:foo
Run Code Online (Sandbox Code Playgroud)

总是报告Permission denied。我想这与它是一个非登录过程有关,但它有点阻碍了权限应该工作的方式。


1. 这通常是服务器的 SOP,我认为必须有办法解决这个问题,因为我发现有人用 apache 做这件事的报告——apache 已被添加到音频组中,然后显然可以使用声音系统。当然,这可能发生在 fork 而不是原始进程中,但实际上在我的上下文中情况相同(它是在 setuid 调用之后派生的子进程)。

setuid permissions group setgid

10
推荐指数
1
解决办法
5117
查看次数

使用 chmod 数字模式取消设置 setgid 位

chmod在取消设置 setgid 位时,我刚刚注意到一些有趣的行为:

$ mkdir test
$ chmod 2755 test
$ stat -c '%a %n' test
2755 test  # as expected
$ chmod 0755 test
$ stat -c '%a %n' test
2755 test  # what? see below
$ chmod 00755 test
$ stat -c '%a %n' test
755 test  # double what?!
Run Code Online (Sandbox Code Playgroud)

尝试取消设置 setgid 位chmod 0755不起作用,这令人惊讶。但是,手册页表明这是预期的行为:

SETUID 和 SETGID 位

如果文件的组 ID 与用户的有效组 ID 或用户的补充组 ID 之一不匹配,则 chmod 清除常规文件的 set-group-ID 位,除非用户具有适当的权限。其他限制可能会导致 MODE 或 RFILE 的 set-user-ID 和 …

directory debian chmod setgid

7
推荐指数
1
解决办法
1691
查看次数

为什么 ssh-agent 组所有权不是 root

试图理解为什么 ssh-agent 有 sgid 位并发现这篇文章ssh-agent has sgid

我还有一个问题,为什么ssh-agent的组所有权是nobody not root?背后的原因是什么?如果组所有权是根,它仍然有效吗?

security permissions ssh-agent setgid

5
推荐指数
1
解决办法
1351
查看次数

可执行文件上 setgid 的含义

setuid在二进制可执行文件上得到它允许进程获取二进制所有者的有效 uid。我无法理解的是,对于特定的可执行文件,如果setuid位关闭但setgid位打开会怎样。在这种情况下会发生什么?

示例:假设我们有以下权限

ls -l my_bin
r-xr-s--- root wheel my_bin
Run Code Online (Sandbox Code Playgroud)

现在假设用户userA是 group 的成员wheeluserA尝试运行此程序时会发生什么?

我认为此进程的有效用户 ID 将uid与 name 用户相同wheel。这是一个人为的例子,但我对组权限如何改变有效 uid 或它们是否对有效 uid 有任何影响感到困惑。

setgid

4
推荐指数
1
解决办法
1258
查看次数

为什么我无法为“其他”设置 setuid?

我无法设置其他人的 setuid 位。为什么?有安全锁吗?

$ ls -l                                                                              
-rwxrwxr-x  1 allexj allexj 16784 Mar 11 17:30 a.out                                                                                                       
$ chmod o=+s a.out                                                              
$ ls -l                                                                              
-rwxrwx---  1 allexj allexj 16784 Mar 11 17:30 a.out
Run Code Online (Sandbox Code Playgroud)

bash setuid permissions chmod setgid

2
推荐指数
1
解决办法
639
查看次数

如何在 C 中的 setregid() 和 setreuid() 之后访问/设置其他用户的环境变量

我有一个特权 C 程序,它由标准用户(例如stduser)执行并在执行时切换到系统用户(例如sysuser),如下所示。基本上,我正在尝试做一些类似于sudo -u sysuser env会做的事情。

环境测试.c:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<shadow.h>
#include<pwd.h>

int main(void){
  struct passwd*pw;
  uid_t sysuid;
  gid_t sysgid;
  char err_module_name[256] = "";

  pw = getpwnam ("ayauser");
  endpwent();

  if (!pw){ //user doesn't really exist
          perror("getpwnam()");
          return errno;
  }

  sysuid = pw->pw_uid;
  sysgid = pw->pw_gid;

  (strcpy(err_module_name, "setregid()") == NULL || setregid(sysgid, sysgid) == 0) &&
  (strcpy(err_module_name, "setreuid()") == NULL || setreuid(sysuid, sysuid) == 0) &&
  (strcpy(err_module_name, "execl()")  == NULL || execl("/usr/bin/env", …
Run Code Online (Sandbox Code Playgroud)

linux c setuid environment-variables setgid

-2
推荐指数
1
解决办法
166
查看次数