authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-17 20:35:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-18 12:22:46-07:00
log4dcd1e60597c5bd79eab29f49717a13b1b144c8b
tree18c57ca713dbf69b4d4a3b60bf0519fa5eb9f341
parent013efaf13987acfa6b41d40f07900c1ea77f5bda

start code: overwrite AT_RANDOM after we use it


1 files changed, 7 insertions(+), 1 deletions(-)

lib/std/start.zig+7-1
......@@ -226,11 +226,17 @@ fn posixCallMainAndExit() noreturn {
226226 // "The address of sixteen bytes containing a random value."
227227 const addr = auxv[i].a_un.a_val;
228228 if (addr == 0) break;
229 const ptr = @intToPtr(*const [16]u8, addr);
229 const ptr = @intToPtr(*[16]u8, addr);
230230 var seed: [32]u8 = undefined;
231231 seed[0..16].* = ptr.*;
232232 seed[16..].* = ptr.*;
233233 tlcsprng.init(seed);
234 // Overwrite AT_RANDOM after we use it, otherwise our secure
235 // seed is sitting in memory ready for some other code in the
236 // program to reuse, and hence break our security.
237 // We play nice by refreshing it with fresh random bytes
238 // rather than clearing it.
239 std.crypto.random.bytes(ptr);
234240 break;
235241 },
236242 else => continue,