新增: 信任所有目录扩展至敏感目录放行
开关语义升级为完全放行,含 .ssh/.aws 等黑名单目录(产品拍板体验优先,用户知情选择) validate_path 与 is_authorized 双拦截点经进程级标志同源放行,audit 层每轮工具执行前刷新 设置页开启时二次确认,正文明示敏感凭据可进对话上下文风险自担;对话区常驻放行横幅既有 测试以串行闸防并行互踩进程级标志
This commit is contained in:
@@ -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 黑名单路径应拒绝");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user