@js-recon/js-recon 1.4.4 → 2.0.1-alpha.2
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/dependabot.yml +50 -0
- 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 +31 -2
- package/.github/workflows/rules-smoke-test.yaml +13 -5
- package/.nvmrc +1 -0
- package/.plumber.yaml +151 -0
- package/CHANGELOG.md +55 -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 +733 -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 +56 -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 +9 -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 +66 -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 +172 -75
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/methodFilter.js +9 -1
- package/build/lazyLoad/methodFilter.js.map +1 -1
- package/build/lazyLoad/next_js/NextJsCrawler.js +98 -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 +17 -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 +407 -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 +29 -5
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/react/react_sourcemapUrls.js +7 -28
- package/build/lazyLoad/react/react_sourcemapUrls.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/sourcemap.js +120 -0
- package/build/lazyLoad/sourcemap.js.map +1 -1
- 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 +15 -6
- 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 +17 -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 +13 -11
- 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 +12 -3
- 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 +28 -38
- 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 +4 -3
- 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 +6 -5
- 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/dataTables/genDataTablesPage.js +2 -1
- package/build/report/utility/dataTables/genDataTablesPage.js.map +1 -1
- package/build/report/utility/genHtml.js +316 -25
- package/build/report/utility/genHtml.js.map +1 -1
- package/build/report/utility/markdownGen/addAnalyze.js +2 -1
- package/build/report/utility/markdownGen/addAnalyze.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/report/utility/severityColors.js +35 -0
- package/build/report/utility/severityColors.js.map +1 -0
- 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/cacheDb.js +78 -0
- package/build/utility/cacheDb.js.map +1 -0
- package/build/utility/configureSandbox.js +2 -2
- package/build/utility/configureSandbox.js.map +1 -1
- package/build/utility/customHeaders.js +30 -0
- package/build/utility/customHeaders.js.map +1 -0
- package/build/utility/globals.js +37 -12
- 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 +38 -87
- 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/config.dist.yaml +3 -3
- package/contributing/testing.md +106 -0
- package/eslint.config.js +24 -0
- package/package.json +22 -6
- 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
package/.claude-sync/sync.sh
CHANGED
|
@@ -61,4 +61,4 @@ while IFS= read -r src; do
|
|
|
61
61
|
ln -sf "$src" "$dest"
|
|
62
62
|
done < <(find "$AGENTIC_REPO_PATH" \( -name "CLAUDE.md" -o -path "*/.claude/skills/*" -o -path "*/.claude/agents/*" \) -type f -not -path "*/.git/*")
|
|
63
63
|
|
|
64
|
-
echo "[claude-sync] synced CLAUDE.md files for branch '$CURRENT_BRANCH'"
|
|
64
|
+
echo "[claude-sync] synced CLAUDE.md / skills / agents files for branch '$CURRENT_BRANCH'"
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Dependabot version updates.
|
|
2
|
+
# Reference: https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference
|
|
3
|
+
#
|
|
4
|
+
# One update stream per package ecosystem present in this repo (npm, the Dockerfile base images,
|
|
5
|
+
# and GitHub Actions). Minor + patch bumps are grouped into a single weekly PR per ecosystem to
|
|
6
|
+
# cut noise; major bumps open individually so breaking changes get a dedicated review. PRs target
|
|
7
|
+
# `dev` — `main` only receives changes via the release flow (publish-js-recon.yml).
|
|
8
|
+
version: 2
|
|
9
|
+
|
|
10
|
+
updates:
|
|
11
|
+
# npm — root package.json / package-lock.json.
|
|
12
|
+
- package-ecosystem: "npm"
|
|
13
|
+
directory: "/"
|
|
14
|
+
target-branch: "dev"
|
|
15
|
+
schedule:
|
|
16
|
+
interval: "weekly"
|
|
17
|
+
commit-message:
|
|
18
|
+
prefix: "chore"
|
|
19
|
+
include: "scope"
|
|
20
|
+
groups:
|
|
21
|
+
npm-minor-patch:
|
|
22
|
+
update-types: ["minor", "patch"]
|
|
23
|
+
|
|
24
|
+
# Docker — covers Dockerfile and Dockerfile.release. Dockerfile.w-rules uses an ARG-only
|
|
25
|
+
# FROM ${BASE_IMAGE} with no fixed tag, so it has nothing for Dependabot to bump.
|
|
26
|
+
- package-ecosystem: "docker"
|
|
27
|
+
directory: "/"
|
|
28
|
+
target-branch: "dev"
|
|
29
|
+
schedule:
|
|
30
|
+
interval: "weekly"
|
|
31
|
+
commit-message:
|
|
32
|
+
prefix: "chore"
|
|
33
|
+
include: "scope"
|
|
34
|
+
groups:
|
|
35
|
+
docker-minor-patch:
|
|
36
|
+
update-types: ["minor", "patch"]
|
|
37
|
+
|
|
38
|
+
# GitHub Actions — all uses: refs are pinned to full commit SHAs (Plumber policy); Dependabot
|
|
39
|
+
# updates the SHA and the trailing "# vX.Y.Z" comment together.
|
|
40
|
+
- package-ecosystem: "github-actions"
|
|
41
|
+
directory: "/"
|
|
42
|
+
target-branch: "dev"
|
|
43
|
+
schedule:
|
|
44
|
+
interval: "weekly"
|
|
45
|
+
commit-message:
|
|
46
|
+
prefix: "ci"
|
|
47
|
+
include: "scope"
|
|
48
|
+
groups:
|
|
49
|
+
actions-minor-patch:
|
|
50
|
+
update-types: ["minor", "patch"]
|
|
@@ -5,6 +5,9 @@ on:
|
|
|
5
5
|
branches-ignore:
|
|
6
6
|
- main
|
|
7
7
|
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
8
11
|
jobs:
|
|
9
12
|
version_check:
|
|
10
13
|
if: |
|
|
@@ -56,6 +59,8 @@ jobs:
|
|
|
56
59
|
runs-on: ubuntu-latest
|
|
57
60
|
needs: audit
|
|
58
61
|
environment: commit-signing
|
|
62
|
+
permissions:
|
|
63
|
+
contents: write
|
|
59
64
|
steps:
|
|
60
65
|
- name: Checkout
|
|
61
66
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
@@ -64,7 +69,7 @@ jobs:
|
|
|
64
69
|
ref: ${{ github.ref_name }}
|
|
65
70
|
|
|
66
71
|
- name: Configure SSH commit signing
|
|
67
|
-
uses: shriyanss/verified-commit-action@v1
|
|
72
|
+
uses: shriyanss/verified-commit-action@1d7638e44a6bab6d3ac35653af7ef9f343074662 # v1.0.2
|
|
68
73
|
with:
|
|
69
74
|
ssh-private-key: ${{ secrets.JS_RECON_SIGNING_KEY }}
|
|
70
75
|
commit-name: "js-recon-bot"
|
|
@@ -115,8 +120,29 @@ jobs:
|
|
|
115
120
|
- name: Run unit tests
|
|
116
121
|
run: npm test
|
|
117
122
|
|
|
123
|
+
lint:
|
|
124
|
+
needs: prettier
|
|
125
|
+
runs-on: ubuntu-latest
|
|
126
|
+
steps:
|
|
127
|
+
- name: Checkout
|
|
128
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
129
|
+
with:
|
|
130
|
+
ref: ${{ github.ref_name }}
|
|
131
|
+
|
|
132
|
+
- name: Set up Node.js
|
|
133
|
+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
134
|
+
with:
|
|
135
|
+
node-version: "22"
|
|
136
|
+
cache: "npm"
|
|
137
|
+
|
|
138
|
+
- name: Install dependencies
|
|
139
|
+
run: npm ci
|
|
140
|
+
|
|
141
|
+
- name: Run ESLint
|
|
142
|
+
run: npm run lint
|
|
143
|
+
|
|
118
144
|
build:
|
|
119
|
-
needs: test
|
|
145
|
+
needs: [test, lint]
|
|
120
146
|
runs-on: ubuntu-latest
|
|
121
147
|
steps:
|
|
122
148
|
- name: Checkout
|
|
@@ -165,13 +191,15 @@ jobs:
|
|
|
165
191
|
path: js-recon-labs
|
|
166
192
|
|
|
167
193
|
- name: Checkout js-recon-rules
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
194
|
+
run: |
|
|
195
|
+
BRANCH="${{ github.ref_name }}"
|
|
196
|
+
if git ls-remote --exit-code --heads https://github.com/js-recon/js-recon-rules.git "$BRANCH" > /dev/null 2>&1; then
|
|
197
|
+
echo "Using js-recon-rules branch: $BRANCH"
|
|
198
|
+
else
|
|
199
|
+
echo "js-recon-rules has no '$BRANCH' branch, falling back to dev"
|
|
200
|
+
BRANCH="dev"
|
|
201
|
+
fi
|
|
202
|
+
git clone --depth 1 --branch "$BRANCH" https://github.com/js-recon/js-recon-rules.git js-recon-rules
|
|
175
203
|
|
|
176
204
|
- name: Set up Node.js
|
|
177
205
|
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
@@ -222,7 +250,7 @@ jobs:
|
|
|
222
250
|
|
|
223
251
|
- name: Upload analyze.json on failure
|
|
224
252
|
if: failure()
|
|
225
|
-
uses: actions/upload-artifact@v4
|
|
253
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
226
254
|
with:
|
|
227
255
|
name: analyze-json-docker
|
|
228
256
|
path: output/**/analyze.json
|
|
@@ -256,7 +284,7 @@ jobs:
|
|
|
256
284
|
|
|
257
285
|
- name: Upload w-rules analyze.json on failure
|
|
258
286
|
if: failure()
|
|
259
|
-
uses: actions/upload-artifact@v4
|
|
287
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
260
288
|
with:
|
|
261
289
|
name: analyze-json-docker-w-rules
|
|
262
290
|
path: output-w-rules/**/analyze.json
|
|
@@ -279,13 +307,15 @@ jobs:
|
|
|
279
307
|
path: js-recon-labs
|
|
280
308
|
|
|
281
309
|
- name: Checkout js-recon-rules
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
310
|
+
run: |
|
|
311
|
+
BRANCH="${{ github.ref_name }}"
|
|
312
|
+
if git ls-remote --exit-code --heads https://github.com/js-recon/js-recon-rules.git "$BRANCH" > /dev/null 2>&1; then
|
|
313
|
+
echo "Using js-recon-rules branch: $BRANCH"
|
|
314
|
+
else
|
|
315
|
+
echo "js-recon-rules has no '$BRANCH' branch, falling back to dev"
|
|
316
|
+
BRANCH="dev"
|
|
317
|
+
fi
|
|
318
|
+
git clone --depth 1 --branch "$BRANCH" https://github.com/js-recon/js-recon-rules.git js-recon-rules
|
|
289
319
|
|
|
290
320
|
- name: Set up Node.js
|
|
291
321
|
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
@@ -347,7 +377,7 @@ jobs:
|
|
|
347
377
|
|
|
348
378
|
- name: Upload analyze.json on failure
|
|
349
379
|
if: failure()
|
|
350
|
-
uses: actions/upload-artifact@v4
|
|
380
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
351
381
|
with:
|
|
352
382
|
name: analyze-json-macos
|
|
353
383
|
path: output/**/analyze.json
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: CodeQL
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- dev
|
|
7
|
+
- main
|
|
8
|
+
pull_request:
|
|
9
|
+
branches:
|
|
10
|
+
- dev
|
|
11
|
+
schedule:
|
|
12
|
+
- cron: "0 6 * * 1" # weekly, Monday 06:00 UTC
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
security-events: write
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
analyze:
|
|
20
|
+
name: Analyze (javascript-typescript)
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
24
|
+
|
|
25
|
+
- name: Initialize CodeQL
|
|
26
|
+
uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
|
27
|
+
with:
|
|
28
|
+
languages: javascript-typescript
|
|
29
|
+
|
|
30
|
+
- name: Perform CodeQL Analysis
|
|
31
|
+
uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
|
32
|
+
with:
|
|
33
|
+
category: "/language:javascript-typescript"
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
name: Exploit Smoke Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches-ignore:
|
|
6
|
+
- main
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
exploit-smoke-test:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
timeout-minutes: 40
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout js-recon
|
|
18
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
19
|
+
|
|
20
|
+
- name: Checkout js-recon-labs
|
|
21
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
22
|
+
with:
|
|
23
|
+
repository: js-recon/js-recon-labs
|
|
24
|
+
path: js-recon-labs
|
|
25
|
+
|
|
26
|
+
- name: Set up Node.js
|
|
27
|
+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
28
|
+
with:
|
|
29
|
+
node-version: "22"
|
|
30
|
+
cache: "npm"
|
|
31
|
+
|
|
32
|
+
- name: Install js-recon dependencies
|
|
33
|
+
run: npm ci
|
|
34
|
+
|
|
35
|
+
- name: Build js-recon
|
|
36
|
+
run: npm run build
|
|
37
|
+
|
|
38
|
+
# --- Next.js: CVE-2025-29927 (middleware bypass) ---
|
|
39
|
+
- name: Build cve-2025-29927 fixture
|
|
40
|
+
working-directory: js-recon-labs/next_js/cve-2025-29927
|
|
41
|
+
run: npm install && npm run build
|
|
42
|
+
|
|
43
|
+
- name: Start cve-2025-29927 fixture
|
|
44
|
+
working-directory: js-recon-labs/next_js/cve-2025-29927
|
|
45
|
+
run: npm start &
|
|
46
|
+
|
|
47
|
+
# --- Next.js: CVE-2026-64645 (rewrites SSRF) ---
|
|
48
|
+
- name: Build cve-2026-64645 fixture
|
|
49
|
+
working-directory: js-recon-labs/next_js/cve-2026-64645
|
|
50
|
+
run: npm install && npm run build
|
|
51
|
+
|
|
52
|
+
- name: Start cve-2026-64645 fixture
|
|
53
|
+
working-directory: js-recon-labs/next_js/cve-2026-64645
|
|
54
|
+
run: ./start.sh &
|
|
55
|
+
|
|
56
|
+
# --- Next.js: CVE-2025-55182 (React Flight RCE) ---
|
|
57
|
+
- name: Install cve-2025-55182 fixture dependencies
|
|
58
|
+
working-directory: js-recon-labs/next_js/cve-2025-55182
|
|
59
|
+
run: npm install
|
|
60
|
+
|
|
61
|
+
- name: Start cve-2025-55182 fixture
|
|
62
|
+
working-directory: js-recon-labs/next_js/cve-2025-55182
|
|
63
|
+
run: npm start &
|
|
64
|
+
|
|
65
|
+
# --- Vite: CVE-2025-30208 (fs.deny double-'?' bypass) ---
|
|
66
|
+
- name: Install cve-2025-30208 fixture dependencies
|
|
67
|
+
working-directory: js-recon-labs/vite/cve-2025-30208
|
|
68
|
+
run: npm install
|
|
69
|
+
|
|
70
|
+
- name: Start cve-2025-30208 fixture
|
|
71
|
+
working-directory: js-recon-labs/vite/cve-2025-30208
|
|
72
|
+
run: npm run dev &
|
|
73
|
+
|
|
74
|
+
# --- Vite: CVE-2026-39363 (WebSocket fetchModule bypass) ---
|
|
75
|
+
- name: Install cve-2026-39363 fixture dependencies
|
|
76
|
+
working-directory: js-recon-labs/vite/cve-2026-39363
|
|
77
|
+
run: npm install
|
|
78
|
+
|
|
79
|
+
- name: Start cve-2026-39363 fixture
|
|
80
|
+
working-directory: js-recon-labs/vite/cve-2026-39363
|
|
81
|
+
run: npm run dev &
|
|
82
|
+
|
|
83
|
+
# --- Nuxt: CVE-2026-71320 (Server Island RCE) ---
|
|
84
|
+
- name: Build cve-2026-71320 fixture
|
|
85
|
+
working-directory: js-recon-labs/nuxt/cve-2026-71320
|
|
86
|
+
run: npm install && npm run build
|
|
87
|
+
|
|
88
|
+
- name: Start cve-2026-71320 fixture
|
|
89
|
+
working-directory: js-recon-labs/nuxt/cve-2026-71320
|
|
90
|
+
run: npm start &
|
|
91
|
+
|
|
92
|
+
# --- Nuxt: CVE-2026-71315 (route-rule casing bypass) ---
|
|
93
|
+
- name: Build cve-2026-71315 fixture
|
|
94
|
+
working-directory: js-recon-labs/nuxt/cve-2026-71315
|
|
95
|
+
run: npm install && npm run build
|
|
96
|
+
|
|
97
|
+
- name: Start cve-2026-71315 fixture
|
|
98
|
+
working-directory: js-recon-labs/nuxt/cve-2026-71315
|
|
99
|
+
run: npm start &
|
|
100
|
+
|
|
101
|
+
# --- Angular: CVE-2026-68945 (HttpTransferCache collision) ---
|
|
102
|
+
- name: Build cve-2026-68945 fixture
|
|
103
|
+
working-directory: js-recon-labs/angular/cve-2026-68945
|
|
104
|
+
run: npm install && npm run build
|
|
105
|
+
|
|
106
|
+
- name: Start cve-2026-68945 fixture
|
|
107
|
+
working-directory: js-recon-labs/angular/cve-2026-68945
|
|
108
|
+
# CommonEngine's own allowedHosts safety net (unrelated to this CVE) rejects every
|
|
109
|
+
# request's Host header by default.
|
|
110
|
+
run: NG_ALLOWED_HOSTS=localhost npm start &
|
|
111
|
+
|
|
112
|
+
- name: Wait for all fixtures to be ready
|
|
113
|
+
run: |
|
|
114
|
+
# -f (fail on HTTP error status) is deliberately NOT used here: several fixtures 404 on
|
|
115
|
+
# a bare GET / (e.g. cve-2026-71315 has no pages/index.vue, only /login /Admin
|
|
116
|
+
# /testauth) or only accept POST with specific headers (cve-2025-55182). Any HTTP
|
|
117
|
+
# response — including a 404 — proves the process is up and listening, which is all
|
|
118
|
+
# this readiness check needs; the exploit module's own baseline/payload requests handle
|
|
119
|
+
# whatever status codes the real routes return.
|
|
120
|
+
for port in 3020 3021 3022 3023 3024 3025 3026 3027; do
|
|
121
|
+
echo "Waiting for app on port $port..."
|
|
122
|
+
timeout 90 bash -c "until curl -s -o /dev/null http://localhost:$port; do sleep 2; done"
|
|
123
|
+
done
|
|
124
|
+
echo "All fixtures ready."
|
|
125
|
+
|
|
126
|
+
- name: Run exploit module against every fixture
|
|
127
|
+
run: |
|
|
128
|
+
set -e
|
|
129
|
+
declare -A TARGETS=(
|
|
130
|
+
["CVE-2025-29927"]="http://localhost:3020/admin"
|
|
131
|
+
["CVE-2026-64645"]="http://localhost:3021/proxy"
|
|
132
|
+
["CVE-2025-30208"]="http://localhost:3022"
|
|
133
|
+
["CVE-2026-39363"]="http://localhost:3023"
|
|
134
|
+
["CVE-2026-71320"]="http://localhost:3024"
|
|
135
|
+
["CVE-2026-71315"]="http://localhost:3025"
|
|
136
|
+
["CVE-2026-68945"]="http://localhost:3026"
|
|
137
|
+
["CVE-2025-55182"]="http://localhost:3027"
|
|
138
|
+
)
|
|
139
|
+
mkdir -p /tmp/exploit-results
|
|
140
|
+
for cve in "${!TARGETS[@]}"; do
|
|
141
|
+
echo "Running exploit for $cve against ${TARGETS[$cve]}"
|
|
142
|
+
node build/index.js exploit \
|
|
143
|
+
-u "${TARGETS[$cve]}" \
|
|
144
|
+
--cve "$cve" \
|
|
145
|
+
--exec-cmd id \
|
|
146
|
+
-o "/tmp/exploit-results/$cve.json" \
|
|
147
|
+
--engine-output "/tmp/exploit-results/$cve-engine.json" \
|
|
148
|
+
--timeout 20000 || true
|
|
149
|
+
done
|
|
150
|
+
|
|
151
|
+
- name: Verify all CVEs reported vulnerable
|
|
152
|
+
run: node scripts/exploit-smoke-test.js /tmp/exploit-results
|
|
153
|
+
|
|
154
|
+
- name: Upload exploit results on failure
|
|
155
|
+
if: failure()
|
|
156
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
157
|
+
with:
|
|
158
|
+
name: exploit-results
|
|
159
|
+
path: /tmp/exploit-results/**
|
|
160
|
+
if-no-files-found: ignore
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
name: Framework Detection Smoke Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- dev
|
|
7
|
+
- main
|
|
8
|
+
pull_request:
|
|
9
|
+
branches:
|
|
10
|
+
- dev
|
|
11
|
+
- main
|
|
12
|
+
release:
|
|
13
|
+
types:
|
|
14
|
+
- published
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
framework-detection-smoke-test:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 30
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- name: Checkout js-recon
|
|
26
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
27
|
+
|
|
28
|
+
- name: Checkout js-recon-labs
|
|
29
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
30
|
+
with:
|
|
31
|
+
repository: js-recon/js-recon-labs
|
|
32
|
+
path: js-recon-labs
|
|
33
|
+
|
|
34
|
+
- name: Set up Node.js
|
|
35
|
+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
36
|
+
with:
|
|
37
|
+
node-version: "22"
|
|
38
|
+
|
|
39
|
+
- name: Install js-recon dependencies
|
|
40
|
+
run: npm ci
|
|
41
|
+
|
|
42
|
+
- name: Build js-recon
|
|
43
|
+
run: npm run build
|
|
44
|
+
|
|
45
|
+
- name: Start next_js detection app (port 3010)
|
|
46
|
+
working-directory: js-recon-labs/detection/next_js
|
|
47
|
+
run: |
|
|
48
|
+
npm ci
|
|
49
|
+
npm run build
|
|
50
|
+
npm start &
|
|
51
|
+
echo "Waiting for app on port 3010..."
|
|
52
|
+
timeout 60 bash -c 'until curl -sf http://localhost:3010 > /dev/null; do sleep 2; done'
|
|
53
|
+
|
|
54
|
+
- name: Start vue detection app (port 3011)
|
|
55
|
+
working-directory: js-recon-labs/detection/vue
|
|
56
|
+
run: |
|
|
57
|
+
npm ci
|
|
58
|
+
npm run build
|
|
59
|
+
npm start &
|
|
60
|
+
echo "Waiting for app on port 3011..."
|
|
61
|
+
timeout 60 bash -c 'until curl -sf http://localhost:3011 > /dev/null; do sleep 2; done'
|
|
62
|
+
|
|
63
|
+
- name: Start nuxt detection app (port 3012)
|
|
64
|
+
working-directory: js-recon-labs/detection/nuxt
|
|
65
|
+
run: |
|
|
66
|
+
npm ci
|
|
67
|
+
npm run build
|
|
68
|
+
npm start &
|
|
69
|
+
echo "Waiting for app on port 3012..."
|
|
70
|
+
timeout 60 bash -c 'until curl -sf http://localhost:3012 > /dev/null; do sleep 2; done'
|
|
71
|
+
|
|
72
|
+
- name: Start svelte detection app (port 3013)
|
|
73
|
+
working-directory: js-recon-labs/detection/svelte
|
|
74
|
+
run: |
|
|
75
|
+
npm ci
|
|
76
|
+
npm run build
|
|
77
|
+
npm start &
|
|
78
|
+
echo "Waiting for app on port 3013..."
|
|
79
|
+
timeout 60 bash -c 'until curl -sf http://localhost:3013 > /dev/null; do sleep 2; done'
|
|
80
|
+
|
|
81
|
+
- name: Start angular detection app (port 3014)
|
|
82
|
+
working-directory: js-recon-labs/detection/angular
|
|
83
|
+
run: |
|
|
84
|
+
npm ci
|
|
85
|
+
npm run build
|
|
86
|
+
npm start &
|
|
87
|
+
echo "Waiting for app on port 3014..."
|
|
88
|
+
timeout 60 bash -c 'until curl -sf http://localhost:3014 > /dev/null; do sleep 2; done'
|
|
89
|
+
|
|
90
|
+
- name: Start react-vite detection app (port 3015)
|
|
91
|
+
working-directory: js-recon-labs/detection/react_vite
|
|
92
|
+
run: |
|
|
93
|
+
npm ci
|
|
94
|
+
npm run build
|
|
95
|
+
npm start &
|
|
96
|
+
echo "Waiting for app on port 3015..."
|
|
97
|
+
timeout 60 bash -c 'until curl -sf http://localhost:3015 > /dev/null; do sleep 2; done'
|
|
98
|
+
|
|
99
|
+
- name: Start react-webpack detection app (port 3016)
|
|
100
|
+
working-directory: js-recon-labs/detection/react_webpack
|
|
101
|
+
run: |
|
|
102
|
+
npm ci
|
|
103
|
+
npm run build
|
|
104
|
+
npm start &
|
|
105
|
+
echo "Waiting for app on port 3016..."
|
|
106
|
+
timeout 60 bash -c 'until curl -sf http://localhost:3016 > /dev/null; do sleep 2; done'
|
|
107
|
+
|
|
108
|
+
- name: Run js-recon fingerprint against all detection apps
|
|
109
|
+
run: |
|
|
110
|
+
cat > /tmp/framework-urls.txt << 'EOF'
|
|
111
|
+
http://localhost:3010
|
|
112
|
+
http://localhost:3011
|
|
113
|
+
http://localhost:3012
|
|
114
|
+
http://localhost:3013
|
|
115
|
+
http://localhost:3014
|
|
116
|
+
http://localhost:3015
|
|
117
|
+
http://localhost:3016
|
|
118
|
+
EOF
|
|
119
|
+
node --max-old-space-size=4096 build/index.js fingerprint \
|
|
120
|
+
-u /tmp/framework-urls.txt \
|
|
121
|
+
-f json \
|
|
122
|
+
-o /tmp/fingerprint-result \
|
|
123
|
+
-t 3 \
|
|
124
|
+
--no-sandbox
|
|
125
|
+
|
|
126
|
+
- name: Verify all frameworks detected correctly
|
|
127
|
+
run: node scripts/framework-detect-smoke-test.js /tmp/fingerprint-result.json
|
|
128
|
+
|
|
129
|
+
- name: Upload fingerprint result on failure
|
|
130
|
+
if: failure()
|
|
131
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
132
|
+
with:
|
|
133
|
+
name: fingerprint-result
|
|
134
|
+
path: /tmp/fingerprint-result.json
|
|
135
|
+
if-no-files-found: ignore
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: Plumber
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push: {}
|
|
5
|
+
pull_request: null
|
|
6
|
+
workflow_dispatch: null
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
security-events: write
|
|
11
|
+
id-token: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
plumber:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
18
|
+
- uses: getplumber/plumber@ef9864df81f444647d95889d98695434f6fa9732 # v0.4.12, 2026-07-20
|
|
19
|
+
with:
|
|
20
|
+
score-push: true
|
|
@@ -18,6 +18,8 @@ jobs:
|
|
|
18
18
|
update-homebrew-tap:
|
|
19
19
|
runs-on: ubuntu-latest
|
|
20
20
|
environment: homebrew-publish
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
21
23
|
steps:
|
|
22
24
|
- name: Fetch published tarball and compute SHA256
|
|
23
25
|
id: sha256
|
|
@@ -93,7 +95,7 @@ jobs:
|
|
|
93
95
|
# Dockerfile.w-rules builds from this context and would otherwise bake
|
|
94
96
|
# the writable GHCR credential into an image layer.
|
|
95
97
|
persist-credentials: false
|
|
96
|
-
- uses: docker/login-action@v3
|
|
98
|
+
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
|
|
97
99
|
with:
|
|
98
100
|
registry: ghcr.io
|
|
99
101
|
username: ${{ github.actor }}
|
|
@@ -203,7 +205,7 @@ jobs:
|
|
|
203
205
|
with:
|
|
204
206
|
node-version: "22"
|
|
205
207
|
|
|
206
|
-
- uses: docker/login-action@v3
|
|
208
|
+
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
|
|
207
209
|
with:
|
|
208
210
|
registry: ghcr.io
|
|
209
211
|
username: ${{ github.actor }}
|
|
@@ -271,7 +273,7 @@ jobs:
|
|
|
271
273
|
with:
|
|
272
274
|
node-version: "22"
|
|
273
275
|
|
|
274
|
-
- uses: docker/login-action@v3
|
|
276
|
+
- uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
|
|
275
277
|
with:
|
|
276
278
|
registry: ghcr.io
|
|
277
279
|
username: ${{ github.actor }}
|
|
@@ -7,6 +7,9 @@ on:
|
|
|
7
7
|
release:
|
|
8
8
|
types: [created]
|
|
9
9
|
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
10
13
|
jobs:
|
|
11
14
|
version_check:
|
|
12
15
|
runs-on: ubuntu-latest
|
|
@@ -59,9 +62,33 @@ jobs:
|
|
|
59
62
|
- run: npm run build
|
|
60
63
|
- run: npm run test
|
|
61
64
|
|
|
65
|
+
depx-audit:
|
|
66
|
+
needs: build
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
steps:
|
|
69
|
+
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
70
|
+
- name: Download and verify depx (SHA256-pinned)
|
|
71
|
+
run: |
|
|
72
|
+
set -euo pipefail
|
|
73
|
+
VERSION="0.1.1"
|
|
74
|
+
EXPECTED_SHA256="9f00c8133369eb75741a1ed52eb0d4102f965b1da413b09f190332981264338f"
|
|
75
|
+
URL="https://github.com/projectdiscovery/depx/releases/download/v${VERSION}/depx_${VERSION}_linux_amd64.zip"
|
|
76
|
+
curl -sSL -o depx.zip "$URL"
|
|
77
|
+
ACTUAL_SHA256=$(sha256sum depx.zip | awk '{print $1}')
|
|
78
|
+
if [[ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]]; then
|
|
79
|
+
echo "depx binary SHA256 mismatch: expected $EXPECTED_SHA256, got $ACTUAL_SHA256"
|
|
80
|
+
exit 1
|
|
81
|
+
fi
|
|
82
|
+
unzip -q depx.zip -d depx-bin
|
|
83
|
+
chmod +x depx-bin/depx
|
|
84
|
+
echo "$PWD/depx-bin" >> "$GITHUB_PATH"
|
|
85
|
+
- name: Run depx audit against package-lock.json
|
|
86
|
+
run: depx audit package-lock.json --require-clean
|
|
62
87
|
|
|
63
88
|
publish-npm:
|
|
64
|
-
needs:
|
|
89
|
+
needs:
|
|
90
|
+
- build
|
|
91
|
+
- depx-audit
|
|
65
92
|
runs-on: ubuntu-latest
|
|
66
93
|
permissions:
|
|
67
94
|
id-token: write
|
|
@@ -90,12 +117,14 @@ jobs:
|
|
|
90
117
|
- publish-npm
|
|
91
118
|
runs-on: ubuntu-latest
|
|
92
119
|
environment: commit-signing
|
|
120
|
+
permissions:
|
|
121
|
+
contents: write
|
|
93
122
|
steps:
|
|
94
123
|
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
95
124
|
with:
|
|
96
125
|
fetch-depth: 0
|
|
97
126
|
- name: Configure SSH commit signing
|
|
98
|
-
uses: shriyanss/verified-commit-action@v1
|
|
127
|
+
uses: shriyanss/verified-commit-action@1d7638e44a6bab6d3ac35653af7ef9f343074662 # v1.0.2
|
|
99
128
|
with:
|
|
100
129
|
ssh-private-key: ${{ secrets.JS_RECON_SIGNING_KEY }}
|
|
101
130
|
commit-name: "js-recon-bot"
|
|
@@ -5,6 +5,9 @@ on:
|
|
|
5
5
|
branches-ignore:
|
|
6
6
|
- main
|
|
7
7
|
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
8
11
|
jobs:
|
|
9
12
|
rules-smoke-test:
|
|
10
13
|
runs-on: ubuntu-latest
|
|
@@ -21,10 +24,15 @@ jobs:
|
|
|
21
24
|
path: js-recon-labs
|
|
22
25
|
|
|
23
26
|
- name: Checkout js-recon-rules
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
run: |
|
|
28
|
+
BRANCH="${{ github.ref_name }}"
|
|
29
|
+
if git ls-remote --exit-code --heads https://github.com/js-recon/js-recon-rules.git "$BRANCH" > /dev/null 2>&1; then
|
|
30
|
+
echo "Using js-recon-rules branch: $BRANCH"
|
|
31
|
+
else
|
|
32
|
+
echo "js-recon-rules has no '$BRANCH' branch, falling back to dev"
|
|
33
|
+
BRANCH="dev"
|
|
34
|
+
fi
|
|
35
|
+
git clone --depth 1 --branch "$BRANCH" https://github.com/js-recon/js-recon-rules.git js-recon-rules
|
|
28
36
|
|
|
29
37
|
- name: Set up Node.js
|
|
30
38
|
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
@@ -72,7 +80,7 @@ jobs:
|
|
|
72
80
|
|
|
73
81
|
- name: Upload analyze.json on failure
|
|
74
82
|
if: failure()
|
|
75
|
-
uses: actions/upload-artifact@v4
|
|
83
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
76
84
|
with:
|
|
77
85
|
name: analyze-json
|
|
78
86
|
path: output/**/analyze.json
|
package/.nvmrc
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
22
|