@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,281 @@
1
+ /**
2
+ * @fileoverview Rule Registry - Manages rule registration and retrieval
3
+ * @module @nahisaho/musubix-security/rules/engine/rule-registry
4
+ * @trace REQ-RULE-003
5
+ */
6
+ /**
7
+ * Rule Registry
8
+ * Manages registration and retrieval of security rules
9
+ */
10
+ export class RuleRegistry {
11
+ rules = new Map();
12
+ rulesByCategory = new Map([
13
+ ['owasp', new Set()],
14
+ ['cwe', new Set()],
15
+ ['custom', new Set()],
16
+ ]);
17
+ rulesByTag = new Map();
18
+ /**
19
+ * Register a rule
20
+ * @param rule The rule to register
21
+ * @param overwrite Whether to overwrite existing rule with same ID
22
+ */
23
+ register(rule, overwrite = false) {
24
+ if (this.rules.has(rule.id) && !overwrite) {
25
+ throw new Error(`Rule ${rule.id} is already registered`);
26
+ }
27
+ // If overwriting, clean up old indexes first
28
+ if (this.rules.has(rule.id)) {
29
+ this.unregister(rule.id);
30
+ }
31
+ this.rules.set(rule.id, rule);
32
+ // Categorize by ID prefix
33
+ const category = this.categorizeRule(rule.id);
34
+ this.rulesByCategory.get(category)?.add(rule.id);
35
+ // Index by tags
36
+ if (rule.tags) {
37
+ for (const tag of rule.tags) {
38
+ if (!this.rulesByTag.has(tag)) {
39
+ this.rulesByTag.set(tag, new Set());
40
+ }
41
+ this.rulesByTag.get(tag).add(rule.id);
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Register multiple rules
47
+ */
48
+ registerAll(rules) {
49
+ for (const rule of rules) {
50
+ this.register(rule);
51
+ }
52
+ }
53
+ /**
54
+ * Unregister a rule
55
+ */
56
+ unregister(ruleId) {
57
+ const rule = this.rules.get(ruleId);
58
+ if (!rule)
59
+ return false;
60
+ this.rules.delete(ruleId);
61
+ // Remove from category index
62
+ const category = this.categorizeRule(ruleId);
63
+ this.rulesByCategory.get(category)?.delete(ruleId);
64
+ // Remove from tag index
65
+ if (rule.tags) {
66
+ for (const tag of rule.tags) {
67
+ this.rulesByTag.get(tag)?.delete(ruleId);
68
+ }
69
+ }
70
+ return true;
71
+ }
72
+ /**
73
+ * Get a rule by ID
74
+ */
75
+ get(ruleId) {
76
+ return this.rules.get(ruleId);
77
+ }
78
+ /**
79
+ * Check if a rule exists
80
+ */
81
+ has(ruleId) {
82
+ return this.rules.has(ruleId);
83
+ }
84
+ /**
85
+ * Get all registered rules
86
+ */
87
+ getAll() {
88
+ return Array.from(this.rules.values());
89
+ }
90
+ /**
91
+ * Get rules by filter
92
+ */
93
+ getFiltered(filter, config) {
94
+ let ruleIds;
95
+ // Start with all rules or category-filtered
96
+ if (filter.category && filter.category !== 'all') {
97
+ ruleIds = new Set(this.rulesByCategory.get(filter.category) ?? []);
98
+ }
99
+ else {
100
+ ruleIds = new Set(this.rules.keys());
101
+ }
102
+ // Filter by specific IDs
103
+ if (filter.ids && filter.ids.length > 0) {
104
+ const idSet = new Set(filter.ids);
105
+ ruleIds = new Set([...ruleIds].filter(id => idSet.has(id)));
106
+ }
107
+ // Filter by tags
108
+ if (filter.tags && filter.tags.length > 0) {
109
+ const tagRules = new Set();
110
+ for (const tag of filter.tags) {
111
+ const rulesWithTag = this.rulesByTag.get(tag);
112
+ if (rulesWithTag) {
113
+ for (const id of rulesWithTag) {
114
+ tagRules.add(id);
115
+ }
116
+ }
117
+ }
118
+ ruleIds = new Set([...ruleIds].filter(id => tagRules.has(id)));
119
+ }
120
+ // Filter by detection method
121
+ if (filter.detectionMethod) {
122
+ ruleIds = new Set([...ruleIds].filter(id => {
123
+ const rule = this.rules.get(id);
124
+ return rule?.detectionMethod === filter.detectionMethod;
125
+ }));
126
+ }
127
+ // Filter by enabled status
128
+ if (filter.enabledOnly && config) {
129
+ ruleIds = new Set([...ruleIds].filter(id => this.isRuleEnabled(id, config)));
130
+ }
131
+ return [...ruleIds]
132
+ .map(id => this.rules.get(id))
133
+ .filter(Boolean);
134
+ }
135
+ /**
136
+ * Get rules by category
137
+ */
138
+ getByCategory(category) {
139
+ if (category === 'all') {
140
+ return this.getAll();
141
+ }
142
+ const ids = this.rulesByCategory.get(category) ?? new Set();
143
+ return [...ids].map(id => this.rules.get(id)).filter(Boolean);
144
+ }
145
+ /**
146
+ * Get rules by tag
147
+ */
148
+ getByTag(tag) {
149
+ const ids = this.rulesByTag.get(tag) ?? new Set();
150
+ return [...ids].map(id => this.rules.get(id)).filter(Boolean);
151
+ }
152
+ /**
153
+ * Get enabled rules based on config
154
+ */
155
+ getEnabled(config) {
156
+ return this.getFiltered({ enabledOnly: true }, config);
157
+ }
158
+ /**
159
+ * Check if a rule is enabled
160
+ */
161
+ isRuleEnabled(ruleId, config) {
162
+ const ruleSettings = config.rules[ruleId];
163
+ // Explicit setting
164
+ if (ruleSettings !== undefined) {
165
+ return ruleSettings.enabled;
166
+ }
167
+ // Default based on profile
168
+ switch (config.profile) {
169
+ case 'strict':
170
+ return true; // All rules enabled
171
+ case 'permissive':
172
+ // Only critical/high by default
173
+ const rule = this.rules.get(ruleId);
174
+ return rule?.defaultSeverity === 'critical' || rule?.defaultSeverity === 'high';
175
+ case 'standard':
176
+ default:
177
+ return true; // All rules enabled by default
178
+ }
179
+ }
180
+ /**
181
+ * Get rule settings with defaults
182
+ */
183
+ getRuleSettings(ruleId, config) {
184
+ const rule = this.rules.get(ruleId);
185
+ const customSettings = config.rules[ruleId];
186
+ return {
187
+ enabled: this.isRuleEnabled(ruleId, config),
188
+ severity: customSettings?.severity ?? rule?.defaultSeverity,
189
+ options: customSettings?.options ?? {},
190
+ };
191
+ }
192
+ /**
193
+ * Get rule count
194
+ */
195
+ get size() {
196
+ return this.rules.size;
197
+ }
198
+ /**
199
+ * Get rule count (alias for size)
200
+ */
201
+ count() {
202
+ return this.rules.size;
203
+ }
204
+ /**
205
+ * Get all rule IDs
206
+ */
207
+ getIds() {
208
+ return Array.from(this.rules.keys());
209
+ }
210
+ /**
211
+ * Get all tags
212
+ */
213
+ getTags() {
214
+ return Array.from(this.rulesByTag.keys());
215
+ }
216
+ /**
217
+ * Get rules by severity
218
+ */
219
+ getBySeverity(severity) {
220
+ return this.getAll().filter(rule => rule.defaultSeverity === severity);
221
+ }
222
+ /**
223
+ * Get rules by detection method
224
+ */
225
+ getByDetectionMethod(method) {
226
+ return this.getAll().filter(rule => rule.detectionMethod === method);
227
+ }
228
+ /**
229
+ * Filter rules by predicate
230
+ */
231
+ filter(predicate) {
232
+ return this.getAll().filter(predicate);
233
+ }
234
+ /**
235
+ * Clear all rules
236
+ */
237
+ clear() {
238
+ this.rules.clear();
239
+ this.rulesByCategory.forEach(set => set.clear());
240
+ this.rulesByTag.clear();
241
+ }
242
+ /**
243
+ * Categorize rule by ID prefix
244
+ */
245
+ categorizeRule(ruleId) {
246
+ const upper = ruleId.toUpperCase();
247
+ if (upper.startsWith('OWASP') || upper.startsWith('A0')) {
248
+ return 'owasp';
249
+ }
250
+ if (upper.startsWith('CWE')) {
251
+ return 'cwe';
252
+ }
253
+ return 'custom';
254
+ }
255
+ }
256
+ /**
257
+ * Global rule registry instance
258
+ */
259
+ let globalRegistry = null;
260
+ /**
261
+ * Get or create global registry
262
+ */
263
+ export function getGlobalRegistry() {
264
+ if (!globalRegistry) {
265
+ globalRegistry = new RuleRegistry();
266
+ }
267
+ return globalRegistry;
268
+ }
269
+ /**
270
+ * Create a new registry (for isolated use)
271
+ */
272
+ export function createRegistry() {
273
+ return new RuleRegistry();
274
+ }
275
+ /**
276
+ * Reset global registry (for testing)
277
+ */
278
+ export function resetGlobalRegistry() {
279
+ globalRegistry = null;
280
+ }
281
+ //# sourceMappingURL=rule-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-registry.js","sourceRoot":"","sources":["../../../src/rules/engine/rule-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Rules Module Exports
3
+ * @module @nahisaho/musubix-security/rules
4
+ */
5
+ export type { SecurityRule, RuleContext, RuleFinding, RuleResult, RuleConfig, RuleSettings, FixSuggestion, SourceLocation, DetectionMethod, RuleSeverity, AnalysisProgress, AnalysisReport, AnalysisSummary, RuleEngineOptions as RuleEngineOptionsBase, } from './types.js';
6
+ export { SEVERITY_ORDER, DEFAULT_RULE_CONFIG, meetsSeverityThreshold, } from './types.js';
7
+ export { RuleEngine, createRuleEngine, RuleRegistry, getGlobalRegistry, createRegistry, RuleContextBuilder, createContextBuilder, } from './engine/index.js';
8
+ export type { RuleEngineOptions, RuleEngineProgress, RuleEngineResult, RuleEngineError, RuleEngineSummary, RuleContextBuildOptions, } from './engine/index.js';
9
+ export { parseConfig, loadConfigFile, findConfigFile, loadProjectConfig, createConfigBuilder, validateConfig, writeConfigFile, ConfigBuilder, DEFAULT_CONFIG, getProfile, getProfileNames, hasProfile, getProfileRuleIds, mergeProfileConfig, PROFILES, PROFILE_MINIMAL, PROFILE_STANDARD, PROFILE_STRICT, PROFILE_OWASP, PROFILE_CWE, } from './config/index.js';
10
+ export type { RawRuleConfig, RawRuleSettings, ParseResult, ConfigFormat, RuleProfile, ProfileRuleConfig, } from './config/index.js';
11
+ export { owaspA01BrokenAccessControl, owaspA02CryptographicFailures, owaspA03Injection, owaspA04InsecureDesign, owaspA05SecurityMisconfiguration, owaspRulesA01A05, } from './owasp/index.js';
12
+ export { owaspA06VulnerableComponents, owaspA07AuthFailures, owaspA08IntegrityFailures, owaspA09LoggingFailures, owaspA10SSRF, owaspRulesA06A10, owaspTop10Rules, } from './owasp/index.js';
13
+ export { cwe787OutOfBoundsWrite, cwe79XSS, cwe89SQLInjection, cwe416UseAfterFree, cwe78CommandInjection, cwe20InputValidation, cwe125OutOfBoundsRead, cwe22PathTraversal, cwe352CSRF, cwe434FileUpload, cwe862MissingAuth, cwe476NullDeref, cwe287ImproperAuth, cweTop25Rules1to13, cweTop25Rules, } from './cwe/index.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EACd,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,iBAAiB,IAAI,qBAAqB,GAC3C,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,YAAY,EACZ,WAAW,EACX,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,iBAAiB,EACjB,sBAAsB,EACtB,gCAAgC,EAChC,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,sBAAsB,EACtB,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @fileoverview Rules Module Exports
3
+ * @module @nahisaho/musubix-security/rules
4
+ */
5
+ export { SEVERITY_ORDER, DEFAULT_RULE_CONFIG, meetsSeverityThreshold, } from './types.js';
6
+ // Engine
7
+ export { RuleEngine, createRuleEngine, RuleRegistry, getGlobalRegistry, createRegistry, RuleContextBuilder, createContextBuilder, } from './engine/index.js';
8
+ // Config
9
+ export { parseConfig, loadConfigFile, findConfigFile, loadProjectConfig, createConfigBuilder, validateConfig, writeConfigFile, ConfigBuilder, DEFAULT_CONFIG, getProfile, getProfileNames, hasProfile, getProfileRuleIds, mergeProfileConfig, PROFILES, PROFILE_MINIMAL, PROFILE_STANDARD, PROFILE_STRICT, PROFILE_OWASP, PROFILE_CWE, } from './config/index.js';
10
+ // OWASP A01-A05 Rules (TSK-RULE-003)
11
+ export { owaspA01BrokenAccessControl, owaspA02CryptographicFailures, owaspA03Injection, owaspA04InsecureDesign, owaspA05SecurityMisconfiguration, owaspRulesA01A05, } from './owasp/index.js';
12
+ // OWASP A06-A10 Rules (TSK-RULE-004)
13
+ export { owaspA06VulnerableComponents, owaspA07AuthFailures, owaspA08IntegrityFailures, owaspA09LoggingFailures, owaspA10SSRF, owaspRulesA06A10, owaspTop10Rules, } from './owasp/index.js';
14
+ // CWE Top 25 Rules (1-13) (TSK-RULE-005)
15
+ export { cwe787OutOfBoundsWrite, cwe79XSS, cwe89SQLInjection, cwe416UseAfterFree, cwe78CommandInjection, cwe20InputValidation, cwe125OutOfBoundsRead, cwe22PathTraversal, cwe352CSRF, cwe434FileUpload, cwe862MissingAuth, cwe476NullDeref, cwe287ImproperAuth, cweTop25Rules1to13, cweTop25Rules, } from './cwe/index.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAW3B,SAAS;AACT,OAAO,EACL,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,UAAU,EACV,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAW3B,qCAAqC;AACrC,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,iBAAiB,EACjB,sBAAsB,EACtB,gCAAgC,EAChC,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,qCAAqC;AACrC,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,yCAAyC;AACzC,OAAO,EACL,sBAAsB,EACtB,QAAQ,EACR,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,GACd,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @fileoverview OWASP A01:2021 - Broken Access Control Rule
3
+ * @module @nahisaho/musubix-security/rules/owasp/a01-broken-access-control
4
+ * @trace TSK-RULE-003
5
+ *
6
+ * Detects:
7
+ * - Missing authorization checks
8
+ * - Direct object references without validation
9
+ * - Path traversal vulnerabilities
10
+ * - CORS misconfigurations
11
+ * - Privilege escalation patterns
12
+ */
13
+ import type { SecurityRule } from '../types.js';
14
+ /**
15
+ * OWASP A01 - Broken Access Control
16
+ */
17
+ export declare const owaspA01BrokenAccessControl: SecurityRule;
18
+ export default owaspA01BrokenAccessControl;
19
+ //# sourceMappingURL=a01-broken-access-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a01-broken-access-control.d.ts","sourceRoot":"","sources":["../../../src/rules/owasp/a01-broken-access-control.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,YAoCzC,CAAC;AAmRF,eAAe,2BAA2B,CAAC"}
@@ -0,0 +1,295 @@
1
+ /**
2
+ * @fileoverview OWASP A01:2021 - Broken Access Control Rule
3
+ * @module @nahisaho/musubix-security/rules/owasp/a01-broken-access-control
4
+ * @trace TSK-RULE-003
5
+ *
6
+ * Detects:
7
+ * - Missing authorization checks
8
+ * - Direct object references without validation
9
+ * - Path traversal vulnerabilities
10
+ * - CORS misconfigurations
11
+ * - Privilege escalation patterns
12
+ */
13
+ /**
14
+ * OWASP A01 - Broken Access Control
15
+ */
16
+ export const owaspA01BrokenAccessControl = {
17
+ id: 'owasp-a01-broken-access-control',
18
+ name: 'OWASP A01:2021 - Broken Access Control',
19
+ description: 'Detects missing or improper access control implementations that could allow unauthorized access to resources',
20
+ defaultSeverity: 'critical',
21
+ detectionMethod: 'combined',
22
+ tags: ['owasp', 'access-control', 'authorization', 'security'],
23
+ owasp: ['A01:2021'],
24
+ cwe: ['284', '285', '639', '862', '863'],
25
+ references: [
26
+ { title: 'OWASP A01:2021 - Broken Access Control', url: 'https://owasp.org/Top10/A01_2021-Broken_Access_Control/' },
27
+ { title: 'CWE-284: Improper Access Control', url: 'https://cwe.mitre.org/data/definitions/284.html' },
28
+ ],
29
+ async analyze(context) {
30
+ const findings = [];
31
+ const sourceFile = context.sourceFile;
32
+ if (!sourceFile)
33
+ return findings;
34
+ // Check for route handlers without auth middleware
35
+ checkMissingAuthMiddleware(context, findings);
36
+ // Check for direct object references
37
+ checkDirectObjectReferences(context, findings);
38
+ // Check for CORS misconfigurations
39
+ checkCorsMisconfigurations(context, findings);
40
+ // Check for path traversal patterns
41
+ checkPathTraversal(context, findings);
42
+ // Check for admin/privileged operations without checks
43
+ checkPrivilegedOperations(context, findings);
44
+ return findings;
45
+ },
46
+ };
47
+ /**
48
+ * Check for route handlers that lack authentication middleware
49
+ */
50
+ function checkMissingAuthMiddleware(context, findings) {
51
+ const sourceCode = context.sourceCode;
52
+ // Pattern: Express-style routes without auth middleware
53
+ const routePatterns = [
54
+ /app\.(get|post|put|delete|patch)\s*\(\s*(['"`][^'"`]*['"`])\s*,\s*(?!.*auth)/gi,
55
+ /router\.(get|post|put|delete|patch)\s*\(\s*(['"`][^'"`]*['"`])\s*,\s*(?!.*auth)/gi,
56
+ ];
57
+ // Sensitive endpoint patterns
58
+ const sensitiveEndpoints = [
59
+ /\/admin/i,
60
+ /\/api\/users/i,
61
+ /\/api\/settings/i,
62
+ /\/api\/config/i,
63
+ /\/api\/private/i,
64
+ /\/delete/i,
65
+ /\/edit/i,
66
+ /\/update/i,
67
+ ];
68
+ for (const pattern of routePatterns) {
69
+ let match;
70
+ while ((match = pattern.exec(sourceCode)) !== null) {
71
+ const endpoint = match[2];
72
+ // Check if it's a sensitive endpoint
73
+ if (sensitiveEndpoints.some(p => p.test(endpoint))) {
74
+ const lines = sourceCode.substring(0, match.index).split('\n');
75
+ const line = lines.length;
76
+ findings.push({
77
+ id: `owasp-a01-${findings.length + 1}`,
78
+ ruleId: 'owasp-a01-broken-access-control',
79
+ severity: 'high',
80
+ message: `Sensitive endpoint ${endpoint} may lack authentication middleware`,
81
+ location: {
82
+ file: context.filePath,
83
+ startLine: line,
84
+ endLine: line,
85
+ startColumn: 0,
86
+ endColumn: match[0].length,
87
+ },
88
+ suggestion: {
89
+ description: 'Add authentication middleware before the route handler',
90
+ example: `// Add auth middleware: app.${match[1]}(${endpoint}, authMiddleware, handler)`,
91
+ },
92
+ });
93
+ }
94
+ }
95
+ }
96
+ }
97
+ /**
98
+ * Check for insecure direct object references (IDOR)
99
+ */
100
+ function checkDirectObjectReferences(context, findings) {
101
+ const sourceCode = context.sourceCode;
102
+ const lines = sourceCode.split('\n');
103
+ // Patterns indicating IDOR vulnerabilities
104
+ const idorPatterns = [
105
+ // Direct use of user-provided ID without ownership check
106
+ /(?:req\.params|req\.query|req\.body)\s*\.\s*(?:id|userId|user_id)/gi,
107
+ // Direct database queries with user input
108
+ /findById\s*\(\s*(?:req\.params|req\.query|req\.body)/gi,
109
+ /where\s*:\s*\{\s*id\s*:\s*(?:req\.params|req\.query)/gi,
110
+ ];
111
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
112
+ const line = lines[lineNum];
113
+ for (const pattern of idorPatterns) {
114
+ pattern.lastIndex = 0;
115
+ if (pattern.test(line)) {
116
+ // Check if there's no ownership/authorization check nearby
117
+ const surroundingCode = lines.slice(Math.max(0, lineNum - 5), lineNum + 5).join('\n');
118
+ if (!hasAuthorizationCheck(surroundingCode)) {
119
+ findings.push({
120
+ id: `owasp-a01-idor-${findings.length + 1}`,
121
+ ruleId: 'owasp-a01-broken-access-control',
122
+ severity: 'high',
123
+ message: 'Potential Insecure Direct Object Reference (IDOR) - user-provided ID used without ownership verification',
124
+ location: {
125
+ file: context.filePath,
126
+ startLine: lineNum + 1,
127
+ endLine: lineNum + 1,
128
+ startColumn: 0,
129
+ endColumn: line.length,
130
+ },
131
+ suggestion: {
132
+ description: 'Verify resource ownership before allowing access',
133
+ example: '// Add ownership check: if (resource.userId !== req.user.id) return res.status(403).json({ error: "Forbidden" })',
134
+ },
135
+ });
136
+ }
137
+ break;
138
+ }
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Check for CORS misconfigurations
144
+ */
145
+ function checkCorsMisconfigurations(context, findings) {
146
+ const sourceCode = context.sourceCode;
147
+ const lines = sourceCode.split('\n');
148
+ const corsPatterns = [
149
+ // Wildcard origin
150
+ { pattern: /['"`]\*['"`]/g, message: 'CORS allows all origins (*)' },
151
+ // Reflecting origin without validation
152
+ { pattern: /origin\s*:\s*(?:req\.headers\.origin|true)/gi, message: 'CORS reflects any origin' },
153
+ // credentials with wildcard
154
+ { pattern: /credentials\s*:\s*true.*origin\s*:\s*['"`]\*['"`]/gi, message: 'CORS allows credentials with wildcard origin' },
155
+ ];
156
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
157
+ const line = lines[lineNum];
158
+ for (const { pattern, message } of corsPatterns) {
159
+ pattern.lastIndex = 0;
160
+ if (pattern.test(line)) {
161
+ findings.push({
162
+ id: `owasp-a01-cors-${findings.length + 1}`,
163
+ ruleId: 'owasp-a01-broken-access-control',
164
+ severity: 'medium',
165
+ message: `CORS misconfiguration: ${message}`,
166
+ location: {
167
+ file: context.filePath,
168
+ startLine: lineNum + 1,
169
+ endLine: lineNum + 1,
170
+ startColumn: 0,
171
+ endColumn: line.length,
172
+ },
173
+ suggestion: {
174
+ description: 'Restrict CORS to specific trusted origins',
175
+ example: "// Use specific origins: origin: ['https://trusted-domain.com']",
176
+ },
177
+ });
178
+ break;
179
+ }
180
+ }
181
+ }
182
+ }
183
+ /**
184
+ * Check for path traversal vulnerabilities
185
+ */
186
+ function checkPathTraversal(context, findings) {
187
+ const sourceCode = context.sourceCode;
188
+ const lines = sourceCode.split('\n');
189
+ // Patterns for potential path traversal
190
+ const pathPatterns = [
191
+ /path\.join\s*\([^)]*(?:req\.params|req\.query|req\.body)/gi,
192
+ /fs\.(?:readFile|readdir|writeFile|unlink|stat)\s*\([^)]*(?:req\.params|req\.query)/gi,
193
+ /res\.sendFile\s*\([^)]*(?:req\.params|req\.query)/gi,
194
+ ];
195
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
196
+ const line = lines[lineNum];
197
+ for (const pattern of pathPatterns) {
198
+ pattern.lastIndex = 0;
199
+ if (pattern.test(line)) {
200
+ // Check if there's path normalization
201
+ if (!line.includes('normalize') && !line.includes('realpath') && !line.includes('sanitize')) {
202
+ findings.push({
203
+ id: `owasp-a01-path-${findings.length + 1}`,
204
+ ruleId: 'owasp-a01-broken-access-control',
205
+ severity: 'high',
206
+ message: 'Potential path traversal vulnerability - user input used in file path without sanitization',
207
+ location: {
208
+ file: context.filePath,
209
+ startLine: lineNum + 1,
210
+ endLine: lineNum + 1,
211
+ startColumn: 0,
212
+ endColumn: line.length,
213
+ },
214
+ suggestion: {
215
+ description: 'Sanitize and validate file paths to prevent directory traversal',
216
+ example: `// Use path.normalize() and verify path doesn't escape base directory
217
+ const safePath = path.normalize(userInput).replace(/^(\\.\\.\\/)+/, '');
218
+ if (!safePath.startsWith(baseDir)) throw new Error('Invalid path');`,
219
+ },
220
+ });
221
+ }
222
+ break;
223
+ }
224
+ }
225
+ }
226
+ }
227
+ /**
228
+ * Check for privileged operations without authorization checks
229
+ */
230
+ function checkPrivilegedOperations(context, findings) {
231
+ const sourceCode = context.sourceCode;
232
+ const lines = sourceCode.split('\n');
233
+ // Privileged operation patterns
234
+ const privilegedPatterns = [
235
+ { pattern: /\.destroy\s*\(/gi, operation: 'delete' },
236
+ { pattern: /\.delete\s*\(/gi, operation: 'delete' },
237
+ { pattern: /\.remove\s*\(/gi, operation: 'delete' },
238
+ { pattern: /role\s*[:=]\s*['"`]admin['"`]/gi, operation: 'role assignment' },
239
+ { pattern: /isAdmin\s*[:=]\s*true/gi, operation: 'admin flag' },
240
+ { pattern: /\.executeRaw\s*\(/gi, operation: 'raw SQL execution' },
241
+ { pattern: /eval\s*\(/gi, operation: 'code evaluation' },
242
+ ];
243
+ for (let lineNum = 0; lineNum < lines.length; lineNum++) {
244
+ const line = lines[lineNum];
245
+ for (const { pattern, operation } of privilegedPatterns) {
246
+ pattern.lastIndex = 0;
247
+ if (pattern.test(line)) {
248
+ // Check surrounding context for authorization
249
+ const surroundingCode = lines.slice(Math.max(0, lineNum - 10), lineNum + 1).join('\n');
250
+ if (!hasAuthorizationCheck(surroundingCode)) {
251
+ findings.push({
252
+ id: `owasp-a01-priv-${findings.length + 1}`,
253
+ ruleId: 'owasp-a01-broken-access-control',
254
+ severity: 'high',
255
+ message: `Privileged operation (${operation}) without visible authorization check`,
256
+ location: {
257
+ file: context.filePath,
258
+ startLine: lineNum + 1,
259
+ endLine: lineNum + 1,
260
+ startColumn: 0,
261
+ endColumn: line.length,
262
+ },
263
+ suggestion: {
264
+ description: 'Add authorization check before privileged operations',
265
+ example: '// Add: if (!user.hasPermission("admin")) throw new ForbiddenError();',
266
+ },
267
+ });
268
+ }
269
+ break;
270
+ }
271
+ }
272
+ }
273
+ }
274
+ /**
275
+ * Check if code contains authorization checks
276
+ */
277
+ function hasAuthorizationCheck(code) {
278
+ const authPatterns = [
279
+ /isAuth/i,
280
+ /isAdmin/i,
281
+ /authorize/i,
282
+ /hasPermission/i,
283
+ /hasRole/i,
284
+ /checkAuth/i,
285
+ /requireAuth/i,
286
+ /guard/i,
287
+ /canAccess/i,
288
+ /userId\s*===\s*req\.user/i,
289
+ /req\.user\.id\s*===\s*/i,
290
+ /\.where\s*\([^)]*userId/i,
291
+ ];
292
+ return authPatterns.some(p => p.test(code));
293
+ }
294
+ export default owaspA01BrokenAccessControl;
295
+ //# sourceMappingURL=a01-broken-access-control.js.map