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 在 内存管理
156 每月下载量
145KB
4K SLoC
hardened_malloc-rs
GrapheneOS的
为什么?
C库(glibc、musl等)中的默认内存分配器仍然在您的Rustcrate中使用,除非您使用其他各种内存分配器构建,例如jemalloc、mimalloc等。然而,大多数内存分配器都过于关注性能(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-objects
的FatLTO似乎可以解决这个问题,但这只是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
- 镜像到其他地方