fix(hooks): prevent SSRF via URL scheme validation and extend disable mechanism to HTTP hooks
- Restrict HTTP hook URLs to http: and https: schemes only (blocks file://, data://, ftp://) - Extend hook disable config to cover HTTP hooks by matching against hook URL identifier - Update all 5 hook executors (pre-tool-use, post-tool-use, stop, pre-compact, user-prompt-submit) - Add 6 new tests for URL scheme validation (file, data, ftp rejection + http, https, invalid URL)
This commit is contained in:
@@ -2,6 +2,7 @@ import type { HookHttp } from "./types"
|
||||
import type { CommandResult } from "../../shared/command-executor/execute-hook-command"
|
||||
|
||||
const DEFAULT_HTTP_HOOK_TIMEOUT_S = 30
|
||||
const ALLOWED_SCHEMES = new Set(["http:", "https:"])
|
||||
|
||||
export function interpolateEnvVars(
|
||||
value: string,
|
||||
@@ -39,6 +40,18 @@ export async function executeHttpHook(
|
||||
hook: HookHttp,
|
||||
stdin: string
|
||||
): Promise<CommandResult> {
|
||||
try {
|
||||
const parsed = new URL(hook.url)
|
||||
if (!ALLOWED_SCHEMES.has(parsed.protocol)) {
|
||||
return {
|
||||
exitCode: 1,
|
||||
stderr: `HTTP hook URL scheme "${parsed.protocol}" is not allowed. Only http: and https: are permitted.`,
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
return { exitCode: 1, stderr: `HTTP hook URL is invalid: ${hook.url}` }
|
||||
}
|
||||
|
||||
const timeoutS = hook.timeout ?? DEFAULT_HTTP_HOOK_TIMEOUT_S
|
||||
const headers = resolveHeaders(hook)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user