9个版本

0.3.0 2022年10月1日
0.2.3 2022年2月14日
0.2.2 2022年1月1日
0.2.1 2021年12月31日
0.1.1 2021年4月20日

104操作系统 类别中

Download history 4461/week @ 2024-04-23 3722/week @ 2024-04-30 3997/week @ 2024-05-07 5422/week @ 2024-05-14 4890/week @ 2024-05-21 4860/week @ 2024-05-28 4077/week @ 2024-06-04 5392/week @ 2024-06-11 4907/week @ 2024-06-18 6921/week @ 2024-06-25 6183/week @ 2024-07-02 7731/week @ 2024-07-09 7544/week @ 2024-07-16 6117/week @ 2024-07-23 5600/week @ 2024-07-30 5582/week @ 2024-08-06

每月 25,908 次下载
17 包中(直接使用11个)

MIT/Apache

275KB
6.5K SLoC

libseccomp-rs

build-test Latest release on crates.io Documentation on docs.rs codecov

Rust语言对libseccomp库的绑定

libseccomp库提供了一个易于使用、平台无关的接口,用于访问Linux内核的syscall过滤机制。libseccomp API旨在抽象底层基于BPF的syscall过滤语言,并呈现一个更传统的基于函数调用的过滤接口,该接口应该对应用程序开发者熟悉且易于采用。

libseccomp-rs提供了对libseccomp库的Rust接口。该仓库包含libseccomp和libseccomp-sys包,使开发人员能够在Rust中使用libseccomp API。

  • libseccomp:高级安全API
  • libseccomp-sys:低级不安全API

变更日志

示例

创建和加载单个seccomp规则

use libseccomp::*;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Creates and returns a new filter context.
    let mut filter = ScmpFilterContext::new_filter(ScmpAction::Allow)?;

    // Adds an architecture to the filter.
    filter.add_arch(ScmpArch::X8664)?;

    // Returns the number of a syscall by name.
    let syscall = ScmpSyscall::from_name("dup3")?;

    // Adds a single rule for an unconditional action on the syscall.
    filter.add_rule(ScmpAction::Errno(10), syscall)?;

    // Loads the filter context into the kernel.
    filter.load()?;

    // The dup3 fails by the seccomp rule.
    assert_eq!(
        unsafe { libc::dup3(0, 100, libc::O_CLOEXEC) } as i32,
        -libc::EPERM
    );
    assert_eq!(std::io::Error::last_os_error().raw_os_error().unwrap(), 10);

    Ok(())
}

要求

在使用libseccomp包之前,您需要为您的系统安装libseccomp库。需要libseccomp库版本2.4或更高版本。

从软件包中安装libseccomp库

例如,基于Debian的Linux

$ sudo apt install libseccomp-dev

从源代码构建和安装libseccomp库

如果您想从官方发布tarball构建libseccomp库而不是使用软件包,请遵循以下快速步骤。

$ LIBSECCOMP_VERSION=2.5.3
$ wget https://github.com/seccomp/libseccomp/releases/download/v${LIBSECCOMP_VERSION}/libseccomp-${LIBSECCOMP_VERSION}.tar.gz
$ tar xvf libseccomp-${LIBSECCOMP_VERSION}.tar.gz
$ cd libseccomp-${LIBSECCOMP_VERSION}
$ ./configure
$ make
$ sudo make install

有关更多详细信息,请参阅libseccomp库仓库

设置

如果您使用动态链接的libseccomp库与libseccomp包,则无需额外的设置。

但是,如果您想使用libseccomp包针对musl-libc和静态链接的libseccomp库,您必须设置环境变量LIBSECCOMP_LINK_TYPELIBSECCOMP_LIB_PATH,如下所示。

$ export LIBSECCOMP_LINK_TYPE=static
$ export LIBSECCOMP_LIB_PATH="the path of the directory containing libseccomp.a (e.g. /usr/lib)"

注意:要针对musl-libc构建libseccomp包,您需要手动为musl-libc构建libseccomp库,或者使用提供静态链接libseccomp库包的基于musl的发行版

现在,将以下内容添加到您的Cargo.toml中以开始构建libseccomp包。

[dependencies]
libseccomp = "0.3.0"

测试包

libseccomp crate 提供了多个单元测试。如果您想运行标准的回归测试,可以执行以下命令。

$ make test

如何贡献

任何人都可以加入并贡献代码、文档和用例。

有关如何为 libseccomp-rs 项目做出贡献的详细信息,请参阅贡献文档

许可证

本 crate 受以下许可证约束

  • MIT 许可证(见 LICENSE-MIT);或者
  • Apache 2.0 许可证(见 LICENSE-APACHE),

任选其一。

除非您明确声明,否则您提交给 libseccomp-rs 的任何有意贡献,根据 Apache-2.0 许可证的定义,应以上述方式双重许可,不附加任何额外条款或条件。

依赖项

~155KB