权限控制

都说Linux之下皆文件。

linux 在访问文件时,根据不同的用户,组,文件所有者的来设定访问权限,保护文件安全

文件类型权限

image-20220729170339169

image-20220729170409280

分析

  • 第0组

    • d 类型(文件夹
  • 第一组 表示该文件的所有组权限

    • r read (代表值为4

    • w write (2

    • x 执行权限 (1

    • S 提权和降权
    • s 修改我当前的组
    • t 仅所有者可删除权限
  • 第二组 同组用户的权限

  • 第三组 其他人,公共权限

  • 而数字为,硬链接数

在linux中常常使用chmod 修改文件的权限

获取用户

在执行权限相关函数的第一步,

当然是需要知道当前有效的用户权限

有效用户识别码/有效组别

uid_t geteuid(void);

uid_t getgid(void);

真实用户识别码,/有效组别

uid_t getuid(void);

uid_t getgid(void);

有效用户表示的是这个进程启动时,是哪个用户启动的。

真实用户实际上就是这个进程实际上当下拥有的用户权限。

实际上我们尝尝用真实用户使用权限控制,而有效用户一般只是用来检测是否是,作为判断依据。

  • 返回值为 0 表示 ROOT 是最高!
  • 1000~10000(不包含10000)系统级别,
  • 10000 以上 其他的比如网络上的用户
  • 安卓的比较严格,每个应用都会分配一个用户

测试发现捏:只有ROOT 的用户文件执行的进程才有更改和提权的函数的能力。其他用户,即使用chmod 7777拉满 (就算是sudo) 修改文件权限,进程运行时也没有办法修改进程的用户权限(就是使用set类的权限函数全部返回-1)。

测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <errno.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>
#define BUFSIZE 512
void err_exit(char* fmt, ...);

int main() {
if (sysconf(_SC_SAVED_IDS) > 0)
printf("_POSIX_SAVED_IDS effective!\n");
uid_t u = getuid();
uid_t eu = geteuid();
uid_t g = getgid();
uid_t eg = getegid();
std::cout << u << " " << eu << " " << g << " " << eg << " " << char(10);

int ret = setuid(0);
int ret2 = setgid(0);
printf("%d\n", ret);
printf("%d\n", ret2);

u = getuid();
eu = geteuid();
g = getgid();
eg = getegid();
std::cout << u << " " << eu << " " << g << " " << eg << " " << char(10);
return 0;
}

总结,涉及提权的函数 的程序 ,都用root权限,要么将程序所有转到root用户下(sudo chown root), 要么用root权限执行。