@nahisaho/musubix-security 2.0.0 → 2.1.0

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 +4 -4
@@ -0,0 +1,371 @@
1
+ /**
2
+ * @fileoverview OWASP A05:2021 - Security Misconfiguration Rule
3
+ * @module @nahisaho/musubix-security/rules/owasp/a05-security-misconfiguration
4
+ * @trace TSK-RULE-003
5
+ *
6
+ * Detects:
7
+ * - Default credentials
8
+ * - Verbose error messages
9
+ * - Unnecessary features enabled
10
+ * - Missing security headers
11
+ * - Development settings in production
12
+ */
13
+ /**
14
+ * OWASP A05 - Security Misconfiguration
15
+ */
16
+ export const owaspA05SecurityMisconfiguration = {
17
+ id: 'owasp-a05-security-misconfiguration',
18
+ name: 'OWASP A05:2021 - Security Misconfiguration',
19
+ description: 'Detects security misconfigurations including default credentials, verbose errors, and insecure settings',
20
+ defaultSeverity: 'high',
21
+ detectionMethod: 'pattern-match',
22
+ tags: ['owasp', 'configuration', 'defaults', 'headers', 'security'],
23
+ owasp: ['A05:2021'],
24
+ cwe: ['2', '11', '13', '15', '16', '260', '315', '520', '526', '537'],
25
+ references: [
26
+ { title: 'OWASP A05:2021 - Security Misconfiguration', url: 'https://owasp.org/Top10/A05_2021-Security_Misconfiguration/' },
27
+ { title: 'CWE-16: Configuration', url: 'https://cwe.mitre.org/data/definitions/16.html' },
28
+ ],
29
+ async analyze(context) {
30
+ const findings = [];
31
+ const sourceFile = context.sourceFile;
32
+ if (!sourceFile)
33
+ return findings;
34
+ // Check for default credentials
35
+ checkDefaultCredentials(context, findings);
36
+ // Check for verbose errors
37
+ checkVerboseErrors(context, findings);
38
+ // Check for unnecessary features
39
+ checkUnnecessaryFeatures(context, findings);
40
+ // Check for missing security headers
41
+ checkMissingHeaders(context, findings);
42
+ // Check for development settings
43
+ checkDevSettings(context, findings);
44
+ // Check for exposed environment
45
+ checkExposedEnvironment(context, findings);
46
+ return findings;
47
+ },
48
+ };
49
+ /**
50
+ * Check for default or hardcoded credentials
51
+ */
52
+ function checkDefaultCredentials(context, findings) {
53
+ const sourceCode = context.sourceCode;
54
+ const lines = sourceCode.split('\n');
55
+ const defaultCredPatterns = [
56
+ // Default passwords
57
+ { pattern: /password\s*[:=]\s*['"`](?:password|admin|123456|root|default|test|demo)['"`]/gi, type: 'default password' },
58
+ // Default usernames
59
+ { pattern: /(?:username|user)\s*[:=]\s*['"`](?:admin|root|test|user|demo)['"`]/gi, type: 'default username' },
60
+ // Default API keys (placeholder patterns)
61
+ { pattern: /(?:api[_-]?key|apikey)\s*[:=]\s*['"`](?:xxx|test|demo|your[_-]?api[_-]?key)['"`]/gi, type: 'placeholder API key' },
62
+ // Default tokens
63
+ { pattern: /(?:token|secret)\s*[:=]\s*['"`](?:changeme|secret|default|test)['"`]/gi, type: 'default token' },
64
+ ];
65
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
66
+ const line = lines[lineNum];
67
+ // Skip comments
68
+ if (line.trim().startsWith('//') || line.trim().startsWith('*'))
69
+ continue;
70
+ for (const { pattern, type } of defaultCredPatterns) {
71
+ pattern.lastIndex = 0;
72
+ if (pattern.test(line)) {
73
+ findings.push({
74
+ id: `owasp-a05-cred-${findings.length + 1}`,
75
+ ruleId: 'owasp-a05-security-misconfiguration',
76
+ severity: 'critical',
77
+ message: `Default or hardcoded ${type} detected`,
78
+ location: {
79
+ file: context.filePath,
80
+ startLine: lineNum + 1,
81
+ endLine: lineNum + 1,
82
+ startColumn: 0,
83
+ endColumn: line.length,
84
+ },
85
+ suggestion: {
86
+ description: 'Use environment variables for credentials',
87
+ example: `// Use environment variables:
88
+ const password = process.env.DB_PASSWORD;
89
+ const apiKey = process.env.API_KEY;`,
90
+ },
91
+ });
92
+ break;
93
+ }
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Check for verbose error messages
99
+ */
100
+ function checkVerboseErrors(context, findings) {
101
+ const sourceCode = context.sourceCode;
102
+ const lines = sourceCode.split('\n');
103
+ const verboseErrorPatterns = [
104
+ // Stack trace exposure
105
+ { pattern: /(?:res\.send|res\.json)\s*\([^)]*(?:err\.stack|error\.stack)/gi, type: 'Stack trace in response' },
106
+ // Full error object
107
+ { pattern: /(?:res\.send|res\.json)\s*\(\s*(?:err|error)\s*\)/gi, type: 'Full error object in response' },
108
+ // Internal error details
109
+ { pattern: /(?:res\.send|res\.json)\s*\([^)]*(?:sql|query|database)/gi, type: 'Database details in response' },
110
+ // Debug info in production
111
+ { pattern: /console\.(?:log|error)\s*\([^)]*(?:password|secret|key|token)/gi, type: 'Sensitive data in console' },
112
+ ];
113
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
114
+ const line = lines[lineNum];
115
+ for (const { pattern, type } of verboseErrorPatterns) {
116
+ pattern.lastIndex = 0;
117
+ if (pattern.test(line)) {
118
+ // Check if there's environment check
119
+ const surroundingCode = lines.slice(Math.max(0, lineNum - 5), lineNum + 1).join('\n');
120
+ if (!hasProductionCheck(surroundingCode)) {
121
+ findings.push({
122
+ id: `owasp-a05-error-${findings.length + 1}`,
123
+ ruleId: 'owasp-a05-security-misconfiguration',
124
+ severity: 'medium',
125
+ message: `Verbose error information: ${type}`,
126
+ location: {
127
+ file: context.filePath,
128
+ startLine: lineNum + 1,
129
+ endLine: lineNum + 1,
130
+ startColumn: 0,
131
+ endColumn: line.length,
132
+ },
133
+ suggestion: {
134
+ description: 'Send generic errors in production',
135
+ example: `// Send generic errors in production:
136
+ app.use((err, req, res, next) => {
137
+ console.error(err); // Log internally
138
+ const message = process.env.NODE_ENV === 'production'
139
+ ? 'Internal Server Error'
140
+ : err.message;
141
+ res.status(500).json({ error: message });
142
+ });`,
143
+ },
144
+ });
145
+ }
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Check for unnecessary features enabled
153
+ */
154
+ function checkUnnecessaryFeatures(context, findings) {
155
+ const sourceCode = context.sourceCode;
156
+ const lines = sourceCode.split('\n');
157
+ const unnecessaryFeaturePatterns = [
158
+ // X-Powered-By header (should be disabled)
159
+ { pattern: /x-powered-by/gi, issue: 'X-Powered-By header exposed' },
160
+ // Directory listing
161
+ { pattern: /serveIndex|directory\s*listing|autoindex/gi, issue: 'Directory listing may be enabled' },
162
+ // TRACE method (rarely needed)
163
+ { pattern: /app\.trace\s*\(/gi, issue: 'TRACE HTTP method enabled' },
164
+ // Debug endpoints
165
+ { pattern: /(?:\/debug|\/trace|\/dump|\/phpinfo)/gi, issue: 'Debug endpoint detected' },
166
+ ];
167
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
168
+ const line = lines[lineNum];
169
+ for (const { pattern, issue } of unnecessaryFeaturePatterns) {
170
+ pattern.lastIndex = 0;
171
+ if (pattern.test(line)) {
172
+ findings.push({
173
+ id: `owasp-a05-feature-${findings.length + 1}`,
174
+ ruleId: 'owasp-a05-security-misconfiguration',
175
+ severity: 'low',
176
+ message: `Unnecessary feature: ${issue}`,
177
+ location: {
178
+ file: context.filePath,
179
+ startLine: lineNum + 1,
180
+ endLine: lineNum + 1,
181
+ startColumn: 0,
182
+ endColumn: line.length,
183
+ },
184
+ suggestion: {
185
+ description: 'Disable unnecessary features',
186
+ example: `// Disable X-Powered-By:
187
+ app.disable('x-powered-by');
188
+ // Or use Helmet which does this automatically`,
189
+ },
190
+ });
191
+ break;
192
+ }
193
+ }
194
+ }
195
+ }
196
+ /**
197
+ * Check for missing security headers
198
+ */
199
+ function checkMissingHeaders(context, findings) {
200
+ const sourceCode = context.sourceCode;
201
+ // List of important security headers
202
+ const securityHeaders = [
203
+ 'Content-Security-Policy',
204
+ 'X-Content-Type-Options',
205
+ 'X-Frame-Options',
206
+ 'Strict-Transport-Security',
207
+ 'X-XSS-Protection',
208
+ ];
209
+ // Check if helmet is used (sets all headers)
210
+ if (sourceCode.includes('helmet'))
211
+ return;
212
+ // Check if it's a server file
213
+ const isServerFile = /express|createServer|fastify|koa/i.test(sourceCode);
214
+ if (isServerFile) {
215
+ const missingHeaders = securityHeaders.filter(header => !new RegExp(header, 'i').test(sourceCode));
216
+ if (missingHeaders.length > 0) {
217
+ findings.push({
218
+ id: `owasp-a05-header-${findings.length + 1}`,
219
+ ruleId: 'owasp-a05-security-misconfiguration',
220
+ severity: 'medium',
221
+ message: `Missing security headers: ${missingHeaders.join(', ')}`,
222
+ location: {
223
+ file: context.filePath,
224
+ startLine: 1,
225
+ endLine: 1,
226
+ startColumn: 0,
227
+ endColumn: 0,
228
+ },
229
+ suggestion: {
230
+ description: 'Use Helmet for comprehensive security headers',
231
+ example: `// Use Helmet for comprehensive security headers:
232
+ const helmet = require('helmet');
233
+ app.use(helmet());
234
+ // Or set individual headers:
235
+ app.use((req, res, next) => {
236
+ res.setHeader('X-Content-Type-Options', 'nosniff');
237
+ res.setHeader('X-Frame-Options', 'DENY');
238
+ next();
239
+ });`,
240
+ },
241
+ });
242
+ }
243
+ }
244
+ }
245
+ /**
246
+ * Check for development settings in production code
247
+ */
248
+ function checkDevSettings(context, findings) {
249
+ const sourceCode = context.sourceCode;
250
+ const lines = sourceCode.split('\n');
251
+ const devSettingsPatterns = [
252
+ // localhost in production
253
+ { pattern: /['"`](?:https?:\/\/)?localhost(?::\d+)?(?:\/[^'"`]*)?['"`]/gi, issue: 'localhost URL' },
254
+ { pattern: /['"`](?:https?:\/\/)?127\.0\.0\.1(?::\d+)?(?:\/[^'"`]*)?['"`]/gi, issue: '127.0.0.1 URL' },
255
+ // Development databases
256
+ { pattern: /mongodb:\/\/localhost/gi, issue: 'localhost MongoDB' },
257
+ { pattern: /redis:\/\/localhost/gi, issue: 'localhost Redis' },
258
+ // Debug flags
259
+ { pattern: /(?:DEBUG|VERBOSE|DEV_MODE)\s*[:=]\s*(?:true|1|['"`]1['"`])/gi, issue: 'Debug flag enabled' },
260
+ // TODO/FIXME for security
261
+ { pattern: /(?:TODO|FIXME)[^*\n]*(?:security|auth|password|token)/gi, issue: 'Security TODO/FIXME' },
262
+ ];
263
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
264
+ const line = lines[lineNum];
265
+ for (const { pattern, issue } of devSettingsPatterns) {
266
+ pattern.lastIndex = 0;
267
+ if (pattern.test(line)) {
268
+ // Check if it's conditional
269
+ const surroundingCode = lines.slice(Math.max(0, lineNum - 2), lineNum + 2).join('\n');
270
+ if (!isConditionalDevCode(surroundingCode)) {
271
+ findings.push({
272
+ id: `owasp-a05-dev-${findings.length + 1}`,
273
+ ruleId: 'owasp-a05-security-misconfiguration',
274
+ severity: 'medium',
275
+ message: `Development setting in code: ${issue}`,
276
+ location: {
277
+ file: context.filePath,
278
+ startLine: lineNum + 1,
279
+ endLine: lineNum + 1,
280
+ startColumn: 0,
281
+ endColumn: line.length,
282
+ },
283
+ suggestion: {
284
+ description: 'Use environment variables',
285
+ example: `// Use environment variables:
286
+ const dbUrl = process.env.DATABASE_URL || 'mongodb://localhost/dev';
287
+ // Or use conditional logic:
288
+ const apiUrl = process.env.NODE_ENV === 'production'
289
+ ? 'https://api.production.com'
290
+ : 'http://localhost:3000';`,
291
+ },
292
+ });
293
+ }
294
+ break;
295
+ }
296
+ }
297
+ }
298
+ }
299
+ /**
300
+ * Check for exposed environment variables
301
+ */
302
+ function checkExposedEnvironment(context, findings) {
303
+ const sourceCode = context.sourceCode;
304
+ const lines = sourceCode.split('\n');
305
+ const exposedEnvPatterns = [
306
+ // Sending all environment variables
307
+ { pattern: /res\.(?:send|json)\s*\([^)]*process\.env\s*\)/gi, issue: 'Full process.env in response' },
308
+ // Logging all environment
309
+ { pattern: /console\.log\s*\([^)]*process\.env\s*\)/gi, issue: 'Full process.env in console' },
310
+ // Config dump
311
+ { pattern: /JSON\.stringify\s*\([^)]*process\.env/gi, issue: 'process.env stringified' },
312
+ ];
313
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
314
+ const line = lines[lineNum];
315
+ for (const { pattern, issue } of exposedEnvPatterns) {
316
+ pattern.lastIndex = 0;
317
+ if (pattern.test(line)) {
318
+ findings.push({
319
+ id: `owasp-a05-env-${findings.length + 1}`,
320
+ ruleId: 'owasp-a05-security-misconfiguration',
321
+ severity: 'critical',
322
+ message: `Exposed environment: ${issue}`,
323
+ location: {
324
+ file: context.filePath,
325
+ startLine: lineNum + 1,
326
+ endLine: lineNum + 1,
327
+ startColumn: 0,
328
+ endColumn: line.length,
329
+ },
330
+ suggestion: {
331
+ description: 'Never expose full environment',
332
+ example: `// Never expose full environment:
333
+ // Instead, expose only safe values
334
+ const safeConfig = {
335
+ nodeEnv: process.env.NODE_ENV,
336
+ appVersion: process.env.APP_VERSION
337
+ };
338
+ res.json({ config: safeConfig });`,
339
+ },
340
+ });
341
+ break;
342
+ }
343
+ }
344
+ }
345
+ }
346
+ /**
347
+ * Check if code has production environment check
348
+ */
349
+ function hasProductionCheck(code) {
350
+ const prodCheckPatterns = [
351
+ /process\.env\.NODE_ENV/i,
352
+ /production/i,
353
+ /development/i,
354
+ /isProduction/i,
355
+ /isProd/i,
356
+ ];
357
+ return prodCheckPatterns.some(p => p.test(code));
358
+ }
359
+ /**
360
+ * Check if code is conditional development code
361
+ */
362
+ function isConditionalDevCode(code) {
363
+ const conditionalPatterns = [
364
+ /if\s*\([^)]*(?:NODE_ENV|development|production)/i,
365
+ /process\.env\.\w+\s*\|\|/i,
366
+ /\?\s*['"`]http/i,
367
+ ];
368
+ return conditionalPatterns.some(p => p.test(code));
369
+ }
370
+ export default owaspA05SecurityMisconfiguration;
371
+ //# sourceMappingURL=a05-security-misconfiguration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a05-security-misconfiguration.js","sourceRoot":"","sources":["../../../src/rules/owasp/a05-security-misconfiguration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @fileoverview OWASP A06:2021 - Vulnerable and Outdated Components
3
+ * @module @nahisaho/musubix-security/rules/owasp/a06
4
+ * @trace REQ-SEC-OWASP-006
5
+ */
6
+ import type { SecurityRule } from '../types.js';
7
+ /**
8
+ * OWASP A06:2021 - Vulnerable and Outdated Components
9
+ *
10
+ * Detects:
11
+ * - Known vulnerable package versions
12
+ * - Outdated dependencies
13
+ * - Using unmaintained packages
14
+ * - Missing integrity checks
15
+ */
16
+ export declare const owaspA06VulnerableComponents: SecurityRule;
17
+ export default owaspA06VulnerableComponents;
18
+ //# sourceMappingURL=a06-vulnerable-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a06-vulnerable-components.d.ts","sourceRoot":"","sources":["../../../src/rules/owasp/a06-vulnerable-components.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA2C,MAAM,aAAa,CAAC;AAEzF;;;;;;;;GAQG;AACH,eAAO,MAAM,4BAA4B,EAAE,YAsC1C,CAAC;AAoNF,eAAe,4BAA4B,CAAC"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * @fileoverview OWASP A06:2021 - Vulnerable and Outdated Components
3
+ * @module @nahisaho/musubix-security/rules/owasp/a06
4
+ * @trace REQ-SEC-OWASP-006
5
+ */
6
+ /**
7
+ * OWASP A06:2021 - Vulnerable and Outdated Components
8
+ *
9
+ * Detects:
10
+ * - Known vulnerable package versions
11
+ * - Outdated dependencies
12
+ * - Using unmaintained packages
13
+ * - Missing integrity checks
14
+ */
15
+ export const owaspA06VulnerableComponents = {
16
+ id: 'owasp-a06-vulnerable-components',
17
+ name: 'OWASP A06:2021 - Vulnerable and Outdated Components',
18
+ description: 'Detects use of components with known vulnerabilities or outdated dependencies',
19
+ defaultSeverity: 'high',
20
+ category: 'dependency',
21
+ owasp: ['A06:2021'],
22
+ cwe: ['1035', '1104', '937'],
23
+ references: [
24
+ {
25
+ title: 'OWASP A06:2021',
26
+ url: 'https://owasp.org/Top10/A06_2021-Vulnerable_and_Outdated_Components/',
27
+ },
28
+ {
29
+ title: 'CWE-1104: Use of Unmaintained Third Party Components',
30
+ url: 'https://cwe.mitre.org/data/definitions/1104.html',
31
+ },
32
+ ],
33
+ async analyze(context) {
34
+ const findings = [];
35
+ // Check for vulnerable patterns
36
+ checkVulnerablePatterns(context, findings);
37
+ // Check package.json if it's the target file
38
+ if (context.filePath.endsWith('package.json')) {
39
+ checkPackageJson(context, findings);
40
+ }
41
+ // Check for missing SRI in HTML/templates
42
+ checkMissingSRI(context, findings);
43
+ // Check for outdated CDN usage
44
+ checkOutdatedCDN(context, findings);
45
+ return findings;
46
+ },
47
+ };
48
+ /**
49
+ * Known vulnerable package patterns (simplified version)
50
+ */
51
+ const VULNERABLE_PATTERNS = [
52
+ // Lodash < 4.17.21
53
+ { pattern: /['"`]lodash['"`]\s*:\s*['"`](?:[0-3]\.|4\.(?:[0-9]|1[0-6])\.|4\.17\.(?:[0-9]|1[0-9]|20))['"`]/i, pkg: 'lodash', issue: 'Prototype pollution vulnerability' },
54
+ // jquery < 3.5.0
55
+ { pattern: /['"`]jquery['"`]\s*:\s*['"`](?:[0-2]\.|3\.[0-4]\.)['"`]/i, pkg: 'jquery', issue: 'XSS vulnerability in htmlPrefilter' },
56
+ // axios < 0.21.1
57
+ { pattern: /['"`]axios['"`]\s*:\s*['"`]0\.(?:[0-9]|1[0-9]|20)\./i, pkg: 'axios', issue: 'SSRF vulnerability' },
58
+ // minimist < 1.2.6
59
+ { pattern: /['"`]minimist['"`]\s*:\s*['"`](?:0\.|1\.[0-2]\.[0-5])['"`]/i, pkg: 'minimist', issue: 'Prototype pollution vulnerability' },
60
+ // serialize-javascript < 3.1.0
61
+ { pattern: /['"`]serialize-javascript['"`]\s*:\s*['"`][0-2]\.['"`]/i, pkg: 'serialize-javascript', issue: 'RCE vulnerability' },
62
+ // node-forge < 1.0.0
63
+ { pattern: /['"`]node-forge['"`]\s*:\s*['"`]0\.['"`]/i, pkg: 'node-forge', issue: 'Improper verification of cryptographic signature' },
64
+ // moment (unmaintained)
65
+ { pattern: /['"`]moment['"`]\s*:/i, pkg: 'moment', issue: 'Unmaintained - consider using date-fns or luxon' },
66
+ // request (deprecated)
67
+ { pattern: /['"`]request['"`]\s*:/i, pkg: 'request', issue: 'Deprecated - use axios, got, or node-fetch' },
68
+ // express-jwt < 6.0.0
69
+ { pattern: /['"`]express-jwt['"`]\s*:\s*['"`][0-5]\.['"`]/i, pkg: 'express-jwt', issue: 'Algorithm confusion vulnerability' },
70
+ ];
71
+ /**
72
+ * Check for vulnerable patterns in source code
73
+ */
74
+ function checkVulnerablePatterns(context, findings) {
75
+ const sourceCode = context.sourceCode;
76
+ const lines = sourceCode.split('\n');
77
+ // Check for importing known vulnerable packages
78
+ const importPatterns = [
79
+ // CommonJS require of vulnerable packages
80
+ { pattern: /require\s*\(\s*['"`]moment['"`]\s*\)/i, pkg: 'moment', issue: 'Unmaintained - consider using date-fns' },
81
+ { pattern: /require\s*\(\s*['"`]request['"`]\s*\)/i, pkg: 'request', issue: 'Deprecated package' },
82
+ // ES imports
83
+ { pattern: /import\s+.*\s+from\s+['"`]moment['"`]/i, pkg: 'moment', issue: 'Unmaintained - consider using date-fns' },
84
+ { pattern: /import\s+.*\s+from\s+['"`]request['"`]/i, pkg: 'request', issue: 'Deprecated package' },
85
+ // Using vulnerable crypto in Node.js
86
+ { pattern: /crypto\.createCipher\s*\(/i, pkg: 'crypto.createCipher', issue: 'Deprecated - use createCipheriv' },
87
+ ];
88
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
89
+ const line = lines[lineNum];
90
+ for (const { pattern, pkg, issue } of importPatterns) {
91
+ if (pattern.test(line)) {
92
+ findings.push({
93
+ id: `owasp-a06-import-${findings.length + 1}`,
94
+ ruleId: 'owasp-a06-vulnerable-components',
95
+ severity: 'medium',
96
+ message: `Potentially vulnerable or deprecated component: ${pkg} - ${issue}`,
97
+ location: {
98
+ file: context.filePath,
99
+ startLine: lineNum + 1,
100
+ endLine: lineNum + 1,
101
+ startColumn: 0,
102
+ endColumn: line.length,
103
+ },
104
+ suggestion: {
105
+ description: 'Consider using a maintained alternative',
106
+ example: pkg === 'moment'
107
+ ? `// Use date-fns instead:\nimport { format, parseISO } from 'date-fns';`
108
+ : pkg === 'request'
109
+ ? `// Use axios or got instead:\nimport axios from 'axios';`
110
+ : `// Use the recommended secure alternative`,
111
+ },
112
+ });
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ /**
119
+ * Check package.json for vulnerable dependencies
120
+ */
121
+ function checkPackageJson(context, findings) {
122
+ const sourceCode = context.sourceCode;
123
+ const lines = sourceCode.split('\n');
124
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
125
+ const line = lines[lineNum];
126
+ for (const { pattern, pkg, issue } of VULNERABLE_PATTERNS) {
127
+ if (pattern.test(line)) {
128
+ findings.push({
129
+ id: `owasp-a06-pkg-${findings.length + 1}`,
130
+ ruleId: 'owasp-a06-vulnerable-components',
131
+ severity: 'high',
132
+ message: `Vulnerable package version: ${pkg} - ${issue}`,
133
+ location: {
134
+ file: context.filePath,
135
+ startLine: lineNum + 1,
136
+ endLine: lineNum + 1,
137
+ startColumn: 0,
138
+ endColumn: line.length,
139
+ },
140
+ cwe: ['1104'],
141
+ suggestion: {
142
+ description: 'Update to the latest secure version',
143
+ example: `Run: npm audit fix\nOr: npm update ${pkg}`,
144
+ },
145
+ });
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ }
151
+ /**
152
+ * Check for missing Subresource Integrity (SRI)
153
+ */
154
+ function checkMissingSRI(context, findings) {
155
+ const sourceCode = context.sourceCode;
156
+ const lines = sourceCode.split('\n');
157
+ // Only check HTML-like files or templates
158
+ const isRelevantFile = /\.(html?|ejs|hbs|pug|vue|svelte|tsx?|jsx?)$/i.test(context.filePath);
159
+ if (!isRelevantFile)
160
+ return;
161
+ const sriPatterns = [
162
+ // Script tags from CDN without integrity
163
+ { pattern: /<script[^>]+src\s*=\s*['"`]https?:\/\/(?:cdn|unpkg|jsdelivr|cdnjs)[^'"`]+['"`][^>]*>/i, type: 'script' },
164
+ // Link tags from CDN without integrity
165
+ { pattern: /<link[^>]+href\s*=\s*['"`]https?:\/\/(?:cdn|unpkg|jsdelivr|cdnjs)[^'"`]+['"`][^>]*>/i, type: 'stylesheet' },
166
+ ];
167
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
168
+ const line = lines[lineNum];
169
+ for (const { pattern, type } of sriPatterns) {
170
+ if (pattern.test(line)) {
171
+ // Check if integrity attribute is present
172
+ if (!/integrity\s*=/i.test(line)) {
173
+ findings.push({
174
+ id: `owasp-a06-sri-${findings.length + 1}`,
175
+ ruleId: 'owasp-a06-vulnerable-components',
176
+ severity: 'medium',
177
+ message: `Missing Subresource Integrity (SRI) for external ${type}`,
178
+ location: {
179
+ file: context.filePath,
180
+ startLine: lineNum + 1,
181
+ endLine: lineNum + 1,
182
+ startColumn: 0,
183
+ endColumn: line.length,
184
+ },
185
+ cwe: ['353'],
186
+ suggestion: {
187
+ description: 'Add integrity and crossorigin attributes',
188
+ example: `<script src="https://cdn.example.com/lib.js"
189
+ integrity="sha384-..."
190
+ crossorigin="anonymous"></script>`,
191
+ },
192
+ });
193
+ }
194
+ break;
195
+ }
196
+ }
197
+ }
198
+ }
199
+ /**
200
+ * Check for outdated CDN URLs
201
+ */
202
+ function checkOutdatedCDN(context, findings) {
203
+ const sourceCode = context.sourceCode;
204
+ const lines = sourceCode.split('\n');
205
+ const outdatedCDNPatterns = [
206
+ // Old jQuery versions
207
+ { pattern: /jquery[\/\-]([0-2]\.[0-9]+|3\.[0-4]\.[0-9]+)/i, lib: 'jQuery', issue: 'outdated version' },
208
+ // Old Bootstrap versions
209
+ { pattern: /bootstrap[\/\-]([0-3]\.[0-9]+|4\.[0-5]\.[0-9]+)/i, lib: 'Bootstrap', issue: 'outdated version' },
210
+ // Old Angular versions
211
+ { pattern: /angular[\/\-](1\.[0-7]\.[0-9]+)/i, lib: 'AngularJS', issue: 'legacy version' },
212
+ // HTTP instead of HTTPS for CDN
213
+ { pattern: /['"`]http:\/\/(?:cdn|unpkg|jsdelivr|cdnjs)/i, lib: 'CDN', issue: 'using HTTP instead of HTTPS' },
214
+ ];
215
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
216
+ const line = lines[lineNum];
217
+ for (const { pattern, lib, issue } of outdatedCDNPatterns) {
218
+ if (pattern.test(line)) {
219
+ findings.push({
220
+ id: `owasp-a06-cdn-${findings.length + 1}`,
221
+ ruleId: 'owasp-a06-vulnerable-components',
222
+ severity: lib === 'CDN' ? 'high' : 'medium',
223
+ message: `Potentially ${issue}: ${lib}`,
224
+ location: {
225
+ file: context.filePath,
226
+ startLine: lineNum + 1,
227
+ endLine: lineNum + 1,
228
+ startColumn: 0,
229
+ endColumn: line.length,
230
+ },
231
+ suggestion: {
232
+ description: lib === 'CDN'
233
+ ? 'Always use HTTPS for external resources'
234
+ : `Update ${lib} to the latest version`,
235
+ },
236
+ });
237
+ break;
238
+ }
239
+ }
240
+ }
241
+ }
242
+ export default owaspA06VulnerableComponents;
243
+ //# sourceMappingURL=a06-vulnerable-components.js.map