os/kernel/task/
cap.rs

1use bitflags::bitflags;
2
3bitflags! {
4    /// Linux 能力位标志
5    ///
6    /// 这些标志代表了内核中各种特权操作的权限。
7    /// 在单 root 用户系统中,所有进程默认拥有所有能力。
8    #[derive(Clone, Copy, Debug, PartialEq, Eq)]
9    pub struct Capabilities: u64 {
10        /// 改变文件所有者
11        const CHOWN              = 1 << 0;
12        /// 绕过文件读写执行权限检查
13        const DAC_OVERRIDE       = 1 << 1;
14        /// 绕过文件读权限检查
15        const DAC_READ_SEARCH    = 1 << 2;
16        /// 绕过文件所有者检查
17        const FOWNER             = 1 << 3;
18        /// 不清除 setuid/setgid 位
19        const FSETID             = 1 << 4;
20        /// 发送信号给任意进程
21        const KILL               = 1 << 5;
22        /// 修改进程 GID
23        const SETGID             = 1 << 6;
24        /// 修改进程 UID
25        const SETUID             = 1 << 7;
26        /// 传递能力
27        const SETPCAP            = 1 << 8;
28        /// 设置不可变标志
29        const LINUX_IMMUTABLE    = 1 << 9;
30        /// 绑定特权端口 (<1024)
31        const NET_BIND_SERVICE   = 1 << 10;
32        /// 网络广播
33        const NET_BROADCAST      = 1 << 11;
34        /// 网络管理操作
35        const NET_ADMIN          = 1 << 12;
36        /// 使用 RAW 和 PACKET socket
37        const NET_RAW            = 1 << 13;
38        /// 锁定内存
39        const IPC_LOCK           = 1 << 14;
40        /// 绕过 IPC 所有权检查
41        const IPC_OWNER          = 1 << 15;
42        /// 加载/卸载内核模块
43        const SYS_MODULE         = 1 << 16;
44        /// 执行 I/O 端口操作
45        const SYS_RAWIO          = 1 << 17;
46        /// 使用 chroot()
47        const SYS_CHROOT         = 1 << 18;
48        /// 使用 ptrace()
49        const SYS_PTRACE         = 1 << 19;
50        /// 进程统计
51        const SYS_PACCT          = 1 << 20;
52        /// 系统管理操作
53        const SYS_ADMIN          = 1 << 21;
54        /// 重启系统
55        const SYS_BOOT           = 1 << 22;
56        /// 修改进程优先级
57        const SYS_NICE           = 1 << 23;
58        /// 覆盖资源限制
59        const SYS_RESOURCE       = 1 << 24;
60        /// 设置系统时间
61        const SYS_TIME           = 1 << 25;
62        /// 配置 TTY
63        const SYS_TTY_CONFIG     = 1 << 26;
64        /// 创建设备文件
65        const MKNOD              = 1 << 27;
66        /// 建立文件租约
67        const LEASE              = 1 << 28;
68        /// 写入审计日志
69        const AUDIT_WRITE        = 1 << 29;
70        /// 配置审计
71        const AUDIT_CONTROL      = 1 << 30;
72        /// 设置文件能力
73        const SETFCAP            = 1 << 31;
74        /// 覆盖 MAC 策略
75        const MAC_OVERRIDE       = 1 << 32;
76        /// 配置 MAC
77        const MAC_ADMIN          = 1 << 33;
78        /// 访问内核日志
79        const SYSLOG             = 1 << 34;
80        /// 触发唤醒告警
81        const WAKE_ALARM         = 1 << 35;
82        /// 阻止系统挂起
83        const BLOCK_SUSPEND      = 1 << 36;
84        /// 读取审计日志
85        const AUDIT_READ         = 1 << 37;
86        /// 性能监控
87        const PERFMON            = 1 << 38;
88        /// BPF 操作
89        const BPF                = 1 << 39;
90        /// 检查点/恢复
91        const CHECKPOINT_RESTORE = 1 << 40;
92    }
93}
94
95impl Capabilities {
96    /// 拥有所有能力(root 用户)
97    pub const fn full() -> Self {
98        Self::all()
99    }
100
101    /// 空能力集
102    pub const fn empty_set() -> Self {
103        Self::empty()
104    }
105}
106
107/// 能力集合
108///
109/// Linux 为每个进程维护 5 个能力集:
110/// - effective: 当前有效的能力(用于权限检查)
111/// - permitted: 允许的能力上限
112/// - inheritable: 可以继承给子进程的能力
113/// - bounding: 能力边界集(限制可获得的能力)
114/// - ambient: 环境能力(保持跨 execve)
115#[derive(Clone, Copy, Debug)]
116pub struct CapabilitySet {
117    /// 有效能力集(当前生效的能力)
118    pub effective: Capabilities,
119    /// 允许能力集(进程可以使用的能力)
120    pub permitted: Capabilities,
121    /// 可继承能力集(execve 时可以继承的能力)
122    pub inheritable: Capabilities,
123    /// 边界能力集(能力的上限)
124    pub bounding: Capabilities,
125    /// 环境能力集(保持跨 execve 的能力)
126    pub ambient: Capabilities,
127}
128
129impl CapabilitySet {
130    /// 创建拥有所有能力的集合(root 用户)
131    pub const fn full() -> Self {
132        Self {
133            effective: Capabilities::full(),
134            permitted: Capabilities::full(),
135            inheritable: Capabilities::full(),
136            bounding: Capabilities::full(),
137            ambient: Capabilities::full(),
138        }
139    }
140
141    /// 创建空能力集
142    pub const fn empty() -> Self {
143        Self {
144            effective: Capabilities::empty_set(),
145            permitted: Capabilities::empty_set(),
146            inheritable: Capabilities::empty_set(),
147            bounding: Capabilities::empty_set(),
148            ambient: Capabilities::empty_set(),
149        }
150    }
151
152    /// 检查是否拥有某个能力
153    pub fn has(&self, cap: Capabilities) -> bool {
154        // 在单 root 用户系统中,总是返回 true
155        self.effective.contains(cap)
156    }
157
158    /// 检查是否拥有所有指定的能力
159    pub fn has_all(&self, caps: Capabilities) -> bool {
160        self.effective.contains(caps)
161    }
162
163    /// 添加能力(在单 root 用户系统中无实际效果)
164    pub fn add(&mut self, cap: Capabilities) {
165        self.effective.insert(cap);
166        self.permitted.insert(cap);
167    }
168
169    /// 移除能力(在单 root 用户系统中无实际效果)
170    pub fn remove(&mut self, cap: Capabilities) {
171        self.effective.remove(cap);
172    }
173}
174
175// 为了与 Linux 系统调用兼容,提供能力位的数值常量
176pub const CAP_CHOWN: u32 = 0;
177pub const CAP_DAC_OVERRIDE: u32 = 1;
178pub const CAP_DAC_READ_SEARCH: u32 = 2;
179pub const CAP_FOWNER: u32 = 3;
180pub const CAP_FSETID: u32 = 4;
181pub const CAP_KILL: u32 = 5;
182pub const CAP_SETGID: u32 = 6;
183pub const CAP_SETUID: u32 = 7;
184pub const CAP_SETPCAP: u32 = 8;
185pub const CAP_LINUX_IMMUTABLE: u32 = 9;
186pub const CAP_NET_BIND_SERVICE: u32 = 10;
187pub const CAP_NET_BROADCAST: u32 = 11;
188pub const CAP_NET_ADMIN: u32 = 12;
189pub const CAP_NET_RAW: u32 = 13;
190pub const CAP_IPC_LOCK: u32 = 14;
191pub const CAP_IPC_OWNER: u32 = 15;
192pub const CAP_SYS_MODULE: u32 = 16;
193pub const CAP_SYS_RAWIO: u32 = 17;
194pub const CAP_SYS_CHROOT: u32 = 18;
195pub const CAP_SYS_PTRACE: u32 = 19;
196pub const CAP_SYS_PACCT: u32 = 20;
197pub const CAP_SYS_ADMIN: u32 = 21;
198pub const CAP_SYS_BOOT: u32 = 22;
199pub const CAP_SYS_NICE: u32 = 23;
200pub const CAP_SYS_RESOURCE: u32 = 24;
201pub const CAP_SYS_TIME: u32 = 25;
202pub const CAP_SYS_TTY_CONFIG: u32 = 26;
203pub const CAP_MKNOD: u32 = 27;
204pub const CAP_LEASE: u32 = 28;
205pub const CAP_AUDIT_WRITE: u32 = 29;
206pub const CAP_AUDIT_CONTROL: u32 = 30;
207pub const CAP_SETFCAP: u32 = 31;
208pub const CAP_MAC_OVERRIDE: u32 = 32;
209pub const CAP_MAC_ADMIN: u32 = 33;
210pub const CAP_SYSLOG: u32 = 34;
211pub const CAP_WAKE_ALARM: u32 = 35;
212pub const CAP_BLOCK_SUSPEND: u32 = 36;
213pub const CAP_AUDIT_READ: u32 = 37;
214pub const CAP_PERFMON: u32 = 38;
215pub const CAP_BPF: u32 = 39;
216pub const CAP_CHECKPOINT_RESTORE: u32 = 40;
217pub const CAP_LAST_CAP: u32 = CAP_CHECKPOINT_RESTORE;
218
219/// 从能力索引转换为能力位
220pub fn capability_from_u32(cap_index: u32) -> Option<Capabilities> {
221    if cap_index > CAP_LAST_CAP {
222        return None;
223    }
224    Some(Capabilities::from_bits_truncate(1u64 << cap_index))
225}