如何将Stack Canaries添加到Rust可执行文件?

Cal*_*all 7 llvm rust

我正在努力强化我正在进行的项目中的一些可执行文件.为了测试,我正在使用一个hello world程序,并使用checksec检查它,它报告没有金丝雀.我对Rust很陌生,谷歌缺乏信息让我觉得我错过了一些明显的东西.

使用GCC,它是一个简单的编译器标志:-fstack-protector-all.我发现的最接近LLVM的是安全堆栈.但是,当我尝试将其传递给LLVM时,Rust编译器似乎没有认识到这一点.例如:

rustc -C llvm-args="-fsanitize=safe-stack" -C link-arg="-fsanitize=safe-stack" test.rust
Run Code Online (Sandbox Code Playgroud)

结果是

rustc:未知的命令行参数'-fsanitize = safe-stack'.试试:'rustc -help'sugcc:你的意思是'-spp-no-call'?

我正在使用Rust 1.23.0.我试图不仅在x86_64上添加这些金丝雀,而且在armeabi-v7a上添加这些金丝雀,以防相关.

Wes*_*ser 6

目前,不支持此功能:

我们更新了LLVM,因此在我们的LLVM中支持这个[安全堆栈属性],我认为默认情况下启用此功能可能需要一些调查,可能还需要RFC,所以我现在要关闭它.

- alexcrichton https://github.com/rust-lang/rust/issues/26612

我无法找到此功能的RFC.


She*_*ter 6

您现在无法使用LLVM的SafeStack.

-fsanitize=safe-stack是一个Clang命令行选项,不一定是LLVM命令行选项.这可能解释了为什么你会收到你所犯的错误.

SafeStack支持最初是在问题26612中提出的,但启用它可以推迟到可以进行更多调查.

由于SafeStack是一种消毒剂,接下来要做的就是问题39699,这是更多消毒杀菌剂的跟踪问题.目前仅支持少数消毒杀菌剂和平台.将它添加到列表并创建PR以启用它可能就像"简单"一样.


话虽这么说,我相信Rust确实有一定的堆栈保护.例如,最近的这个问题讨论了glibc即将发生的一些变化将如何影响Rust的堆栈保护计算.