// 受限后端安全测试:验证敏感路径被拦截、正常资源可访问 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);