@nahisaho/musubix-security 2.0.1 → 2.1.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 (363) hide show
  1. package/dist/analysis/enhanced-taint-analyzer.d.ts +120 -0
  2. package/dist/analysis/enhanced-taint-analyzer.d.ts.map +1 -0
  3. package/dist/analysis/enhanced-taint-analyzer.js +450 -0
  4. package/dist/analysis/enhanced-taint-analyzer.js.map +1 -0
  5. package/dist/analysis/index.d.ts +1 -0
  6. package/dist/analysis/index.d.ts.map +1 -1
  7. package/dist/analysis/index.js +1 -0
  8. package/dist/analysis/index.js.map +1 -1
  9. package/dist/analysis/interprocedural/call-graph-builder.d.ts +192 -0
  10. package/dist/analysis/interprocedural/call-graph-builder.d.ts.map +1 -0
  11. package/dist/analysis/interprocedural/call-graph-builder.js +510 -0
  12. package/dist/analysis/interprocedural/call-graph-builder.js.map +1 -0
  13. package/dist/analysis/interprocedural/dfg-adapter.d.ts +166 -0
  14. package/dist/analysis/interprocedural/dfg-adapter.d.ts.map +1 -0
  15. package/dist/analysis/interprocedural/dfg-adapter.js +455 -0
  16. package/dist/analysis/interprocedural/dfg-adapter.js.map +1 -0
  17. package/dist/analysis/interprocedural/index.d.ts +9 -0
  18. package/dist/analysis/interprocedural/index.d.ts.map +1 -0
  19. package/dist/analysis/interprocedural/index.js +9 -0
  20. package/dist/analysis/interprocedural/index.js.map +1 -0
  21. package/dist/analysis/interprocedural/taint-propagator.d.ts +250 -0
  22. package/dist/analysis/interprocedural/taint-propagator.d.ts.map +1 -0
  23. package/dist/analysis/interprocedural/taint-propagator.js +435 -0
  24. package/dist/analysis/interprocedural/taint-propagator.js.map +1 -0
  25. package/dist/analysis/sanitizers/command-sanitizers.d.ts +12 -0
  26. package/dist/analysis/sanitizers/command-sanitizers.d.ts.map +1 -0
  27. package/dist/analysis/sanitizers/command-sanitizers.js +123 -0
  28. package/dist/analysis/sanitizers/command-sanitizers.js.map +1 -0
  29. package/dist/analysis/sanitizers/html-sanitizers.d.ts +12 -0
  30. package/dist/analysis/sanitizers/html-sanitizers.d.ts.map +1 -0
  31. package/dist/analysis/sanitizers/html-sanitizers.js +213 -0
  32. package/dist/analysis/sanitizers/html-sanitizers.js.map +1 -0
  33. package/dist/analysis/sanitizers/index.d.ts +35 -0
  34. package/dist/analysis/sanitizers/index.d.ts.map +1 -0
  35. package/dist/analysis/sanitizers/index.js +59 -0
  36. package/dist/analysis/sanitizers/index.js.map +1 -0
  37. package/dist/analysis/sanitizers/path-sanitizers.d.ts +12 -0
  38. package/dist/analysis/sanitizers/path-sanitizers.d.ts.map +1 -0
  39. package/dist/analysis/sanitizers/path-sanitizers.js +163 -0
  40. package/dist/analysis/sanitizers/path-sanitizers.js.map +1 -0
  41. package/dist/analysis/sanitizers/sql-sanitizers.d.ts +12 -0
  42. package/dist/analysis/sanitizers/sql-sanitizers.d.ts.map +1 -0
  43. package/dist/analysis/sanitizers/sql-sanitizers.js +216 -0
  44. package/dist/analysis/sanitizers/sql-sanitizers.js.map +1 -0
  45. package/dist/analysis/sanitizers/types.d.ts +78 -0
  46. package/dist/analysis/sanitizers/types.d.ts.map +1 -0
  47. package/dist/analysis/sanitizers/types.js +7 -0
  48. package/dist/analysis/sanitizers/types.js.map +1 -0
  49. package/dist/analysis/sanitizers/validation-sanitizers.d.ts +12 -0
  50. package/dist/analysis/sanitizers/validation-sanitizers.d.ts.map +1 -0
  51. package/dist/analysis/sanitizers/validation-sanitizers.js +268 -0
  52. package/dist/analysis/sanitizers/validation-sanitizers.js.map +1 -0
  53. package/dist/analysis/sinks/code-eval.d.ts +12 -0
  54. package/dist/analysis/sinks/code-eval.d.ts.map +1 -0
  55. package/dist/analysis/sinks/code-eval.js +231 -0
  56. package/dist/analysis/sinks/code-eval.js.map +1 -0
  57. package/dist/analysis/sinks/command-exec.d.ts +12 -0
  58. package/dist/analysis/sinks/command-exec.d.ts.map +1 -0
  59. package/dist/analysis/sinks/command-exec.js +187 -0
  60. package/dist/analysis/sinks/command-exec.js.map +1 -0
  61. package/dist/analysis/sinks/file-operations.d.ts +12 -0
  62. package/dist/analysis/sinks/file-operations.d.ts.map +1 -0
  63. package/dist/analysis/sinks/file-operations.js +239 -0
  64. package/dist/analysis/sinks/file-operations.js.map +1 -0
  65. package/dist/analysis/sinks/html-output.d.ts +12 -0
  66. package/dist/analysis/sinks/html-output.d.ts.map +1 -0
  67. package/dist/analysis/sinks/html-output.js +256 -0
  68. package/dist/analysis/sinks/html-output.js.map +1 -0
  69. package/dist/analysis/sinks/index.d.ts +30 -0
  70. package/dist/analysis/sinks/index.d.ts.map +1 -0
  71. package/dist/analysis/sinks/index.js +46 -0
  72. package/dist/analysis/sinks/index.js.map +1 -0
  73. package/dist/analysis/sinks/sql-query.d.ts +12 -0
  74. package/dist/analysis/sinks/sql-query.d.ts.map +1 -0
  75. package/dist/analysis/sinks/sql-query.js +209 -0
  76. package/dist/analysis/sinks/sql-query.js.map +1 -0
  77. package/dist/analysis/sinks/types.d.ts +97 -0
  78. package/dist/analysis/sinks/types.d.ts.map +1 -0
  79. package/dist/analysis/sinks/types.js +7 -0
  80. package/dist/analysis/sinks/types.js.map +1 -0
  81. package/dist/analysis/sources/database.d.ts +12 -0
  82. package/dist/analysis/sources/database.d.ts.map +1 -0
  83. package/dist/analysis/sources/database.js +211 -0
  84. package/dist/analysis/sources/database.js.map +1 -0
  85. package/dist/analysis/sources/environment.d.ts +12 -0
  86. package/dist/analysis/sources/environment.d.ts.map +1 -0
  87. package/dist/analysis/sources/environment.js +158 -0
  88. package/dist/analysis/sources/environment.js.map +1 -0
  89. package/dist/analysis/sources/file-system.d.ts +12 -0
  90. package/dist/analysis/sources/file-system.d.ts.map +1 -0
  91. package/dist/analysis/sources/file-system.js +180 -0
  92. package/dist/analysis/sources/file-system.js.map +1 -0
  93. package/dist/analysis/sources/http-request.d.ts +12 -0
  94. package/dist/analysis/sources/http-request.d.ts.map +1 -0
  95. package/dist/analysis/sources/http-request.js +179 -0
  96. package/dist/analysis/sources/http-request.js.map +1 -0
  97. package/dist/analysis/sources/index.d.ts +26 -0
  98. package/dist/analysis/sources/index.d.ts.map +1 -0
  99. package/dist/analysis/sources/index.js +40 -0
  100. package/dist/analysis/sources/index.js.map +1 -0
  101. package/dist/analysis/sources/types.d.ts +93 -0
  102. package/dist/analysis/sources/types.d.ts.map +1 -0
  103. package/dist/analysis/sources/types.js +7 -0
  104. package/dist/analysis/sources/types.js.map +1 -0
  105. package/dist/analysis/sources/user-input.d.ts +12 -0
  106. package/dist/analysis/sources/user-input.d.ts.map +1 -0
  107. package/dist/analysis/sources/user-input.js +261 -0
  108. package/dist/analysis/sources/user-input.js.map +1 -0
  109. package/dist/cve/cpe-matcher.d.ts +183 -0
  110. package/dist/cve/cpe-matcher.d.ts.map +1 -0
  111. package/dist/cve/cpe-matcher.js +396 -0
  112. package/dist/cve/cpe-matcher.js.map +1 -0
  113. package/dist/cve/cve-cache.d.ts +225 -0
  114. package/dist/cve/cve-cache.d.ts.map +1 -0
  115. package/dist/cve/cve-cache.js +452 -0
  116. package/dist/cve/cve-cache.js.map +1 -0
  117. package/dist/cve/cve-cache.test.d.ts +6 -0
  118. package/dist/cve/cve-cache.test.d.ts.map +1 -0
  119. package/dist/cve/cve-cache.test.js +363 -0
  120. package/dist/cve/cve-cache.test.js.map +1 -0
  121. package/dist/cve/dependency-parser.d.ts +204 -0
  122. package/dist/cve/dependency-parser.d.ts.map +1 -0
  123. package/dist/cve/dependency-parser.js +338 -0
  124. package/dist/cve/dependency-parser.js.map +1 -0
  125. package/dist/cve/index.d.ts +20 -0
  126. package/dist/cve/index.d.ts.map +1 -0
  127. package/dist/cve/index.js +13 -0
  128. package/dist/cve/index.js.map +1 -0
  129. package/dist/cve/nvd-client.d.ts +137 -0
  130. package/dist/cve/nvd-client.d.ts.map +1 -0
  131. package/dist/cve/nvd-client.js +333 -0
  132. package/dist/cve/nvd-client.js.map +1 -0
  133. package/dist/cve/rate-limiter.d.ts +194 -0
  134. package/dist/cve/rate-limiter.d.ts.map +1 -0
  135. package/dist/cve/rate-limiter.js +276 -0
  136. package/dist/cve/rate-limiter.js.map +1 -0
  137. package/dist/cve/report-generator.d.ts +145 -0
  138. package/dist/cve/report-generator.d.ts.map +1 -0
  139. package/dist/cve/report-generator.js +377 -0
  140. package/dist/cve/report-generator.js.map +1 -0
  141. package/dist/cve/report-generator.test.d.ts +6 -0
  142. package/dist/cve/report-generator.test.d.ts.map +1 -0
  143. package/dist/cve/report-generator.test.js +275 -0
  144. package/dist/cve/report-generator.test.js.map +1 -0
  145. package/dist/cve/vulnerability-scanner.d.ts +198 -0
  146. package/dist/cve/vulnerability-scanner.d.ts.map +1 -0
  147. package/dist/cve/vulnerability-scanner.js +311 -0
  148. package/dist/cve/vulnerability-scanner.js.map +1 -0
  149. package/dist/cve/vulnerability-scanner.test.d.ts +6 -0
  150. package/dist/cve/vulnerability-scanner.test.d.ts.map +1 -0
  151. package/dist/cve/vulnerability-scanner.test.js +329 -0
  152. package/dist/cve/vulnerability-scanner.test.js.map +1 -0
  153. package/dist/index.d.ts +1 -0
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +4 -0
  156. package/dist/index.js.map +1 -1
  157. package/dist/rules/config/config-parser.d.ts +119 -0
  158. package/dist/rules/config/config-parser.d.ts.map +1 -0
  159. package/dist/rules/config/config-parser.js +376 -0
  160. package/dist/rules/config/config-parser.js.map +1 -0
  161. package/dist/rules/config/index.d.ts +8 -0
  162. package/dist/rules/config/index.d.ts.map +1 -0
  163. package/dist/rules/config/index.js +8 -0
  164. package/dist/rules/config/index.js.map +1 -0
  165. package/dist/rules/config/profiles.d.ts +85 -0
  166. package/dist/rules/config/profiles.d.ts.map +1 -0
  167. package/dist/rules/config/profiles.js +226 -0
  168. package/dist/rules/config/profiles.js.map +1 -0
  169. package/dist/rules/cwe/cwe-119-buffer-overflow.d.ts +9 -0
  170. package/dist/rules/cwe/cwe-119-buffer-overflow.d.ts.map +1 -0
  171. package/dist/rules/cwe/cwe-119-buffer-overflow.js +54 -0
  172. package/dist/rules/cwe/cwe-119-buffer-overflow.js.map +1 -0
  173. package/dist/rules/cwe/cwe-125-oob-read.d.ts +20 -0
  174. package/dist/rules/cwe/cwe-125-oob-read.d.ts.map +1 -0
  175. package/dist/rules/cwe/cwe-125-oob-read.js +247 -0
  176. package/dist/rules/cwe/cwe-125-oob-read.js.map +1 -0
  177. package/dist/rules/cwe/cwe-190-integer-overflow.d.ts +9 -0
  178. package/dist/rules/cwe/cwe-190-integer-overflow.d.ts.map +1 -0
  179. package/dist/rules/cwe/cwe-190-integer-overflow.js +55 -0
  180. package/dist/rules/cwe/cwe-190-integer-overflow.js.map +1 -0
  181. package/dist/rules/cwe/cwe-20-input-validation.d.ts +21 -0
  182. package/dist/rules/cwe/cwe-20-input-validation.d.ts.map +1 -0
  183. package/dist/rules/cwe/cwe-20-input-validation.js +342 -0
  184. package/dist/rules/cwe/cwe-20-input-validation.js.map +1 -0
  185. package/dist/rules/cwe/cwe-22-path-traversal.d.ts +20 -0
  186. package/dist/rules/cwe/cwe-22-path-traversal.d.ts.map +1 -0
  187. package/dist/rules/cwe/cwe-22-path-traversal.js +306 -0
  188. package/dist/rules/cwe/cwe-22-path-traversal.js.map +1 -0
  189. package/dist/rules/cwe/cwe-269-improper-privilege.d.ts +9 -0
  190. package/dist/rules/cwe/cwe-269-improper-privilege.d.ts.map +1 -0
  191. package/dist/rules/cwe/cwe-269-improper-privilege.js +58 -0
  192. package/dist/rules/cwe/cwe-269-improper-privilege.js.map +1 -0
  193. package/dist/rules/cwe/cwe-276-default-permissions.d.ts +9 -0
  194. package/dist/rules/cwe/cwe-276-default-permissions.d.ts.map +1 -0
  195. package/dist/rules/cwe/cwe-276-default-permissions.js +54 -0
  196. package/dist/rules/cwe/cwe-276-default-permissions.js.map +1 -0
  197. package/dist/rules/cwe/cwe-287-improper-auth.d.ts +9 -0
  198. package/dist/rules/cwe/cwe-287-improper-auth.d.ts.map +1 -0
  199. package/dist/rules/cwe/cwe-287-improper-auth.js +57 -0
  200. package/dist/rules/cwe/cwe-287-improper-auth.js.map +1 -0
  201. package/dist/rules/cwe/cwe-306-missing-auth-critical.d.ts +9 -0
  202. package/dist/rules/cwe/cwe-306-missing-auth-critical.d.ts.map +1 -0
  203. package/dist/rules/cwe/cwe-306-missing-auth-critical.js +53 -0
  204. package/dist/rules/cwe/cwe-306-missing-auth-critical.js.map +1 -0
  205. package/dist/rules/cwe/cwe-352-csrf.d.ts +9 -0
  206. package/dist/rules/cwe/cwe-352-csrf.d.ts.map +1 -0
  207. package/dist/rules/cwe/cwe-352-csrf.js +51 -0
  208. package/dist/rules/cwe/cwe-352-csrf.js.map +1 -0
  209. package/dist/rules/cwe/cwe-362-race-condition.d.ts +9 -0
  210. package/dist/rules/cwe/cwe-362-race-condition.d.ts.map +1 -0
  211. package/dist/rules/cwe/cwe-362-race-condition.js +55 -0
  212. package/dist/rules/cwe/cwe-362-race-condition.js.map +1 -0
  213. package/dist/rules/cwe/cwe-416-use-after-free.d.ts +23 -0
  214. package/dist/rules/cwe/cwe-416-use-after-free.d.ts.map +1 -0
  215. package/dist/rules/cwe/cwe-416-use-after-free.js +402 -0
  216. package/dist/rules/cwe/cwe-416-use-after-free.js.map +1 -0
  217. package/dist/rules/cwe/cwe-434-file-upload.d.ts +9 -0
  218. package/dist/rules/cwe/cwe-434-file-upload.d.ts.map +1 -0
  219. package/dist/rules/cwe/cwe-434-file-upload.js +55 -0
  220. package/dist/rules/cwe/cwe-434-file-upload.js.map +1 -0
  221. package/dist/rules/cwe/cwe-476-null-deref.d.ts +9 -0
  222. package/dist/rules/cwe/cwe-476-null-deref.d.ts.map +1 -0
  223. package/dist/rules/cwe/cwe-476-null-deref.js +55 -0
  224. package/dist/rules/cwe/cwe-476-null-deref.js.map +1 -0
  225. package/dist/rules/cwe/cwe-502-deserialization.d.ts +9 -0
  226. package/dist/rules/cwe/cwe-502-deserialization.d.ts.map +1 -0
  227. package/dist/rules/cwe/cwe-502-deserialization.js +57 -0
  228. package/dist/rules/cwe/cwe-502-deserialization.js.map +1 -0
  229. package/dist/rules/cwe/cwe-77-command-injection.d.ts +9 -0
  230. package/dist/rules/cwe/cwe-77-command-injection.d.ts.map +1 -0
  231. package/dist/rules/cwe/cwe-77-command-injection.js +55 -0
  232. package/dist/rules/cwe/cwe-77-command-injection.js.map +1 -0
  233. package/dist/rules/cwe/cwe-78-command-injection.d.ts +20 -0
  234. package/dist/rules/cwe/cwe-78-command-injection.d.ts.map +1 -0
  235. package/dist/rules/cwe/cwe-78-command-injection.js +259 -0
  236. package/dist/rules/cwe/cwe-78-command-injection.js.map +1 -0
  237. package/dist/rules/cwe/cwe-787-oob-write.d.ts +21 -0
  238. package/dist/rules/cwe/cwe-787-oob-write.d.ts.map +1 -0
  239. package/dist/rules/cwe/cwe-787-oob-write.js +321 -0
  240. package/dist/rules/cwe/cwe-787-oob-write.js.map +1 -0
  241. package/dist/rules/cwe/cwe-79-xss.d.ts +22 -0
  242. package/dist/rules/cwe/cwe-79-xss.d.ts.map +1 -0
  243. package/dist/rules/cwe/cwe-79-xss.js +386 -0
  244. package/dist/rules/cwe/cwe-79-xss.js.map +1 -0
  245. package/dist/rules/cwe/cwe-798-hardcoded-credentials.d.ts +9 -0
  246. package/dist/rules/cwe/cwe-798-hardcoded-credentials.d.ts.map +1 -0
  247. package/dist/rules/cwe/cwe-798-hardcoded-credentials.js +58 -0
  248. package/dist/rules/cwe/cwe-798-hardcoded-credentials.js.map +1 -0
  249. package/dist/rules/cwe/cwe-862-missing-auth.d.ts +9 -0
  250. package/dist/rules/cwe/cwe-862-missing-auth.d.ts.map +1 -0
  251. package/dist/rules/cwe/cwe-862-missing-auth.js +55 -0
  252. package/dist/rules/cwe/cwe-862-missing-auth.js.map +1 -0
  253. package/dist/rules/cwe/cwe-863-incorrect-auth.d.ts +9 -0
  254. package/dist/rules/cwe/cwe-863-incorrect-auth.d.ts.map +1 -0
  255. package/dist/rules/cwe/cwe-863-incorrect-auth.js +58 -0
  256. package/dist/rules/cwe/cwe-863-incorrect-auth.js.map +1 -0
  257. package/dist/rules/cwe/cwe-89-sql-injection.d.ts +21 -0
  258. package/dist/rules/cwe/cwe-89-sql-injection.d.ts.map +1 -0
  259. package/dist/rules/cwe/cwe-89-sql-injection.js +456 -0
  260. package/dist/rules/cwe/cwe-89-sql-injection.js.map +1 -0
  261. package/dist/rules/cwe/cwe-918-ssrf.d.ts +9 -0
  262. package/dist/rules/cwe/cwe-918-ssrf.d.ts.map +1 -0
  263. package/dist/rules/cwe/cwe-918-ssrf.js +59 -0
  264. package/dist/rules/cwe/cwe-918-ssrf.js.map +1 -0
  265. package/dist/rules/cwe/cwe-94-code-injection.d.ts +9 -0
  266. package/dist/rules/cwe/cwe-94-code-injection.d.ts.map +1 -0
  267. package/dist/rules/cwe/cwe-94-code-injection.js +59 -0
  268. package/dist/rules/cwe/cwe-94-code-injection.js.map +1 -0
  269. package/dist/rules/cwe/index.d.ts +43 -0
  270. package/dist/rules/cwe/index.d.ts.map +1 -0
  271. package/dist/rules/cwe/index.js +99 -0
  272. package/dist/rules/cwe/index.js.map +1 -0
  273. package/dist/rules/engine/index.d.ts +10 -0
  274. package/dist/rules/engine/index.d.ts.map +1 -0
  275. package/dist/rules/engine/index.js +9 -0
  276. package/dist/rules/engine/index.js.map +1 -0
  277. package/dist/rules/engine/rule-context.d.ts +99 -0
  278. package/dist/rules/engine/rule-context.d.ts.map +1 -0
  279. package/dist/rules/engine/rule-context.js +175 -0
  280. package/dist/rules/engine/rule-context.js.map +1 -0
  281. package/dist/rules/engine/rule-engine.d.ts +132 -0
  282. package/dist/rules/engine/rule-engine.d.ts.map +1 -0
  283. package/dist/rules/engine/rule-engine.js +379 -0
  284. package/dist/rules/engine/rule-engine.js.map +1 -0
  285. package/dist/rules/engine/rule-registry.d.ts +133 -0
  286. package/dist/rules/engine/rule-registry.d.ts.map +1 -0
  287. package/dist/rules/engine/rule-registry.js +281 -0
  288. package/dist/rules/engine/rule-registry.js.map +1 -0
  289. package/dist/rules/index.d.ts +14 -0
  290. package/dist/rules/index.d.ts.map +1 -0
  291. package/dist/rules/index.js +16 -0
  292. package/dist/rules/index.js.map +1 -0
  293. package/dist/rules/owasp/a01-broken-access-control.d.ts +19 -0
  294. package/dist/rules/owasp/a01-broken-access-control.d.ts.map +1 -0
  295. package/dist/rules/owasp/a01-broken-access-control.js +295 -0
  296. package/dist/rules/owasp/a01-broken-access-control.js.map +1 -0
  297. package/dist/rules/owasp/a02-cryptographic-failures.d.ts +19 -0
  298. package/dist/rules/owasp/a02-cryptographic-failures.d.ts.map +1 -0
  299. package/dist/rules/owasp/a02-cryptographic-failures.js +327 -0
  300. package/dist/rules/owasp/a02-cryptographic-failures.js.map +1 -0
  301. package/dist/rules/owasp/a03-injection.d.ts +21 -0
  302. package/dist/rules/owasp/a03-injection.d.ts.map +1 -0
  303. package/dist/rules/owasp/a03-injection.js +342 -0
  304. package/dist/rules/owasp/a03-injection.js.map +1 -0
  305. package/dist/rules/owasp/a04-insecure-design.d.ts +19 -0
  306. package/dist/rules/owasp/a04-insecure-design.d.ts.map +1 -0
  307. package/dist/rules/owasp/a04-insecure-design.js +403 -0
  308. package/dist/rules/owasp/a04-insecure-design.js.map +1 -0
  309. package/dist/rules/owasp/a05-security-misconfiguration.d.ts +19 -0
  310. package/dist/rules/owasp/a05-security-misconfiguration.d.ts.map +1 -0
  311. package/dist/rules/owasp/a05-security-misconfiguration.js +371 -0
  312. package/dist/rules/owasp/a05-security-misconfiguration.js.map +1 -0
  313. package/dist/rules/owasp/a06-vulnerable-components.d.ts +18 -0
  314. package/dist/rules/owasp/a06-vulnerable-components.d.ts.map +1 -0
  315. package/dist/rules/owasp/a06-vulnerable-components.js +243 -0
  316. package/dist/rules/owasp/a06-vulnerable-components.js.map +1 -0
  317. package/dist/rules/owasp/a07-auth-failures.d.ts +19 -0
  318. package/dist/rules/owasp/a07-auth-failures.d.ts.map +1 -0
  319. package/dist/rules/owasp/a07-auth-failures.js +300 -0
  320. package/dist/rules/owasp/a07-auth-failures.js.map +1 -0
  321. package/dist/rules/owasp/a08-integrity-failures.d.ts +18 -0
  322. package/dist/rules/owasp/a08-integrity-failures.d.ts.map +1 -0
  323. package/dist/rules/owasp/a08-integrity-failures.js +306 -0
  324. package/dist/rules/owasp/a08-integrity-failures.js.map +1 -0
  325. package/dist/rules/owasp/a09-logging-failures.d.ts +18 -0
  326. package/dist/rules/owasp/a09-logging-failures.d.ts.map +1 -0
  327. package/dist/rules/owasp/a09-logging-failures.js +339 -0
  328. package/dist/rules/owasp/a09-logging-failures.js.map +1 -0
  329. package/dist/rules/owasp/a10-ssrf.d.ts +18 -0
  330. package/dist/rules/owasp/a10-ssrf.d.ts.map +1 -0
  331. package/dist/rules/owasp/a10-ssrf.js +349 -0
  332. package/dist/rules/owasp/a10-ssrf.js.map +1 -0
  333. package/dist/rules/owasp/index.d.ts +20 -0
  334. package/dist/rules/owasp/index.d.ts.map +1 -0
  335. package/dist/rules/owasp/index.js +53 -0
  336. package/dist/rules/owasp/index.js.map +1 -0
  337. package/dist/rules/types.d.ts +277 -0
  338. package/dist/rules/types.d.ts.map +1 -0
  339. package/dist/rules/types.js +34 -0
  340. package/dist/rules/types.js.map +1 -0
  341. package/dist/tests/integration/epic-integration.test.d.ts +7 -0
  342. package/dist/tests/integration/epic-integration.test.d.ts.map +1 -0
  343. package/dist/tests/integration/epic-integration.test.js +390 -0
  344. package/dist/tests/integration/epic-integration.test.js.map +1 -0
  345. package/dist/tests/rules/cwe/cwe-top25-1-13.test.d.ts +2 -0
  346. package/dist/tests/rules/cwe/cwe-top25-1-13.test.d.ts.map +1 -0
  347. package/dist/tests/rules/cwe/cwe-top25-1-13.test.js +154 -0
  348. package/dist/tests/rules/cwe/cwe-top25-1-13.test.js.map +1 -0
  349. package/dist/tests/rules/cwe/cwe-top25-14-25.test.d.ts +2 -0
  350. package/dist/tests/rules/cwe/cwe-top25-14-25.test.d.ts.map +1 -0
  351. package/dist/tests/rules/cwe/cwe-top25-14-25.test.js +121 -0
  352. package/dist/tests/rules/cwe/cwe-top25-14-25.test.js.map +1 -0
  353. package/dist/types/cve.d.ts +278 -0
  354. package/dist/types/cve.d.ts.map +1 -0
  355. package/dist/types/cve.js +7 -0
  356. package/dist/types/cve.js.map +1 -0
  357. package/dist/types/index.d.ts +2 -0
  358. package/dist/types/index.d.ts.map +1 -1
  359. package/dist/types/rule.d.ts +245 -0
  360. package/dist/types/rule.d.ts.map +1 -0
  361. package/dist/types/rule.js +7 -0
  362. package/dist/types/rule.js.map +1 -0
  363. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @fileoverview CWE-352: Cross-Site Request Forgery (CSRF)
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-352-csrf
4
+ * @trace TSK-RULE-005
5
+ */
6
+ export const cwe352CSRF = {
7
+ id: 'cwe-352-csrf',
8
+ name: 'CWE-352: Cross-Site Request Forgery',
9
+ description: 'Detects missing CSRF protection patterns',
10
+ defaultSeverity: 'high',
11
+ category: 'session',
12
+ tags: ['cwe', 'csrf', 'session', 'security'],
13
+ cwe: ['352'],
14
+ references: [
15
+ { title: 'CWE-352: CSRF', url: 'https://cwe.mitre.org/data/definitions/352.html' },
16
+ ],
17
+ async analyze(context) {
18
+ const findings = [];
19
+ const lines = context.sourceCode.split('\n');
20
+ const patterns = [
21
+ { pattern: /app\.post\s*\(/gi, type: 'POST without CSRF', severity: 'medium' },
22
+ { pattern: /app\.put\s*\(/gi, type: 'PUT without CSRF', severity: 'medium' },
23
+ { pattern: /app\.delete\s*\(/gi, type: 'DELETE without CSRF', severity: 'medium' },
24
+ { pattern: /SameSite\s*:\s*['"`]None['"`]/gi, type: 'SameSite=None cookie', severity: 'high' },
25
+ { pattern: /credentials\s*:\s*['"`]include['"`]/gi, type: 'Fetch with credentials', severity: 'low' },
26
+ ];
27
+ for (let i = 0; i < lines.length; i++) {
28
+ for (const { pattern, type, severity } of patterns) {
29
+ pattern.lastIndex = 0;
30
+ if (pattern.test(lines[i])) {
31
+ findings.push({
32
+ id: `cwe-352-${findings.length + 1}`,
33
+ ruleId: 'cwe-352-csrf',
34
+ severity,
35
+ message: `CSRF - ${type}: Ensure CSRF token validation`,
36
+ location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
37
+ cwe: ['352'],
38
+ suggestion: {
39
+ description: 'Use CSRF middleware',
40
+ example: `const csrf = require('csurf');
41
+ app.use(csrf({ cookie: true }));`,
42
+ },
43
+ });
44
+ }
45
+ }
46
+ }
47
+ return findings;
48
+ },
49
+ };
50
+ export default cwe352CSRF;
51
+ //# sourceMappingURL=cwe-352-csrf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwe-352-csrf.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-352-csrf.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,UAAU,GAAiB;IACtC,EAAE,EAAE,cAAc;IAClB,IAAI,EAAE,qCAAqC;IAC3C,WAAW,EAAE,0CAA0C;IACvD,eAAe,EAAE,MAAM;IACvB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC;IAC5C,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,UAAU,EAAE;QACV,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,iDAAiD,EAAE;KACnF;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,QAAQ,GAAG;YACf,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACvF,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACrF,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC3F,EAAE,OAAO,EAAE,iCAAiC,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAe,EAAE;YACvG,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,KAAc,EAAE;SAC/G,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACnD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;gBACtB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,WAAW,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBACpC,MAAM,EAAE,cAAc;wBACtB,QAAQ;wBACR,OAAO,EAAE,UAAU,IAAI,gCAAgC;wBACvD,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;wBACtE,GAAG,EAAE,CAAC,KAAK,CAAC;wBACZ,UAAU,EAAE;4BACV,WAAW,EAAE,qBAAqB;4BAClC,OAAO,EAAE;iCACU;yBACpB;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview CWE-362: Concurrent Execution Using Shared Resource (Race Condition)
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-362-race-condition
4
+ * @trace TSK-RULE-006
5
+ */
6
+ import type { SecurityRule } from '../types.js';
7
+ export declare const cwe362RaceCondition: SecurityRule;
8
+ export default cwe362RaceCondition;
9
+ //# sourceMappingURL=cwe-362-race-condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwe-362-race-condition.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-362-race-condition.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E,eAAO,MAAM,mBAAmB,EAAE,YAkDjC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @fileoverview CWE-362: Concurrent Execution Using Shared Resource (Race Condition)
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-362-race-condition
4
+ * @trace TSK-RULE-006
5
+ */
6
+ export const cwe362RaceCondition = {
7
+ id: 'cwe-362-race-condition',
8
+ name: 'CWE-362: Race Condition',
9
+ description: 'Detects potential race condition vulnerabilities',
10
+ defaultSeverity: 'medium',
11
+ category: 'concurrency',
12
+ tags: ['cwe', 'race-condition', 'concurrency', 'security'],
13
+ cwe: ['362'],
14
+ references: [
15
+ { title: 'CWE-362', url: 'https://cwe.mitre.org/data/definitions/362.html' },
16
+ ],
17
+ async analyze(context) {
18
+ const findings = [];
19
+ const lines = context.sourceCode.split('\n');
20
+ const patterns = [
21
+ { pattern: /if\s*\(.*exists.*\).*\{[^}]*(?:write|create|delete)/gis, type: 'Check-then-act pattern', severity: 'high' },
22
+ { pattern: /fs\.existsSync.*fs\.(?:write|unlink|mkdir)/gi, type: 'File TOCTOU', severity: 'high' },
23
+ { pattern: /\.findOne\s*\([^)]+\).*\.save\s*\(\)/gi, type: 'Read-modify-write pattern', severity: 'medium' },
24
+ { pattern: /let\s+\w+\s*=.*;\s*(?:setTimeout|setInterval)/gi, type: 'Shared state with timer', severity: 'medium' },
25
+ { pattern: /global\.\w+\s*=|globalThis\.\w+\s*=/gi, type: 'Global state modification', severity: 'medium' },
26
+ { pattern: /Promise\.all.*(?:update|write|delete)/gi, type: 'Concurrent mutations', severity: 'medium' },
27
+ ];
28
+ for (let i = 0; i < lines.length; i++) {
29
+ for (const { pattern, type, severity } of patterns) {
30
+ pattern.lastIndex = 0;
31
+ if (pattern.test(lines[i])) {
32
+ findings.push({
33
+ id: `cwe-362-${findings.length + 1}`,
34
+ ruleId: 'cwe-362-race-condition',
35
+ severity,
36
+ message: `Race Condition - ${type}: Use atomic operations or locks`,
37
+ location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
38
+ cwe: ['362'],
39
+ suggestion: {
40
+ description: 'Use atomic operations or proper locking',
41
+ example: `// Use atomic operation or transaction
42
+ await db.transaction(async (tx) => {
43
+ const item = await tx.findOne(query);
44
+ if (item) await tx.update(item.id, data);
45
+ });`,
46
+ },
47
+ });
48
+ }
49
+ }
50
+ }
51
+ return findings;
52
+ },
53
+ };
54
+ export default cwe362RaceCondition;
55
+ //# sourceMappingURL=cwe-362-race-condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwe-362-race-condition.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-362-race-condition.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,EAAE,EAAE,wBAAwB;IAC5B,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,kDAAkD;IAC/D,eAAe,EAAE,QAAQ;IACzB,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,UAAU,CAAC;IAC1D,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,UAAU,EAAE;QACV,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,iDAAiD,EAAE;KAC7E;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,QAAQ,GAAG;YACf,EAAE,OAAO,EAAE,wDAAwD,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAChI,EAAE,OAAO,EAAE,8CAA8C,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC3G,EAAE,OAAO,EAAE,wCAAwC,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACrH,EAAE,OAAO,EAAE,iDAAiD,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC5H,EAAE,OAAO,EAAE,uCAAuC,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YACpH,EAAE,OAAO,EAAE,yCAAyC,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAiB,EAAE;SAClH,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACnD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;gBACtB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,WAAW,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBACpC,MAAM,EAAE,wBAAwB;wBAChC,QAAQ;wBACR,OAAO,EAAE,oBAAoB,IAAI,kCAAkC;wBACnE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;wBACtE,GAAG,EAAE,CAAC,KAAK,CAAC;wBACZ,UAAU,EAAE;4BACV,WAAW,EAAE,yCAAyC;4BACtD,OAAO,EAAE;;;;IAInB;yBACS;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @fileoverview CWE-416: Use After Free
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-416-use-after-free
4
+ * @trace TSK-RULE-005
5
+ *
6
+ * Detects:
7
+ * - Resource usage after disposal (streams, handles)
8
+ * - Promise race conditions
9
+ * - Event listener memory leaks
10
+ * - Timer cleanup issues
11
+ * - Database connection pool misuse
12
+ *
13
+ * CWE-416 is #4 in CWE Top 25 2023.
14
+ * Note: JavaScript has garbage collection, so traditional UAF is rare.
15
+ * This rule focuses on logical "use after free" patterns.
16
+ */
17
+ import type { SecurityRule } from '../types.js';
18
+ /**
19
+ * CWE-416 - Use After Free
20
+ */
21
+ export declare const cwe416UseAfterFree: SecurityRule;
22
+ export default cwe416UseAfterFree;
23
+ //# sourceMappingURL=cwe-416-use-after-free.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwe-416-use-after-free.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-416-use-after-free.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAgChC,CAAC;AAqZF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,402 @@
1
+ /**
2
+ * @fileoverview CWE-416: Use After Free
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-416-use-after-free
4
+ * @trace TSK-RULE-005
5
+ *
6
+ * Detects:
7
+ * - Resource usage after disposal (streams, handles)
8
+ * - Promise race conditions
9
+ * - Event listener memory leaks
10
+ * - Timer cleanup issues
11
+ * - Database connection pool misuse
12
+ *
13
+ * CWE-416 is #4 in CWE Top 25 2023.
14
+ * Note: JavaScript has garbage collection, so traditional UAF is rare.
15
+ * This rule focuses on logical "use after free" patterns.
16
+ */
17
+ /**
18
+ * CWE-416 - Use After Free
19
+ */
20
+ export const cwe416UseAfterFree = {
21
+ id: 'cwe-416-use-after-free',
22
+ name: 'CWE-416: Use After Free',
23
+ description: 'Detects resource usage after disposal patterns including streams, connections, and event handlers',
24
+ defaultSeverity: 'medium',
25
+ category: 'memory-safety',
26
+ tags: ['cwe', 'memory', 'resource', 'disposal', 'security'],
27
+ cwe: ['416'],
28
+ references: [
29
+ {
30
+ title: 'CWE-416: Use After Free',
31
+ url: 'https://cwe.mitre.org/data/definitions/416.html',
32
+ },
33
+ {
34
+ title: 'Node.js Stream Documentation',
35
+ url: 'https://nodejs.org/api/stream.html',
36
+ },
37
+ ],
38
+ async analyze(context) {
39
+ const findings = [];
40
+ const sourceCode = context.sourceCode;
41
+ checkStreamDisposal(context, sourceCode, findings);
42
+ checkConnectionPoolIssues(context, sourceCode, findings);
43
+ checkEventListenerLeaks(context, sourceCode, findings);
44
+ checkTimerCleanup(context, sourceCode, findings);
45
+ checkPromiseRaceConditions(context, sourceCode, findings);
46
+ return findings;
47
+ },
48
+ };
49
+ /**
50
+ * Check for stream usage after close/destroy
51
+ */
52
+ function checkStreamDisposal(context, sourceCode, findings) {
53
+ const lines = sourceCode.split('\n');
54
+ const streamPatterns = [
55
+ {
56
+ pattern: /\.destroy\s*\(\s*\)[^;]*;[^}]*\.write\s*\(/gi,
57
+ type: 'Write after destroy',
58
+ message: 'Writing to stream after destroy() was called',
59
+ severity: 'high',
60
+ },
61
+ {
62
+ pattern: /\.end\s*\(\s*\)[^;]*;[^}]*\.write\s*\(/gi,
63
+ type: 'Write after end',
64
+ message: 'Writing to stream after end() was called',
65
+ severity: 'medium',
66
+ },
67
+ {
68
+ pattern: /\.close\s*\(\s*\)[^;]*;[^}]*(?:\.read|\.write|\.pipe)\s*\(/gi,
69
+ type: 'Operation after close',
70
+ message: 'Stream operation after close() was called',
71
+ severity: 'medium',
72
+ },
73
+ {
74
+ pattern: /stream\.(?:destroy|end|close)\s*\([^)]*\)\s*;[\s\S]{0,100}stream\./gi,
75
+ type: 'Stream reuse after disposal',
76
+ message: 'Potential stream usage after disposal',
77
+ severity: 'medium',
78
+ },
79
+ ];
80
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
81
+ const line = lines[lineNum];
82
+ for (const { pattern, type, message, severity } of streamPatterns) {
83
+ pattern.lastIndex = 0;
84
+ if (pattern.test(line)) {
85
+ findings.push({
86
+ id: `cwe-416-stream-${findings.length + 1}`,
87
+ ruleId: 'cwe-416-use-after-free',
88
+ severity,
89
+ message: `Use After Free - ${type}: ${message}`,
90
+ location: {
91
+ file: context.filePath,
92
+ startLine: lineNum + 1,
93
+ endLine: lineNum + 1,
94
+ startColumn: 0,
95
+ endColumn: line.length,
96
+ },
97
+ cwe: ['416'],
98
+ suggestion: {
99
+ description: 'Check stream state before operations',
100
+ example: `// Check if stream is writable before writing
101
+ if (!stream.destroyed && stream.writable) {
102
+ stream.write(data);
103
+ }
104
+
105
+ // Use proper event handlers
106
+ stream.on('close', () => {
107
+ // Stream is now closed, don't use it
108
+ stream = null;
109
+ });`,
110
+ },
111
+ });
112
+ }
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Check for database connection pool issues
118
+ */
119
+ function checkConnectionPoolIssues(context, sourceCode, findings) {
120
+ const lines = sourceCode.split('\n');
121
+ const connectionPatterns = [
122
+ {
123
+ pattern: /\.release\s*\(\s*\)[^;]*;[^}]*(?:\.query|\.execute)\s*\(/gi,
124
+ type: 'Query after release',
125
+ message: 'Database operation after connection release',
126
+ severity: 'high',
127
+ },
128
+ {
129
+ pattern: /connection\.end\s*\(\s*\)[^;]*;[^}]*connection\./gi,
130
+ type: 'Connection use after end',
131
+ message: 'Connection used after end() was called',
132
+ severity: 'high',
133
+ },
134
+ {
135
+ pattern: /pool\.end\s*\(\s*\)[^;]*;[^}]*pool\.(?:query|getConnection)/gi,
136
+ type: 'Pool use after end',
137
+ message: 'Connection pool used after being closed',
138
+ severity: 'high',
139
+ },
140
+ {
141
+ pattern: /client\.close\s*\(\s*\)[^;]*;[^}]*client\./gi,
142
+ type: 'Client use after close',
143
+ message: 'Database client used after close()',
144
+ severity: 'high',
145
+ },
146
+ {
147
+ pattern: /await\s+\w+\.release\s*\(\s*\)[\s\S]{0,50}await\s+\w+\.query/gi,
148
+ type: 'Query after async release',
149
+ message: 'Async query after connection release',
150
+ severity: 'medium',
151
+ },
152
+ ];
153
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
154
+ const line = lines[lineNum];
155
+ for (const { pattern, type, message, severity } of connectionPatterns) {
156
+ pattern.lastIndex = 0;
157
+ if (pattern.test(line)) {
158
+ findings.push({
159
+ id: `cwe-416-conn-${findings.length + 1}`,
160
+ ruleId: 'cwe-416-use-after-free',
161
+ severity,
162
+ message: `Use After Free - ${type}: ${message}`,
163
+ location: {
164
+ file: context.filePath,
165
+ startLine: lineNum + 1,
166
+ endLine: lineNum + 1,
167
+ startColumn: 0,
168
+ endColumn: line.length,
169
+ },
170
+ cwe: ['416'],
171
+ suggestion: {
172
+ description: 'Use connection within try-finally or use pooled queries',
173
+ example: `// Use try-finally for proper cleanup
174
+ const connection = await pool.getConnection();
175
+ try {
176
+ await connection.query('SELECT ...');
177
+ } finally {
178
+ connection.release();
179
+ }
180
+
181
+ // Or use pool.query directly (auto-release)
182
+ const results = await pool.query('SELECT ...');`,
183
+ },
184
+ });
185
+ }
186
+ }
187
+ }
188
+ }
189
+ /**
190
+ * Check for event listener memory leaks
191
+ */
192
+ function checkEventListenerLeaks(context, sourceCode, findings) {
193
+ const lines = sourceCode.split('\n');
194
+ const listenerPatterns = [
195
+ {
196
+ pattern: /\.on\s*\(\s*['"`]\w+['"`]\s*,\s*(?:function|\([^)]*\)\s*=>)/gi,
197
+ type: 'Event listener without removal',
198
+ message: 'Event listener added - ensure proper cleanup',
199
+ severity: 'info',
200
+ },
201
+ {
202
+ pattern: /\.addListener\s*\(\s*['"`]\w+['"`]\s*,/gi,
203
+ type: 'addListener without removal',
204
+ message: 'addListener used - ensure corresponding removeListener',
205
+ severity: 'info',
206
+ },
207
+ {
208
+ pattern: /setMaxListeners\s*\(\s*0\s*\)/gi,
209
+ type: 'Unlimited listeners',
210
+ message: 'setMaxListeners(0) disables leak warning - may mask real leaks',
211
+ severity: 'medium',
212
+ },
213
+ {
214
+ pattern: /setMaxListeners\s*\(\s*(?:Infinity|Number\.MAX_SAFE_INTEGER)\s*\)/gi,
215
+ type: 'Infinite listeners',
216
+ message: 'Infinite max listeners disables leak detection',
217
+ severity: 'medium',
218
+ },
219
+ {
220
+ pattern: /\.removeAllListeners\s*\(\s*\)/gi,
221
+ type: 'Remove all listeners',
222
+ message: 'removeAllListeners() may remove listeners from other modules',
223
+ severity: 'low',
224
+ },
225
+ ];
226
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
227
+ const line = lines[lineNum];
228
+ for (const { pattern, type, message, severity } of listenerPatterns) {
229
+ pattern.lastIndex = 0;
230
+ if (pattern.test(line)) {
231
+ findings.push({
232
+ id: `cwe-416-listener-${findings.length + 1}`,
233
+ ruleId: 'cwe-416-use-after-free',
234
+ severity,
235
+ message: `Resource Leak - ${type}: ${message}`,
236
+ location: {
237
+ file: context.filePath,
238
+ startLine: lineNum + 1,
239
+ endLine: lineNum + 1,
240
+ startColumn: 0,
241
+ endColumn: line.length,
242
+ },
243
+ cwe: ['416'],
244
+ suggestion: {
245
+ description: 'Use once() or cleanup listeners properly',
246
+ example: `// Use once() for one-time events
247
+ emitter.once('event', handler);
248
+
249
+ // Store reference for cleanup
250
+ const handler = () => { /* ... */ };
251
+ emitter.on('event', handler);
252
+ // Later:
253
+ emitter.off('event', handler);
254
+
255
+ // Use AbortController for cleanup
256
+ const controller = new AbortController();
257
+ element.addEventListener('click', handler, { signal: controller.signal });
258
+ // Cleanup:
259
+ controller.abort();`,
260
+ },
261
+ });
262
+ }
263
+ }
264
+ }
265
+ }
266
+ /**
267
+ * Check for timer cleanup issues
268
+ */
269
+ function checkTimerCleanup(context, sourceCode, findings) {
270
+ const lines = sourceCode.split('\n');
271
+ const timerPatterns = [
272
+ {
273
+ pattern: /setInterval\s*\([^)]+\)/gi,
274
+ type: 'setInterval without clearInterval',
275
+ message: 'setInterval may cause memory leaks if not cleared',
276
+ severity: 'low',
277
+ },
278
+ {
279
+ pattern: /setTimeout\s*\([^)]+\)(?!\s*;?\s*(?:const|let|var)\s+\w+)/gi,
280
+ type: 'setTimeout without reference',
281
+ message: 'setTimeout without storing reference cannot be cancelled',
282
+ severity: 'info',
283
+ },
284
+ {
285
+ pattern: /clearTimeout\s*\(\s*\w+\s*\)\s*;[^}]*setTimeout/gi,
286
+ type: 'Timeout cleared then reused',
287
+ message: 'Timer variable reused after clear - ensure proper assignment',
288
+ severity: 'low',
289
+ },
290
+ ];
291
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
292
+ const line = lines[lineNum];
293
+ for (const { pattern, type, message, severity } of timerPatterns) {
294
+ pattern.lastIndex = 0;
295
+ if (pattern.test(line)) {
296
+ findings.push({
297
+ id: `cwe-416-timer-${findings.length + 1}`,
298
+ ruleId: 'cwe-416-use-after-free',
299
+ severity,
300
+ message: `Resource Leak - ${type}: ${message}`,
301
+ location: {
302
+ file: context.filePath,
303
+ startLine: lineNum + 1,
304
+ endLine: lineNum + 1,
305
+ startColumn: 0,
306
+ endColumn: line.length,
307
+ },
308
+ cwe: ['416'],
309
+ suggestion: {
310
+ description: 'Store timer references and clean up properly',
311
+ example: `// Store reference for cleanup
312
+ const timerId = setInterval(() => {
313
+ // periodic work
314
+ }, 1000);
315
+
316
+ // Clean up when done
317
+ clearInterval(timerId);
318
+
319
+ // For React components
320
+ useEffect(() => {
321
+ const id = setInterval(fn, 1000);
322
+ return () => clearInterval(id);
323
+ }, []);`,
324
+ },
325
+ });
326
+ }
327
+ }
328
+ }
329
+ }
330
+ /**
331
+ * Check for promise race conditions that may cause UAF-like issues
332
+ */
333
+ function checkPromiseRaceConditions(context, sourceCode, findings) {
334
+ const lines = sourceCode.split('\n');
335
+ const racePatterns = [
336
+ {
337
+ pattern: /Promise\.race\s*\(\s*\[/gi,
338
+ type: 'Promise.race usage',
339
+ message: 'Promise.race may leave pending promises - ensure proper cleanup',
340
+ severity: 'info',
341
+ },
342
+ {
343
+ pattern: /\.then\s*\([^)]+\)\s*;[^}]*=\s*null/gi,
344
+ type: 'Nullify after async',
345
+ message: 'Variable nullified while async operation may still be pending',
346
+ severity: 'medium',
347
+ },
348
+ {
349
+ pattern: /async\s+function[^{]*\{[^}]*this\.\w+\s*=[^}]*await/gi,
350
+ type: 'This assignment after await',
351
+ message: 'Assignment to this after await may fail if object was disposed',
352
+ severity: 'medium',
353
+ },
354
+ {
355
+ pattern: /unmount|destroy|dispose[^}]*await/gi,
356
+ type: 'Await in cleanup',
357
+ message: 'Async operation in cleanup function may complete after disposal',
358
+ severity: 'medium',
359
+ },
360
+ ];
361
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
362
+ const line = lines[lineNum];
363
+ for (const { pattern, type, message, severity } of racePatterns) {
364
+ pattern.lastIndex = 0;
365
+ if (pattern.test(line)) {
366
+ findings.push({
367
+ id: `cwe-416-race-${findings.length + 1}`,
368
+ ruleId: 'cwe-416-use-after-free',
369
+ severity,
370
+ message: `Race Condition - ${type}: ${message}`,
371
+ location: {
372
+ file: context.filePath,
373
+ startLine: lineNum + 1,
374
+ endLine: lineNum + 1,
375
+ startColumn: 0,
376
+ endColumn: line.length,
377
+ },
378
+ cwe: ['416'],
379
+ suggestion: {
380
+ description: 'Use cancellation tokens or check component state',
381
+ example: `// Use AbortController for cancellation
382
+ const controller = new AbortController();
383
+ fetch(url, { signal: controller.signal });
384
+ // Cancel on cleanup:
385
+ controller.abort();
386
+
387
+ // Check mounted state in React
388
+ useEffect(() => {
389
+ let mounted = true;
390
+ fetchData().then(data => {
391
+ if (mounted) setData(data);
392
+ });
393
+ return () => { mounted = false; };
394
+ }, []);`,
395
+ },
396
+ });
397
+ }
398
+ }
399
+ }
400
+ }
401
+ export default cwe416UseAfterFree;
402
+ //# sourceMappingURL=cwe-416-use-after-free.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwe-416-use-after-free.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-416-use-after-free.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview CWE-434: Unrestricted Upload of File with Dangerous Type
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-434-file-upload
4
+ * @trace TSK-RULE-005
5
+ */
6
+ import type { SecurityRule } from '../types.js';
7
+ export declare const cwe434FileUpload: SecurityRule;
8
+ export default cwe434FileUpload;
9
+ //# sourceMappingURL=cwe-434-file-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwe-434-file-upload.d.ts","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-434-file-upload.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E,eAAO,MAAM,gBAAgB,EAAE,YAkD9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @fileoverview CWE-434: Unrestricted Upload of File with Dangerous Type
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-434-file-upload
4
+ * @trace TSK-RULE-005
5
+ */
6
+ export const cwe434FileUpload = {
7
+ id: 'cwe-434-file-upload',
8
+ name: 'CWE-434: Unrestricted File Upload',
9
+ description: 'Detects dangerous file upload patterns',
10
+ defaultSeverity: 'high',
11
+ category: 'file-system',
12
+ tags: ['cwe', 'upload', 'file', 'security'],
13
+ cwe: ['434'],
14
+ references: [
15
+ { title: 'CWE-434', url: 'https://cwe.mitre.org/data/definitions/434.html' },
16
+ ],
17
+ async analyze(context) {
18
+ const findings = [];
19
+ const lines = context.sourceCode.split('\n');
20
+ const patterns = [
21
+ { pattern: /multer\s*\(\s*\{[^}]*dest\s*:/gi, type: 'Multer without fileFilter', severity: 'medium' },
22
+ { pattern: /\.originalname/gi, type: 'Using original filename', severity: 'high' },
23
+ { pattern: /req\.files?\.\w+\.(?:path|name)/gi, type: 'Direct file path usage', severity: 'medium' },
24
+ { pattern: /\.mimetype\s*===?\s*['"`]/gi, type: 'Client-side mimetype trust', severity: 'medium' },
25
+ { pattern: /upload\.(?:single|array|fields)\s*\(/gi, type: 'File upload endpoint', severity: 'info' },
26
+ ];
27
+ for (let i = 0; i < lines.length; i++) {
28
+ for (const { pattern, type, severity } of patterns) {
29
+ pattern.lastIndex = 0;
30
+ if (pattern.test(lines[i])) {
31
+ findings.push({
32
+ id: `cwe-434-${findings.length + 1}`,
33
+ ruleId: 'cwe-434-file-upload',
34
+ severity,
35
+ message: `File Upload - ${type}: Validate file type and sanitize filename`,
36
+ location: { file: context.filePath, startLine: i + 1, endLine: i + 1 },
37
+ cwe: ['434'],
38
+ suggestion: {
39
+ description: 'Validate file type by content, not extension',
40
+ example: `const upload = multer({
41
+ fileFilter: (req, file, cb) => {
42
+ const allowed = ['image/jpeg', 'image/png'];
43
+ cb(null, allowed.includes(file.mimetype));
44
+ }
45
+ });`,
46
+ },
47
+ });
48
+ }
49
+ }
50
+ }
51
+ return findings;
52
+ },
53
+ };
54
+ export default cwe434FileUpload;
55
+ //# sourceMappingURL=cwe-434-file-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwe-434-file-upload.js","sourceRoot":"","sources":["../../../src/rules/cwe/cwe-434-file-upload.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAiB;IAC5C,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,mCAAmC;IACzC,WAAW,EAAE,wCAAwC;IACrD,eAAe,EAAE,MAAM;IACvB,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;IAC3C,GAAG,EAAE,CAAC,KAAK,CAAC;IACZ,UAAU,EAAE;QACV,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,iDAAiD,EAAE;KAC7E;IAED,KAAK,CAAC,OAAO,CAAC,OAAoB;QAChC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,QAAQ,GAAG;YACf,EAAE,OAAO,EAAE,iCAAiC,EAAE,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC9G,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,MAAe,EAAE;YAC3F,EAAE,OAAO,EAAE,mCAAmC,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC7G,EAAE,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,4BAA4B,EAAE,QAAQ,EAAE,QAAiB,EAAE;YAC3G,EAAE,OAAO,EAAE,wCAAwC,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAe,EAAE;SAC/G,CAAC;QAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACnD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;gBACtB,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,IAAI,CAAC;wBACZ,EAAE,EAAE,WAAW,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;wBACpC,MAAM,EAAE,qBAAqB;wBAC7B,QAAQ;wBACR,OAAO,EAAE,iBAAiB,IAAI,4CAA4C;wBAC1E,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;wBACtE,GAAG,EAAE,CAAC,KAAK,CAAC;wBACZ,UAAU,EAAE;4BACV,WAAW,EAAE,8CAA8C;4BAC3D,OAAO,EAAE;;;;;IAKnB;yBACS;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview CWE-476: NULL Pointer Dereference
3
+ * @module @nahisaho/musubix-security/rules/cwe/cwe-476-null-deref
4
+ * @trace TSK-RULE-005
5
+ */
6
+ import type { SecurityRule } from '../types.js';
7
+ export declare const cwe476NullDeref: SecurityRule;
8
+ export default cwe476NullDeref;
9
+ //# sourceMappingURL=cwe-476-null-deref.d.ts.map