stat函数中S_ISUID,有效用户ID和S_ISGID组ID

10 篇文章 0 订阅

目录

引言

下面是测试代ID码

测试输出:

实例如下图:

下面是我的一些疑问以及询问Chatgpt的解答:

1.设置组ID和设置用户ID怎么防止恶意用户修改文件?真的可以吗?依据是什么

2.进程的有效ID是root,那么此进程是否能够完成root用户所有的操作

3.请举例说明“即使进程的有效用户 ID 为 root,也不一定能够执行 root 用户的所有操作”


引言

S_ISUID标志位是一个用于确定文件是否设置了Set-User-ID(SUID)位的位标志。当SUID位被设置时,执行该文件的用户将会获得该文件所有者的权限来执行文件,而不是仅拥有该文件本身的权限。

在这里需要注意两个概念:

  1. 文件所有者的权限:文件所有者指创建该文件或最近一次使用chown命令更改该文件所有者的用户。文件所有者对于该文件拥有特殊的权限,如修改文件的权限、更改文件所有者、删除文件等。

  2. 执行该文件的用户:执行该文件的用户指以./filename或sh filename等方式启动该文件的用户。执行该文件的用户只能拥有该文件的权限中允许的操作权限,不能更改文件的权限或所有者等信息。

需要注意的是,在设置S_ISUID标志时要谨慎,因为它可能会导致安全漏洞。S_ISUID标志的设置使得执行该文件的用户可以绕过自己的权限限制,成为文件所有者并获得更高的权限来执行文件。

下面是测试代ID码

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include<string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
        struct stat statbuf;
        for(int i = 1; i < argc; i++){
                printf("%s:",argv[i]);
                int ret = lstat(argv[i], &statbuf);
                if(ret < 0){
                        perror("lstat");
                        continue;
                }
                if(S_ISUID & statbuf.st_mode)
                        printf("SUID is set\n");
                else
                        printf("SUID is not set\n");

        }
        return 0;
}

测试输出:

另外可以使用chmod和chown命令修改有效用户ID

实例如下图:

即使刚开始使用chown命令修改了test所有者,但是没有设置SUID位置,程序的有效用户ID还是原来的ID,只有设置了SUID之后才真正具有root的所有权限 

关于组S_ISGID也是差不多的,可以自己下去试试

下面是我的一些疑问以及参考解答:

1.设置组ID和设置用户ID怎么防止恶意用户修改文件?真的可以吗?依据是什么

在 Linux 系统中,设置组ID和设置用户ID是一种常见的文件权限标记,可以防止恶意用户修改文件。

设置组ID(SGID)是一种文件权限标记,用于在某个目录下创建新文件时,使其继承该目录的所属组。例如,如果一个目录的所属组为 group1,同时设置了 SGID 标记,则在该目录下创建的新文件都会自动继承 group1 作为它们的所属组。这样,即使普通用户能够对这些文件拥有写入权限,但它们仍然无法将文件的所属组更改为其他组,从而保护了文件的安全性。

设置用户ID(SUID)也是一种文件权限标记,用于在执行某个程序时,暂时将进程的有效用户ID修改为程序的所有者ID。例如,对于一些需要具有特殊权限才能运行的程序(如 passwd),如果使用 SUID 标记将其配置为 root 所有者,则即使普通用户执行该程序,它也可以以 root 权限运行,从而完成一些普通用户无法完成的任务。由于 SUID 标记可能会导致一些安全问题,因此只应在必要的情况下使用,并确保程序的所有者和内容是可信的和安全的。

实际上,设置组ID和设置用户ID并不能完全防止恶意用户修改文件,但它们可以限制恶意用户对文件的权限,并增加攻击者对系统的难度。同时,为了确保系统的安全和可靠性,还需要进行其他的权限控制和访问控制,例如使用 SELinux、配置强密码策略等。

需要注意的是,在设置组ID和设置用户ID时,必须对目标文件进行谨慎处理,并严格审查程序的所有者和内容,以避免出现安全漏洞或不必要的后果。

2.进程的有效ID是root,那么此进程是否能够完成root用户所有的操作

如果一个进程的有效用户 ID 是 root,那么该进程具有 root 用户的特权,从理论上来说,它可以完成 root 用户能够完成的所有操作。也就是说,该进程可以在系统中执行各种特权级别的操作,包括访问和修改系统配置、访问和修改系统文件等等。

然而,实际上,在 Unix/Linux 系统中,为了确保系统的安全性,即使进程的有效用户 ID 为 root,也不一定能够执行 root 用户的所有操作。因为系统会对一些敏感操作进行严格的授权和访问控制,例如修改系统配置和文件等等。如果没有足够的权限或授权,即使进程的有效用户 ID 为 root,也不能执行这些操作。

此外,即使进程的有效用户 ID 为 root,也要注意谨慎处理,并确保该进程的来源和内容是可信和安全的。因为进程的有效用户 ID 为 root,可能会产生非常严重的后果,包括损坏系统、泄露敏感信息等等。如果您不信任该进程的来源或内容,请避免使用 root 用户来执行它。

3.请举例说明“即使进程的有效用户 ID 为 root,也不一定能够执行 root 用户的所有操作”

在 Unix/Linux 系统中,即使进程的有效用户 ID 为 root,也不一定能够执行 root 用户的所有操作,因为系统会对一些敏感操作进行严格的授权和访问控制。以下是一些常见的例子:

  1. 修改系统配置文件

在 Unix/Linux 系统中,许多系统配置文件位于 /etc 目录下,例如 /etc/passwd/etc/shadow/etc/sudoers 等等。这些文件包含了系统的配置信息和用户信息等等,是非常敏感的文件。即使进程的有效用户 ID 为 root,如果没有足够的权限或授权,也不能修改这些文件。

  1. 访问和修改硬件资源

在 Unix/Linux 系统中,硬件资源(如磁盘驱动器、网络接口、USB 设备等)通常需要特殊的访问权限。即使进程的有效用户 ID 为 root,如果没有相应的硬件访问权限,也无法访问或修改这些硬件资源。

  1. 执行特权级别的操作

在 Unix/Linux 系统中,有些操作需要更高的特权级别才能执行,如更改系统时间、访问其他用户的进程、打开 raw socket 等等。即使进程的有效用户 ID 是 root,如果没有足够的权限或授权,也不能执行这些操作。

综上所述,即使进程的有效用户 ID 为 root,也不能保证它能够执行 root 用户的所有操作。系统会对一些敏感操作进行严格的授权和访问控制,以确保系统的安全性和可靠性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值