



















@@ -1,38 +1,28 @@
11import fs from "node:fs/promises";
2-import os from "node:os";
32import path from "node:path";
43import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
54import type { OpenClawConfig } from "../config/config.js";
65import { collectWorkspaceSkillSymlinkEscapeFindings } from "./audit-extra.async.js";
6+import { AsyncTempCaseFactory } from "./test-temp-cases.js";
7788const isWindows = process.platform === "win32";
991010describe("security audit workspace skill path escape findings", () => {
11-let fixtureRoot = "";
12-let caseId = 0;
11+const tempCases = new AsyncTempCaseFactory("openclaw-security-audit-workspace-");
13121413beforeAll(async () => {
15-fixtureRoot = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-security-audit-workspace-"));
14+await tempCases.setup();
1615});
17161817afterAll(async () => {
19-if (!fixtureRoot) {
20-return;
21-}
22-await fs.rm(fixtureRoot, { recursive: true, force: true }).catch(() => undefined);
18+await tempCases.cleanup();
2319});
242025-const makeTmpDir = async (label: string) => {
26-const dir = path.join(fixtureRoot, `case-${caseId++}-${label}`);
27-await fs.mkdir(dir, { recursive: true });
28-return dir;
29-};
30-3121it("evaluates workspace skill path escape findings", async () => {
3222const runs = [
3323!isWindows
3424 ? (async () => {
35-const tmp = await makeTmpDir("workspace-skill-symlink-escape");
25+const tmp = await tempCases.makeTmpDir("workspace-skill-symlink-escape");
3626const workspaceDir = path.join(tmp, "workspace");
3727const outsideDir = path.join(tmp, "outside");
3828await fs.mkdir(path.join(workspaceDir, "skills", "leak"), { recursive: true });
@@ -54,7 +44,7 @@ describe("security audit workspace skill path escape findings", () => {
5444})()
5545 : Promise.resolve(),
5646(async () => {
57-const tmp = await makeTmpDir("workspace-skill-in-root");
47+const tmp = await tempCases.makeTmpDir("workspace-skill-in-root");
5848const workspaceDir = path.join(tmp, "workspace");
5949await fs.mkdir(path.join(workspaceDir, "skills", "safe"), { recursive: true });
6050await fs.writeFile(
@@ -75,7 +65,7 @@ describe("security audit workspace skill path escape findings", () => {
7565});
76667767it("treats an unresolvable realpath (timeout/error simulation) as a potential symlink escape", async () => {
78-const tmp = await makeTmpDir("workspace-skill-realpath-unresolvable");
68+const tmp = await tempCases.makeTmpDir("workspace-skill-realpath-unresolvable");
7969const workspaceDir = path.join(tmp, "workspace");
8070const skillsDir = path.join(workspaceDir, "skills", "suspect-skill");
8171await fs.mkdir(skillsDir, { recursive: true });
@@ -112,7 +102,7 @@ describe("security audit workspace skill path escape findings", () => {
112102});
113103114104it("surfaces scan_truncated finding when BFS visit cap is hit", async () => {
115-const tmp = await makeTmpDir("workspace-skill-bfs-truncated");
105+const tmp = await tempCases.makeTmpDir("workspace-skill-bfs-truncated");
116106const workspaceDir = path.join(tmp, "workspace");
117107const skillsRoot = path.join(workspaceDir, "skills");
118108await fs.mkdir(skillsRoot, { recursive: true });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。