mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 02:31:22 +00:00
fix(security): restrict skill download target paths
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { createHash } from "node:crypto";
|
||||
import path from "node:path";
|
||||
|
||||
export function unscopedPackageName(name: string): string {
|
||||
@@ -16,6 +17,30 @@ export function safeDirName(input: string): string {
|
||||
return trimmed.replaceAll("/", "__").replaceAll("\\", "__");
|
||||
}
|
||||
|
||||
export function safePathSegmentHashed(input: string): string {
|
||||
const trimmed = input.trim();
|
||||
const base = trimmed
|
||||
.replaceAll(/[\\/]/g, "-")
|
||||
.replaceAll(/[^a-zA-Z0-9._-]/g, "-")
|
||||
.replaceAll(/-+/g, "-")
|
||||
.replaceAll(/^-+/g, "")
|
||||
.replaceAll(/-+$/g, "");
|
||||
|
||||
const normalized = base.length > 0 ? base : "skill";
|
||||
const safe = normalized === "." || normalized === ".." ? "skill" : normalized;
|
||||
|
||||
const hash = createHash("sha256").update(trimmed).digest("hex").slice(0, 10);
|
||||
|
||||
if (safe !== trimmed) {
|
||||
const prefix = safe.length > 50 ? safe.slice(0, 50) : safe;
|
||||
return `${prefix}-${hash}`;
|
||||
}
|
||||
if (safe.length > 60) {
|
||||
return `${safe.slice(0, 50)}-${hash}`;
|
||||
}
|
||||
return safe;
|
||||
}
|
||||
|
||||
export function resolveSafeInstallDir(params: {
|
||||
baseDir: string;
|
||||
id: string;
|
||||
|
||||
Reference in New Issue
Block a user