新增: 信任所有目录扩展至敏感目录放行

开关语义升级为完全放行,含 .ssh/.aws 等黑名单目录(产品拍板体验优先,用户知情选择)
validate_path 与 is_authorized 双拦截点经进程级标志同源放行,audit 层每轮工具执行前刷新
设置页开启时二次确认,正文明示敏感凭据可进对话上下文风险自担;对话区常驻放行横幅既有
测试以串行闸防并行互踩进程级标志
This commit is contained in:
lxy
2026-10-01 02:40:49 +08:00
parent 63779e8d69
commit 3e239a108f
8 changed files with 204 additions and 25 deletions
+8 -3
View File
@@ -125,7 +125,8 @@ pub(crate) fn generate_diff(old: &str, new: &str) -> String {
/// 2. **按路径分隔符分段**做 `..` 归一化检测——纯子串 `contains("..")` 会误伤
/// 合法目录名如 `my..file`,改用分段(逐段判断是否有 `..` 段)更精准,且能识别
/// 解码后 `..%2f` / `..\` 等变体。
/// 3. 敏感系统目录黑名单仍保留(.ssh/.aws/.gnupg/AppData/ProgramData/Windows/System32)。
/// 3. 敏感系统目录黑名单(.ssh/.aws/.gnupg/AppData/ProgramData/Windows/System32),
/// 「信任所有目录」总开关(df-ai-path-auth-bypass)开启时放行。
pub(crate) fn validate_path(path: &str) -> anyhow::Result<()> {
// 1) URL 解码:防 %2e%2e / %2f / %5c 等 URL 编码绕过 (LLM/外部输入可能传编码串)
// percent_decode_str 对非法 %XX 容错(保留原字节),decode_utf8_lossy 容错非 UTF-8。
@@ -147,8 +148,12 @@ pub(crate) fn validate_path(path: &str) -> anyhow::Result<()> {
// 敏感系统目录(.ssh/.aws/.gnupg + Windows/ProgramFiles/ProgramData + Unix 核心):
// 统一走 state::is_in_system_blacklist 分段匹配(消除 contains 子串误伤如 my\windows\backup,
// 与 is_authorized 运行时黑名单同源,单一来源 — 修 agent1 问题4 两套黑名单不一致)
if crate::state::is_in_system_blacklist(&PathBuf::from(&normalized)) {
// 与 is_authorized 运行时黑名单同源,单一来源 — 修 agent1 问题4 两套黑名单不一致)。
// 总开关开启时跳过(产品拍板:bypass 语义为完全放行,含敏感目录);标志由 audit 层每轮
// 工具执行前从同一 KV 刷新,与本函数无参签名解耦。.. 遍历检查保留在上:路径合法性校验,非权限边界。
if crate::state::is_in_system_blacklist(&PathBuf::from(&normalized))
&& !crate::commands::ai::audit::is_blacklist_bypassed()
{
anyhow::bail!("禁止访问敏感系统目录");
}
// AppData 不再硬拦(原 `lower.contains("\\appdata\\")` 一刀切致用户授权后仍拒)。