-
Notifications
You must be signed in to change notification settings - Fork 70
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposal for Adapt Stack Protector for Rust #841
Comments
Important This issue is not meant to be used for technical discussion. There is a Zulip stream for that. Use this issue to leave procedural comments, such as volunteering to review, indicating that you second the proposal (or third, etc), or raising a concern that you would like to be addressed. Concerns or objections to the proposal should be discussed on Zulip and formally registered here by adding a comment with the following syntax:
Concerns can be lifted with:
See documentation at https://forge.rust-lang.org cc @rust-lang/compiler |
@rustbot second |
Recording some objections that should be resolved prior to accepting this MCP: @rfcbot concern impl-at-mir-level Zulip: doing this on MIR [...] will end up up protecting a lot more functions than necessary, because it happens pre-(LLVM-)inlining, so there will be a lot of addresses taken that later get inlined out. @rfcbot concern inhibit-opts Zulip: By inserting the stack protectors prior to optimization, we're most likely going to inhibit optimizations @rfcbot concern lose-debuginfo-data Zulip: Some targets (eg, msvc) record in debuginfo whether stack protectors were enabled or disabled on a per-function basis and this data is used in automated compliance tooling to ensure standard deployment practices are being followed. By inserting stack protectors earlier than LLVM is aware, we lose out on this data being captured correctly. EDIT: reformatted comment for machine parsing |
@wesleywiser Based on the previous discussion, I think these problems have solutions.
|
Proposal for Adapt Stack Protector for Rust
Stack smash protection is a requirement for many products in actual production environments.
Although Rust is known for its memory safety, Rust's unsafe code may still cause stack smash risks. In the current industry, many products use Rust/C/C++ interop, which leads to the frequent use of unsafe code. This is the main reason why products have a great demand for Rust's stack smash protection.
There are three modes of stack protection: basic, strong and all. (Tracking issue here). The current status is that the
all
mode will significantly increase the binary size ( >7% in average) (which maybe affect performance too, needing more test), which is hard to accept for products. So they prefer to use basic/strong mode. But as this issue discussed, this two modes are for C++ and cannot be adapted to Rust.Therefore, Rust needs to implement its own stack protection mode. Our goal is to define similar checking rules for Rust, referring to the implementation of basic/strong in gcc/clang, and enable the compiler to identify functions that need to be protected.
The following are the initially proposed function check rules for rusty mode that require stack protection in Rust(Reference for clang here):
Arrays and references/pointers in Rust are of different types. If you want to use an array to manipulate stack space to cause a buffer overflow, you must first obtain a reference/pointer to it. Therefore, there is no need to specify stack protection rules for arrays in Rust.
By checking each function in the mir layer (because it is convenient to traverse rvalues), we can effectively identify functions that need to perform stack protection and add the corresponding flag in codegen.
Problems that require further discussion:
prototype PR: rust-lang/rust#137418
Mentors or Reviewers
@rcvalle
Thanks for your help!
Process
The main points of the Major Change Process are as follows:
@rustbot second
.-C flag
, then full team check-off is required.@rfcbot fcp merge
on either the MCP or the PR.You can read more about Major Change Proposals on forge.
Comments
This issue is not meant to be used for technical discussion. There is a Zulip stream for that. Use this issue to leave procedural comments, such as volunteering to review, indicating that you second the proposal (or third, etc), or raising a concern that you would like to be addressed.
The text was updated successfully, but these errors were encountered: