Skip to content

Synthetic object files disable control flow protection features #103001

Closed
@pcc

Description

@pcc

I noticed that the synthetic object files added in #95604 will disable the IBT (on x86, enabled by -Z cf-protection=branch) and BTI (on AArch64, enabled by -Z branch-protection=bti) features because the object files are missing .note.gnu.property sections indicating that the object file is compatible with those features. Normally, if an object file is missing a .note.gnu.property section, the linker will disable all such features, on the assumption that the object file is not compatible.

This issue is reproducible on the master branch (slightly awkwardly because many distros don't ship IBT-enabled *crt*.o files, and neither is it enabled in Rust's standard library by default):

RUSTFLAGS_NOT_BOOTSTRAP='-Zcf-protection=branch' python3 x.py build  --target x86_64-unknown-linux-gnu --stage 1
rustup toolchain link stage1 build/x86_64-unknown-linux-gnu/stage1

In another directory:

> cat hello.rs
fn main() {
    println!("hello world");
}
> rustc +stage1 -Z cf-protection=branch hello.rs -C link-args='-nostartfiles'
> readelf -nW hello

Displaying notes found in: .note.gnu.build-id
  Owner                Data size 	Description
  GNU                  0x00000014	NT_GNU_BUILD_ID (unique build ID bitstring)	    Build ID: 9bc8182397b263d79d29c83448350ec033a6f66b

After commenting out the line of code that adds symbols.o to the link:

diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs
index 95e72184ff0..ed314db6772 100644
--- a/compiler/rustc_codegen_ssa/src/back/link.rs
+++ b/compiler/rustc_codegen_ssa/src/back/link.rs
@@ -1795,7 +1795,7 @@ fn add_linked_symbol_object(
     if let Err(e) = result {
         sess.fatal(&format!("failed to write {}: {}", path.display(), e));
     }
-    cmd.add_object(&path);
+    //cmd.add_object(&path);
 }
 
 /// Add object files containing code from the current crate.

the binary has the correct property note:

Displaying notes found in: .note.gnu.property
  Owner                Data size 	Description
  GNU                  0x00000010	NT_GNU_PROPERTY_TYPE_0	      Properties: x86 feature: IBT

Displaying notes found in: .note.gnu.build-id
  Owner                Data size 	Description
  GNU                  0x00000014	NT_GNU_BUILD_ID (unique build ID bitstring)	    Build ID: fb555c532955966767702c5af52844dbcc9a386c

Metadata

Metadata

Assignees

Labels

A-linkageArea: linking into static, shared libraries and binariesA-securityArea: Security (example: address space layout randomization).C-bugCategory: This is a bug.PG-exploit-mitigationsProject group: Exploit mitigations

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions