From b739113b3a979fbf8660a81452e9ad978ce2ec7f Mon Sep 17 00:00:00 2001 From: FletcherFrimpong Date: Thu, 26 Mar 2026 21:35:07 +0000 Subject: [PATCH 01/15] chore: add package-lock.json files for openclaw extensions Co-Authored-By: FletcherFrimpong --- .../openclaw-docker/package-lock.json | 59 +++++++++++++++++++ .../openclaw-local/package-lock.json | 59 +++++++++++++++++++ .../extensions/openclaw-ssh/package-lock.json | 59 +++++++++++++++++++ .../extensions/openclaw/package-lock.json | 4 +- 4 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 apps/editor/extensions/openclaw-docker/package-lock.json create mode 100644 apps/editor/extensions/openclaw-local/package-lock.json create mode 100644 apps/editor/extensions/openclaw-ssh/package-lock.json diff --git a/apps/editor/extensions/openclaw-docker/package-lock.json b/apps/editor/extensions/openclaw-docker/package-lock.json new file mode 100644 index 00000000..ec3be7d1 --- /dev/null +++ b/apps/editor/extensions/openclaw-docker/package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "openclaw-docker", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "openclaw-docker", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.0.0", + "@types/vscode": "^1.85.0", + "typescript": "^5.3.0" + }, + "engines": { + "vscode": "^1.85.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.110.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.110.0.tgz", + "integrity": "sha512-AGuxUEpU4F4mfuQjxPPaQVyuOMhs+VT/xRok1jiHVBubHK7lBRvCuOMZG0LKUwxncrPorJ5qq/uil3IdZBd5lA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/apps/editor/extensions/openclaw-local/package-lock.json b/apps/editor/extensions/openclaw-local/package-lock.json new file mode 100644 index 00000000..ee7213c7 --- /dev/null +++ b/apps/editor/extensions/openclaw-local/package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "openclaw-local", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "openclaw-local", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.0.0", + "@types/vscode": "^1.85.0", + "typescript": "^5.3.0" + }, + "engines": { + "vscode": "^1.85.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.110.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.110.0.tgz", + "integrity": "sha512-AGuxUEpU4F4mfuQjxPPaQVyuOMhs+VT/xRok1jiHVBubHK7lBRvCuOMZG0LKUwxncrPorJ5qq/uil3IdZBd5lA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/apps/editor/extensions/openclaw-ssh/package-lock.json b/apps/editor/extensions/openclaw-ssh/package-lock.json new file mode 100644 index 00000000..aae5847f --- /dev/null +++ b/apps/editor/extensions/openclaw-ssh/package-lock.json @@ -0,0 +1,59 @@ +{ + "name": "openclaw-ssh", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "openclaw-ssh", + "version": "0.1.0", + "license": "MIT", + "devDependencies": { + "@types/node": "^20.0.0", + "@types/vscode": "^1.85.0", + "typescript": "^5.3.0" + }, + "engines": { + "vscode": "^1.85.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.37", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.37.tgz", + "integrity": "sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.110.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.110.0.tgz", + "integrity": "sha512-AGuxUEpU4F4mfuQjxPPaQVyuOMhs+VT/xRok1jiHVBubHK7lBRvCuOMZG0LKUwxncrPorJ5qq/uil3IdZBd5lA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/apps/editor/extensions/openclaw/package-lock.json b/apps/editor/extensions/openclaw/package-lock.json index d4a553e8..687d28e1 100644 --- a/apps/editor/extensions/openclaw/package-lock.json +++ b/apps/editor/extensions/openclaw/package-lock.json @@ -1,11 +1,11 @@ { - "name": "openclaw", + "name": "home", "version": "0.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "openclaw", + "name": "home", "version": "0.2.2", "license": "MIT", "devDependencies": { From 3e4cdf730d812b592799cecab6521c8be0063ff5 Mon Sep 17 00:00:00 2001 From: FletcherFrimpong Date: Thu, 26 Mar 2026 22:19:01 +0000 Subject: [PATCH 02/15] security: fix XSS, CSP, command injection, and dependency vulnerabilities - config.ts: remove unsafe-eval from Content Security Policy - statusController.ts: HTML-escape version strings before innerHTML injection - statusHtml.ts: sanitize maintainerName/URL before inserting into innerHTML - extension.ts: use imported cp module instead of require(); redact API keys from logs - openclaw-ssh/connection.ts: validate file paths to reject null bytes and non-absolute paths - status.ts: add localResourceRoots to restrict webview resource loading - apps/web: upgrade Next.js to 16.2.1 to fix CSRF bypass and HTTP smuggling CVEs Co-Authored-By: FletcherFrimpong --- .../extensions/openclaw-ssh/src/connection.ts | 2 ++ apps/editor/extensions/openclaw/src/extension.ts | 6 +++--- .../extensions/openclaw/src/panels/config.ts | 2 +- .../extensions/openclaw/src/panels/status.ts | 2 +- .../openclaw/src/panels/statusController.ts | 14 ++++++++++---- .../extensions/openclaw/src/panels/statusHtml.ts | 4 +++- apps/web/package.json | 2 +- 7 files changed, 21 insertions(+), 11 deletions(-) diff --git a/apps/editor/extensions/openclaw-ssh/src/connection.ts b/apps/editor/extensions/openclaw-ssh/src/connection.ts index 79dcfd99..adf1e078 100644 --- a/apps/editor/extensions/openclaw-ssh/src/connection.ts +++ b/apps/editor/extensions/openclaw-ssh/src/connection.ts @@ -95,6 +95,8 @@ export class SSHHostConnection implements HostConnection { } async writeFile(filePath: string, content: string): Promise { + if (/\0/.test(filePath)) { throw new Error('Invalid file path: null byte'); } + if (!/^[/~]/.test(filePath)) { throw new Error('Invalid file path: must be absolute or home-relative'); } const dir = path.posix.dirname(filePath); await this.exec('mkdir', ['-p', dir]); await new Promise((resolve, reject) => { diff --git a/apps/editor/extensions/openclaw/src/extension.ts b/apps/editor/extensions/openclaw/src/extension.ts index d9baf826..740ee3a6 100644 --- a/apps/editor/extensions/openclaw/src/extension.ts +++ b/apps/editor/extensions/openclaw/src/extension.ts @@ -535,8 +535,8 @@ function initBalanceBar(context: vscode.ExtensionContext): (amount?: number) => log(` Status: 200 OK`); log(` Email: ${d.email ?? '(not returned)'}`); log(` Balance: $${balanceBefore.toFixed(6)}`); - log(` MoltpilotKey: ${moltpilotKey ? 'OK ' + moltpilotKey.substring(0, 12) + '...' : 'MISSING'}`); - log(` OccKey: ${occKey ? 'OK ' + occKey.substring(0, 12) + '...' : 'MISSING'}`); + log(` MoltpilotKey: ${moltpilotKey ? 'OK [redacted]' : 'MISSING'}`); + log(` OccKey: ${occKey ? 'OK [redacted]' : 'MISSING'}`); } else { log(` HTTP ${r.status} -- JWT may be expired`); } @@ -785,7 +785,7 @@ export async function activate(context: vscode.ExtensionContext): Promise { - const child = require('child_process').spawn('sudo', ['-S', 'bash', '-c', command], { + const child = cp.spawn('sudo', ['-S', 'bash', '-c', command], { stdio: ['pipe', 'pipe', 'pipe'], }); child.stdin?.write(password + '\n'); diff --git a/apps/editor/extensions/openclaw/src/panels/config.ts b/apps/editor/extensions/openclaw/src/panels/config.ts index ce9eb944..53a90c78 100644 --- a/apps/editor/extensions/openclaw/src/panels/config.ts +++ b/apps/editor/extensions/openclaw/src/panels/config.ts @@ -451,7 +451,7 @@ export class ConfigPanel { - +