修复: spawn panic 兜底 + namespace 淘汰提示 + run_command 超时与破坏命令信任门控
This commit is contained in:
@@ -489,6 +489,26 @@ fn dir_of_path_normalized(path: &str) -> String {
|
||||
}
|
||||
}
|
||||
|
||||
/// 判定 run_command 的命令串是否「破坏性」(rm/del/format/... 等不可逆操作)。
|
||||
///
|
||||
/// 用于会话信任放行门控:破坏性命令**永不**走 session_trust auto 放行,即使同会话
|
||||
/// 已批准过同目录的 run_command,也必须每轮走正常审批(避免「一次批准同目录 →
|
||||
/// rm -rf 任意文件被自动放行」的安全漏洞)。
|
||||
///
|
||||
/// 判定规则:取命令**首 token** 精确匹配,避免前缀法误伤 delta/delve 等以 del 开头的
|
||||
/// 合法命令。黑名单只覆盖「不可逆破坏」类;curl/wget/scp 等下载拷贝类的风险(数据外泄/
|
||||
/// 恶意脚本)由 run_command 的 High risk 审批(用户每轮看完整命令)覆盖,不进黑名单,
|
||||
/// 避免误伤频繁合法下载。
|
||||
/// 局限:不解析 sudo/doas/env 等提权前缀(`sudo rm` 首 token 是 sudo 不命中)——本层是
|
||||
/// 「尽力」补充,主防线仍是 High risk 审批。
|
||||
pub fn is_destructive_command(cmd: &str) -> bool {
|
||||
const DESTRUCTIVE_VERBS: &[&str] = &[
|
||||
"rm", "rmdir", "del", "erase", "format", "remove-item", "dd", "mkfs",
|
||||
];
|
||||
let first = cmd.trim().split_whitespace().next().unwrap_or("").to_lowercase();
|
||||
DESTRUCTIVE_VERBS.iter().any(|v| first == *v)
|
||||
}
|
||||
|
||||
/// run_command / write_file 共用的目录 key 规范化:
|
||||
/// 尝试 canonicalize(去 symlink / .. / 大小写归一),失败回退原字面量 trim。
|
||||
fn normalize_dir_key(dir: &str) -> String {
|
||||
|
||||
Reference in New Issue
Block a user