shield360 1.0.1 → 1.2.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 (424) hide show
  1. package/README.md +392 -37
  2. package/dist/__tests__/build-info.test.d.ts +1 -0
  3. package/dist/__tests__/build-info.test.js +196 -0
  4. package/dist/__tests__/build-info.test.js.map +1 -0
  5. package/dist/__tests__/code-location.test.d.ts +1 -0
  6. package/dist/__tests__/code-location.test.js +180 -0
  7. package/dist/__tests__/code-location.test.js.map +1 -0
  8. package/dist/__tests__/masking.test.d.ts +1 -0
  9. package/dist/__tests__/masking.test.js +66 -0
  10. package/dist/__tests__/masking.test.js.map +1 -0
  11. package/dist/__tests__/pricing-claude-5.test.js +3 -0
  12. package/dist/__tests__/pricing-claude-5.test.js.map +1 -1
  13. package/dist/__tests__/register.e2e.test.d.ts +1 -0
  14. package/dist/__tests__/register.e2e.test.js +264 -0
  15. package/dist/__tests__/register.e2e.test.js.map +1 -0
  16. package/dist/__tests__/register.test.js +60 -0
  17. package/dist/__tests__/register.test.js.map +1 -1
  18. package/dist/agents/__tests__/agents.test.d.ts +1 -0
  19. package/dist/agents/__tests__/agents.test.js +529 -0
  20. package/dist/agents/__tests__/agents.test.js.map +1 -0
  21. package/dist/agents/index.d.ts +15 -0
  22. package/dist/agents/index.js +25 -0
  23. package/dist/agents/index.js.map +1 -0
  24. package/dist/agents/passport.d.ts +92 -0
  25. package/dist/agents/passport.js +301 -0
  26. package/dist/agents/passport.js.map +1 -0
  27. package/dist/agents/policy.d.ts +24 -0
  28. package/dist/agents/policy.js +93 -0
  29. package/dist/agents/policy.js.map +1 -0
  30. package/dist/agents/replay.d.ts +20 -0
  31. package/dist/agents/replay.js +47 -0
  32. package/dist/agents/replay.js.map +1 -0
  33. package/dist/agents/report.d.ts +30 -0
  34. package/dist/agents/report.js +93 -0
  35. package/dist/agents/report.js.map +1 -0
  36. package/dist/agents/types.d.ts +148 -0
  37. package/dist/agents/types.js +37 -0
  38. package/dist/agents/types.js.map +1 -0
  39. package/dist/agents/verifier.d.ts +33 -0
  40. package/dist/agents/verifier.js +276 -0
  41. package/dist/agents/verifier.js.map +1 -0
  42. package/dist/ai-security/__tests__/bench.test.d.ts +1 -0
  43. package/dist/ai-security/__tests__/bench.test.js +50 -0
  44. package/dist/ai-security/__tests__/bench.test.js.map +1 -0
  45. package/dist/ai-security/__tests__/checks.test.d.ts +1 -0
  46. package/dist/ai-security/__tests__/checks.test.js +248 -0
  47. package/dist/ai-security/__tests__/checks.test.js.map +1 -0
  48. package/dist/ai-security/__tests__/config.test.d.ts +1 -0
  49. package/dist/ai-security/__tests__/config.test.js +164 -0
  50. package/dist/ai-security/__tests__/config.test.js.map +1 -0
  51. package/dist/ai-security/__tests__/detection.test.d.ts +1 -0
  52. package/dist/ai-security/__tests__/detection.test.js +114 -0
  53. package/dist/ai-security/__tests__/detection.test.js.map +1 -0
  54. package/dist/ai-security/__tests__/fixtures.d.ts +8 -0
  55. package/dist/ai-security/__tests__/fixtures.js +30 -0
  56. package/dist/ai-security/__tests__/fixtures.js.map +1 -0
  57. package/dist/ai-security/__tests__/hooks.test.d.ts +1 -0
  58. package/dist/ai-security/__tests__/hooks.test.js +174 -0
  59. package/dist/ai-security/__tests__/hooks.test.js.map +1 -0
  60. package/dist/ai-security/__tests__/stream.test.d.ts +1 -0
  61. package/dist/ai-security/__tests__/stream.test.js +85 -0
  62. package/dist/ai-security/__tests__/stream.test.js.map +1 -0
  63. package/dist/ai-security/config.d.ts +94 -0
  64. package/dist/ai-security/config.js +241 -0
  65. package/dist/ai-security/config.js.map +1 -0
  66. package/dist/ai-security/context.d.ts +45 -0
  67. package/dist/ai-security/context.js +108 -0
  68. package/dist/ai-security/context.js.map +1 -0
  69. package/dist/ai-security/custom-kinds.d.ts +23 -0
  70. package/dist/ai-security/custom-kinds.js +97 -0
  71. package/dist/ai-security/custom-kinds.js.map +1 -0
  72. package/dist/ai-security/events.d.ts +77 -0
  73. package/dist/ai-security/events.js +153 -0
  74. package/dist/ai-security/events.js.map +1 -0
  75. package/dist/ai-security/hooks.d.ts +48 -0
  76. package/dist/ai-security/hooks.js +461 -0
  77. package/dist/ai-security/hooks.js.map +1 -0
  78. package/dist/ai-security/index.d.ts +209 -0
  79. package/dist/ai-security/index.js +587 -0
  80. package/dist/ai-security/index.js.map +1 -0
  81. package/dist/ai-security/injection-rules.json +1024 -0
  82. package/dist/ai-security/injection.d.ts +46 -0
  83. package/dist/ai-security/injection.js +635 -0
  84. package/dist/ai-security/injection.js.map +1 -0
  85. package/dist/ai-security/jailbreak.d.ts +38 -0
  86. package/dist/ai-security/jailbreak.js +73 -0
  87. package/dist/ai-security/jailbreak.js.map +1 -0
  88. package/dist/ai-security/limits.d.ts +84 -0
  89. package/dist/ai-security/limits.js +195 -0
  90. package/dist/ai-security/limits.js.map +1 -0
  91. package/dist/ai-security/mcp.d.ts +82 -0
  92. package/dist/ai-security/mcp.js +150 -0
  93. package/dist/ai-security/mcp.js.map +1 -0
  94. package/dist/ai-security/output.d.ts +107 -0
  95. package/dist/ai-security/output.js +390 -0
  96. package/dist/ai-security/output.js.map +1 -0
  97. package/dist/ai-security/policy.d.ts +125 -0
  98. package/dist/ai-security/policy.js +196 -0
  99. package/dist/ai-security/policy.js.map +1 -0
  100. package/dist/ai-security/rag.d.ts +70 -0
  101. package/dist/ai-security/rag.js +174 -0
  102. package/dist/ai-security/rag.js.map +1 -0
  103. package/dist/ai-security/tool-rules.json +203 -0
  104. package/dist/ai-security/tools.d.ts +46 -0
  105. package/dist/ai-security/tools.js +62 -0
  106. package/dist/ai-security/tools.js.map +1 -0
  107. package/dist/budgets/__tests__/budgets.test.d.ts +1 -0
  108. package/dist/budgets/__tests__/budgets.test.js +134 -0
  109. package/dist/budgets/__tests__/budgets.test.js.map +1 -0
  110. package/dist/budgets/auto.d.ts +25 -0
  111. package/dist/budgets/auto.js +63 -0
  112. package/dist/budgets/auto.js.map +1 -0
  113. package/dist/budgets/index.d.ts +110 -0
  114. package/dist/budgets/index.js +239 -0
  115. package/dist/budgets/index.js.map +1 -0
  116. package/dist/config.js +1 -1
  117. package/dist/config.js.map +1 -1
  118. package/dist/customer/__tests__/customer.test.d.ts +1 -0
  119. package/dist/customer/__tests__/customer.test.js +155 -0
  120. package/dist/customer/__tests__/customer.test.js.map +1 -0
  121. package/dist/customer/index.d.ts +48 -0
  122. package/dist/customer/index.js +132 -0
  123. package/dist/customer/index.js.map +1 -0
  124. package/dist/feedback/__tests__/feedback.test.d.ts +1 -0
  125. package/dist/feedback/__tests__/feedback.test.js +80 -0
  126. package/dist/feedback/__tests__/feedback.test.js.map +1 -0
  127. package/dist/feedback/index.d.ts +48 -0
  128. package/dist/feedback/index.js +97 -0
  129. package/dist/feedback/index.js.map +1 -0
  130. package/dist/flags/__tests__/flags.test.d.ts +1 -0
  131. package/dist/flags/__tests__/flags.test.js +301 -0
  132. package/dist/flags/__tests__/flags.test.js.map +1 -0
  133. package/dist/flags/client.d.ts +131 -0
  134. package/dist/flags/client.js +301 -0
  135. package/dist/flags/client.js.map +1 -0
  136. package/dist/flags/engine.d.ts +200 -0
  137. package/dist/flags/engine.js +677 -0
  138. package/dist/flags/engine.js.map +1 -0
  139. package/dist/flags/index.d.ts +4 -0
  140. package/dist/flags/index.js +16 -0
  141. package/dist/flags/index.js.map +1 -0
  142. package/dist/guard/__tests__/findings.test.js +28 -9
  143. package/dist/guard/__tests__/findings.test.js.map +1 -1
  144. package/dist/guard/__tests__/report.test.js +67 -0
  145. package/dist/guard/__tests__/report.test.js.map +1 -1
  146. package/dist/guard/base.d.ts +2 -0
  147. package/dist/guard/base.js +4 -0
  148. package/dist/guard/base.js.map +1 -1
  149. package/dist/guard/findings.d.ts +12 -2
  150. package/dist/guard/findings.js +19 -49
  151. package/dist/guard/findings.js.map +1 -1
  152. package/dist/guard/heartbeat.d.ts +34 -0
  153. package/dist/guard/heartbeat.js +83 -0
  154. package/dist/guard/heartbeat.js.map +1 -0
  155. package/dist/guard/integration.d.ts +33 -3
  156. package/dist/guard/integration.js +106 -32
  157. package/dist/guard/integration.js.map +1 -1
  158. package/dist/guard/pipeline.d.ts +10 -1
  159. package/dist/guard/pipeline.js +14 -0
  160. package/dist/guard/pipeline.js.map +1 -1
  161. package/dist/guard/report.d.ts +24 -1
  162. package/dist/guard/report.js +67 -18
  163. package/dist/guard/report.js.map +1 -1
  164. package/dist/index.d.ts +90 -0
  165. package/dist/index.js +225 -3
  166. package/dist/index.js.map +1 -1
  167. package/dist/instrumentation/__tests__/langchain-wrapper.test.js +1 -1
  168. package/dist/instrumentation/__tests__/langchain-wrapper.test.js.map +1 -1
  169. package/dist/instrumentation/anthropic/wrapper.js +4 -0
  170. package/dist/instrumentation/anthropic/wrapper.js.map +1 -1
  171. package/dist/instrumentation/mcp/wrapper.js +7 -1
  172. package/dist/instrumentation/mcp/wrapper.js.map +1 -1
  173. package/dist/instrumentation/openai/wrapper.js +6 -0
  174. package/dist/instrumentation/openai/wrapper.js.map +1 -1
  175. package/dist/masking.d.ts +42 -0
  176. package/dist/masking.js +197 -0
  177. package/dist/masking.js.map +1 -0
  178. package/dist/otel/__tests__/app-logs-safety.test.d.ts +1 -0
  179. package/dist/otel/__tests__/app-logs-safety.test.js +129 -0
  180. package/dist/otel/__tests__/app-logs-safety.test.js.map +1 -0
  181. package/dist/otel/__tests__/app-logs.test.d.ts +1 -0
  182. package/dist/otel/__tests__/app-logs.test.js +269 -0
  183. package/dist/otel/__tests__/app-logs.test.js.map +1 -0
  184. package/dist/otel/__tests__/log-auto.test.d.ts +1 -0
  185. package/dist/otel/__tests__/log-auto.test.js +125 -0
  186. package/dist/otel/__tests__/log-auto.test.js.map +1 -0
  187. package/dist/otel/__tests__/log-bridges.test.d.ts +1 -0
  188. package/dist/otel/__tests__/log-bridges.test.js +170 -0
  189. package/dist/otel/__tests__/log-bridges.test.js.map +1 -0
  190. package/dist/otel/__tests__/system-metrics.test.d.ts +1 -0
  191. package/dist/otel/__tests__/system-metrics.test.js +79 -0
  192. package/dist/otel/__tests__/system-metrics.test.js.map +1 -0
  193. package/dist/otel/app-logs.d.ts +80 -0
  194. package/dist/otel/app-logs.js +195 -0
  195. package/dist/otel/app-logs.js.map +1 -0
  196. package/dist/otel/build-info.d.ts +23 -0
  197. package/dist/otel/build-info.js +176 -0
  198. package/dist/otel/build-info.js.map +1 -0
  199. package/dist/otel/code-location.d.ts +49 -0
  200. package/dist/otel/code-location.js +233 -0
  201. package/dist/otel/code-location.js.map +1 -0
  202. package/dist/otel/events.d.ts +1 -0
  203. package/dist/otel/events.js +21 -12
  204. package/dist/otel/events.js.map +1 -1
  205. package/dist/otel/log-auto.d.ts +44 -0
  206. package/dist/otel/log-auto.js +200 -0
  207. package/dist/otel/log-auto.js.map +1 -0
  208. package/dist/otel/log-bridges.d.ts +54 -0
  209. package/dist/otel/log-bridges.js +307 -0
  210. package/dist/otel/log-bridges.js.map +1 -0
  211. package/dist/otel/system-metrics.d.ts +39 -0
  212. package/dist/otel/system-metrics.js +166 -0
  213. package/dist/otel/system-metrics.js.map +1 -0
  214. package/dist/otel/tracing.js +12 -1
  215. package/dist/otel/tracing.js.map +1 -1
  216. package/dist/pricing.json +100 -42
  217. package/dist/protect/__tests__/protect.test.d.ts +1 -0
  218. package/dist/protect/__tests__/protect.test.js +210 -0
  219. package/dist/protect/__tests__/protect.test.js.map +1 -0
  220. package/dist/protect/index.d.ts +103 -0
  221. package/dist/protect/index.js +196 -0
  222. package/dist/protect/index.js.map +1 -0
  223. package/dist/protect/mcp.d.ts +13 -0
  224. package/dist/protect/mcp.js +49 -0
  225. package/dist/protect/mcp.js.map +1 -0
  226. package/dist/protect/mode.d.ts +89 -0
  227. package/dist/protect/mode.js +134 -0
  228. package/dist/protect/mode.js.map +1 -0
  229. package/dist/rasp/__tests__/auto-http.test.d.ts +1 -0
  230. package/dist/rasp/__tests__/auto-http.test.js +136 -0
  231. package/dist/rasp/__tests__/auto-http.test.js.map +1 -0
  232. package/dist/rasp/__tests__/baseline.test.d.ts +1 -0
  233. package/dist/rasp/__tests__/baseline.test.js +86 -0
  234. package/dist/rasp/__tests__/baseline.test.js.map +1 -0
  235. package/dist/rasp/__tests__/benign-corpus.test.d.ts +1 -0
  236. package/dist/rasp/__tests__/benign-corpus.test.js +68 -0
  237. package/dist/rasp/__tests__/benign-corpus.test.js.map +1 -0
  238. package/dist/rasp/__tests__/capture-context.test.d.ts +1 -0
  239. package/dist/rasp/__tests__/capture-context.test.js +135 -0
  240. package/dist/rasp/__tests__/capture-context.test.js.map +1 -0
  241. package/dist/rasp/__tests__/code-hook.test.d.ts +1 -0
  242. package/dist/rasp/__tests__/code-hook.test.js +218 -0
  243. package/dist/rasp/__tests__/code-hook.test.js.map +1 -0
  244. package/dist/rasp/__tests__/config-client.test.d.ts +1 -0
  245. package/dist/rasp/__tests__/config-client.test.js +283 -0
  246. package/dist/rasp/__tests__/config-client.test.js.map +1 -0
  247. package/dist/rasp/__tests__/corpus.d.ts +13 -0
  248. package/dist/rasp/__tests__/corpus.js +111 -0
  249. package/dist/rasp/__tests__/corpus.js.map +1 -0
  250. package/dist/rasp/__tests__/custom-rules.test.d.ts +1 -0
  251. package/dist/rasp/__tests__/custom-rules.test.js +276 -0
  252. package/dist/rasp/__tests__/custom-rules.test.js.map +1 -0
  253. package/dist/rasp/__tests__/db-hook.test.d.ts +1 -0
  254. package/dist/rasp/__tests__/db-hook.test.js +438 -0
  255. package/dist/rasp/__tests__/db-hook.test.js.map +1 -0
  256. package/dist/rasp/__tests__/deception.test.d.ts +1 -0
  257. package/dist/rasp/__tests__/deception.test.js +567 -0
  258. package/dist/rasp/__tests__/deception.test.js.map +1 -0
  259. package/dist/rasp/__tests__/detect.test.d.ts +1 -0
  260. package/dist/rasp/__tests__/detect.test.js +276 -0
  261. package/dist/rasp/__tests__/detect.test.js.map +1 -0
  262. package/dist/rasp/__tests__/esm-exports.test.d.ts +1 -0
  263. package/dist/rasp/__tests__/esm-exports.test.js +20 -0
  264. package/dist/rasp/__tests__/esm-exports.test.js.map +1 -0
  265. package/dist/rasp/__tests__/fs-hook.test.d.ts +1 -0
  266. package/dist/rasp/__tests__/fs-hook.test.js +241 -0
  267. package/dist/rasp/__tests__/fs-hook.test.js.map +1 -0
  268. package/dist/rasp/__tests__/hook-contracts.test.d.ts +1 -0
  269. package/dist/rasp/__tests__/hook-contracts.test.js +201 -0
  270. package/dist/rasp/__tests__/hook-contracts.test.js.map +1 -0
  271. package/dist/rasp/__tests__/hook-kit.d.ts +42 -0
  272. package/dist/rasp/__tests__/hook-kit.js +139 -0
  273. package/dist/rasp/__tests__/hook-kit.js.map +1 -0
  274. package/dist/rasp/__tests__/http-hook.test.d.ts +1 -0
  275. package/dist/rasp/__tests__/http-hook.test.js +250 -0
  276. package/dist/rasp/__tests__/http-hook.test.js.map +1 -0
  277. package/dist/rasp/__tests__/iast.test.d.ts +1 -0
  278. package/dist/rasp/__tests__/iast.test.js +361 -0
  279. package/dist/rasp/__tests__/iast.test.js.map +1 -0
  280. package/dist/rasp/__tests__/include-hook.test.d.ts +1 -0
  281. package/dist/rasp/__tests__/include-hook.test.js +122 -0
  282. package/dist/rasp/__tests__/include-hook.test.js.map +1 -0
  283. package/dist/rasp/__tests__/middleware.test.d.ts +1 -0
  284. package/dist/rasp/__tests__/middleware.test.js +302 -0
  285. package/dist/rasp/__tests__/middleware.test.js.map +1 -0
  286. package/dist/rasp/__tests__/process-hook.test.d.ts +1 -0
  287. package/dist/rasp/__tests__/process-hook.test.js +238 -0
  288. package/dist/rasp/__tests__/process-hook.test.js.map +1 -0
  289. package/dist/rasp/__tests__/reporter.test.d.ts +1 -0
  290. package/dist/rasp/__tests__/reporter.test.js +114 -0
  291. package/dist/rasp/__tests__/reporter.test.js.map +1 -0
  292. package/dist/rasp/__tests__/route.test.d.ts +1 -0
  293. package/dist/rasp/__tests__/route.test.js +46 -0
  294. package/dist/rasp/__tests__/route.test.js.map +1 -0
  295. package/dist/rasp/__tests__/rule-expr.test.d.ts +1 -0
  296. package/dist/rasp/__tests__/rule-expr.test.js +151 -0
  297. package/dist/rasp/__tests__/rule-expr.test.js.map +1 -0
  298. package/dist/rasp/__tests__/rule-phases.test.d.ts +1 -0
  299. package/dist/rasp/__tests__/rule-phases.test.js +271 -0
  300. package/dist/rasp/__tests__/rule-phases.test.js.map +1 -0
  301. package/dist/rasp/__tests__/sinks-hook.test.d.ts +1 -0
  302. package/dist/rasp/__tests__/sinks-hook.test.js +177 -0
  303. package/dist/rasp/__tests__/sinks-hook.test.js.map +1 -0
  304. package/dist/rasp/__tests__/targets.test.d.ts +1 -0
  305. package/dist/rasp/__tests__/targets.test.js +82 -0
  306. package/dist/rasp/__tests__/targets.test.js.map +1 -0
  307. package/dist/rasp/__tests__/template-hook.test.d.ts +1 -0
  308. package/dist/rasp/__tests__/template-hook.test.js +254 -0
  309. package/dist/rasp/__tests__/template-hook.test.js.map +1 -0
  310. package/dist/rasp/__tests__/upload.test.d.ts +1 -0
  311. package/dist/rasp/__tests__/upload.test.js +81 -0
  312. package/dist/rasp/__tests__/upload.test.js.map +1 -0
  313. package/dist/rasp/__tests__/vpatch-engine.test.d.ts +1 -0
  314. package/dist/rasp/__tests__/vpatch-engine.test.js +177 -0
  315. package/dist/rasp/__tests__/vpatch-engine.test.js.map +1 -0
  316. package/dist/rasp/auto-http.d.ts +6 -0
  317. package/dist/rasp/auto-http.js +194 -0
  318. package/dist/rasp/auto-http.js.map +1 -0
  319. package/dist/rasp/baseline.d.ts +35 -0
  320. package/dist/rasp/baseline.js +91 -0
  321. package/dist/rasp/baseline.js.map +1 -0
  322. package/dist/rasp/capture.d.ts +76 -0
  323. package/dist/rasp/capture.js +304 -0
  324. package/dist/rasp/capture.js.map +1 -0
  325. package/dist/rasp/config-client.d.ts +122 -0
  326. package/dist/rasp/config-client.js +337 -0
  327. package/dist/rasp/config-client.js.map +1 -0
  328. package/dist/rasp/context.d.ts +65 -0
  329. package/dist/rasp/context.js +68 -0
  330. package/dist/rasp/context.js.map +1 -0
  331. package/dist/rasp/custom-rules.d.ts +68 -0
  332. package/dist/rasp/custom-rules.js +222 -0
  333. package/dist/rasp/custom-rules.js.map +1 -0
  334. package/dist/rasp/data/default-rules.json +199 -0
  335. package/dist/rasp/data/default-sinks.json +4 -0
  336. package/dist/rasp/data/dnslog-domains.json +11 -0
  337. package/dist/rasp/deception.d.ts +70 -0
  338. package/dist/rasp/deception.js +220 -0
  339. package/dist/rasp/deception.js.map +1 -0
  340. package/dist/rasp/detect.d.ts +68 -0
  341. package/dist/rasp/detect.js +671 -0
  342. package/dist/rasp/detect.js.map +1 -0
  343. package/dist/rasp/engine.d.ts +107 -0
  344. package/dist/rasp/engine.js +330 -0
  345. package/dist/rasp/engine.js.map +1 -0
  346. package/dist/rasp/hooks/code.d.ts +20 -0
  347. package/dist/rasp/hooks/code.js +334 -0
  348. package/dist/rasp/hooks/code.js.map +1 -0
  349. package/dist/rasp/hooks/db.d.ts +48 -0
  350. package/dist/rasp/hooks/db.js +322 -0
  351. package/dist/rasp/hooks/db.js.map +1 -0
  352. package/dist/rasp/hooks/esm.d.ts +7 -0
  353. package/dist/rasp/hooks/esm.js +18 -0
  354. package/dist/rasp/hooks/esm.js.map +1 -0
  355. package/dist/rasp/hooks/fs.d.ts +3 -0
  356. package/dist/rasp/hooks/fs.js +206 -0
  357. package/dist/rasp/hooks/fs.js.map +1 -0
  358. package/dist/rasp/hooks/http.d.ts +4 -0
  359. package/dist/rasp/hooks/http.js +213 -0
  360. package/dist/rasp/hooks/http.js.map +1 -0
  361. package/dist/rasp/hooks/include.d.ts +9 -0
  362. package/dist/rasp/hooks/include.js +79 -0
  363. package/dist/rasp/hooks/include.js.map +1 -0
  364. package/dist/rasp/hooks/marks.d.ts +2 -0
  365. package/dist/rasp/hooks/marks.js +16 -0
  366. package/dist/rasp/hooks/marks.js.map +1 -0
  367. package/dist/rasp/hooks/process.d.ts +22 -0
  368. package/dist/rasp/hooks/process.js +191 -0
  369. package/dist/rasp/hooks/process.js.map +1 -0
  370. package/dist/rasp/hooks/sinks.d.ts +54 -0
  371. package/dist/rasp/hooks/sinks.js +329 -0
  372. package/dist/rasp/hooks/sinks.js.map +1 -0
  373. package/dist/rasp/hooks/template.d.ts +21 -0
  374. package/dist/rasp/hooks/template.js +152 -0
  375. package/dist/rasp/hooks/template.js.map +1 -0
  376. package/dist/rasp/iast-rules.d.ts +82 -0
  377. package/dist/rasp/iast-rules.js +240 -0
  378. package/dist/rasp/iast-rules.js.map +1 -0
  379. package/dist/rasp/iast-scope.d.ts +29 -0
  380. package/dist/rasp/iast-scope.js +54 -0
  381. package/dist/rasp/iast-scope.js.map +1 -0
  382. package/dist/rasp/iast.d.ts +81 -0
  383. package/dist/rasp/iast.js +272 -0
  384. package/dist/rasp/iast.js.map +1 -0
  385. package/dist/rasp/index.d.ts +52 -0
  386. package/dist/rasp/index.js +280 -0
  387. package/dist/rasp/index.js.map +1 -0
  388. package/dist/rasp/lexers.d.ts +32 -0
  389. package/dist/rasp/lexers.js +444 -0
  390. package/dist/rasp/lexers.js.map +1 -0
  391. package/dist/rasp/middleware.d.ts +155 -0
  392. package/dist/rasp/middleware.js +568 -0
  393. package/dist/rasp/middleware.js.map +1 -0
  394. package/dist/rasp/model-output.d.ts +14 -0
  395. package/dist/rasp/model-output.js +107 -0
  396. package/dist/rasp/model-output.js.map +1 -0
  397. package/dist/rasp/normalize.d.ts +23 -0
  398. package/dist/rasp/normalize.js +140 -0
  399. package/dist/rasp/normalize.js.map +1 -0
  400. package/dist/rasp/reporter.d.ts +60 -0
  401. package/dist/rasp/reporter.js +230 -0
  402. package/dist/rasp/reporter.js.map +1 -0
  403. package/dist/rasp/rule-expr.d.ts +236 -0
  404. package/dist/rasp/rule-expr.js +1253 -0
  405. package/dist/rasp/rule-expr.js.map +1 -0
  406. package/dist/rasp/template.d.ts +53 -0
  407. package/dist/rasp/template.js +336 -0
  408. package/dist/rasp/template.js.map +1 -0
  409. package/dist/rasp/types.d.ts +110 -0
  410. package/dist/rasp/types.js +51 -0
  411. package/dist/rasp/types.js.map +1 -0
  412. package/dist/rasp/vpatch.d.ts +55 -0
  413. package/dist/rasp/vpatch.js +120 -0
  414. package/dist/rasp/vpatch.js.map +1 -0
  415. package/dist/register.js +52 -11
  416. package/dist/register.js.map +1 -1
  417. package/dist/semantic-convention.d.ts +2 -0
  418. package/dist/semantic-convention.js +5 -0
  419. package/dist/semantic-convention.js.map +1 -1
  420. package/dist/types.d.ts +96 -0
  421. package/dist/zero-code.d.ts +8 -0
  422. package/dist/zero-code.js +38 -0
  423. package/dist/zero-code.js.map +1 -0
  424. package/package.json +18 -2
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CUSTOM_RULE_ACTIONS = exports.CUSTOM_RULE_PREFIX = exports.CUSTOM_RULE_ID = exports.MAX_RULE_APPS = exports.MAX_CUSTOM_RULES = void 0;
4
+ exports.resetCustomRuleWarnings = resetCustomRuleWarnings;
5
+ exports.parseCustomRules = parseCustomRules;
6
+ exports.actionMode = actionMode;
7
+ exports.customFinding = customFinding;
8
+ exports.requestSubject = requestSubject;
9
+ exports.ruleState = ruleState;
10
+ exports.matchRequestRules = matchRequestRules;
11
+ exports.matchFindingRules = matchFindingRules;
12
+ /**
13
+ * Custom rules (README "Custom rules"): the organization's own rules, written
14
+ * in the expression language of rule-expr.ts and delivered inside the signed
15
+ * config (`customRules`). They are data: each expression is parsed and
16
+ * type-checked when the config arrives and evaluated against the request (or
17
+ * a built-in finding) as a value. An invalid rule is skipped with one
18
+ * warning and never breaks the config; evaluation fails open.
19
+ *
20
+ * This file turns rules and the request context into the language's terms;
21
+ * the engine and capture decide what a match does.
22
+ */
23
+ const context_1 = require("./context");
24
+ const rule_expr_1 = require("./rule-expr");
25
+ exports.MAX_CUSTOM_RULES = 64;
26
+ exports.MAX_RULE_APPS = 32;
27
+ /** Lower-case, so the event rule `custom.<id>` fits the platform's rule shape. */
28
+ exports.CUSTOM_RULE_ID = /^[a-z0-9][a-z0-9_-]{0,47}$/;
29
+ exports.CUSTOM_RULE_PREFIX = 'custom.';
30
+ exports.CUSTOM_RULE_ACTIONS = ['block', 'monitor', 'alert'];
31
+ const warned = new Set();
32
+ function defaultWarn(s) {
33
+ console.warn(`Shield360 RASP: custom rule ${s.id ? `"${s.id}"` : `#${s.index + 1}`} was skipped (${s.reason}); the other rules apply.`);
34
+ }
35
+ /** Tests only: lets the once-per-rule warnings fire again. */
36
+ function resetCustomRuleWarnings() {
37
+ warned.clear();
38
+ }
39
+ /**
40
+ * The rules of a signed config that apply to this app: invalid rules are
41
+ * skipped (one warning per rule and reason, per process), disabled rules and
42
+ * rules scoped to other apps are left out silently. At most 64.
43
+ */
44
+ function parseCustomRules(raw, app, warn = defaultWarn) {
45
+ if (!Array.isArray(raw))
46
+ return [];
47
+ const out = [];
48
+ const ids = new Set();
49
+ const skip = (s, expression) => {
50
+ const key = `${s.id ?? s.index}\u0000${s.reason}\u0000${typeof expression === 'string' ? expression : ''}`;
51
+ if (warned.has(key))
52
+ return;
53
+ if (warned.size > 1024)
54
+ warned.clear();
55
+ warned.add(key);
56
+ try {
57
+ warn(s);
58
+ }
59
+ catch {
60
+ // never
61
+ }
62
+ };
63
+ for (let index = 0; index < raw.length; index++) {
64
+ try {
65
+ const r = raw[index];
66
+ if (!r || typeof r !== 'object' || Array.isArray(r)) {
67
+ skip({ index, reason: 'not an object' });
68
+ continue;
69
+ }
70
+ const id = typeof r.id === 'string' && exports.CUSTOM_RULE_ID.test(r.id) ? r.id : undefined;
71
+ if (!id) {
72
+ skip({ index, reason: 'invalid id' });
73
+ continue;
74
+ }
75
+ if (ids.has(id)) {
76
+ skip({ index, id, reason: 'duplicate id' });
77
+ continue;
78
+ }
79
+ ids.add(id);
80
+ if (typeof r.enabled !== 'boolean') {
81
+ skip({ index, id, reason: 'invalid enabled flag' });
82
+ continue;
83
+ }
84
+ if (!exports.CUSTOM_RULE_ACTIONS.includes(r.action)) {
85
+ skip({ index, id, reason: 'invalid action' });
86
+ continue;
87
+ }
88
+ if (r.name !== undefined && typeof r.name !== 'string') {
89
+ skip({ index, id, reason: 'invalid name' });
90
+ continue;
91
+ }
92
+ if (r.apps !== undefined && r.apps !== null && !(Array.isArray(r.apps) && r.apps.length <= exports.MAX_RULE_APPS && r.apps.every((a) => typeof a === 'string'))) {
93
+ skip({ index, id, reason: 'invalid apps' });
94
+ continue;
95
+ }
96
+ const compiled = (0, rule_expr_1.compileRuleExpr)(r.expression);
97
+ if (!compiled.ok) {
98
+ skip({ index, id, reason: `expression: ${compiled.error.code}` }, r.expression);
99
+ continue;
100
+ }
101
+ if (!r.enabled)
102
+ continue;
103
+ const apps = Array.isArray(r.apps) && r.apps.length ? r.apps : undefined;
104
+ if (apps && !apps.includes(app))
105
+ continue;
106
+ if (out.length >= exports.MAX_CUSTOM_RULES) {
107
+ skip({ index, id, reason: 'more than 64 rules' });
108
+ continue;
109
+ }
110
+ out.push({ id, name: typeof r.name === 'string' ? r.name : id, action: r.action, ...(apps ? { apps } : {}), expr: compiled.expr });
111
+ }
112
+ catch {
113
+ skip({ index, reason: 'unreadable' });
114
+ }
115
+ }
116
+ return out;
117
+ }
118
+ /** The most a rule does: `alert` reports like `monitor` (the platform raises the alert). */
119
+ function actionMode(a) {
120
+ return a === 'block' ? 'block' : 'monitor';
121
+ }
122
+ /** The finding a matched rule reports (attack type `custom_rule`, rule `custom.<id>`). */
123
+ function customFinding(rule, input) {
124
+ return { attack: 'custom_rule', rule: `${exports.CUSTOM_RULE_PREFIX}${rule.id}`, action: actionMode(rule.action), ...(input ? { input } : {}) };
125
+ }
126
+ const joined = (v) => (v === undefined ? undefined : Array.isArray(v) ? v.join(', ') : String(v));
127
+ /** The request as the language sees it (README "Custom rules: fields"). */
128
+ function requestSubject(ctx, app, inputs) {
129
+ if (!ctx)
130
+ return { app, inputs: [] };
131
+ const list = inputs ?? ctx.inputs;
132
+ const headers = {};
133
+ const raw = ctx.vp?.req.headers;
134
+ if (raw) {
135
+ for (const k of Object.keys(raw)) {
136
+ const v = joined(raw[k]);
137
+ if (v !== undefined)
138
+ headers[k.toLowerCase()] = v;
139
+ }
140
+ }
141
+ const query = {};
142
+ const body = {};
143
+ for (const i of list) {
144
+ if (i.source !== 'request')
145
+ continue;
146
+ if (i.key.startsWith('query.')) {
147
+ const k = i.key.slice(6);
148
+ if (!Object.prototype.hasOwnProperty.call(query, k))
149
+ query[k] = i.value;
150
+ }
151
+ else if (i.key.startsWith('body.')) {
152
+ const k = i.key.slice(5);
153
+ if (!Object.prototype.hasOwnProperty.call(body, k))
154
+ body[k] = i.value;
155
+ }
156
+ }
157
+ const path = ctx.path ?? null;
158
+ return {
159
+ app,
160
+ request: ctx.inRequest
161
+ ? {
162
+ method: ctx.method ? ctx.method.toUpperCase() : null,
163
+ path,
164
+ route: ctx.route ?? (path ? (0, context_1.routeOf)(path) : null),
165
+ ip: ctx.ip ?? null,
166
+ headers,
167
+ query,
168
+ body,
169
+ }
170
+ : null,
171
+ inputs: list.map((i) => ({ value: i.value, key: i.key, source: i.source })),
172
+ };
173
+ }
174
+ function ruleState(ctx) {
175
+ if (!ctx.rules)
176
+ ctx.rules = { matched: new Set(), budget: { steps: rule_expr_1.DEFAULT_RULE_BUDGET }, ranHead: false, ranBody: false };
177
+ return ctx.rules;
178
+ }
179
+ /**
180
+ * The request rules to judge in a phase, matched in order. `head`: every
181
+ * request rule that does not read the body. `body`: rules that read the body,
182
+ * and rules reading `input.*` that did not match at `head` (the body added
183
+ * inputs). A rule matches at most once per request.
184
+ */
185
+ function matchRequestRules(rules, ctx, phase, subject) {
186
+ const st = ruleState(ctx);
187
+ const out = [];
188
+ for (const rule of rules) {
189
+ const e = rule.expr;
190
+ if (st.budget.steps < 0)
191
+ break;
192
+ if (e.phase !== 'request' || st.matched.has(rule.id))
193
+ continue;
194
+ if (phase === 'head' ? e.usesBody : !(e.usesBody || e.usesInput))
195
+ continue;
196
+ const r = (0, rule_expr_1.evaluateRuleExpr)(e, subject, st.budget);
197
+ if (r.exhausted)
198
+ break;
199
+ if (!r.matched)
200
+ continue;
201
+ st.matched.add(rule.id);
202
+ out.push({ rule, input: r.input });
203
+ }
204
+ return out;
205
+ }
206
+ /** The finding rules a built-in finding matches, in order. */
207
+ function matchFindingRules(rules, subject, budget) {
208
+ const out = [];
209
+ for (const rule of rules) {
210
+ if (budget.steps < 0)
211
+ break;
212
+ if (rule.expr.phase !== 'finding')
213
+ continue;
214
+ const r = (0, rule_expr_1.evaluateRuleExpr)(rule.expr, subject, budget);
215
+ if (r.exhausted)
216
+ break;
217
+ if (r.matched)
218
+ out.push({ rule, input: r.input });
219
+ }
220
+ return out;
221
+ }
222
+ //# sourceMappingURL=custom-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-rules.js","sourceRoot":"","sources":["../../src/rasp/custom-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ {
2
+ "version": "2026-10-29.1",
3
+ "rules": [
4
+ {
5
+ "id": "vp.react2shell",
6
+ "title": "React Server Components Flight deserialization RCE (React2Shell) in a Next.js server action",
7
+ "cves": [
8
+ "CVE-2025-55182",
9
+ "CVE-2025-66478"
10
+ ],
11
+ "references": [
12
+ "https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components",
13
+ "https://vercel.com/changelog/cve-2025-55182",
14
+ "https://www.trendmicro.com/en_us/research/25/l/CVE-2025-55182-analysis-poc-itw.html"
15
+ ],
16
+ "severity": "critical",
17
+ "example": false,
18
+ "runtimes": [
19
+ "node"
20
+ ],
21
+ "action": "block",
22
+ "match": [
23
+ {
24
+ "target": "method",
25
+ "op": "equals",
26
+ "values": [
27
+ "POST"
28
+ ]
29
+ },
30
+ {
31
+ "target": "header:next-action",
32
+ "op": "present"
33
+ },
34
+ {
35
+ "target": "body",
36
+ "op": "contains_any",
37
+ "values": [
38
+ "resolved_model",
39
+ "constructor:constructor",
40
+ "_formData.get",
41
+ ":then:constructor",
42
+ ":__proto__:"
43
+ ]
44
+ }
45
+ ],
46
+ "note": "Body markers are the request shape Trend Micro documents for public exploits; CVE-2025-66478 is Next.js's identifier for the same flaw."
47
+ },
48
+ {
49
+ "id": "vp.react2shell-flight",
50
+ "title": "React Server Components Flight deserialization RCE (React2Shell) without a Next-Action header",
51
+ "cves": [
52
+ "CVE-2025-55182"
53
+ ],
54
+ "references": [
55
+ "https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components"
56
+ ],
57
+ "severity": "critical",
58
+ "example": false,
59
+ "runtimes": [
60
+ "node"
61
+ ],
62
+ "action": "block",
63
+ "match": [
64
+ {
65
+ "target": "method",
66
+ "op": "equals",
67
+ "values": [
68
+ "POST"
69
+ ]
70
+ },
71
+ {
72
+ "target": "body",
73
+ "op": "contains_any",
74
+ "values": [
75
+ "resolved_model"
76
+ ]
77
+ },
78
+ {
79
+ "target": "body",
80
+ "op": "contains_any",
81
+ "values": [
82
+ "constructor:constructor",
83
+ "_formData.get",
84
+ ":then:constructor"
85
+ ]
86
+ }
87
+ ]
88
+ },
89
+ {
90
+ "id": "vp.next-middleware-bypass",
91
+ "title": "Next.js middleware authorization bypass with x-middleware-subrequest",
92
+ "cves": [
93
+ "CVE-2025-29927"
94
+ ],
95
+ "references": [
96
+ "https://github.com/vercel/next.js/security/advisories/GHSA-f82v-jwr5-mffw"
97
+ ],
98
+ "severity": "critical",
99
+ "example": false,
100
+ "runtimes": [
101
+ "node"
102
+ ],
103
+ "action": "block",
104
+ "match": [
105
+ {
106
+ "target": "header:x-middleware-subrequest",
107
+ "op": "present"
108
+ }
109
+ ]
110
+ },
111
+ {
112
+ "id": "vp.node-serialize-iife",
113
+ "title": "node-serialize unserialize() code execution through an immediately invoked function",
114
+ "cves": [
115
+ "CVE-2017-5941"
116
+ ],
117
+ "references": [
118
+ "https://nvd.nist.gov/vuln/detail/CVE-2017-5941"
119
+ ],
120
+ "severity": "critical",
121
+ "example": false,
122
+ "runtimes": [
123
+ "node"
124
+ ],
125
+ "action": "block",
126
+ "match": [
127
+ {
128
+ "target": "request",
129
+ "op": "contains_any",
130
+ "values": [
131
+ "_$$ND_FUNC$$_"
132
+ ]
133
+ }
134
+ ]
135
+ },
136
+ {
137
+ "id": "vp.node2shell-brotli",
138
+ "title": "Node2Shell: Brotli decoder out-of-bounds write; refuses Brotli-encoded request bodies on unpatched Node.js",
139
+ "cves": [
140
+ "CVE-2026-111497"
141
+ ],
142
+ "references": [
143
+ "https://www.ox.security/blog/node-js-brotli-decoder-out-of-bounds-write-rce-cve-2026-111497/",
144
+ "https://thehackernews.com/2026/10/nodejs-brotli-decoder-bug-could-allow.html"
145
+ ],
146
+ "severity": "high",
147
+ "example": false,
148
+ "runtimes": [
149
+ "node"
150
+ ],
151
+ "runtimeVersions": {
152
+ "node": [
153
+ [
154
+ "22.0.0",
155
+ "22.23.4"
156
+ ],
157
+ [
158
+ "24.0.0",
159
+ "24.22.1"
160
+ ],
161
+ [
162
+ "26.0.0",
163
+ "26.12.1"
164
+ ]
165
+ ]
166
+ },
167
+ "action": "block",
168
+ "match": [
169
+ {
170
+ "target": "header:content-encoding",
171
+ "op": "contains_any",
172
+ "values": [
173
+ "br"
174
+ ],
175
+ "ignoreCase": true
176
+ }
177
+ ],
178
+ "confirmation": "third-party: OX Security, The Hacker News and Rescana report CVE-2026-111497 and the fixed releases 22.23.4, 24.22.1, 26.12.1; the nodejs.org advisory was not read when this rule was written"
179
+ },
180
+ {
181
+ "id": "vp.example-test-header",
182
+ "title": "Example rule: matches the test header x-shield360-rasp-test: exploit (not a real advisory)",
183
+ "cves": [],
184
+ "references": [],
185
+ "severity": "info",
186
+ "example": true,
187
+ "action": "block",
188
+ "match": [
189
+ {
190
+ "target": "header:x-shield360-rasp-test",
191
+ "op": "equals",
192
+ "values": [
193
+ "exploit"
194
+ ]
195
+ }
196
+ ]
197
+ }
198
+ ]
199
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "version": "2026-10-29.1",
3
+ "sinks": []
4
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "source": "Adapted from Baidu OpenRASP plugins/official/plugin.js dnsLogDomains (Apache-2.0); requestbin/interactsh entries added by Shield360.",
3
+ "domains": [
4
+ ".vuleye.pw", ".ceye.io", ".exeye.io", ".vcap.me", ".xip.name", ".xip.io", ".sslip.io", ".nip.io", ".oastify.com", ".eyes.sh",
5
+ ".burpcollaborator.net", ".tu4.org", ".2xss.cc", ".bxss.me", ".godns.vip", ".dnslog.cn", ".0kee.360.cn", ".r87.me", ".ngrok.io",
6
+ ".xn--9tr.com", ".pipedream.net", ".vxtrans.com", ".vxtrans.link", ".hopto.org", ".zapto.org", ".sytes.net", ".ddns.net",
7
+ ".canarytokens.com", ".interact.sh", ".oast.fun", ".oast.pro", ".oast.live", ".oast.site", ".oast.online", ".oast.me",
8
+ ".requestbin.net", ".requestcatcher.com", ".webhook.site"
9
+ ],
10
+ "hosts": ["requestb.in", "transfer.sh", "webhook.site"]
11
+ }
@@ -0,0 +1,70 @@
1
+ import { RaspBlockedError } from './types';
2
+ export type DeceptionConfig = {
3
+ paths: string[];
4
+ action: 'block' | 'monitor';
5
+ ttlSeconds: number;
6
+ };
7
+ export declare const MAX_DECOYS = 64;
8
+ export declare const MAX_DECOY_LENGTH = 256;
9
+ export declare const DEFAULT_TTL_S = 900;
10
+ export declare const MAX_TTL_S = 86400;
11
+ export declare const MAX_SUSPICIOUS = 10000;
12
+ export declare const HIT_RULE = "deception.hit";
13
+ export declare const SUSPICIOUS_RULE = "deception.suspicious";
14
+ export declare const DECEPTION_SINK = "http.deception";
15
+ /** Reads the signed config's `deception` value ("Deception", "Config"); null when deception is off. */
16
+ export declare function parseDeception(v: unknown): DeceptionConfig | null;
17
+ /**
18
+ * The decoy a request target hits, or null ("Deception", "Matching"). The
19
+ * path (before the first `?`) is percent-decoded once and compared byte for
20
+ * byte with each decoy's UTF-8. Both sides are kept as binary strings (one
21
+ * character per byte): Node's `req.url` already holds the target's bytes that
22
+ * way (it reads them as latin1); a character above U+00FF, which only a
23
+ * caller's own string can hold, counts as its UTF-8 bytes.
24
+ */
25
+ export declare function matchDecoy(target: string, decoys: readonly string[]): string | null;
26
+ /**
27
+ * Suspicious client addresses, at most `cap` entries, kept in expiry order
28
+ * (soonest first; equal expiries in marking order), so a TTL lowered by a new
29
+ * config never leaves an expired mark behind a live one. Marking a new
30
+ * address when full first drops every expired mark, then the mark closest to
31
+ * expiring. Single threaded, so no locking.
32
+ */
33
+ export declare class SuspiciousTable {
34
+ private readonly cap;
35
+ private readonly now;
36
+ private readonly marks;
37
+ private head?;
38
+ private tail?;
39
+ constructor(cap?: number, now?: () => number);
40
+ private unlink;
41
+ /** Marks (or marks again, restarting the time) an address for `ttlSeconds`. */
42
+ mark(ip: string, ttlSeconds: number): void;
43
+ /** Whether an address is marked; an expired mark is dropped. Never extends a mark. */
44
+ isMarked(ip: string): boolean;
45
+ get size(): number;
46
+ /** The marked addresses, soonest to expire first (tests). */
47
+ keys(): string[];
48
+ }
49
+ /** The process's table (tests). */
50
+ export declare function suspiciousTable(): SuspiciousTable;
51
+ /** Replaces the process's table (tests: a small cap, a fake clock). */
52
+ export declare function setSuspiciousTable(t: SuspiciousTable): void;
53
+ /** A request as deception sees it: the raw target (path and query as received) and the client address `request.ip` uses. */
54
+ export type DeceptionRequest = {
55
+ framework: string;
56
+ method: string;
57
+ url: string;
58
+ ip?: string;
59
+ };
60
+ /** What the adapter does: go on, answer its not-found, or answer the block response. */
61
+ export type DeceptionOutcome = {
62
+ notFound?: true;
63
+ blocked?: RaspBlockedError;
64
+ };
65
+ /**
66
+ * Runs deception for a request ("Deception", "Decision"). Call it only while
67
+ * RASP is active, before anything else. Never throws: an error lets the
68
+ * request through as if deception were off.
69
+ */
70
+ export declare function checkDeception(r: DeceptionRequest): DeceptionOutcome;