6 个版本
0.2.4 | 2024年3月17日 |
---|---|
0.2.3 | 2023年7月30日 |
0.2.2 | 2022年6月26日 |
0.2.1 | 2022年3月19日 |
0.1.0 | 2020年11月4日 |
#156 in Unix APIs
18,164 每月下载量
用于 5 个crates (2 directly)
160KB
3.5K SLoC
capctl
A pure-Rust interface to prctl()
and Linux capabilities.
功能
This crate has the following features (by default, only std
is enabled)
-
std
: Link against the standard library.Interfaces that depend on this feature are marked in the documentation on docs.rs.
-
sc
: Allow making inline syscalls with thesc
crate instead of calling into the system's libc for some operations.Note: Currently, support for inline syscalls is limited to the following syscalls:
prctl()
,capget()
,capset()
,setresuid()
,setresgid()
,setgroups()
.capctl
will still call into the system's libc for most other syscalls. -
serde
: Enables implementations ofSerialize
andDeserialize
for most (non-error) types.
Why not caps
?
TL;DR: In the opinion of capctl
's author, caps
adds too much abstraction and overhead.
-
The kernel APIs to access the 5 capability sets (permitted, effective, inheritable, bounding, and ambient) are very different. However,
caps
presents a unified interface that allows for manipulating all of them the same way.这无疑更方便使用。然而,a) 它最小化了能力集之间的差异(这是基本且必须理解的,以便正确使用能力),b) 它允许用户编写尝试执行实际上不可能的操作的代码(例如,将能力添加到边界能力集中),以及 c) 它可能导致过多的系统调用(因为内核API允许一起执行的操作必须单独执行)。
注意:如果同时提供底层API以允许用户进行更细粒度的控制,则《capctl》的作者并不完全反对添加此类接口。然而,《caps》并没有这样做。
-
capctl
在内部使用更有效的表示。例如,《caps》使用
HashSet
来存储能力集,这是浪费的。《capctl》同时,有一个定制的CapSet
结构体,它以更有效的方式存储一组能力。(CapSet
还具有专门设计用于处理能力的函数,而不仅仅是作为通用的集合实现。)
为什么不使用prctl
?
TL;DR:《prctl》是一个非常底层的封装crate,其中一些“安全”代码应该是unsafe
。
-
《prctl》专注于
prctl()
系统调用,而不是Linux能力。因此,其Linux能力的接口是次要的,且不完整。 -
当发生错误时,《prctl》返回原始的
errno
值。这个crate返回一个更友好的自定义错误类型,可以转换为io::Error
。 -
最重要的是,《prctl》未能认识到,正如手册页面所解释的,
prctl()
是一个非常底层的系统调用,应该谨慎使用。因此,
prctl
中的一些“安全”函数实际上非常不安全!prctl::set_mm()
是最差的例子:它可以用来设置原始地址,例如堆的末尾(就像使用brk()
一样),而且它是一个“安全”函数!它甚至接受这些地址作为libc::c_ulong
而不是原始指针,这使得它容易受到滥用。
依赖关系
~74–370KB