4个版本

0.1.3+12 2024年7月7日
0.1.2+12 2024年4月20日
0.1.1+12 2024年4月11日
0.1.0+12 2024年4月10日

#166内存管理

Download history 148/week @ 2024-04-27 147/week @ 2024-05-04 129/week @ 2024-05-11 155/week @ 2024-05-18 69/week @ 2024-05-25 138/week @ 2024-06-01 91/week @ 2024-06-08 99/week @ 2024-06-15 89/week @ 2024-06-22 111/week @ 2024-06-29 105/week @ 2024-07-06 23/week @ 2024-07-13 40/week @ 2024-07-20 56/week @ 2024-07-27 39/week @ 2024-08-03 20/week @ 2024-08-10

156 每月下载量

Apache-2.0 OR MIT

145KB
4K SLoC

C 3K SLoC // 0.0% comments C++ 381 SLoC // 0.1% comments Python 265 SLoC Rust 217 SLoC // 0.1% comments Java 61 SLoC Shell 4 SLoC

hardened_malloc-rs

GrapheneOS的的hardened_malloc的Rust包装库,可以作为您Rustcrate的全局内存分配器。

为什么?

C库(glibc、musl等)中的默认内存分配器仍然在您的Rustcrate中使用,除非您使用其他各种内存分配器构建,例如jemallocmimalloc等。然而,大多数内存分配器都过于关注性能(jemalloc)或是在安全和性能之间寻求平衡。

像GrapheneOS的hardened_malloc这样的内存分配器纯粹关注安全,非常适合关注安全的用例,但轻量级的变体使hardened_malloc非常适合替换默认的C库malloc,同时仍然保留许多安全属性,并最终提高应用程序的性能。

此外,在二进制文件中构建hardened_malloc而不是依赖LD_PRELOAD,可以使系统更加安全,因为它可以用来创建位置无关代码(-fPIE/-fPIC)并防止导出符号的替换(即使用LD_PRELOAD插入您的malloc)使用-fno-semantic-interposition。并且它可以从编译器和链接器中获得优化,否则这些优化将不可用。

https://github.com/GrapheneOS/hardened_malloc?tab=readme-ov-file#individual-applications

当集成到C标准库中时,它可以提供略微更好的性能,并且在C标准库和动态链接器实现中还有其他类似加固的机会。例如,可以实施一个库区域,为动态库提供类似于该分配器在不同大小类之间提供的类似隔离。目的是将其作为Bionic和musl C标准库加固变体的组成部分提供。

构建

默认使用的功能是 "static","gcc","light"。

要配置,您必须在不使用默认功能的情况下构建。要配置的功能列表如下

  • static - 创建libhardened_malloc的静态库,以便将您的crate进行静态链接
  • dynamic - 创建libhardened_malloc的动态链接库
  • gcc - 使用gcc构建hardened_malloc,作为 $CC
  • clang - 使用clang构建hardened_malloc,作为 $CC
  • light - 使用轻量级变体/配置构建hardened_malloc(性能与安全之间的平衡)
  • standard - 使用默认变体/配置构建hardened_malloc(更安全)

目前不能同时启用相同类型的功能(例如,不能同时启用gcc和clang)。

用法

在您的Cargo.toml的依赖项中(示例)

hardened_malloc-rs = { version = "0.1", features = ["static", "clang", "light"], default-features = false }

在您的crate的main.rs中

#[cfg(all(not(target_env = "msvc"), not(target_os = "macos")))]
use hardened_malloc_rs::HardenedMalloc;

#[cfg(all(not(target_env = "msvc"), not(target_os = "macos")))]
#[global_allocator]
static GLOBAL: HardenedMalloc = HardenedMalloc;

注意

这需要对hardened_malloc进行分叉以跳过LTO链接阶段,如果进行静态Clang/LLVM构建。Clang/LLVM的LTO将产生不兼容GNU链接器(ld)和ar的LLVM IR位码,除非顶级crate使用LLVM链接器(lld)在整个依赖图上,并且使用llvm-ar。GCC不受影响。

有关更多详细信息,请参阅https://github.com/girlbossceo/hardened_malloc-rs/issues/5

使用-ffat-lto-objectsFatLTO似乎可以解决这个问题,但这只是lld和gold插件的特性。

最低支持的Rust版本(MSRV)

hardened_malloc声明的可以用来构建hardened_malloc的最古老依赖集是Debian 12(bookworm),即最新的稳定版。Debian 12的仓库中有Rust 1.63,它将成为hardened_malloc-rs的MSRV。

有关详细信息,请参阅https://github.com/GrapheneOS/hardened_malloc?tab=readme-ov-file#dependencies

待办事项
  • 支持构建此crate以输出.so/.a文件
  • 测试是否真的可行
  • 在选择变体之上添加对显式make配置参数的支持
  • 使构建脚本整体更好
  • 支持C预处理器宏定义
  • 可能添加对同时构建两个变体的支持,或者不使用默认的轻量级变体
  • 可能添加对交叉编译的支持,以便我可以在苹果硅上为Linux x86构建?
  • 添加对hardened_malloc的测试和我们的测试的支持
  • 添加github CI/CD
  • 镜像到其他地方

无运行时依赖