shield360 1.1.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +330 -3
  2. package/dist/__tests__/build-info.test.js +8 -1
  3. package/dist/__tests__/build-info.test.js.map +1 -1
  4. package/dist/__tests__/code-location.test.js +1 -1
  5. package/dist/__tests__/destination.test.js +15 -0
  6. package/dist/__tests__/destination.test.js.map +1 -1
  7. package/dist/__tests__/masking.test.d.ts +1 -0
  8. package/dist/__tests__/masking.test.js +66 -0
  9. package/dist/__tests__/masking.test.js.map +1 -0
  10. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  11. package/dist/__tests__/register.e2e.test.js +279 -0
  12. package/dist/__tests__/register.e2e.test.js.map +1 -0
  13. package/dist/__tests__/register.test.js +60 -0
  14. package/dist/__tests__/register.test.js.map +1 -1
  15. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  16. package/dist/agents/__tests__/agents.test.js +529 -0
  17. package/dist/agents/__tests__/agents.test.js.map +1 -0
  18. package/dist/agents/index.d.ts +15 -0
  19. package/dist/agents/index.js +25 -0
  20. package/dist/agents/index.js.map +1 -0
  21. package/dist/agents/passport.d.ts +92 -0
  22. package/dist/agents/passport.js +301 -0
  23. package/dist/agents/passport.js.map +1 -0
  24. package/dist/agents/policy.d.ts +24 -0
  25. package/dist/agents/policy.js +93 -0
  26. package/dist/agents/policy.js.map +1 -0
  27. package/dist/agents/replay.d.ts +20 -0
  28. package/dist/agents/replay.js +47 -0
  29. package/dist/agents/replay.js.map +1 -0
  30. package/dist/agents/report.d.ts +30 -0
  31. package/dist/agents/report.js +93 -0
  32. package/dist/agents/report.js.map +1 -0
  33. package/dist/agents/types.d.ts +148 -0
  34. package/dist/agents/types.js +37 -0
  35. package/dist/agents/types.js.map +1 -0
  36. package/dist/agents/verifier.d.ts +33 -0
  37. package/dist/agents/verifier.js +276 -0
  38. package/dist/agents/verifier.js.map +1 -0
  39. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  40. package/dist/ai-security/__tests__/bench.test.js +50 -0
  41. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  42. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/checks.test.js +248 -0
  44. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/config.test.js +164 -0
  47. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/detection.test.js +114 -0
  50. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  52. package/dist/ai-security/__tests__/fixtures.js +30 -0
  53. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  54. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  55. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  56. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  57. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/stream.test.js +85 -0
  59. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  60. package/dist/ai-security/config.d.ts +94 -0
  61. package/dist/ai-security/config.js +241 -0
  62. package/dist/ai-security/config.js.map +1 -0
  63. package/dist/ai-security/context.d.ts +45 -0
  64. package/dist/ai-security/context.js +108 -0
  65. package/dist/ai-security/context.js.map +1 -0
  66. package/dist/ai-security/custom-kinds.d.ts +23 -0
  67. package/dist/ai-security/custom-kinds.js +97 -0
  68. package/dist/ai-security/custom-kinds.js.map +1 -0
  69. package/dist/ai-security/events.d.ts +77 -0
  70. package/dist/ai-security/events.js +153 -0
  71. package/dist/ai-security/events.js.map +1 -0
  72. package/dist/ai-security/hooks.d.ts +48 -0
  73. package/dist/ai-security/hooks.js +461 -0
  74. package/dist/ai-security/hooks.js.map +1 -0
  75. package/dist/ai-security/index.d.ts +209 -0
  76. package/dist/ai-security/index.js +587 -0
  77. package/dist/ai-security/index.js.map +1 -0
  78. package/dist/ai-security/injection-rules.json +1024 -0
  79. package/dist/ai-security/injection.d.ts +46 -0
  80. package/dist/ai-security/injection.js +635 -0
  81. package/dist/ai-security/injection.js.map +1 -0
  82. package/dist/ai-security/jailbreak.d.ts +38 -0
  83. package/dist/ai-security/jailbreak.js +73 -0
  84. package/dist/ai-security/jailbreak.js.map +1 -0
  85. package/dist/ai-security/limits.d.ts +84 -0
  86. package/dist/ai-security/limits.js +195 -0
  87. package/dist/ai-security/limits.js.map +1 -0
  88. package/dist/ai-security/mcp.d.ts +82 -0
  89. package/dist/ai-security/mcp.js +150 -0
  90. package/dist/ai-security/mcp.js.map +1 -0
  91. package/dist/ai-security/output.d.ts +107 -0
  92. package/dist/ai-security/output.js +390 -0
  93. package/dist/ai-security/output.js.map +1 -0
  94. package/dist/ai-security/policy.d.ts +125 -0
  95. package/dist/ai-security/policy.js +196 -0
  96. package/dist/ai-security/policy.js.map +1 -0
  97. package/dist/ai-security/rag.d.ts +70 -0
  98. package/dist/ai-security/rag.js +174 -0
  99. package/dist/ai-security/rag.js.map +1 -0
  100. package/dist/ai-security/tool-rules.json +203 -0
  101. package/dist/ai-security/tools.d.ts +46 -0
  102. package/dist/ai-security/tools.js +62 -0
  103. package/dist/ai-security/tools.js.map +1 -0
  104. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  105. package/dist/budgets/__tests__/budgets.test.js +134 -0
  106. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  107. package/dist/budgets/auto.d.ts +25 -0
  108. package/dist/budgets/auto.js +63 -0
  109. package/dist/budgets/auto.js.map +1 -0
  110. package/dist/budgets/index.d.ts +110 -0
  111. package/dist/budgets/index.js +239 -0
  112. package/dist/budgets/index.js.map +1 -0
  113. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  114. package/dist/customer/__tests__/customer.test.js +155 -0
  115. package/dist/customer/__tests__/customer.test.js.map +1 -0
  116. package/dist/customer/index.d.ts +48 -0
  117. package/dist/customer/index.js +132 -0
  118. package/dist/customer/index.js.map +1 -0
  119. package/dist/destination.d.ts +14 -0
  120. package/dist/destination.js +16 -0
  121. package/dist/destination.js.map +1 -1
  122. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  123. package/dist/feedback/__tests__/feedback.test.js +80 -0
  124. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  125. package/dist/feedback/index.d.ts +48 -0
  126. package/dist/feedback/index.js +97 -0
  127. package/dist/feedback/index.js.map +1 -0
  128. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  129. package/dist/flags/__tests__/flags.test.js +301 -0
  130. package/dist/flags/__tests__/flags.test.js.map +1 -0
  131. package/dist/flags/client.d.ts +131 -0
  132. package/dist/flags/client.js +301 -0
  133. package/dist/flags/client.js.map +1 -0
  134. package/dist/flags/engine.d.ts +200 -0
  135. package/dist/flags/engine.js +677 -0
  136. package/dist/flags/engine.js.map +1 -0
  137. package/dist/flags/index.d.ts +4 -0
  138. package/dist/flags/index.js +16 -0
  139. package/dist/flags/index.js.map +1 -0
  140. package/dist/guard/__tests__/findings.test.js +1 -1
  141. package/dist/guard/__tests__/report.test.js +67 -0
  142. package/dist/guard/__tests__/report.test.js.map +1 -1
  143. package/dist/guard/heartbeat.d.ts +34 -0
  144. package/dist/guard/heartbeat.js +83 -0
  145. package/dist/guard/heartbeat.js.map +1 -0
  146. package/dist/guard/integration.d.ts +9 -0
  147. package/dist/guard/integration.js +4 -2
  148. package/dist/guard/integration.js.map +1 -1
  149. package/dist/guard/report.d.ts +24 -1
  150. package/dist/guard/report.js +67 -18
  151. package/dist/guard/report.js.map +1 -1
  152. package/dist/index.d.ts +88 -0
  153. package/dist/index.js +203 -2
  154. package/dist/index.js.map +1 -1
  155. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  156. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  157. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  158. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  159. package/dist/instrumentation/openai/wrapper.js +6 -0
  160. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  161. package/dist/masking.d.ts +42 -0
  162. package/dist/masking.js +197 -0
  163. package/dist/masking.js.map +1 -0
  164. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  165. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  166. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  167. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  168. package/dist/otel/__tests__/app-logs.test.js +269 -0
  169. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  170. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  171. package/dist/otel/__tests__/log-auto.test.js +125 -0
  172. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  173. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  174. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  175. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  176. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  177. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  178. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  179. package/dist/otel/app-logs.d.ts +80 -0
  180. package/dist/otel/app-logs.js +195 -0
  181. package/dist/otel/app-logs.js.map +1 -0
  182. package/dist/otel/build-info.d.ts +2 -1
  183. package/dist/otel/build-info.js +3 -2
  184. package/dist/otel/build-info.js.map +1 -1
  185. package/dist/otel/events.d.ts +1 -0
  186. package/dist/otel/events.js +22 -13
  187. package/dist/otel/events.js.map +1 -1
  188. package/dist/otel/log-auto.d.ts +44 -0
  189. package/dist/otel/log-auto.js +200 -0
  190. package/dist/otel/log-auto.js.map +1 -0
  191. package/dist/otel/log-bridges.d.ts +54 -0
  192. package/dist/otel/log-bridges.js +307 -0
  193. package/dist/otel/log-bridges.js.map +1 -0
  194. package/dist/otel/metrics.js +1 -1
  195. package/dist/otel/metrics.js.map +1 -1
  196. package/dist/otel/system-metrics.d.ts +39 -0
  197. package/dist/otel/system-metrics.js +166 -0
  198. package/dist/otel/system-metrics.js.map +1 -0
  199. package/dist/otel/tracing.js +6 -2
  200. package/dist/otel/tracing.js.map +1 -1
  201. package/dist/protect/__tests__/protect.test.js +4 -0
  202. package/dist/protect/__tests__/protect.test.js.map +1 -1
  203. package/dist/protect/index.js +9 -4
  204. package/dist/protect/index.js.map +1 -1
  205. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  206. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  207. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  208. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  209. package/dist/rasp/__tests__/baseline.test.js +86 -0
  210. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  211. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  212. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  213. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  214. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  215. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  216. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  217. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  218. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  219. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  220. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  221. package/dist/rasp/__tests__/config-client.test.js +283 -0
  222. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  223. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  224. package/dist/rasp/__tests__/corpus.js +111 -0
  225. package/dist/rasp/__tests__/corpus.js.map +1 -0
  226. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  227. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  228. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  229. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  231. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  232. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/deception.test.js +567 -0
  234. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  235. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/detect.test.js +276 -0
  237. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  238. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  240. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  241. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  243. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  246. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  247. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  248. package/dist/rasp/__tests__/hook-kit.js +139 -0
  249. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  250. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  252. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  253. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/iast.test.js +361 -0
  255. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  256. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  258. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  259. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/middleware.test.js +302 -0
  261. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  262. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  264. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  265. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/reporter.test.js +114 -0
  267. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  268. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/route.test.js +46 -0
  270. package/dist/rasp/__tests__/route.test.js.map +1 -0
  271. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  272. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  273. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  274. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  276. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  277. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  279. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  280. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/targets.test.js +82 -0
  282. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  283. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  285. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  286. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/upload.test.js +81 -0
  288. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  289. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  291. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  292. package/dist/rasp/auto-http.d.ts +6 -0
  293. package/dist/rasp/auto-http.js +194 -0
  294. package/dist/rasp/auto-http.js.map +1 -0
  295. package/dist/rasp/baseline.d.ts +35 -0
  296. package/dist/rasp/baseline.js +91 -0
  297. package/dist/rasp/baseline.js.map +1 -0
  298. package/dist/rasp/capture.d.ts +76 -0
  299. package/dist/rasp/capture.js +304 -0
  300. package/dist/rasp/capture.js.map +1 -0
  301. package/dist/rasp/config-client.d.ts +122 -0
  302. package/dist/rasp/config-client.js +337 -0
  303. package/dist/rasp/config-client.js.map +1 -0
  304. package/dist/rasp/context.d.ts +65 -0
  305. package/dist/rasp/context.js +68 -0
  306. package/dist/rasp/context.js.map +1 -0
  307. package/dist/rasp/custom-rules.d.ts +68 -0
  308. package/dist/rasp/custom-rules.js +222 -0
  309. package/dist/rasp/custom-rules.js.map +1 -0
  310. package/dist/rasp/data/default-rules.json +199 -0
  311. package/dist/rasp/data/default-sinks.json +4 -0
  312. package/dist/rasp/data/dnslog-domains.json +11 -0
  313. package/dist/rasp/deception.d.ts +70 -0
  314. package/dist/rasp/deception.js +220 -0
  315. package/dist/rasp/deception.js.map +1 -0
  316. package/dist/rasp/detect.d.ts +68 -0
  317. package/dist/rasp/detect.js +671 -0
  318. package/dist/rasp/detect.js.map +1 -0
  319. package/dist/rasp/engine.d.ts +107 -0
  320. package/dist/rasp/engine.js +330 -0
  321. package/dist/rasp/engine.js.map +1 -0
  322. package/dist/rasp/hooks/code.d.ts +20 -0
  323. package/dist/rasp/hooks/code.js +334 -0
  324. package/dist/rasp/hooks/code.js.map +1 -0
  325. package/dist/rasp/hooks/db.d.ts +48 -0
  326. package/dist/rasp/hooks/db.js +322 -0
  327. package/dist/rasp/hooks/db.js.map +1 -0
  328. package/dist/rasp/hooks/esm.d.ts +7 -0
  329. package/dist/rasp/hooks/esm.js +18 -0
  330. package/dist/rasp/hooks/esm.js.map +1 -0
  331. package/dist/rasp/hooks/fs.d.ts +3 -0
  332. package/dist/rasp/hooks/fs.js +206 -0
  333. package/dist/rasp/hooks/fs.js.map +1 -0
  334. package/dist/rasp/hooks/http.d.ts +4 -0
  335. package/dist/rasp/hooks/http.js +213 -0
  336. package/dist/rasp/hooks/http.js.map +1 -0
  337. package/dist/rasp/hooks/include.d.ts +9 -0
  338. package/dist/rasp/hooks/include.js +79 -0
  339. package/dist/rasp/hooks/include.js.map +1 -0
  340. package/dist/rasp/hooks/marks.d.ts +2 -0
  341. package/dist/rasp/hooks/marks.js +16 -0
  342. package/dist/rasp/hooks/marks.js.map +1 -0
  343. package/dist/rasp/hooks/process.d.ts +22 -0
  344. package/dist/rasp/hooks/process.js +191 -0
  345. package/dist/rasp/hooks/process.js.map +1 -0
  346. package/dist/rasp/hooks/sinks.d.ts +54 -0
  347. package/dist/rasp/hooks/sinks.js +329 -0
  348. package/dist/rasp/hooks/sinks.js.map +1 -0
  349. package/dist/rasp/hooks/template.d.ts +21 -0
  350. package/dist/rasp/hooks/template.js +152 -0
  351. package/dist/rasp/hooks/template.js.map +1 -0
  352. package/dist/rasp/iast-rules.d.ts +82 -0
  353. package/dist/rasp/iast-rules.js +240 -0
  354. package/dist/rasp/iast-rules.js.map +1 -0
  355. package/dist/rasp/iast-scope.d.ts +29 -0
  356. package/dist/rasp/iast-scope.js +54 -0
  357. package/dist/rasp/iast-scope.js.map +1 -0
  358. package/dist/rasp/iast.d.ts +81 -0
  359. package/dist/rasp/iast.js +272 -0
  360. package/dist/rasp/iast.js.map +1 -0
  361. package/dist/rasp/index.d.ts +52 -0
  362. package/dist/rasp/index.js +280 -0
  363. package/dist/rasp/index.js.map +1 -0
  364. package/dist/rasp/lexers.d.ts +32 -0
  365. package/dist/rasp/lexers.js +444 -0
  366. package/dist/rasp/lexers.js.map +1 -0
  367. package/dist/rasp/middleware.d.ts +155 -0
  368. package/dist/rasp/middleware.js +568 -0
  369. package/dist/rasp/middleware.js.map +1 -0
  370. package/dist/rasp/model-output.d.ts +14 -0
  371. package/dist/rasp/model-output.js +107 -0
  372. package/dist/rasp/model-output.js.map +1 -0
  373. package/dist/rasp/normalize.d.ts +23 -0
  374. package/dist/rasp/normalize.js +140 -0
  375. package/dist/rasp/normalize.js.map +1 -0
  376. package/dist/rasp/reporter.d.ts +60 -0
  377. package/dist/rasp/reporter.js +230 -0
  378. package/dist/rasp/reporter.js.map +1 -0
  379. package/dist/rasp/rule-expr.d.ts +236 -0
  380. package/dist/rasp/rule-expr.js +1253 -0
  381. package/dist/rasp/rule-expr.js.map +1 -0
  382. package/dist/rasp/template.d.ts +53 -0
  383. package/dist/rasp/template.js +336 -0
  384. package/dist/rasp/template.js.map +1 -0
  385. package/dist/rasp/types.d.ts +110 -0
  386. package/dist/rasp/types.js +51 -0
  387. package/dist/rasp/types.js.map +1 -0
  388. package/dist/rasp/vpatch.d.ts +55 -0
  389. package/dist/rasp/vpatch.js +120 -0
  390. package/dist/rasp/vpatch.js.map +1 -0
  391. package/dist/register.js +52 -11
  392. package/dist/register.js.map +1 -1
  393. package/dist/semantic-convention.d.ts +2 -0
  394. package/dist/semantic-convention.js +5 -0
  395. package/dist/semantic-convention.js.map +1 -1
  396. package/dist/types.d.ts +77 -1
  397. package/dist/zero-code.d.ts +8 -0
  398. package/dist/zero-code.js +38 -0
  399. package/dist/zero-code.js.map +1 -0
  400. package/package.json +18 -2
@@ -0,0 +1,337 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RaspConfigClient = exports.BACKOFF_MS = exports.JITTER_MS = exports.POLL_MS = exports.SKEW_S = exports.JWS_TYPE = void 0;
37
+ exports.parsePublicKeys = parsePublicKeys;
38
+ exports.jwsKid = jwsKid;
39
+ exports.verifyConfigJws = verifyConfigJws;
40
+ /**
41
+ * Signed RASP config client (README "The signed config").
42
+ *
43
+ * `GET /api/rasp/config?app=` returns `{ config: <compact JWS>, keys }`. The
44
+ * JWS is trusted only when it verifies against a key the app pinned
45
+ * (`configPublicKey` / `SHIELD360_CONFIG_PUBLIC_KEY`: a JWK, a JWKS for
46
+ * rotation, or the bare base64url Ed25519 `x`). The `keys` in the response
47
+ * are never trusted on their own: they came over the same channel as the
48
+ * config. Only with trust on first use (development: `allowUnpinnedConfig`
49
+ * or `SHIELD360_CONFIG_TOFU=dev`, never in production) is the first `kid`
50
+ * seen pinned; a config signed by another kid after that is rejected. A
51
+ * pinned key that does not verify never falls back to trust on first use.
52
+ *
53
+ * ETag polling every 60 s ± 10 s, 5 minutes after a failure; the last
54
+ * verified config is kept in memory and in a cache file that is re-verified
55
+ * when loaded. Never throws and never blocks start-up.
56
+ */
57
+ const crypto_1 = require("crypto");
58
+ const fs = __importStar(require("fs"));
59
+ const path_1 = require("path");
60
+ exports.JWS_TYPE = 'shield360-rasp+jws';
61
+ exports.SKEW_S = 60;
62
+ exports.POLL_MS = 60000;
63
+ exports.JITTER_MS = 10000;
64
+ exports.BACKOFF_MS = 5 * 60000;
65
+ const FETCH_TIMEOUT_MS = 10000;
66
+ const MAX_TOKEN = 256 * 1024;
67
+ // Captured at load, before any later file-system hook, so the cache never
68
+ // trips RASP itself.
69
+ const readFile = fs.readFileSync.bind(fs);
70
+ const writeFile = fs.writeFileSync.bind(fs);
71
+ const mkdir = fs.mkdirSync.bind(fs);
72
+ const rename = fs.renameSync.bind(fs);
73
+ const b64url = (s) => Buffer.from(s.replace(/-/g, '+').replace(/_/g, '/'), 'base64');
74
+ const B64URL = /^[A-Za-z0-9_-]+$/;
75
+ function fromJwk(jwk) {
76
+ try {
77
+ const j = jwk;
78
+ if (!j || j.kty !== 'OKP' || j.crv !== 'Ed25519' || typeof j.x !== 'string' || !B64URL.test(j.x) || b64url(j.x).length !== 32)
79
+ return null;
80
+ const key = (0, crypto_1.createPublicKey)({ key: { kty: 'OKP', crv: 'Ed25519', x: j.x }, format: 'jwk' });
81
+ return { kid: typeof j.kid === 'string' && j.kid ? j.kid : undefined, x: j.x, key };
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ /**
88
+ * Parses a pinned key: a JWK, a JWKS, or the bare base64url Ed25519 `x`
89
+ * (objects or JSON text). Unusable entries are left out; [] when none is usable.
90
+ */
91
+ function parsePublicKeys(input) {
92
+ if (input == null || input === '')
93
+ return [];
94
+ let value = input;
95
+ if (typeof value === 'string') {
96
+ const s = value.trim();
97
+ if (s.startsWith('{') || s.startsWith('[')) {
98
+ try {
99
+ value = JSON.parse(s);
100
+ }
101
+ catch {
102
+ return [];
103
+ }
104
+ }
105
+ else {
106
+ const k = fromJwk({ kty: 'OKP', crv: 'Ed25519', x: s });
107
+ return k ? [k] : [];
108
+ }
109
+ }
110
+ const list = Array.isArray(value) ? value : value && typeof value === 'object' && Array.isArray(value.keys) ? value.keys : [value];
111
+ return list
112
+ .slice(0, 16)
113
+ .map(fromJwk)
114
+ .filter((k) => k !== null);
115
+ }
116
+ function header(token) {
117
+ try {
118
+ const h = JSON.parse(b64url(token.split('.')[0] || '').toString('utf8'));
119
+ return h && typeof h === 'object' ? h : null;
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ /** The `kid` in a JWS header, or undefined. */
126
+ function jwsKid(token) {
127
+ const h = typeof token === 'string' ? header(token) : null;
128
+ return h && typeof h.kid === 'string' ? h.kid : undefined;
129
+ }
130
+ /**
131
+ * Verifies a compact JWS against the given keys only: `alg` EdDSA, `typ`
132
+ * shield360-rasp+jws, an Ed25519 signature by the pinned key whose kid
133
+ * matches the header (any pinned key when the header names none listed), `v` 1, `app` equal to ours, `exp` in the future
134
+ * (60 s skew).
135
+ */
136
+ function verifyConfigJws(token, keys, app, nowS = Date.now() / 1000) {
137
+ try {
138
+ if (typeof token !== 'string' || token.length > MAX_TOKEN)
139
+ return { ok: false, reason: 'malformed' };
140
+ const parts = token.split('.');
141
+ if (parts.length !== 3 || !parts.every((p) => B64URL.test(p)))
142
+ return { ok: false, reason: 'malformed' };
143
+ const h = header(token);
144
+ if (!h)
145
+ return { ok: false, reason: 'malformed' };
146
+ if (h.alg !== 'EdDSA')
147
+ return { ok: false, reason: 'alg' };
148
+ if (h.typ !== exports.JWS_TYPE)
149
+ return { ok: false, reason: 'typ' };
150
+ const kid = typeof h.kid === 'string' ? h.kid : undefined;
151
+ let candidates = kid ? keys.filter((k) => k.kid === kid) : [];
152
+ if (!candidates.length)
153
+ candidates = keys;
154
+ if (!candidates.length)
155
+ return { ok: false, reason: 'no_key' };
156
+ const signed = Buffer.from(`${parts[0]}.${parts[1]}`);
157
+ const sig = b64url(parts[2]);
158
+ if (!candidates.some((k) => (0, crypto_1.verify)(null, signed, k.key, sig)))
159
+ return { ok: false, reason: 'signature' };
160
+ const claims = JSON.parse(b64url(parts[1]).toString('utf8'));
161
+ if (!claims || typeof claims !== 'object' || claims.v !== 1)
162
+ return { ok: false, reason: 'version' };
163
+ if (claims.app !== app)
164
+ return { ok: false, reason: 'app' };
165
+ if (typeof claims.exp !== 'number' || claims.exp + exports.SKEW_S <= nowS)
166
+ return { ok: false, reason: 'expired' };
167
+ if (typeof claims.version !== 'string' || !claims.version)
168
+ return { ok: false, reason: 'version' };
169
+ return { ok: true, claims, kid };
170
+ }
171
+ catch {
172
+ return { ok: false, reason: 'malformed' };
173
+ }
174
+ }
175
+ class RaspConfigClient {
176
+ constructor(o) {
177
+ this.o = o;
178
+ /** Keys pinned on first use (allowUnpinned only). */
179
+ this.tofu = [];
180
+ this.warned = new Set();
181
+ this.stopped = false;
182
+ this.base = o.url.replace(/\/+$/, '');
183
+ }
184
+ /** The keys a config must verify against right now. */
185
+ trusted() {
186
+ return this.o.pinned.length ? this.o.pinned : this.o.allowUnpinned ? this.tofu : [];
187
+ }
188
+ nowMs() {
189
+ return (this.o.now ?? Date.now)();
190
+ }
191
+ cacheFile() {
192
+ return (0, path_1.join)(this.o.cacheDir, `${this.o.app.replace(/[^A-Za-z0-9._-]/g, '_').slice(0, 128) || 'default'}.json`);
193
+ }
194
+ warn(reason) {
195
+ if (this.warned.has(reason))
196
+ return;
197
+ this.warned.add(reason);
198
+ try {
199
+ this.o.onWarning?.(reason);
200
+ }
201
+ catch {
202
+ // never
203
+ }
204
+ }
205
+ apply(claims) {
206
+ // A stopped client (RASP re-initialized for another app or key) never
207
+ // applies anything: a poll still in flight when it stopped is dropped.
208
+ if (this.stopped)
209
+ return;
210
+ this.current = claims;
211
+ try {
212
+ this.o.onConfig(claims);
213
+ }
214
+ catch {
215
+ // fail open
216
+ }
217
+ }
218
+ /** Loads the cached config and re-verifies it. Pinned keys are never read from the cache. */
219
+ loadCache() {
220
+ try {
221
+ const saved = JSON.parse(readFile(this.cacheFile(), 'utf8'));
222
+ if (!this.o.pinned.length && this.o.allowUnpinned && !this.tofu.length)
223
+ this.tofu = parsePublicKeys({ keys: saved.tofu ?? [] });
224
+ const r = verifyConfigJws(saved.config, this.trusted(), this.o.app, this.nowMs() / 1000);
225
+ if (!r.ok)
226
+ return false;
227
+ this.apply(r.claims);
228
+ return true;
229
+ }
230
+ catch {
231
+ return false;
232
+ }
233
+ }
234
+ saveCache(config) {
235
+ if (this.stopped)
236
+ return;
237
+ try {
238
+ mkdir(this.o.cacheDir, { recursive: true, mode: 0o700 });
239
+ const body = { config };
240
+ if (!this.o.pinned.length && this.tofu.length)
241
+ body.tofu = this.tofu.map((k) => ({ kty: 'OKP', crv: 'Ed25519', x: k.x, ...(k.kid ? { kid: k.kid } : {}) }));
242
+ const file = this.cacheFile();
243
+ const tmp = `${file}.${process.pid}.tmp`;
244
+ writeFile(tmp, JSON.stringify(body), { mode: 0o600 });
245
+ rename(tmp, file);
246
+ }
247
+ catch {
248
+ // the cache is best effort
249
+ }
250
+ }
251
+ /** Drops the config in force once it has expired (the platform could not be reached for its whole lifetime). */
252
+ expire() {
253
+ if (this.current && this.current.exp + exports.SKEW_S <= this.nowMs() / 1000) {
254
+ this.etag = undefined;
255
+ this.apply(undefined);
256
+ }
257
+ }
258
+ /** One poll. Never throws. */
259
+ async poll() {
260
+ const result = await this.fetchOnce();
261
+ this.expire();
262
+ return result;
263
+ }
264
+ async fetchOnce() {
265
+ try {
266
+ if (!this.o.pinned.length && !this.o.allowUnpinned) {
267
+ this.warn('unpinned');
268
+ return 'rejected';
269
+ }
270
+ const send = this.o.fetchImpl ?? globalThis.fetch;
271
+ const headers = { Authorization: `Bearer ${this.o.apiKey}`, Accept: 'application/json' };
272
+ if (this.etag && this.current)
273
+ headers['If-None-Match'] = this.etag;
274
+ const init = { headers };
275
+ if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function')
276
+ init.signal = AbortSignal.timeout(FETCH_TIMEOUT_MS);
277
+ const res = await send(`${this.base}/api/rasp/config?app=${encodeURIComponent(this.o.app)}`, init);
278
+ if (res.status === 304)
279
+ return 'unchanged';
280
+ if (!res.ok)
281
+ return 'failed';
282
+ const body = (await res.json());
283
+ const token = typeof body?.config === 'string' ? body.config : '';
284
+ if (!this.o.pinned.length && this.o.allowUnpinned && !this.tofu.length) {
285
+ // Trust on first use (development only): pin the key the response names.
286
+ const kid = jwsKid(token);
287
+ const offered = parsePublicKeys({ keys: Array.isArray(body?.keys) ? body.keys : [] });
288
+ const first = offered.find((k) => k.kid === kid) ?? (offered.length === 1 ? offered[0] : undefined);
289
+ if (first) {
290
+ this.tofu = [first];
291
+ this.warn('trust_on_first_use');
292
+ }
293
+ }
294
+ const r = verifyConfigJws(token, this.trusted(), this.o.app, this.nowMs() / 1000);
295
+ if (!r.ok) {
296
+ this.warn(r.reason);
297
+ return 'rejected';
298
+ }
299
+ this.etag = res.headers.get('etag') ?? undefined;
300
+ this.apply(r.claims);
301
+ this.saveCache(token);
302
+ return 'updated';
303
+ }
304
+ catch {
305
+ return 'failed';
306
+ }
307
+ }
308
+ /** The delay before the next poll after a result. */
309
+ nextDelay(r) {
310
+ if (r === 'failed' || r === 'rejected')
311
+ return exports.BACKOFF_MS;
312
+ const random = this.o.random ?? Math.random;
313
+ return exports.POLL_MS + Math.round((random() * 2 - 1) * exports.JITTER_MS);
314
+ }
315
+ start() {
316
+ this.loadCache();
317
+ const loop = async () => {
318
+ if (this.stopped)
319
+ return;
320
+ const r = await this.poll();
321
+ if (this.stopped)
322
+ return;
323
+ this.timer = setTimeout(() => void loop(), this.nextDelay(r));
324
+ this.timer.unref?.();
325
+ };
326
+ // Off the start-up path.
327
+ this.timer = setTimeout(() => void loop(), 0);
328
+ this.timer.unref?.();
329
+ }
330
+ stop() {
331
+ this.stopped = true;
332
+ if (this.timer)
333
+ clearTimeout(this.timer);
334
+ }
335
+ }
336
+ exports.RaspConfigClient = RaspConfigClient;
337
+ //# sourceMappingURL=config-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-client.js","sourceRoot":"","sources":["../../src/rasp/config-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * The RASP context of the request (or worker job) being served, kept in
3
+ * AsyncLocalStorage. Inputs live here, in memory, for the life of the
4
+ * request only; nothing in this file sends or stores them anywhere else.
5
+ */
6
+ import { AsyncLocalStorage } from 'async_hooks';
7
+ import type { CustomRuleState } from './custom-rules';
8
+ import type { RaspInput } from './types';
9
+ import type { VpRequest } from './vpatch';
10
+ export type RaspContext = {
11
+ inputs: RaspInput[];
12
+ /** Parsed body and query trees (for nosql_injection). */
13
+ trees: unknown[];
14
+ inRequest: boolean;
15
+ method?: string;
16
+ path?: string;
17
+ /** The route template when the framework knows it. */
18
+ route?: string;
19
+ framework?: string;
20
+ /** The client address as the framework reports it (custom rules' `request.ip`). */
21
+ ip?: string;
22
+ /** Custom-rule state for this request (custom-rules.ts). */
23
+ rules?: CustomRuleState;
24
+ /** How many of `inputs` were known before the body (set when the body is captured): head rules see only these. */
25
+ headInputs?: number;
26
+ /** Virtual-patch state: the request as the rules see it. */
27
+ vp?: {
28
+ req: VpRequest;
29
+ bodyKnown: boolean;
30
+ ranHead: boolean;
31
+ ranBody: boolean;
32
+ };
33
+ /**
34
+ * Captures a body that a parser set after the middleware ran (Express or
35
+ * Koa with the body parser registered later). Called when a sink reads
36
+ * the inputs, until it reports the body was found (returns other than false).
37
+ */
38
+ late?: () => boolean | void;
39
+ /** SHIELD: set on the context the zero-code `http` capture (shield360/register) made. */
40
+ auto?: boolean;
41
+ /** SHIELD: deception already ran for this request (the zero-code capture runs it first), so middleware skips it. */
42
+ deception?: boolean;
43
+ };
44
+ export declare const storage: AsyncLocalStorage<RaspContext>;
45
+ export declare function currentContext(): RaspContext | undefined;
46
+ export declare function newContext(init?: Partial<RaspContext>): RaspContext;
47
+ /**
48
+ * The context's inputs, after any late body capture. Sinks call this rather
49
+ * than reading `inputs` directly. A virtual patch matched by the late body
50
+ * throws the block error from here.
51
+ */
52
+ export declare function inputsOf(ctx: RaspContext): RaspInput[];
53
+ /** Runs fn in a fresh context that is not a request (a worker acting on a model's answer). */
54
+ export declare function runInRaspScope<T>(fn: () => T): T;
55
+ /** Runs fn with a context holding the given inputs (workers, tests). */
56
+ export declare function runWithInputs<T>(inputs: RaspInput[], fn: () => T, extra?: Partial<RaspContext>): T;
57
+ /** Route fallback: all-digit, UUID and hex (8+, with a digit) segments become `:id`. */
58
+ export declare function routeOf(path: string): string;
59
+ /**
60
+ * The route every event carries when the framework gave no template (README
61
+ * "Event route"): the route fallback, then every segment that is not a short
62
+ * lower-case word (or an API version such as `v2`) becomes `:id`, so a token,
63
+ * name or other value in the path never reaches an event.
64
+ */
65
+ export declare function eventRouteOf(path: string): string;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.storage = void 0;
4
+ exports.currentContext = currentContext;
5
+ exports.newContext = newContext;
6
+ exports.inputsOf = inputsOf;
7
+ exports.runInRaspScope = runInRaspScope;
8
+ exports.runWithInputs = runWithInputs;
9
+ exports.routeOf = routeOf;
10
+ exports.eventRouteOf = eventRouteOf;
11
+ /**
12
+ * The RASP context of the request (or worker job) being served, kept in
13
+ * AsyncLocalStorage. Inputs live here, in memory, for the life of the
14
+ * request only; nothing in this file sends or stores them anywhere else.
15
+ */
16
+ const async_hooks_1 = require("async_hooks");
17
+ exports.storage = new async_hooks_1.AsyncLocalStorage();
18
+ function currentContext() {
19
+ return exports.storage.getStore();
20
+ }
21
+ function newContext(init = {}) {
22
+ return { inputs: [], trees: [], inRequest: false, ...init };
23
+ }
24
+ /**
25
+ * The context's inputs, after any late body capture. Sinks call this rather
26
+ * than reading `inputs` directly. A virtual patch matched by the late body
27
+ * throws the block error from here.
28
+ */
29
+ function inputsOf(ctx) {
30
+ const late = ctx.late;
31
+ if (late) {
32
+ ctx.late = undefined;
33
+ if (late() === false)
34
+ ctx.late = late;
35
+ }
36
+ return ctx.inputs;
37
+ }
38
+ /** Runs fn in a fresh context that is not a request (a worker acting on a model's answer). */
39
+ function runInRaspScope(fn) {
40
+ return exports.storage.run(newContext(), fn);
41
+ }
42
+ /** Runs fn with a context holding the given inputs (workers, tests). */
43
+ function runWithInputs(inputs, fn, extra = {}) {
44
+ return exports.storage.run(newContext({ inputs: [...inputs], ...extra }), fn);
45
+ }
46
+ const ID_SEGMENT = /^(\d+|[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|(?=[0-9a-f]*\d)[0-9a-f]{8,})$/i;
47
+ /** Route fallback: all-digit, UUID and hex (8+, with a digit) segments become `:id`. */
48
+ function routeOf(path) {
49
+ return path
50
+ .split('?')[0]
51
+ .split('/')
52
+ .map((s) => (ID_SEGMENT.test(s) ? ':id' : s))
53
+ .join('/');
54
+ }
55
+ const KEPT_SEGMENT = /^(?:[a-z][a-z_.-]{0,15}|v\d{1,2})$/;
56
+ /**
57
+ * The route every event carries when the framework gave no template (README
58
+ * "Event route"): the route fallback, then every segment that is not a short
59
+ * lower-case word (or an API version such as `v2`) becomes `:id`, so a token,
60
+ * name or other value in the path never reaches an event.
61
+ */
62
+ function eventRouteOf(path) {
63
+ return routeOf(path)
64
+ .split('/')
65
+ .map((seg) => (seg === '' || seg === ':id' || KEPT_SEGMENT.test(seg) ? seg : ':id'))
66
+ .join('/');
67
+ }
68
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/rasp/context.ts"],"names":[],"mappings":";;;AA0CA,wCAEC;AAED,gCAEC;AAOD,4BAOC;AAGD,wCAEC;AAGD,sCAEC;AAKD,0BAMC;AAUD,oCAKC;AAlGD;;;;GAIG;AACH,6CAAgD;AAmCnC,QAAA,OAAO,GAAG,IAAI,+BAAiB,EAAe,CAAC;AAE5D,SAAgB,cAAc;IAC5B,OAAO,eAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,SAAgB,UAAU,CAAC,OAA6B,EAAE;IACxD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,SAAgB,QAAQ,CAAC,GAAgB;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,EAAE,CAAC;QACT,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;QACrB,IAAI,IAAI,EAAE,KAAK,KAAK;YAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACxC,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,CAAC;AACpB,CAAC;AAED,8FAA8F;AAC9F,SAAgB,cAAc,CAAI,EAAW;IAC3C,OAAO,eAAO,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,wEAAwE;AACxE,SAAgB,aAAa,CAAI,MAAmB,EAAE,EAAW,EAAE,QAA8B,EAAE;IACjG,OAAO,eAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,GAAG,mGAAmG,CAAC;AAEvH,wFAAwF;AACxF,SAAgB,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,YAAY,GAAG,oCAAoC,CAAC;AAE1D;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,IAAY;IACvC,OAAO,OAAO,CAAC,IAAI,CAAC;SACjB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,KAAK,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SACnF,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Custom rules (README "Custom rules"): the organization's own rules, written
3
+ * in the expression language of rule-expr.ts and delivered inside the signed
4
+ * config (`customRules`). They are data: each expression is parsed and
5
+ * type-checked when the config arrives and evaluated against the request (or
6
+ * a built-in finding) as a value. An invalid rule is skipped with one
7
+ * warning and never breaks the config; evaluation fails open.
8
+ *
9
+ * This file turns rules and the request context into the language's terms;
10
+ * the engine and capture decide what a match does.
11
+ */
12
+ import { type RaspContext } from './context';
13
+ import { type CompiledRuleExpr, type RuleBudget, type RuleSubject } from './rule-expr';
14
+ import type { Finding, RaspInput, RaspMode } from './types';
15
+ export declare const MAX_CUSTOM_RULES = 64;
16
+ export declare const MAX_RULE_APPS = 32;
17
+ /** Lower-case, so the event rule `custom.<id>` fits the platform's rule shape. */
18
+ export declare const CUSTOM_RULE_ID: RegExp;
19
+ export declare const CUSTOM_RULE_PREFIX = "custom.";
20
+ export declare const CUSTOM_RULE_ACTIONS: readonly ["block", "monitor", "alert"];
21
+ export type CustomRuleAction = (typeof CUSTOM_RULE_ACTIONS)[number];
22
+ export type CustomRule = {
23
+ id: string;
24
+ name: string;
25
+ action: CustomRuleAction;
26
+ apps?: string[];
27
+ expr: CompiledRuleExpr;
28
+ };
29
+ export type SkippedRule = {
30
+ index: number;
31
+ id?: string;
32
+ reason: string;
33
+ };
34
+ /** Tests only: lets the once-per-rule warnings fire again. */
35
+ export declare function resetCustomRuleWarnings(): void;
36
+ /**
37
+ * The rules of a signed config that apply to this app: invalid rules are
38
+ * skipped (one warning per rule and reason, per process), disabled rules and
39
+ * rules scoped to other apps are left out silently. At most 64.
40
+ */
41
+ export declare function parseCustomRules(raw: unknown, app: string, warn?: (s: SkippedRule) => void): CustomRule[];
42
+ /** The most a rule does: `alert` reports like `monitor` (the platform raises the alert). */
43
+ export declare function actionMode(a: CustomRuleAction): RaspMode;
44
+ /** The finding a matched rule reports (attack type `custom_rule`, rule `custom.<id>`). */
45
+ export declare function customFinding(rule: CustomRule, input?: RaspInput): Finding;
46
+ /** The request as the language sees it (README "Custom rules: fields"). */
47
+ export declare function requestSubject(ctx: RaspContext | undefined, app: string, inputs?: RaspInput[]): RuleSubject;
48
+ /** Per-request evaluation state, kept on the context. */
49
+ export type CustomRuleState = {
50
+ matched: Set<string>;
51
+ budget: RuleBudget;
52
+ ranHead: boolean;
53
+ ranBody: boolean;
54
+ };
55
+ export declare function ruleState(ctx: RaspContext): CustomRuleState;
56
+ export type RuleMatch = {
57
+ rule: CustomRule;
58
+ input?: RaspInput;
59
+ };
60
+ /**
61
+ * The request rules to judge in a phase, matched in order. `head`: every
62
+ * request rule that does not read the body. `body`: rules that read the body,
63
+ * and rules reading `input.*` that did not match at `head` (the body added
64
+ * inputs). A rule matches at most once per request.
65
+ */
66
+ export declare function matchRequestRules(rules: CustomRule[], ctx: RaspContext, phase: 'head' | 'body', subject: RuleSubject): RuleMatch[];
67
+ /** The finding rules a built-in finding matches, in order. */
68
+ export declare function matchFindingRules(rules: CustomRule[], subject: RuleSubject, budget: RuleBudget): RuleMatch[];