From cdac8ce1f4f7e0b98c832f49240b13988c5084d5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 22 Sep 2026 07:47:11 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=92=20Prevent=20path=20traversal=20in?= =?UTF-8?q?=20process=20commands?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added validation to prevent path traversal (`..`) and null bytes (`\0`) in command execution via `std.process.run` and `std.process.spawn`. This ensures that even when the Process capability is granted, the engine mitigates attempts to execute arbitrary binaries outside of intended directories. Co-authored-by: Tcode-Motion <188012755+Tcode-Motion@users.noreply.github.com> --- stdlib/src/process.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/stdlib/src/process.rs b/stdlib/src/process.rs index 1b3a882b..b22f3ee4 100644 --- a/stdlib/src/process.rs +++ b/stdlib/src/process.rs @@ -32,6 +32,15 @@ impl StdlibRegistry { )); } let cmd = args[0].try_into_string()?; + if cmd.contains("..") || cmd.contains('\0') { + return Err(RuntimeError::new( + RuntimeErrorKind::InvalidOperation( + "Security policy violation: Path traversal or null bytes in command are denied".to_string(), + ), + None, + None, + )); + } let args_list = match &args[1] { RuntimeValue::List { items, .. } => { let mut list = Vec::new(); @@ -115,6 +124,16 @@ impl StdlibRegistry { } }; + if cmd.contains("..") || cmd.contains('\0') { + return Err(RuntimeError::new( + RuntimeErrorKind::InvalidOperation( + "Security policy violation: Path traversal or null bytes in command are denied".to_string(), + ), + None, + None, + )); + } + let parsed = shlex::split(&cmd).ok_or_else(|| { RuntimeError::new( RuntimeErrorKind::InvalidOperation(