From b63a49fc3980296c6a6ea6ac0624142e8af94d52 Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 2 Nov 2025 17:19:28 +0000 Subject: fix: Stricter SSRF validation (#2082) * fix: Stricter SSRF validation * skip dns resolution if running in proxy context * more fixes * Add LRU cache * change the env variable for internal hostnames * make dns resolution timeout configerable * upgrade ipaddr * handle ipv6 * handle proxy bypass for request interceptor --- packages/shared/config.ts | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'packages') diff --git a/packages/shared/config.ts b/packages/shared/config.ts index d54b7589..51b591ad 100644 --- a/packages/shared/config.ts +++ b/packages/shared/config.ts @@ -104,6 +104,7 @@ const allEnv = z.object({ .default("") .transform((t) => t.split("%%").filter((a) => a)), CRAWLER_SCREENSHOT_TIMEOUT_SEC: z.coerce.number().default(5), + CRAWLER_IP_VALIDATION_DNS_RESOLVER_TIMEOUT_SEC: z.coerce.number().default(1), LOG_LEVEL: z.string().default("debug"), NO_COLOR: stringBool("false"), DEMO_MODE: stringBool("false"), @@ -178,7 +179,24 @@ const allEnv = z.object({ .filter((p) => p), ) .optional(), - CRAWLER_NO_PROXY: z.string().optional(), + CRAWLER_NO_PROXY: z + .string() + .transform((val) => + val + .split(",") + .map((p) => p.trim()) + .filter((p) => p), + ) + .optional(), + CRAWLER_ALLOWED_INTERNAL_HOSTNAMES: z + .string() + .transform((val) => + val + .split(",") + .map((p) => p.trim()) + .filter((p) => p), + ) + .optional(), // Database configuration DB_WAL_MODE: stringBool("false"), @@ -276,6 +294,10 @@ const serverConfigSchema = allEnv.transform((val, ctx) => { ytDlpArguments: val.CRAWLER_YTDLP_ARGS, screenshotTimeoutSec: val.CRAWLER_SCREENSHOT_TIMEOUT_SEC, htmlContentSizeThreshold: val.HTML_CONTENT_SIZE_INLINE_THRESHOLD_BYTES, + ipValidation: { + dnsResolverTimeoutSec: + val.CRAWLER_IP_VALIDATION_DNS_RESOLVER_TIMEOUT_SEC, + }, }, ocr: { langs: val.OCR_LANGS, @@ -309,6 +331,7 @@ const serverConfigSchema = allEnv.transform((val, ctx) => { httpsProxy: val.CRAWLER_HTTPS_PROXY, noProxy: val.CRAWLER_NO_PROXY, }, + allowedInternalHostnames: val.CRAWLER_ALLOWED_INTERNAL_HOSTNAMES, assetPreprocessing: { numWorkers: val.ASSET_PREPROCESSING_NUM_WORKERS, }, -- cgit v1.2.3-70-g09d2