shadow-rs: suppress unwind tables in release builds (#143)

Since Rust 1.92, panic=abort no longer prevents unwind table emission
on Linux. For setuid-root binaries, unwind tables leak internal binary
layout information (function boundaries, call graph structure).

Add -C force-unwind-tables=no via .cargo/config.toml. This is the only
stable mechanism in Cargo 1.95 (profile-rustflags is still unstable).
Applied to all profiles — harmless in dev builds where debug info
already exposes far more than unwind tables.

Verified with readelf: passwd release binary has zero .eh_frame or
.eh_frame_hdr sections after this change.

Fixes #143. Raised by @oech3.
This commit is contained in:
Pierre Warnier
2026-04-22 09:41:46 +02:00
parent 512c63e5e0
commit 9763b7e177
+15
View File
@@ -0,0 +1,15 @@
# Suppress unwind table generation in all builds.
#
# Since Rust 1.92, panic=abort no longer prevents unwind tables from being
# emitted on Linux (see https://blog.rust-lang.org/2025/12/11/Rust-1.92.0/).
# For setuid-root binaries, unwind tables leak internal binary layout
# information. Disabling them removes that attack surface.
#
# strip=true in [profile.release] already removes debug symbols; this covers
# the unwind tables that strip does not remove.
#
# Note: Cargo's per-profile rustflags (profile-rustflags) is not yet
# stabilised as of Cargo 1.95. This flag is applied globally but is harmless
# in debug builds (debug info already exposes far more than unwind tables).
[build]
rustflags = ["-C", "force-unwind-tables=no"]