cha39.能力

读书笔记

进程能力分为:

类型 解释
许可集 进程可使用的能力,删除一个能力是不可逆的
有效集 进程当前能使用的能力
可继承集 exec之后,可以继承、进入许可集的能力集(规定被exec的文件可以继承哪些能力)

文件能力分为:

类型 解释
许可集 exec时添加到进程的许可集
有效集 1位,关闭,则exec后进程有效集为空;开启,exec后有效集为许可集
可继承集 文件可继承集与进程可继承集相交后,作为exec后可被继承、进入许可集的能力集合(规定被exec的文件可以继承哪些能力)

exec前后计算公式

cap_bset为能力边界集

39.1

使用capability修改35-2

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <sys/capability.h>

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdarg.h>
#include <sched.h>

void error(const char *file, int line,const char *str, ...) {
va_list fmt;
va_start(fmt, str);
fprintf(stderr, "error:%s %s:%d\n", strerror(errno), file, line);
vfprintf(stderr, str, fmt);
fprintf(stderr, "\n");
va_end(fmt);
}

#define ERROR(...) error(__FILE__, __LINE__, __VA_ARGS__); exit(1)
#define FAIL(...) error(__FILE__, __LINE__, __VA_ARGS__); return -1

int raiseCap(int cap) {
cap_value_t caplist[1];
cap_t capability = cap_get_proc();
if(capability == NULL) {
FAIL("");
}
caplist[0] = cap;
if(cap_set_flag(capability, CAP_EFFECTIVE, 1, caplist, CAP_SET) == -1) {
cap_free(capability);
FAIL("");
}
if(cap_set_proc(capability) == -1) {
cap_free(capability);
FAIL("");
}
if(cap_free(capability) == -1) {
FAIL("");
}
return 0;
}

int main(int argc, char *argv[]) {
if(raiseCap(CAP_SYS_NICE) == -1) { ERROR("");}
int j, policy;
struct sched_param sp;

if(argc < 3 || strrchr("rfo", argv[1][0]) == NULL) {
ERROR("usage: %s policy priority pid...\n"
"\tpolicy is r(RR), f(FIFO), "
#ifdef SCHED_BATCH
"b(BATCH), "
#endif
#ifdef SCHED_IDLE
"i(IDLE), "
#endif
"or o(OTHER)"
, argv[0]);
}
switch (argv[1][0]) {
case 'r':
policy = SCHED_RR;
break;
case 'f':
policy = SCHED_FIFO;
break;
#ifdef SCHED_BATCH
case 'b':
policy = SCHED_BATCH;
break;
#endif
#ifdef SCHED_IDLE
case 'i':
policy = SCHED_IDLE;
break;
#endif
case 'o':
policy = SCHED_OTHER;
break;
default:
ERROR("unsupported policy:%s\n", argv[1]);
break;
}
sp.sched_priority = atoi(argv[2]);
for(int j = 3; j < argc; j++) {
pid_t pid = atoi(argv[j]);
if(sched_setscheduler(pid, policy, &sp) == -1) {
ERROR("");
}
}
}
1
2
gcc practice39.1.c -o practice39.1 -lcap
sudo setcap "cap_sys_nice=pe" practice39.1
作者

Meow Meow Liu

发布于

2023-08-22

更新于

2024-04-23

许可协议

评论