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

开关语义升级为完全放行,含 .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
+39
View File
@@ -73,6 +73,10 @@ impl AllowedDirs {
/// 故本函数内部 best-effort canonicalize 兜底(失败回退词法),消除所有调用方形态差异。
/// 白名单仍是唯一真相源,canonicalize 不引入新放行,顺带解析 symlink 增强(非削弱)防逃逸。
pub fn is_authorized(&self, candidate: &Path) -> bool {
// 授权总开关开时不再逐目录询问,黑名单与白名单外一并放行,体验优先用户知情选择;开关关行为不变
if crate::commands::ai::audit::path_auth::is_blacklist_bypassed() {
return true;
}
// Phase C: 黑名单优先(白名单命中也拒)。validate_path 已挡 .ssh/.aws 等,
// 此处补系统核心目录(用户可能误把 C:\ 加入 persistent,黑名单兜底拒 System32)。
if is_in_system_blacklist(candidate) {
@@ -523,4 +527,39 @@ mod tests {
assert!(!is_in_system_blacklist(&PathBuf::from("E:\\wk-lab\\devflow\\src")));
assert!(!is_in_system_blacklist(&PathBuf::from("D:\\backup\\appdata\\data")));
}
// 授权总开关(黑名单放行)接入 is_authorized 的语义测试。
// 进程级标志全进程单例,改写或依赖其结果的用例持 path_auth 串行闸防并行互踩。
/// 总开关开:白名单外路径与 .ssh 黑名单路径一律放行(is_authorized 首位短路)。
/// 先取结果再复位再断言,防 panic 泄漏标志污染并行测试。
#[test]
fn test_bypass_on_is_authorized_allows_all() {
let _guard = crate::commands::ai::audit::path_auth::BLACKLIST_BYPASS_TEST_LOCK
.lock()
.unwrap_or_else(|e| e.into_inner());
crate::commands::ai::audit::path_auth::set_blacklist_bypass(true);
let allowed = AllowedDirs::default();
let outside = PathBuf::from("E:/wk-test-bypass-outside/file.txt");
let ssh = PathBuf::from("/home/user/.ssh/id_rsa");
let outside_ok = allowed.is_authorized(&outside);
let ssh_ok = allowed.is_authorized(&ssh);
crate::commands::ai::audit::path_auth::set_blacklist_bypass(false);
assert!(outside_ok, "总开关开时白名单外路径应放行");
assert!(ssh_ok, "总开关开时 .ssh 黑名单路径应放行");
}
/// 总开关关:黑名单拒且白名单外拒,与接入旁路前行为一致。
#[test]
fn test_bypass_off_is_authorized_unchanged() {
let _guard = crate::commands::ai::audit::path_auth::BLACKLIST_BYPASS_TEST_LOCK
.lock()
.unwrap_or_else(|e| e.into_inner());
crate::commands::ai::audit::path_auth::set_blacklist_bypass(false);
let allowed = AllowedDirs::default();
let outside_ok = allowed.is_authorized(&PathBuf::from("E:/wk-test-bypass-outside/file.txt"));
let ssh_ok = allowed.is_authorized(&PathBuf::from("/home/user/.ssh/id_rsa"));
assert!(!outside_ok, "总开关关时白名单外路径应拒绝");
assert!(!ssh_ok, "总开关关时 .ssh 黑名单路径应拒绝");
}
}