首页 文章

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

提问于
浏览
7

我'm trying to harden some executables in a project I'正在努力 . 为了测试,我正在使用一个hello world程序,并使用checksec检查它,它报告没有金丝雀 . 我错过了一些明显的东西 .

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

rustc -C llvm-args="-fsanitize=safe-stack" -C link-arg="-fsanitize=safe-stack" test.rust

结果是

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

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

2 回答

  • 6

    您现在无法使用LLVM的SafeStack .

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

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

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


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

  • 6

    目前,不支持此功能:

    我们更新了LLVM,因此在我们的LLVM中支持这个[安全堆栈属性],我认为默认启用此功能可能需要一些调查,可能需要先进行RFC,所以我现在要关闭它 . - alexcrichton https://github.com/rust-lang/rust/issues/26612

    我无法找到此功能的RFC .

相关问题