【问题标题】:How to add Stack Canaries to Rust executables?如何将 Stack Canaries 添加到 Rust 可执行文件?
【发布时间】:2018-01-31 16:56:05
【问题描述】:

我正在尝试强化我正在处理的项目中的一些可执行文件。为了进行测试,我使用了一个 hello world 程序,并使用 checksec 检查它,它报告说没有金丝雀。我对 Rust 很陌生,Google 上缺乏信息让我觉得我遗漏了一些明显的东西。

使用 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=安全堆栈”。试试:'rustc -help' rustc:你有没有 意思是'-spp-no-call'?

我正在使用 Rust 1.23.0。我正在尝试不仅在 x86_64 上添加这些金丝雀,而且还在 armeabi-v7a 上添加这些金丝雀,以防万一。

【问题讨论】:

  • test.rust — FWIW,扩展名是.rs。

标签: rust llvm


【解决方案1】:

你现在不能使用 LLVM 的 SafeStack。

-fsanitize=safe-stack 是一个 Clang 命令行选项,不一定是 LLVM 选项。这可能解释了为什么会出现错误。

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

由于 SafeStack 是一种消毒剂,接下来要关注的是issue 39699,这是针对更多消毒剂的跟踪问题。目前仅支持少数消毒剂和平台。它可能就像将其添加到列表并创建 PR 以启用它一样“简单”。


话虽如此,我相信 Rust 确实有一些数量的堆栈保护。例如,this recent issue 谈到了 glibc 即将发生的一些变化将如何影响 Rust 的堆栈保护计算。

【讨论】:

    【解决方案2】:

    目前不支持:

    我们更新了 LLVM,因此在我们的 LLVM 中支持此 [安全堆栈属性],我认为默认情况下打开此功能可能需要进行一些调查,并且可能首先需要 RFC,所以我现在要关闭它。

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

    我找不到此功能的 RFC。

    【讨论】:

      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2013-02-17
      • 1970-01-01
      • 2010-11-28
      • 2020-06-26
      • 2022-01-15
      相关资源
      最近更新 更多