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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. package/.claude-sync/sync.sh +1 -1
  2. package/.github/workflows/build-and-prettify.yaml +55 -25
  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 +15 -7
  10. package/.nvmrc +1 -0
  11. package/.plumber.yaml +151 -0
  12. package/CHANGELOG.md +54 -0
  13. package/CONTRIBUTING.md +32 -0
  14. package/Dockerfile +1 -0
  15. package/README.md +55 -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 +42 -24
  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 +245 -339
  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 +494 -0
  46. package/build/config/applicationConfig.js.map +1 -0
  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 +11 -21
  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 +16 -555
  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 +51 -40
  106. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  107. package/build/lazyLoad/downloadQueue.js +154 -50
  108. package/build/lazyLoad/downloadQueue.js.map +1 -1
  109. package/build/lazyLoad/downloadResponse.js +113 -0
  110. package/build/lazyLoad/downloadResponse.js.map +1 -0
  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 +35 -0
  130. package/build/lazyLoad/globals.js.map +1 -1
  131. package/build/lazyLoad/index.js +311 -175
  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 +39 -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 +21 -20
  142. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  143. package/build/lazyLoad/next_js/next_SubsequentRequests.js +100 -99
  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/outputPath.js +92 -0
  170. package/build/lazyLoad/outputPath.js.map +1 -0
  171. package/build/lazyLoad/react/react_followImports.js +15 -5
  172. package/build/lazyLoad/react/react_followImports.js.map +1 -1
  173. package/build/lazyLoad/react/react_getScriptTags.js +11 -6
  174. package/build/lazyLoad/react/react_getScriptTags.js.map +1 -1
  175. package/build/lazyLoad/react/react_sourcemapUrls.js +3 -2
  176. package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -1
  177. package/build/lazyLoad/react/react_webpackChunkPaths.js +12 -203
  178. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
  179. package/build/lazyLoad/researchUtils.js +15 -0
  180. package/build/lazyLoad/researchUtils.js.map +1 -0
  181. package/build/lazyLoad/shared/webpackChunkParsers.js +218 -0
  182. package/build/lazyLoad/shared/webpackChunkParsers.js.map +1 -0
  183. package/build/lazyLoad/stagnation/stagnationMonitor.js +63 -0
  184. package/build/lazyLoad/stagnation/stagnationMonitor.js.map +1 -0
  185. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js +1 -0
  186. package/build/lazyLoad/svelte/svelte_discoverPagesFromJs.js.map +1 -1
  187. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +5 -5
  188. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -1
  189. package/build/lazyLoad/svelte/svelte_getVersionJson.js +2 -2
  190. package/build/lazyLoad/svelte/svelte_getVersionJson.js.map +1 -1
  191. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js +6 -6
  192. package/build/lazyLoad/svelte/svelte_recursivePageCrawl.js.map +1 -1
  193. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +2 -2
  194. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
  195. package/build/lazyLoad/techDetect/checkAngularJS.js +1 -1
  196. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
  197. package/build/lazyLoad/techDetect/checkNuxtJS.js +3 -3
  198. package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -1
  199. package/build/lazyLoad/techDetect/checkSvelte.js +0 -1
  200. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -1
  201. package/build/lazyLoad/techDetect/checkVueJS.js +6 -6
  202. package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -1
  203. package/build/lazyLoad/techDetect/index.js +106 -60
  204. package/build/lazyLoad/techDetect/index.js.map +1 -1
  205. package/build/lazyLoad/vue/vue_RuntimeJs.js +20 -15
  206. package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
  207. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +10 -5
  208. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
  209. package/build/lazyLoad/vue/vue_discoverJsFiles.js +20 -17
  210. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
  211. package/build/lazyLoad/vue/vue_getClientSidePaths.js +70 -46
  212. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
  213. package/build/lazyLoad/vue/vue_jsImports.js +3 -2
  214. package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
  215. package/build/lazyLoad/vue/vue_pageSrc.js +3 -2
  216. package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -1
  217. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +6 -5
  218. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
  219. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +10 -21
  220. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -1
  221. package/build/lazyLoad/vue/vue_severalJsFilesHome.js +5 -4
  222. package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
  223. package/build/lazyLoad/vue/vue_stringJsFiles.js +28 -25
  224. package/build/lazyLoad/vue/vue_stringJsFiles.js.map +1 -1
  225. package/build/lazyLoad/vue/vue_viteMapDeps.js +8 -2
  226. package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
  227. package/build/load/index.js +8 -7
  228. package/build/load/index.js.map +1 -1
  229. package/build/map/angular_js/getAngularConnections.js +6 -6
  230. package/build/map/angular_js/getAngularConnections.js.map +1 -1
  231. package/build/map/graphql/resolveGraphql.js +6 -6
  232. package/build/map/graphql/resolveGraphql.js.map +1 -1
  233. package/build/map/index.js +17 -17
  234. package/build/map/index.js.map +1 -1
  235. package/build/map/interactive-mode/commandHandler.js +278 -0
  236. package/build/map/interactive-mode/commandHandler.js.map +1 -0
  237. package/build/map/interactive-mode/commandHelpers.js +189 -0
  238. package/build/map/interactive-mode/commandHelpers.js.map +1 -0
  239. package/build/map/interactive-mode/esqueryGen.js.map +1 -0
  240. package/build/map/interactive-mode/helpMenu.js +11 -0
  241. package/build/map/interactive-mode/helpMenu.js.map +1 -0
  242. package/build/map/interactive-mode/inputPatch.js.map +1 -0
  243. package/build/map/interactive-mode/interactive.js +71 -0
  244. package/build/map/interactive-mode/interactive.js.map +1 -0
  245. package/build/map/interactive-mode/keybindings.js.map +1 -0
  246. package/build/map/interactive-mode/printer.js.map +1 -0
  247. package/build/map/interactive-mode/ui.js.map +1 -0
  248. package/build/map/next_js/getAxiosInstances.js +5 -5
  249. package/build/map/next_js/getAxiosInstances.js.map +1 -1
  250. package/build/map/next_js/getExports.js +4 -4
  251. package/build/map/next_js/getExports.js.map +1 -1
  252. package/build/map/next_js/getFetchInstances.js +10 -10
  253. package/build/map/next_js/getFetchInstances.js.map +1 -1
  254. package/build/map/next_js/getTurbopackConnections.js +8 -8
  255. package/build/map/next_js/getTurbopackConnections.js.map +1 -1
  256. package/build/map/next_js/getWebpackConnections.js +27 -16
  257. package/build/map/next_js/getWebpackConnections.js.map +1 -1
  258. package/build/map/next_js/interactive.js +3 -65
  259. package/build/map/next_js/interactive.js.map +1 -1
  260. package/build/map/next_js/interactive_helpers/commandHandler.js +38 -290
  261. package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -1
  262. package/build/map/next_js/interactive_helpers/commandHelpers.js +0 -184
  263. package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -1
  264. package/build/map/next_js/interactive_helpers/helpMenu.js +2 -10
  265. package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -1
  266. package/build/map/next_js/resolveAxios.js +6 -6
  267. package/build/map/next_js/resolveAxios.js.map +1 -1
  268. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js +4 -4
  269. package/build/map/next_js/resolveAxiosHelpers/findAxiosClients.js.map +1 -1
  270. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -2
  271. package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
  272. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +5 -5
  273. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
  274. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +10 -10
  275. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
  276. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +13 -9
  277. package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
  278. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js +12 -8
  279. package/build/map/next_js/resolveAxiosHelpers/processAxiosCall.js.map +1 -1
  280. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js +12 -8
  281. package/build/map/next_js/resolveAxiosHelpers/processDirectAxiosCall.js.map +1 -1
  282. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +11 -11
  283. package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
  284. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +16 -16
  285. package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
  286. package/build/map/next_js/resolveFetch.js +23 -23
  287. package/build/map/next_js/resolveFetch.js.map +1 -1
  288. package/build/map/next_js/resolveNewRequest.js +10 -10
  289. package/build/map/next_js/resolveNewRequest.js.map +1 -1
  290. package/build/map/next_js/resolveServerActions.js +4 -4
  291. package/build/map/next_js/resolveServerActions.js.map +1 -1
  292. package/build/map/next_js/utils.js +8 -2
  293. package/build/map/next_js/utils.js.map +1 -1
  294. package/build/map/react_js/getReactConnections.js +21 -14
  295. package/build/map/react_js/getReactConnections.js.map +1 -1
  296. package/build/map/svelte_js/interactive.js +3 -54
  297. package/build/map/svelte_js/interactive.js.map +1 -1
  298. package/build/map/vue_js/getViteConnections.js +23 -16
  299. package/build/map/vue_js/getViteConnections.js.map +1 -1
  300. package/build/map/vue_js/interactive.js +3 -63
  301. package/build/map/vue_js/interactive.js.map +1 -1
  302. package/build/map/vue_js/interactive_helpers/commandHandler.js +34 -283
  303. package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -1
  304. package/build/map/vue_js/interactive_helpers/helpMenu.js +2 -10
  305. package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -1
  306. package/build/map/vue_js/taint_utils.js +1 -1
  307. package/build/map/vue_js/taint_utils.js.map +1 -1
  308. package/build/map/vue_js/vue_resolveFetch.js +12 -12
  309. package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
  310. package/build/map/vue_js/vue_resolveHttpClient.js +18 -18
  311. package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
  312. package/build/map/vue_js/vue_resolveXhr.js +11 -11
  313. package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
  314. package/build/mcp/chatOneShot.js +7 -7
  315. package/build/mcp/chatOneShot.js.map +1 -1
  316. package/build/mcp/claudeCodeCreds.js +5 -5
  317. package/build/mcp/claudeCodeCreds.js.map +1 -1
  318. package/build/mcp/cli.js +36 -35
  319. package/build/mcp/cli.js.map +1 -1
  320. package/build/mcp/config.js +4 -4
  321. package/build/mcp/config.js.map +1 -1
  322. package/build/mcp/index.js +7 -7
  323. package/build/mcp/index.js.map +1 -1
  324. package/build/mcp/mcpServer.js +3 -2
  325. package/build/mcp/mcpServer.js.map +1 -1
  326. package/build/mcp/skills.js +1 -0
  327. package/build/mcp/skills.js.map +1 -1
  328. package/build/mcp/tools.js +5 -4
  329. package/build/mcp/tools.js.map +1 -1
  330. package/build/proxy/checkFeasibility.js +8 -4
  331. package/build/proxy/checkFeasibility.js.map +1 -1
  332. package/build/proxy/checkFireWallBlocking.js +23 -13
  333. package/build/proxy/checkFireWallBlocking.js.map +1 -1
  334. package/build/proxy/detectBlockedResponse.js +205 -0
  335. package/build/proxy/detectBlockedResponse.js.map +1 -0
  336. package/build/proxy/genReq.js +434 -127
  337. package/build/proxy/genReq.js.map +1 -1
  338. package/build/proxy/index.js +3 -3
  339. package/build/proxy/index.js.map +1 -1
  340. package/build/proxy/oxylabsFallback.js +110 -0
  341. package/build/proxy/oxylabsFallback.js.map +1 -0
  342. package/build/proxy/proxyFeasibilityRequest.js +11 -9
  343. package/build/proxy/proxyFeasibilityRequest.js.map +1 -1
  344. package/build/refactor/index.js +83 -79
  345. package/build/refactor/index.js.map +1 -1
  346. package/build/refactor/next/index.js +69 -26
  347. package/build/refactor/next/index.js.map +1 -1
  348. package/build/refactor/next/transform.js +11 -4
  349. package/build/refactor/next/transform.js.map +1 -1
  350. package/build/refactor/next/validator.js +7 -7
  351. package/build/refactor/next/validator.js.map +1 -1
  352. package/build/refactor/react/index.js +13 -13
  353. package/build/refactor/react/index.js.map +1 -1
  354. package/build/refactor/react/validator.js +7 -7
  355. package/build/refactor/react/validator.js.map +1 -1
  356. package/build/refactor/react-vite/index.js +3 -3
  357. package/build/refactor/react-vite/index.js.map +1 -1
  358. package/build/refactor/remote/hf-client.js +1 -0
  359. package/build/refactor/remote/hf-client.js.map +1 -1
  360. package/build/refactor/remote/version-detect.js +12 -12
  361. package/build/refactor/remote/version-detect.js.map +1 -1
  362. package/build/refactor/vue/index.js +6 -6
  363. package/build/refactor/vue/index.js.map +1 -1
  364. package/build/refactor/vue/vite.js +6 -6
  365. package/build/refactor/vue/vite.js.map +1 -1
  366. package/build/report/index.js +30 -8
  367. package/build/report/index.js.map +1 -1
  368. package/build/report/swaggerJacker.js +63 -0
  369. package/build/report/swaggerJacker.js.map +1 -0
  370. package/build/report/utility/genHtml.js +7 -7
  371. package/build/report/utility/genHtml.js.map +1 -1
  372. package/build/report/utility/populateDb/populateAnalysisFindings.js +2 -2
  373. package/build/report/utility/populateDb/populateAnalysisFindings.js.map +1 -1
  374. package/build/report/utility/populateDb/populateEndpoints.js +3 -3
  375. package/build/report/utility/populateDb/populateEndpoints.js.map +1 -1
  376. package/build/report/utility/populateDb/populateMappedJson.js +2 -2
  377. package/build/report/utility/populateDb/populateMappedJson.js.map +1 -1
  378. package/build/report/utility/populateDb/populateMappedOpenapi.js +3 -3
  379. package/build/report/utility/populateDb/populateMappedOpenapi.js.map +1 -1
  380. package/build/run/bundler-detect.js +45 -9
  381. package/build/run/bundler-detect.js.map +1 -1
  382. package/build/run/cancellableStep.js +27 -0
  383. package/build/run/cancellableStep.js.map +1 -0
  384. package/build/run/dashboard/dashboardHtml.js +150 -0
  385. package/build/run/dashboard/dashboardHtml.js.map +1 -0
  386. package/build/run/dashboard/fsBrowser.js +43 -0
  387. package/build/run/dashboard/fsBrowser.js.map +1 -0
  388. package/build/run/dashboard/server.js +123 -0
  389. package/build/run/dashboard/server.js.map +1 -0
  390. package/build/run/dashboard/state.js +97 -0
  391. package/build/run/dashboard/state.js.map +1 -0
  392. package/build/run/index.js +239 -204
  393. package/build/run/index.js.map +1 -1
  394. package/build/run/interruptHandler.js +18 -0
  395. package/build/run/interruptHandler.js.map +1 -1
  396. package/build/run/outputDirectory.js +377 -0
  397. package/build/run/outputDirectory.js.map +1 -0
  398. package/build/sourcemaps/index.js +116 -29
  399. package/build/sourcemaps/index.js.map +1 -1
  400. package/build/strings/index.js +38 -28
  401. package/build/strings/index.js.map +1 -1
  402. package/build/strings/openapi.js +4 -4
  403. package/build/strings/openapi.js.map +1 -1
  404. package/build/strings/permutate.js +4 -4
  405. package/build/strings/permutate.js.map +1 -1
  406. package/build/strings/secrets.js +1 -0
  407. package/build/strings/secrets.js.map +1 -1
  408. package/build/strings/trufflehog.js +66 -19
  409. package/build/strings/trufflehog.js.map +1 -1
  410. package/build/strings/trufflehogConfig.js +36 -0
  411. package/build/strings/trufflehogConfig.js.map +1 -0
  412. package/build/strings/trufflehogDownload.js +115 -0
  413. package/build/strings/trufflehogDownload.js.map +1 -0
  414. package/build/utility/ai.js +33 -4
  415. package/build/utility/ai.js.map +1 -1
  416. package/build/utility/banner.js +4 -3
  417. package/build/utility/banner.js.map +1 -1
  418. package/build/utility/configureSandbox.js +2 -2
  419. package/build/utility/configureSandbox.js.map +1 -1
  420. package/build/utility/downloadProgress.js +99 -0
  421. package/build/utility/downloadProgress.js.map +1 -0
  422. package/build/utility/globals.js +19 -11
  423. package/build/utility/globals.js.map +1 -1
  424. package/build/utility/heap.js +2 -1
  425. package/build/utility/heap.js.map +1 -1
  426. package/build/utility/makeReq.js +490 -257
  427. package/build/utility/makeReq.js.map +1 -1
  428. package/build/utility/openapiGenerator.js +2 -2
  429. package/build/utility/openapiGenerator.js.map +1 -1
  430. package/build/utility/printMsg.js +53 -0
  431. package/build/utility/printMsg.js.map +1 -0
  432. package/build/utility/progressLog.js +68 -7
  433. package/build/utility/progressLog.js.map +1 -1
  434. package/build/utility/resolvePath.js +2 -1
  435. package/build/utility/resolvePath.js.map +1 -1
  436. package/build/utility/ruleVersionMap.js +73 -0
  437. package/build/utility/ruleVersionMap.js.map +1 -0
  438. package/build/utility/targetInputs.js +177 -0
  439. package/build/utility/targetInputs.js.map +1 -0
  440. package/build/utility/urlUtils.js +37 -1
  441. package/build/utility/urlUtils.js.map +1 -1
  442. package/config.dist.yaml +251 -0
  443. package/contributing/testing.md +106 -0
  444. package/eslint.config.js +24 -0
  445. package/package.json +22 -5
  446. package/scripts/exploit-smoke-test.js +82 -0
  447. package/scripts/framework-detect-smoke-test.js +64 -0
  448. package/scripts/postinstall-completion.mjs +40 -0
  449. package/scripts/smoke-test.js +12 -0
  450. package/build/lazyLoad/downloadLoadedJsUtil.js +0 -98
  451. package/build/lazyLoad/downloadLoadedJsUtil.js.map +0 -1
  452. package/build/map/next_js/interactive_helpers/esqueryGen.js.map +0 -1
  453. package/build/map/next_js/interactive_helpers/inputPatch.js.map +0 -1
  454. package/build/map/next_js/interactive_helpers/keybindings.js.map +0 -1
  455. package/build/map/next_js/interactive_helpers/printer.js.map +0 -1
  456. package/build/map/next_js/interactive_helpers/ui.js.map +0 -1
  457. /package/build/map/{next_js/interactive_helpers → interactive-mode}/esqueryGen.js +0 -0
  458. /package/build/map/{next_js/interactive_helpers → interactive-mode}/inputPatch.js +0 -0
  459. /package/build/map/{next_js/interactive_helpers → interactive-mode}/keybindings.js +0 -0
  460. /package/build/map/{next_js/interactive_helpers → interactive-mode}/printer.js +0 -0
  461. /package/build/map/{next_js/interactive_helpers → interactive-mode}/ui.js +0 -0
@@ -61,4 +61,4 @@ while IFS= read -r src; do
61
61
  ln -sf "$src" "$dest"
62
62
  done < <(find "$AGENTIC_REPO_PATH" \( -name "CLAUDE.md" -o -path "*/.claude/skills/*" -o -path "*/.claude/agents/*" \) -type f -not -path "*/.git/*")
63
63
 
64
- echo "[claude-sync] synced CLAUDE.md files for branch '$CURRENT_BRANCH'"
64
+ echo "[claude-sync] synced CLAUDE.md / skills / agents files for branch '$CURRENT_BRANCH'"
@@ -5,6 +5,9 @@ on:
5
5
  branches-ignore:
6
6
  - main
7
7
 
8
+ permissions:
9
+ contents: read
10
+
8
11
  jobs:
9
12
  version_check:
10
13
  if: |
@@ -56,6 +59,8 @@ jobs:
56
59
  runs-on: ubuntu-latest
57
60
  needs: audit
58
61
  environment: commit-signing
62
+ permissions:
63
+ contents: write
59
64
  steps:
60
65
  - name: Checkout
61
66
  uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -64,7 +69,7 @@ jobs:
64
69
  ref: ${{ github.ref_name }}
65
70
 
66
71
  - name: Configure SSH commit signing
67
- uses: shriyanss/verified-commit-action@v1
72
+ uses: shriyanss/verified-commit-action@1d7638e44a6bab6d3ac35653af7ef9f343074662 # v1.0.2
68
73
  with:
69
74
  ssh-private-key: ${{ secrets.JS_RECON_SIGNING_KEY }}
70
75
  commit-name: "js-recon-bot"
@@ -115,8 +120,29 @@ jobs:
115
120
  - name: Run unit tests
116
121
  run: npm test
117
122
 
123
+ lint:
124
+ needs: prettier
125
+ runs-on: ubuntu-latest
126
+ steps:
127
+ - name: Checkout
128
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
129
+ with:
130
+ ref: ${{ github.ref_name }}
131
+
132
+ - name: Set up Node.js
133
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
134
+ with:
135
+ node-version: "22"
136
+ cache: "npm"
137
+
138
+ - name: Install dependencies
139
+ run: npm ci
140
+
141
+ - name: Run ESLint
142
+ run: npm run lint
143
+
118
144
  build:
119
- needs: test
145
+ needs: [test, lint]
120
146
  runs-on: ubuntu-latest
121
147
  steps:
122
148
  - name: Checkout
@@ -165,13 +191,15 @@ jobs:
165
191
  path: js-recon-labs
166
192
 
167
193
  - name: Checkout js-recon-rules
168
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
169
- with:
170
- repository: js-recon/js-recon-rules
171
- path: js-recon-rules
172
- # Keep the checkout token out of js-recon-rules/.git/config — this
173
- # context is consumed by later build/run steps (incl. Dockerfile.w-rules).
174
- persist-credentials: false
194
+ run: |
195
+ BRANCH="${{ github.ref_name }}"
196
+ if git ls-remote --exit-code --heads https://github.com/js-recon/js-recon-rules.git "$BRANCH" > /dev/null 2>&1; then
197
+ echo "Using js-recon-rules branch: $BRANCH"
198
+ else
199
+ echo "js-recon-rules has no '$BRANCH' branch, falling back to dev"
200
+ BRANCH="dev"
201
+ fi
202
+ git clone --depth 1 --branch "$BRANCH" https://github.com/js-recon/js-recon-rules.git js-recon-rules
175
203
 
176
204
  - name: Set up Node.js
177
205
  uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
@@ -218,14 +246,14 @@ jobs:
218
246
  docker rm js-recon-run
219
247
 
220
248
  - name: Verify all rules fired
221
- run: node scripts/smoke-test.js
249
+ run: node scripts/smoke-test.js "$(find output -name analyze.json | head -n1)"
222
250
 
223
251
  - name: Upload analyze.json on failure
224
252
  if: failure()
225
- uses: actions/upload-artifact@v4
253
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
226
254
  with:
227
255
  name: analyze-json-docker
228
- path: output/localhost_3001/analyze.json
256
+ path: output/**/analyze.json
229
257
  if-no-files-found: ignore
230
258
 
231
259
  - name: Build the rules-bundled (-w-rules) image
@@ -252,14 +280,14 @@ jobs:
252
280
  }
253
281
 
254
282
  - name: Verify all rules fired (w-rules image)
255
- run: node scripts/smoke-test.js output-w-rules/localhost_3001/analyze.json
283
+ run: node scripts/smoke-test.js "$(find output-w-rules -name analyze.json | head -n1)"
256
284
 
257
285
  - name: Upload w-rules analyze.json on failure
258
286
  if: failure()
259
- uses: actions/upload-artifact@v4
287
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
260
288
  with:
261
289
  name: analyze-json-docker-w-rules
262
- path: output-w-rules/localhost_3001/analyze.json
290
+ path: output-w-rules/**/analyze.json
263
291
  if-no-files-found: ignore
264
292
 
265
293
  integration-test-macos:
@@ -279,13 +307,15 @@ jobs:
279
307
  path: js-recon-labs
280
308
 
281
309
  - name: Checkout js-recon-rules
282
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
283
- with:
284
- repository: js-recon/js-recon-rules
285
- path: js-recon-rules
286
- # Keep the checkout token out of js-recon-rules/.git/config — this
287
- # context is consumed by later build/run steps (incl. Dockerfile.w-rules).
288
- persist-credentials: false
310
+ run: |
311
+ BRANCH="${{ github.ref_name }}"
312
+ if git ls-remote --exit-code --heads https://github.com/js-recon/js-recon-rules.git "$BRANCH" > /dev/null 2>&1; then
313
+ echo "Using js-recon-rules branch: $BRANCH"
314
+ else
315
+ echo "js-recon-rules has no '$BRANCH' branch, falling back to dev"
316
+ BRANCH="dev"
317
+ fi
318
+ git clone --depth 1 --branch "$BRANCH" https://github.com/js-recon/js-recon-rules.git js-recon-rules
289
319
 
290
320
  - name: Set up Node.js
291
321
  uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
@@ -343,12 +373,12 @@ jobs:
343
373
  PUPPETEER_EXECUTABLE_PATH: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
344
374
 
345
375
  - name: Verify all rules fired
346
- run: node scripts/smoke-test.js
376
+ run: node scripts/smoke-test.js "$(find output -name analyze.json | head -n1)"
347
377
 
348
378
  - name: Upload analyze.json on failure
349
379
  if: failure()
350
- uses: actions/upload-artifact@v4
380
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
351
381
  with:
352
382
  name: analyze-json-macos
353
- path: output/localhost_3001/analyze.json
383
+ path: output/**/analyze.json
354
384
  if-no-files-found: ignore
@@ -0,0 +1,33 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - dev
7
+ - main
8
+ pull_request:
9
+ branches:
10
+ - dev
11
+ schedule:
12
+ - cron: "0 6 * * 1" # weekly, Monday 06:00 UTC
13
+
14
+ permissions:
15
+ contents: read
16
+ security-events: write
17
+
18
+ jobs:
19
+ analyze:
20
+ name: Analyze (javascript-typescript)
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
24
+
25
+ - name: Initialize CodeQL
26
+ uses: github/codeql-action/init@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
27
+ with:
28
+ languages: javascript-typescript
29
+
30
+ - name: Perform CodeQL Analysis
31
+ uses: github/codeql-action/analyze@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
32
+ with:
33
+ category: "/language:javascript-typescript"
@@ -0,0 +1,160 @@
1
+ name: Exploit Smoke Test
2
+
3
+ on:
4
+ push:
5
+ branches-ignore:
6
+ - main
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ exploit-smoke-test:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 40
15
+
16
+ steps:
17
+ - name: Checkout js-recon
18
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
19
+
20
+ - name: Checkout js-recon-labs
21
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
22
+ with:
23
+ repository: js-recon/js-recon-labs
24
+ path: js-recon-labs
25
+
26
+ - name: Set up Node.js
27
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
28
+ with:
29
+ node-version: "22"
30
+ cache: "npm"
31
+
32
+ - name: Install js-recon dependencies
33
+ run: npm ci
34
+
35
+ - name: Build js-recon
36
+ run: npm run build
37
+
38
+ # --- Next.js: CVE-2025-29927 (middleware bypass) ---
39
+ - name: Build cve-2025-29927 fixture
40
+ working-directory: js-recon-labs/next_js/cve-2025-29927
41
+ run: npm install && npm run build
42
+
43
+ - name: Start cve-2025-29927 fixture
44
+ working-directory: js-recon-labs/next_js/cve-2025-29927
45
+ run: npm start &
46
+
47
+ # --- Next.js: CVE-2026-64645 (rewrites SSRF) ---
48
+ - name: Build cve-2026-64645 fixture
49
+ working-directory: js-recon-labs/next_js/cve-2026-64645
50
+ run: npm install && npm run build
51
+
52
+ - name: Start cve-2026-64645 fixture
53
+ working-directory: js-recon-labs/next_js/cve-2026-64645
54
+ run: ./start.sh &
55
+
56
+ # --- Next.js: CVE-2025-55182 (React Flight RCE) ---
57
+ - name: Install cve-2025-55182 fixture dependencies
58
+ working-directory: js-recon-labs/next_js/cve-2025-55182
59
+ run: npm install
60
+
61
+ - name: Start cve-2025-55182 fixture
62
+ working-directory: js-recon-labs/next_js/cve-2025-55182
63
+ run: npm start &
64
+
65
+ # --- Vite: CVE-2025-30208 (fs.deny double-'?' bypass) ---
66
+ - name: Install cve-2025-30208 fixture dependencies
67
+ working-directory: js-recon-labs/vite/cve-2025-30208
68
+ run: npm install
69
+
70
+ - name: Start cve-2025-30208 fixture
71
+ working-directory: js-recon-labs/vite/cve-2025-30208
72
+ run: npm run dev &
73
+
74
+ # --- Vite: CVE-2026-39363 (WebSocket fetchModule bypass) ---
75
+ - name: Install cve-2026-39363 fixture dependencies
76
+ working-directory: js-recon-labs/vite/cve-2026-39363
77
+ run: npm install
78
+
79
+ - name: Start cve-2026-39363 fixture
80
+ working-directory: js-recon-labs/vite/cve-2026-39363
81
+ run: npm run dev &
82
+
83
+ # --- Nuxt: CVE-2026-71320 (Server Island RCE) ---
84
+ - name: Build cve-2026-71320 fixture
85
+ working-directory: js-recon-labs/nuxt/cve-2026-71320
86
+ run: npm install && npm run build
87
+
88
+ - name: Start cve-2026-71320 fixture
89
+ working-directory: js-recon-labs/nuxt/cve-2026-71320
90
+ run: npm start &
91
+
92
+ # --- Nuxt: CVE-2026-71315 (route-rule casing bypass) ---
93
+ - name: Build cve-2026-71315 fixture
94
+ working-directory: js-recon-labs/nuxt/cve-2026-71315
95
+ run: npm install && npm run build
96
+
97
+ - name: Start cve-2026-71315 fixture
98
+ working-directory: js-recon-labs/nuxt/cve-2026-71315
99
+ run: npm start &
100
+
101
+ # --- Angular: CVE-2026-68945 (HttpTransferCache collision) ---
102
+ - name: Build cve-2026-68945 fixture
103
+ working-directory: js-recon-labs/angular/cve-2026-68945
104
+ run: npm install && npm run build
105
+
106
+ - name: Start cve-2026-68945 fixture
107
+ working-directory: js-recon-labs/angular/cve-2026-68945
108
+ # CommonEngine's own allowedHosts safety net (unrelated to this CVE) rejects every
109
+ # request's Host header by default.
110
+ run: NG_ALLOWED_HOSTS=localhost npm start &
111
+
112
+ - name: Wait for all fixtures to be ready
113
+ run: |
114
+ # -f (fail on HTTP error status) is deliberately NOT used here: several fixtures 404 on
115
+ # a bare GET / (e.g. cve-2026-71315 has no pages/index.vue, only /login /Admin
116
+ # /testauth) or only accept POST with specific headers (cve-2025-55182). Any HTTP
117
+ # response — including a 404 — proves the process is up and listening, which is all
118
+ # this readiness check needs; the exploit module's own baseline/payload requests handle
119
+ # whatever status codes the real routes return.
120
+ for port in 3020 3021 3022 3023 3024 3025 3026 3027; do
121
+ echo "Waiting for app on port $port..."
122
+ timeout 90 bash -c "until curl -s -o /dev/null http://localhost:$port; do sleep 2; done"
123
+ done
124
+ echo "All fixtures ready."
125
+
126
+ - name: Run exploit module against every fixture
127
+ run: |
128
+ set -e
129
+ declare -A TARGETS=(
130
+ ["CVE-2025-29927"]="http://localhost:3020/admin"
131
+ ["CVE-2026-64645"]="http://localhost:3021/proxy"
132
+ ["CVE-2025-30208"]="http://localhost:3022"
133
+ ["CVE-2026-39363"]="http://localhost:3023"
134
+ ["CVE-2026-71320"]="http://localhost:3024"
135
+ ["CVE-2026-71315"]="http://localhost:3025"
136
+ ["CVE-2026-68945"]="http://localhost:3026"
137
+ ["CVE-2025-55182"]="http://localhost:3027"
138
+ )
139
+ mkdir -p /tmp/exploit-results
140
+ for cve in "${!TARGETS[@]}"; do
141
+ echo "Running exploit for $cve against ${TARGETS[$cve]}"
142
+ node build/index.js exploit \
143
+ -u "${TARGETS[$cve]}" \
144
+ --cve "$cve" \
145
+ --exec-cmd id \
146
+ -o "/tmp/exploit-results/$cve.json" \
147
+ --engine-output "/tmp/exploit-results/$cve-engine.json" \
148
+ --timeout 20000 || true
149
+ done
150
+
151
+ - name: Verify all CVEs reported vulnerable
152
+ run: node scripts/exploit-smoke-test.js /tmp/exploit-results
153
+
154
+ - name: Upload exploit results on failure
155
+ if: failure()
156
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
157
+ with:
158
+ name: exploit-results
159
+ path: /tmp/exploit-results/**
160
+ if-no-files-found: ignore
@@ -0,0 +1,135 @@
1
+ name: Framework Detection Smoke Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - dev
7
+ - main
8
+ pull_request:
9
+ branches:
10
+ - dev
11
+ - main
12
+ release:
13
+ types:
14
+ - published
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ framework-detection-smoke-test:
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 30
23
+
24
+ steps:
25
+ - name: Checkout js-recon
26
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
27
+
28
+ - name: Checkout js-recon-labs
29
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
30
+ with:
31
+ repository: js-recon/js-recon-labs
32
+ path: js-recon-labs
33
+
34
+ - name: Set up Node.js
35
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
36
+ with:
37
+ node-version: "22"
38
+
39
+ - name: Install js-recon dependencies
40
+ run: npm ci
41
+
42
+ - name: Build js-recon
43
+ run: npm run build
44
+
45
+ - name: Start next_js detection app (port 3010)
46
+ working-directory: js-recon-labs/detection/next_js
47
+ run: |
48
+ npm ci
49
+ npm run build
50
+ npm start &
51
+ echo "Waiting for app on port 3010..."
52
+ timeout 60 bash -c 'until curl -sf http://localhost:3010 > /dev/null; do sleep 2; done'
53
+
54
+ - name: Start vue detection app (port 3011)
55
+ working-directory: js-recon-labs/detection/vue
56
+ run: |
57
+ npm ci
58
+ npm run build
59
+ npm start &
60
+ echo "Waiting for app on port 3011..."
61
+ timeout 60 bash -c 'until curl -sf http://localhost:3011 > /dev/null; do sleep 2; done'
62
+
63
+ - name: Start nuxt detection app (port 3012)
64
+ working-directory: js-recon-labs/detection/nuxt
65
+ run: |
66
+ npm ci
67
+ npm run build
68
+ npm start &
69
+ echo "Waiting for app on port 3012..."
70
+ timeout 60 bash -c 'until curl -sf http://localhost:3012 > /dev/null; do sleep 2; done'
71
+
72
+ - name: Start svelte detection app (port 3013)
73
+ working-directory: js-recon-labs/detection/svelte
74
+ run: |
75
+ npm ci
76
+ npm run build
77
+ npm start &
78
+ echo "Waiting for app on port 3013..."
79
+ timeout 60 bash -c 'until curl -sf http://localhost:3013 > /dev/null; do sleep 2; done'
80
+
81
+ - name: Start angular detection app (port 3014)
82
+ working-directory: js-recon-labs/detection/angular
83
+ run: |
84
+ npm ci
85
+ npm run build
86
+ npm start &
87
+ echo "Waiting for app on port 3014..."
88
+ timeout 60 bash -c 'until curl -sf http://localhost:3014 > /dev/null; do sleep 2; done'
89
+
90
+ - name: Start react-vite detection app (port 3015)
91
+ working-directory: js-recon-labs/detection/react_vite
92
+ run: |
93
+ npm ci
94
+ npm run build
95
+ npm start &
96
+ echo "Waiting for app on port 3015..."
97
+ timeout 60 bash -c 'until curl -sf http://localhost:3015 > /dev/null; do sleep 2; done'
98
+
99
+ - name: Start react-webpack detection app (port 3016)
100
+ working-directory: js-recon-labs/detection/react_webpack
101
+ run: |
102
+ npm ci
103
+ npm run build
104
+ npm start &
105
+ echo "Waiting for app on port 3016..."
106
+ timeout 60 bash -c 'until curl -sf http://localhost:3016 > /dev/null; do sleep 2; done'
107
+
108
+ - name: Run js-recon fingerprint against all detection apps
109
+ run: |
110
+ cat > /tmp/framework-urls.txt << 'EOF'
111
+ http://localhost:3010
112
+ http://localhost:3011
113
+ http://localhost:3012
114
+ http://localhost:3013
115
+ http://localhost:3014
116
+ http://localhost:3015
117
+ http://localhost:3016
118
+ EOF
119
+ node --max-old-space-size=4096 build/index.js fingerprint \
120
+ -u /tmp/framework-urls.txt \
121
+ -f json \
122
+ -o /tmp/fingerprint-result \
123
+ -t 3 \
124
+ --no-sandbox
125
+
126
+ - name: Verify all frameworks detected correctly
127
+ run: node scripts/framework-detect-smoke-test.js /tmp/fingerprint-result.json
128
+
129
+ - name: Upload fingerprint result on failure
130
+ if: failure()
131
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
132
+ with:
133
+ name: fingerprint-result
134
+ path: /tmp/fingerprint-result.json
135
+ if-no-files-found: ignore
@@ -0,0 +1,20 @@
1
+ name: Plumber
2
+
3
+ on:
4
+ push: {}
5
+ pull_request: null
6
+ workflow_dispatch: null
7
+
8
+ permissions:
9
+ contents: read
10
+ security-events: write
11
+ id-token: write
12
+
13
+ jobs:
14
+ plumber:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
18
+ - uses: getplumber/plumber@ef9864df81f444647d95889d98695434f6fa9732 # v0.4.12, 2026-07-20
19
+ with:
20
+ score-push: true
@@ -18,6 +18,8 @@ jobs:
18
18
  update-homebrew-tap:
19
19
  runs-on: ubuntu-latest
20
20
  environment: homebrew-publish
21
+ permissions:
22
+ contents: read
21
23
  steps:
22
24
  - name: Fetch published tarball and compute SHA256
23
25
  id: sha256
@@ -93,7 +95,7 @@ jobs:
93
95
  # Dockerfile.w-rules builds from this context and would otherwise bake
94
96
  # the writable GHCR credential into an image layer.
95
97
  persist-credentials: false
96
- - uses: docker/login-action@v3
98
+ - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
97
99
  with:
98
100
  registry: ghcr.io
99
101
  username: ${{ github.actor }}
@@ -203,7 +205,7 @@ jobs:
203
205
  with:
204
206
  node-version: "22"
205
207
 
206
- - uses: docker/login-action@v3
208
+ - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
207
209
  with:
208
210
  registry: ghcr.io
209
211
  username: ${{ github.actor }}
@@ -271,7 +273,7 @@ jobs:
271
273
  with:
272
274
  node-version: "22"
273
275
 
274
- - uses: docker/login-action@v3
276
+ - uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
275
277
  with:
276
278
  registry: ghcr.io
277
279
  username: ${{ github.actor }}
@@ -7,6 +7,9 @@ on:
7
7
  release:
8
8
  types: [created]
9
9
 
10
+ permissions:
11
+ contents: read
12
+
10
13
  jobs:
11
14
  version_check:
12
15
  runs-on: ubuntu-latest
@@ -90,12 +93,14 @@ jobs:
90
93
  - publish-npm
91
94
  runs-on: ubuntu-latest
92
95
  environment: commit-signing
96
+ permissions:
97
+ contents: write
93
98
  steps:
94
99
  - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
95
100
  with:
96
101
  fetch-depth: 0
97
102
  - name: Configure SSH commit signing
98
- uses: shriyanss/verified-commit-action@v1
103
+ uses: shriyanss/verified-commit-action@1d7638e44a6bab6d3ac35653af7ef9f343074662 # v1.0.2
99
104
  with:
100
105
  ssh-private-key: ${{ secrets.JS_RECON_SIGNING_KEY }}
101
106
  commit-name: "js-recon-bot"
@@ -5,6 +5,9 @@ on:
5
5
  branches-ignore:
6
6
  - main
7
7
 
8
+ permissions:
9
+ contents: read
10
+
8
11
  jobs:
9
12
  rules-smoke-test:
10
13
  runs-on: ubuntu-latest
@@ -21,10 +24,15 @@ jobs:
21
24
  path: js-recon-labs
22
25
 
23
26
  - name: Checkout js-recon-rules
24
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
25
- with:
26
- repository: js-recon/js-recon-rules
27
- path: js-recon-rules
27
+ run: |
28
+ BRANCH="${{ github.ref_name }}"
29
+ if git ls-remote --exit-code --heads https://github.com/js-recon/js-recon-rules.git "$BRANCH" > /dev/null 2>&1; then
30
+ echo "Using js-recon-rules branch: $BRANCH"
31
+ else
32
+ echo "js-recon-rules has no '$BRANCH' branch, falling back to dev"
33
+ BRANCH="dev"
34
+ fi
35
+ git clone --depth 1 --branch "$BRANCH" https://github.com/js-recon/js-recon-rules.git js-recon-rules
28
36
 
29
37
  - name: Set up Node.js
30
38
  uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
@@ -68,12 +76,12 @@ jobs:
68
76
  PUPPETEER_EXECUTABLE_PATH: /usr/bin/google-chrome-stable
69
77
 
70
78
  - name: Verify all rules fired
71
- run: node scripts/smoke-test.js
79
+ run: node scripts/smoke-test.js "$(find output -name analyze.json | head -n1)"
72
80
 
73
81
  - name: Upload analyze.json on failure
74
82
  if: failure()
75
- uses: actions/upload-artifact@v4
83
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
76
84
  with:
77
85
  name: analyze-json
78
- path: output/localhost_3001/analyze.json
86
+ path: output/**/analyze.json
79
87
  if-no-files-found: ignore
package/.nvmrc ADDED
@@ -0,0 +1 @@
1
+ 22