mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-24 10:56:51 -06:00
security: submit XATTACH picked path as literal text, not a command line (CWE-74) (#1843)
The External References palette's XATTACH handler passed the file picker's result to `app.cmdline(&path)`. `cmdline` interprets command-line syntax, so a selected filename beginning with an apostrophe (for example `'closeall`) was run as an engine command rather than naming the file — closing every drawing without the UI's unsaved-change confirmation. The picked path is attacker-controlled (the picker returns whatever the user selected, and `relative_to_host` can reduce it to a bare basename). After starting XATTACH, submit it through `Session::input(Input::Text(path))` so it is delivered to the command's prompt as literal text and never interpreted as a command, matching how other picker/dialog bridges already behave. Addresses finding row 26.
This commit is contained in:
@@ -24,7 +24,13 @@ pub fn route(app: &mut CadApp, id: &str, params: &Value) -> Option<Result<Value,
|
||||
if let Err(e) = app.session.start("xattach") {
|
||||
return Some(Err(e.to_string()));
|
||||
}
|
||||
app.cmdline(&path);
|
||||
// Submit the picked filename as literal text, not through the command line: a path is
|
||||
// attacker-controlled (the file picker returns whatever the user selected), and
|
||||
// `cmdline` interprets command syntax, so a name like `'closeall` would run an engine
|
||||
// command instead of naming the file (CWE-74).
|
||||
if let Err(e) = app.session.input(cadcraft_engine::Input::Text(path)) {
|
||||
return Some(Err(e.to_string()));
|
||||
}
|
||||
Some(Ok(Value::Null))
|
||||
}
|
||||
_ => None,
|
||||
|
||||
Reference in New Issue
Block a user