@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
|
@@ -0,0 +1,70 @@
|
|
|
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 fs from "fs";
|
|
11
|
+
import yaml from "yaml";
|
|
12
|
+
import { computeRequiredVersion } from "../../utility/ruleVersionMap.js";
|
|
13
|
+
import { printMsg, MSG } from "../../utility/printMsg.js";
|
|
14
|
+
/**
|
|
15
|
+
* For each rule file, computes the js_recon_version/js_recon_max_version actually
|
|
16
|
+
* required by the features it uses (via RULE_VERSION_MAP) and compares it against
|
|
17
|
+
* what's declared. Prints a mismatch for every non-compliant file (checks all files
|
|
18
|
+
* before returning, per the CLI's exit-code contract) and, when `apply` is true,
|
|
19
|
+
* rewrites only the mismatched version field(s) via a targeted line replacement on
|
|
20
|
+
* the raw file text — not a full yaml parse+stringify round-trip, which would
|
|
21
|
+
* reformat the entire file (indentation, line wrapping) and produce a much larger
|
|
22
|
+
* diff than the version-field change actually warrants.
|
|
23
|
+
*
|
|
24
|
+
* @returns true only if every rule file was already correct
|
|
25
|
+
*/
|
|
26
|
+
const checkOrApplyRuleVersions = (ruleFiles, apply) => __awaiter(void 0, void 0, void 0, function* () {
|
|
27
|
+
printMsg(MSG.Header, `[i] ${apply ? "Applying" : "Determining"} compatible rule versions...`);
|
|
28
|
+
let allCorrect = true;
|
|
29
|
+
for (const ruleFile of ruleFiles) {
|
|
30
|
+
const raw = fs.readFileSync(ruleFile, "utf8");
|
|
31
|
+
const doc = yaml.parseDocument(raw);
|
|
32
|
+
const rule = doc.toJS();
|
|
33
|
+
const required = computeRequiredVersion(rule);
|
|
34
|
+
const expectedMin = required.min !== "0.0.0" ? `>=${required.min}` : undefined;
|
|
35
|
+
const expectedMax = required.max ? `<${required.max}` : undefined;
|
|
36
|
+
const minMismatch = expectedMin !== undefined && rule.js_recon_version !== expectedMin;
|
|
37
|
+
const maxMismatch = expectedMax !== undefined && rule.js_recon_max_version !== expectedMax;
|
|
38
|
+
if (!minMismatch && !maxMismatch) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
allCorrect = false;
|
|
42
|
+
if (!apply) {
|
|
43
|
+
printMsg(MSG.Err, `[!] ${ruleFile}: incompatible declared version`);
|
|
44
|
+
if (minMismatch) {
|
|
45
|
+
printMsg(MSG.Err, ` - js_recon_version is "${rule.js_recon_version}", expected "${expectedMin}"`);
|
|
46
|
+
}
|
|
47
|
+
if (maxMismatch) {
|
|
48
|
+
printMsg(MSG.Err, ` - js_recon_max_version is "${rule.js_recon_max_version}", expected "${expectedMax}"`);
|
|
49
|
+
}
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
let updated = raw;
|
|
53
|
+
if (minMismatch && expectedMin !== undefined) {
|
|
54
|
+
updated = updated.replace(/^js_recon_version:.*$/m, `js_recon_version: "${expectedMin}"`);
|
|
55
|
+
}
|
|
56
|
+
if (maxMismatch && expectedMax !== undefined) {
|
|
57
|
+
if (/^js_recon_max_version:.*$/m.test(updated)) {
|
|
58
|
+
updated = updated.replace(/^js_recon_max_version:.*$/m, `js_recon_max_version: "${expectedMax}"`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
updated = updated.replace(/^js_recon_version:.*$/m, (line) => `${line}\njs_recon_max_version: "${expectedMax}"`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
fs.writeFileSync(ruleFile, updated);
|
|
65
|
+
printMsg(MSG.Run, `[✓] Updated ${ruleFile}`);
|
|
66
|
+
}
|
|
67
|
+
return allCorrect;
|
|
68
|
+
});
|
|
69
|
+
export default checkOrApplyRuleVersions;
|
|
70
|
+
//# sourceMappingURL=determineCompatibleVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"determineCompatibleVersion.js","sourceRoot":"","sources":["../../../src/analyze/helpers/determineCompatibleVersion.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,18 @@ const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _tra
|
|
|
6
6
|
* Traverses the given node and its children to find a match.
|
|
7
7
|
* @param node The AST node to traverse.
|
|
8
8
|
* @param toMatch The name of the property to match on the left side of the assignment.
|
|
9
|
-
* @param scope The scope of the traverse.
|
|
10
9
|
* @returns The assignment expression node if found, otherwise undefined.
|
|
11
10
|
*/
|
|
12
|
-
export const findMemberExpressionAssignment = (node, toMatch
|
|
11
|
+
export const findMemberExpressionAssignment = (node, toMatch) => {
|
|
13
12
|
let foundNode;
|
|
14
13
|
traverse(node, {
|
|
14
|
+
// The node passed in is often a function subtree rather than a Program/File,
|
|
15
|
+
// and isn't accompanied by a real parent Scope/parentPath. Without noScope,
|
|
16
|
+
// Babel's scope crawling can walk a broken parent-scope chain for some node
|
|
17
|
+
// shapes (e.g. an assignment nested inside an IfStatement) and throw
|
|
18
|
+
// "Couldn't find a Program" from deep inside Scope#getProgramParent. This
|
|
19
|
+
// visitor never reads path.scope, so skipping scope construction is safe.
|
|
20
|
+
noScope: true,
|
|
15
21
|
AssignmentExpression(path) {
|
|
16
22
|
var _a, _b, _c, _d;
|
|
17
23
|
const assignmentNode = path.node;
|
|
@@ -24,7 +30,7 @@ export const findMemberExpressionAssignment = (node, toMatch, scope) => {
|
|
|
24
30
|
path.stop();
|
|
25
31
|
}
|
|
26
32
|
},
|
|
27
|
-
}
|
|
33
|
+
});
|
|
28
34
|
return foundNode;
|
|
29
35
|
};
|
|
30
36
|
//# sourceMappingURL=findMemberExpressionAssignment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findMemberExpressionAssignment.js","sourceRoot":"","sources":["../../../../src/analyze/helpers/engineHelpers/findMemberExpressionAssignment.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,MAAM,QAAQ,GAAG,CAAC,MAAA,SAAS,CAAC,OAAO,mCAAI,SAAS,CAA6B,CAAC;AAE9E
|
|
1
|
+
{"version":3,"file":"findMemberExpressionAssignment.js","sourceRoot":"","sources":["../../../../src/analyze/helpers/engineHelpers/findMemberExpressionAssignment.ts"],"names":[],"mappings":";AACA,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,MAAM,QAAQ,GAAG,CAAC,MAAA,SAAS,CAAC,OAAO,mCAAI,SAAS,CAA6B,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,IAAU,EAAE,OAAe,EAAoB,EAAE;IAC5F,IAAI,SAA2B,CAAC;IAEhC,QAAQ,CAAC,IAAI,EAAE;QACX,6EAA6E;QAC7E,4EAA4E;QAC5E,4EAA4E;QAC5E,qEAAqE;QACrE,0EAA0E;QAC1E,0EAA0E;QAC1E,OAAO,EAAE,IAAI;QACb,oBAAoB,CAAC,IAAI;;YACrB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC;YAEjC,IACI,CAAA,MAAA,cAAc,CAAC,IAAI,0CAAE,IAAI,MAAK,kBAAkB;gBAChD,CAAA,MAAA,cAAc,CAAC,KAAK,0CAAE,IAAI,MAAK,kBAAkB;gBACjD,CAAA,MAAC,cAAc,CAAC,IAAY,CAAC,QAAQ,0CAAE,IAAI,MAAK,YAAY;gBAC5D,CAAA,MAAC,cAAc,CAAC,IAAY,CAAC,QAAQ,0CAAE,IAAI,MAAK,OAAO,EACzD,CAAC;gBACC,SAAS,GAAG,cAAc,CAAC;gBAC3B,+CAA+C;gBAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,CAAC;QACL,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC"}
|
|
@@ -7,11 +7,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import chalk from "chalk";
|
|
11
10
|
import fs from "fs";
|
|
12
11
|
import path from "path";
|
|
13
12
|
import extract from "extract-zip";
|
|
14
13
|
import { withActiveProxyDispatcher } from "../../utility/makeReq.js";
|
|
14
|
+
import { printMsg, MSG } from "../../utility/printMsg.js";
|
|
15
15
|
const RULES_RELEASE_URL = "https://api.github.com/repos/js-recon/js-recon-rules/releases/latest";
|
|
16
16
|
const fetchLatestRulesRelease = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
17
17
|
const response = yield fetch(RULES_RELEASE_URL, options);
|
|
@@ -44,7 +44,7 @@ const fetchLatestRulesRelease = (options) => __awaiter(void 0, void 0, void 0, f
|
|
|
44
44
|
* @returns Promise that resolves when rules are downloaded and extracted
|
|
45
45
|
*/
|
|
46
46
|
const downloadRules = (homeDir) => __awaiter(void 0, void 0, void 0, function* () {
|
|
47
|
-
|
|
47
|
+
printMsg(MSG.Header, "[i] Rules not found. Downloading from GitHub...");
|
|
48
48
|
const buffer = yield withActiveProxyDispatcher((options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
49
|
const release = yield fetchLatestRulesRelease(options);
|
|
50
50
|
const downloadResponse = yield fetch(release.zipballUrl, options);
|
|
@@ -55,7 +55,7 @@ const downloadRules = (homeDir) => __awaiter(void 0, void 0, void 0, function* (
|
|
|
55
55
|
}));
|
|
56
56
|
const zipPath = path.join(homeDir, "/.js-recon/rules.zip");
|
|
57
57
|
fs.writeFileSync(zipPath, buffer);
|
|
58
|
-
|
|
58
|
+
printMsg(MSG.Header, "[i] Unzipping rules...");
|
|
59
59
|
const extractPath = path.join(homeDir, "/.js-recon");
|
|
60
60
|
yield extract(zipPath, { dir: extractPath });
|
|
61
61
|
// Find the extracted directory
|
|
@@ -79,7 +79,7 @@ const downloadRules = (homeDir) => __awaiter(void 0, void 0, void 0, function* (
|
|
|
79
79
|
}
|
|
80
80
|
fs.renameSync(rulesSkillsDir, skillsDir);
|
|
81
81
|
}
|
|
82
|
-
|
|
82
|
+
printMsg(MSG.Run, "[✓] Rules initialized successfully.");
|
|
83
83
|
});
|
|
84
84
|
/**
|
|
85
85
|
* Determines whether the GitHub rules version check should be skipped.
|
|
@@ -108,7 +108,7 @@ export const shouldSkipRulesVersionCheck = (disableFlag, envValue, rulesDirExist
|
|
|
108
108
|
* @returns Promise that resolves when rules initialization is complete
|
|
109
109
|
*/
|
|
110
110
|
const initRules = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (disableVersionCheck = false) {
|
|
111
|
-
|
|
111
|
+
printMsg(MSG.Header, "[i] Initializing rules...");
|
|
112
112
|
// get the user's home dir
|
|
113
113
|
const homeDir = process.env.HOME;
|
|
114
114
|
// check if the .js-recon directory exists
|
|
@@ -117,7 +117,7 @@ const initRules = (...args_1) => __awaiter(void 0, [...args_1], void 0, function
|
|
|
117
117
|
}
|
|
118
118
|
const rulesDir = path.join(homeDir, "/.js-recon/rules");
|
|
119
119
|
if (shouldSkipRulesVersionCheck(disableVersionCheck, process.env.JS_RECON_DISABLE_RULES_VERSION_CHECK, fs.existsSync(rulesDir))) {
|
|
120
|
-
|
|
120
|
+
printMsg(MSG.Header, "[i] Rules version check disabled — using cached rules as-is.");
|
|
121
121
|
return;
|
|
122
122
|
}
|
|
123
123
|
// now, check if the rules directory exists
|
|
@@ -127,7 +127,7 @@ const initRules = (...args_1) => __awaiter(void 0, [...args_1], void 0, function
|
|
|
127
127
|
// now that this rule exists, check if the version.txt exists
|
|
128
128
|
const versionPath = path.join(homeDir, "/.js-recon/rules/version.txt");
|
|
129
129
|
if (!fs.existsSync(versionPath)) {
|
|
130
|
-
|
|
130
|
+
printMsg(MSG.Warn, "[!] Rules directory is corrupted. Downloading again...");
|
|
131
131
|
// remove the rules directory
|
|
132
132
|
fs.rmSync(path.join(homeDir, "/.js-recon/rules"), { recursive: true });
|
|
133
133
|
yield downloadRules(homeDir);
|
|
@@ -137,14 +137,14 @@ const initRules = (...args_1) => __awaiter(void 0, [...args_1], void 0, function
|
|
|
137
137
|
try {
|
|
138
138
|
const release = yield withActiveProxyDispatcher(fetchLatestRulesRelease);
|
|
139
139
|
if (`v${version}` !== release.tagName) {
|
|
140
|
-
|
|
140
|
+
printMsg(MSG.Warn, "[!] Rules are not up to date. Downloading latest version...");
|
|
141
141
|
// remove the rules directory
|
|
142
142
|
fs.rmSync(path.join(homeDir, "/.js-recon/rules"), { recursive: true });
|
|
143
143
|
yield downloadRules(homeDir);
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
catch (_a) {
|
|
147
|
-
|
|
147
|
+
printMsg(MSG.Err, "[!] An error occurred when fetching rules from GitHub");
|
|
148
148
|
}
|
|
149
149
|
});
|
|
150
150
|
export default initRules;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initRules.js","sourceRoot":"","sources":["../../../src/analyze/helpers/initRules.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"initRules.js","sourceRoot":"","sources":["../../../src/analyze/helpers/initRules.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from "fs";
|
|
2
|
-
import
|
|
2
|
+
import { printMsg, MSG } from "../../utility/printMsg.js";
|
|
3
3
|
/**
|
|
4
4
|
* Writes analysis findings to a JSON file.
|
|
5
5
|
*
|
|
@@ -7,8 +7,8 @@ import chalk from "chalk";
|
|
|
7
7
|
* @param {EngineOutput[]} findings - Array of analysis findings to write to the output file
|
|
8
8
|
*/
|
|
9
9
|
export const generateEngineOutput = (outputFile, findings) => {
|
|
10
|
-
|
|
10
|
+
printMsg(MSG.Header, "[i] Generating engine output...");
|
|
11
11
|
fs.writeFileSync(outputFile, JSON.stringify(findings, null, 2));
|
|
12
|
-
|
|
12
|
+
printMsg(MSG.Run, "[✓] Engine output generated successfully.");
|
|
13
13
|
};
|
|
14
14
|
//# sourceMappingURL=outputHelper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outputHelper.js","sourceRoot":"","sources":["../../../src/analyze/helpers/outputHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,
|
|
1
|
+
{"version":3,"file":"outputHelper.js","sourceRoot":"","sources":["../../../src/analyze/helpers/outputHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAc1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAAkB,EAAE,QAAwB,EAAE,EAAE;IACjF,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,iCAAiC,CAAC,CAAC;IACxD,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,2CAA2C,CAAC,CAAC;AACnE,CAAC,CAAC"}
|
|
@@ -53,6 +53,7 @@ export const ruleSchema = z.object({
|
|
|
53
53
|
author: z.string(),
|
|
54
54
|
description: z.string(),
|
|
55
55
|
js_recon_version: z.string(),
|
|
56
|
+
js_recon_max_version: z.string().optional(),
|
|
56
57
|
tech: z.array(z.enum(["next", "vue", "react", "svelte", "angular", "all"])),
|
|
57
58
|
severity: z.enum(["info", "low", "medium", "high"]),
|
|
58
59
|
type: z.enum(["request", "ast", "cs-mast-s"]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/analyze/helpers/schemas.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/analyze/helpers/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,11 +7,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import chalk from "chalk";
|
|
11
10
|
import fs from "fs";
|
|
12
11
|
import yaml from "yaml";
|
|
13
12
|
import { ruleSchema } from "./schemas.js";
|
|
14
13
|
import CONFIG from "../../globalConfig.js";
|
|
14
|
+
import { printMsg, MSG } from "../../utility/printMsg.js";
|
|
15
15
|
export const parseVersion = (version) => {
|
|
16
16
|
const clean = version.split("-")[0];
|
|
17
17
|
const parts = clean.split(".").map(Number);
|
|
@@ -59,7 +59,7 @@ export const isVersionCompatible = (requirement, currentVersion) => {
|
|
|
59
59
|
* @returns Promise that resolves to an object with allValid (schema validity) and compatibleRuleFiles (version-compatible files)
|
|
60
60
|
*/
|
|
61
61
|
const validateRules = (ruleFiles) => __awaiter(void 0, void 0, void 0, function* () {
|
|
62
|
-
|
|
62
|
+
printMsg(MSG.Header, "[i] Validating rules...");
|
|
63
63
|
let allValid = true;
|
|
64
64
|
const compatibleRuleFiles = [];
|
|
65
65
|
for (const ruleFile of ruleFiles) {
|
|
@@ -68,17 +68,21 @@ const validateRules = (ruleFiles) => __awaiter(void 0, void 0, void 0, function*
|
|
|
68
68
|
const rule = yaml.parse(ruleData);
|
|
69
69
|
ruleSchema.parse(rule);
|
|
70
70
|
if (!isVersionCompatible(rule.js_recon_version, CONFIG.version)) {
|
|
71
|
-
|
|
71
|
+
printMsg(MSG.Warn, `[!] Skipping ${ruleFile}: requires js-recon ${rule.js_recon_version} (current: ${CONFIG.version})`);
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (rule.js_recon_max_version && !isVersionCompatible(rule.js_recon_max_version, CONFIG.version)) {
|
|
75
|
+
printMsg(MSG.Warn, `[!] Skipping ${ruleFile}: requires js-recon ${rule.js_recon_max_version} (current: ${CONFIG.version})`);
|
|
72
76
|
continue;
|
|
73
77
|
}
|
|
74
78
|
compatibleRuleFiles.push(ruleFile);
|
|
75
79
|
}
|
|
76
80
|
catch (error) {
|
|
77
81
|
allValid = false;
|
|
78
|
-
|
|
82
|
+
printMsg(MSG.Err, `[!] Invalid rule in ${ruleFile}:`);
|
|
79
83
|
if (error.errors) {
|
|
80
84
|
for (const err of error.errors) {
|
|
81
|
-
|
|
85
|
+
printMsg(MSG.Err, ` - ${err.path.join(".")} - ${err.message}`);
|
|
82
86
|
}
|
|
83
87
|
}
|
|
84
88
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/analyze/helpers/validate.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/analyze/helpers/validate.ts"],"names":[],"mappings":"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"}
|
package/build/analyze/index.js
CHANGED
|
@@ -7,14 +7,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import chalk from "chalk";
|
|
11
10
|
import fs from "fs";
|
|
12
11
|
import path from "path";
|
|
13
12
|
import validateRules from "./helpers/validate.js";
|
|
13
|
+
import checkOrApplyRuleVersions from "./helpers/determineCompatibleVersion.js";
|
|
14
14
|
import engine from "./engine/index.js";
|
|
15
15
|
import yaml from "yaml";
|
|
16
16
|
import initRules from "./helpers/initRules.js";
|
|
17
17
|
import { generateEngineOutput } from "./helpers/outputHelper.js";
|
|
18
|
+
import { printMsg, MSG } from "../utility/printMsg.js";
|
|
18
19
|
const availableTechs = {
|
|
19
20
|
next: "Next.js",
|
|
20
21
|
vue: "Vue.js",
|
|
@@ -62,10 +63,12 @@ const getRuleFilesRecursive = (dir) => {
|
|
|
62
63
|
* @param validate - Whether to only validate rules without running analysis
|
|
63
64
|
* @param outputFile - Output file name for analysis results
|
|
64
65
|
* @param disableRulesVersionCheck - Skip the GitHub rules version check and use cached rules as-is
|
|
66
|
+
* @param determineCompatibleVersion - Whether to report the compatible js_recon_version/js_recon_max_version for each rule
|
|
67
|
+
* @param applyCompatibleVersions - Whether to rewrite rule files with the compatible versions
|
|
65
68
|
* @returns Promise that resolves when analysis is complete
|
|
66
69
|
*/
|
|
67
|
-
const analyze = (rulesPath_1, mappedJson_1, tech_1, list_1, openapi_1, validate_1, outputFile_1, ...args_1) => __awaiter(void 0, [rulesPath_1, mappedJson_1, tech_1, list_1, openapi_1, validate_1, outputFile_1, ...args_1], void 0, function* (rulesPath, mappedJson, tech, list, openapi, validate, outputFile, disableRulesVersionCheck = false) {
|
|
68
|
-
|
|
70
|
+
const analyze = (rulesPath_1, mappedJson_1, tech_1, list_1, openapi_1, validate_1, outputFile_1, ...args_1) => __awaiter(void 0, [rulesPath_1, mappedJson_1, tech_1, list_1, openapi_1, validate_1, outputFile_1, ...args_1], void 0, function* (rulesPath, mappedJson, tech, list, openapi, validate, outputFile, disableRulesVersionCheck = false, determineCompatibleVersion = false, applyCompatibleVersions = false) {
|
|
71
|
+
printMsg(MSG.Header, `[i] Loading analyze module...`);
|
|
69
72
|
yield initRules(disableRulesVersionCheck);
|
|
70
73
|
// check if `-r` flag is there. If not, default to `~/.js-recon/rules`
|
|
71
74
|
if (!rulesPath || rulesPath === "") {
|
|
@@ -73,7 +76,7 @@ const analyze = (rulesPath_1, mappedJson_1, tech_1, list_1, openapi_1, validate_
|
|
|
73
76
|
}
|
|
74
77
|
// check if `rules` exists
|
|
75
78
|
if (!fs.existsSync(rulesPath)) {
|
|
76
|
-
|
|
79
|
+
printMsg(MSG.Err, `[!] Rules ${rulesPath} does not exist`);
|
|
77
80
|
return;
|
|
78
81
|
}
|
|
79
82
|
// now that the rule thing exist, check if it is a direcotory or a file
|
|
@@ -87,39 +90,46 @@ const analyze = (rulesPath_1, mappedJson_1, tech_1, list_1, openapi_1, validate_
|
|
|
87
90
|
// now, validate all those files
|
|
88
91
|
const { allValid: allValidated, compatibleRuleFiles } = yield validateRules(ruleFiles);
|
|
89
92
|
if (!allValidated) {
|
|
90
|
-
|
|
93
|
+
printMsg(MSG.Err, "[!] Some rules are invalid");
|
|
91
94
|
process.exit(20);
|
|
92
95
|
}
|
|
96
|
+
if (determineCompatibleVersion || applyCompatibleVersions) {
|
|
97
|
+
const allCorrect = yield checkOrApplyRuleVersions(ruleFiles, applyCompatibleVersions);
|
|
98
|
+
if (!allCorrect && !applyCompatibleVersions) {
|
|
99
|
+
process.exit(20);
|
|
100
|
+
}
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
93
103
|
if (validate) {
|
|
94
|
-
|
|
104
|
+
printMsg(MSG.Run, "[✓] All rules are valid");
|
|
95
105
|
return;
|
|
96
106
|
}
|
|
97
107
|
// check if the list flag is passed. If so, list the techs and return
|
|
98
108
|
if (list) {
|
|
99
|
-
|
|
109
|
+
printMsg(MSG.Run, "[i] List of available technologies");
|
|
100
110
|
for (const [key, value] of Object.entries(availableTechs)) {
|
|
101
|
-
|
|
111
|
+
printMsg(MSG.Run, `- ${key}: ${value}`);
|
|
102
112
|
}
|
|
103
113
|
return;
|
|
104
114
|
}
|
|
105
115
|
// check if a valid tech is passed
|
|
106
116
|
if (!availableTechs[tech]) {
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
printMsg(MSG.Err, `[!] Invalid technology ${tech}.`);
|
|
118
|
+
printMsg(MSG.Warn, "[i] Run with -l/--list to see available technologies");
|
|
109
119
|
return;
|
|
110
120
|
}
|
|
111
121
|
// check if either mappedJson or either openapi is passed
|
|
112
122
|
if (!mappedJson && !openapi) {
|
|
113
|
-
|
|
123
|
+
printMsg(MSG.Err, "[!] Either mappedJson or openapi must be passed");
|
|
114
124
|
return;
|
|
115
125
|
}
|
|
116
126
|
// check if the mappedJson and openapi exists if they are not undefined
|
|
117
127
|
if (mappedJson && !fs.existsSync(mappedJson)) {
|
|
118
|
-
|
|
128
|
+
printMsg(MSG.Err, `[!] Mapped JSON ${mappedJson} does not exist`);
|
|
119
129
|
return;
|
|
120
130
|
}
|
|
121
131
|
if (openapi && !fs.existsSync(openapi)) {
|
|
122
|
-
|
|
132
|
+
printMsg(MSG.Err, `[!] OpenAPI spec ${openapi} does not exist`);
|
|
123
133
|
return;
|
|
124
134
|
}
|
|
125
135
|
// load the mapped json and openapi in memory
|
|
@@ -127,14 +137,14 @@ const analyze = (rulesPath_1, mappedJson_1, tech_1, list_1, openapi_1, validate_
|
|
|
127
137
|
let openapiData;
|
|
128
138
|
if (mappedJson) {
|
|
129
139
|
mappedJsonData = JSON.parse(fs.readFileSync(mappedJson, "utf8"));
|
|
130
|
-
|
|
140
|
+
printMsg(MSG.Run, `[✓] Mapped JSON loaded successfully`);
|
|
131
141
|
}
|
|
132
142
|
if (openapi) {
|
|
133
143
|
openapiData = JSON.parse(fs.readFileSync(openapi, "utf8"));
|
|
134
|
-
|
|
144
|
+
printMsg(MSG.Run, `[✓] OpenAPI spec loaded successfully`);
|
|
135
145
|
}
|
|
136
146
|
// iterate over the ruleFiles
|
|
137
|
-
|
|
147
|
+
const ruleFindings = [];
|
|
138
148
|
for (const ruleFile of compatibleRuleFiles) {
|
|
139
149
|
// load the rule
|
|
140
150
|
const rule = yaml.parse(fs.readFileSync(ruleFile, "utf8"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyze/index.ts"],"names":[],"mappings":"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"}
|