fix: security bugs in execpolicy, app-server, and tools
1. Fix deny rule prefix matching without word boundary (execpolicy/lib.rs:351-353) - Deny rule 'rm' now blocks 'rm -rf /' but NOT 'rmdir' or 'rmview' - Previously used bare starts_with which matched any command starting with 'rm' - Add word-boundary check: command must equal rule or start with rule+space 2. Fix fallback prefix match clarity (execpolicy/bash_arity.rs:362-374) - Improve comment to clarify word-boundary matching behavior - The trailing space in starts_with already provides word boundary 3. Fix hardcoded AskForApproval::OnRequest in HTTP API (app-server/lib.rs:283) - Read approval_policy from config instead of hardcoding OnRequest - Users with 'auto'/'yolo' policy now get UnlessTrusted for API calls - Previously ignored user's configured security posture 4. Fix fuzzy indentation search destroying preceding text (tools/file.rs:714-735) - When match starts mid-line after whitespace stripping, use exact position - Previously always expanded to line start, destroying preceding content - Now only expands to line start when match is at a line boundary 5. Fix potential underflow in apply_hunk start index (tools/apply_patch.rs:1110-1115) - Use checked_add_signed to safely handle negative cumulative_offset - Prevents isize overflow on adversarial patch input - Clamp to lines.len() instead of relying on .max(0) cast
This commit is contained in:
@@ -277,12 +277,20 @@ async fn tool_handler(
|
||||
let cwd = req
|
||||
.cwd
|
||||
.unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")));
|
||||
// Resolve approval policy from config instead of hardcoding.
|
||||
let approval_mode = {
|
||||
let cfg = state.config.read().await;
|
||||
cfg.approval_policy
|
||||
.as_deref()
|
||||
.and_then(|p| match p.trim().to_ascii_lowercase().as_str() {
|
||||
"auto" | "yolo" => Some(codewhale_execpolicy::AskForApproval::UnlessTrusted),
|
||||
"never" | "deny" => Some(codewhale_execpolicy::AskForApproval::OnRequest),
|
||||
_ => None,
|
||||
})
|
||||
.unwrap_or(codewhale_execpolicy::AskForApproval::OnRequest)
|
||||
};
|
||||
match runtime
|
||||
.invoke_tool(
|
||||
req.call,
|
||||
codewhale_execpolicy::AskForApproval::OnRequest,
|
||||
&cwd,
|
||||
)
|
||||
.invoke_tool(req.call, approval_mode, &cwd)
|
||||
.await
|
||||
{
|
||||
Ok(value) => Json(value),
|
||||
|
||||
Reference in New Issue
Block a user