Files
api_health/agent/infra/test_restricted_backend.mjs
T
2026-09-09 17:36:45 +08:00

59 lines
3.1 KiB
JavaScript

// 受限后端安全测试:验证敏感路径被拦截、正常资源可访问
import { createRestrictedBackend } from "./restricted_fs_backend.js";
import { CompositeBackend, FilesystemBackend } from "deepagents";
const ROOT = "d:/work/ws_health/api/health";
const b = createRestrictedBackend({ rootDir: ROOT, dataDir: "./data" });
let pass = 0, fail = 0;
const check = (name, cond) => { cond ? pass++ : fail++; console.log(`${cond ? "PASS" : "FAIL"} ${name}`); };
// 1. 敏感文件读取拦截
check("read conf.json (relative) denied", (await b.read("conf.json")).error?.includes("denied"));
check("read conf.json (absolute) denied", (await b.read("d:/work/ws_health/api/health/conf.json")).error?.includes("denied"));
check("read /conf.json (root-absolute) denied", (await b.read("/conf.json")).error !== undefined);
check("read .env denied", (await b.read(".env")).error?.includes("denied"));
check("read data dir file denied", (await b.read("data/users/u123/memory.txt")).error?.includes("denied"));
check("read logs denied", (await b.read("logs/x.log")).error?.includes("denied"));
// 2. 穿越与沙箱外路径拦截
check("traversal denied", (await b.read("../conf.json")).error !== undefined);
check("outside sandbox denied", (await b.read("c:/Windows/win.ini")).error !== undefined);
// 3. 正常资源仍可访问
const agents = await b.read("agent/bots/bot-escort/AGENTS.md");
check("read AGENTS.md ok", !agents.error && agents.content.includes("小橙") === false || !agents.error);
const skill = await b.read("agent/infra/skills/baidu-ai-map/SKILL.md");
check("read SKILL.md ok", !skill.error);
// 4. ls / glob / grep 过滤
const ls = await b.ls("/");
check("ls no conf.json", !ls.files.some(f => f.path.toLowerCase().endsWith("conf.json")));
const glob = await b.glob("**/conf*.json");
check("glob no conf.json", !glob.files.some(f => f.path.toLowerCase().endsWith("conf.json")));
const grep1 = await b.grep("apiKey", "/");
check("grep no conf.json match", !grep1.matches.some(m => m.path.toLowerCase().endsWith("conf.json")));
const grep2 = await b.grep("escort", "agent/bots/bot-escort");
check("grep normal dir works", grep2.matches.length > 0);
// 5. 拒绝写敏感文件、允许写普通目录
check("write conf.json denied", (await b.write("conf.json", "{}")).error?.includes("denied"));
const w = await b.write("data-sandbox-test.txt", "hello");
check("write normal file ok", !w.error);
await b.delete?.("data-sandbox-test.txt");
// 6. /memories/ 虚拟挂载( escort 场景)不受影响
const composite = new CompositeBackend(
createRestrictedBackend({ rootDir: ROOT, dataDir: "./data" }),
{ "/memories/": new FilesystemBackend({ rootDir: ROOT + "/data/users/u123", virtualMode: true }) },
);
const wm = await composite.write("/memories/memory.txt", "测试记忆");
check("write /memories ok", !wm.error);
const rm = await composite.read("/memories/memory.txt");
check("read /memories ok", !rm.error && rm.content === "测试记忆");
const wm2 = await composite.read("/conf.json");
check("composite /conf.json denied", wm2.error?.includes("denied") || wm2.error !== undefined);
console.log(`\n${pass} passed, ${fail} failed`);
process.exit(fail ? 1 : 0);