@skillsmith/core 0.2.0 → 2.0.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 (233) hide show
  1. package/README.md +233 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/__tests__/incremental.test.d.ts +13 -0
  4. package/dist/src/analysis/__tests__/incremental.test.d.ts.map +1 -0
  5. package/dist/src/analysis/__tests__/incremental.test.js +515 -0
  6. package/dist/src/analysis/__tests__/incremental.test.js.map +1 -0
  7. package/dist/src/analysis/__tests__/integration.test.d.ts +14 -0
  8. package/dist/src/analysis/__tests__/integration.test.d.ts.map +1 -0
  9. package/dist/src/analysis/__tests__/integration.test.js +1059 -0
  10. package/dist/src/analysis/__tests__/integration.test.js.map +1 -0
  11. package/dist/src/analysis/__tests__/metrics.test.d.ts +9 -0
  12. package/dist/src/analysis/__tests__/metrics.test.d.ts.map +1 -0
  13. package/dist/src/analysis/__tests__/metrics.test.js +369 -0
  14. package/dist/src/analysis/__tests__/metrics.test.js.map +1 -0
  15. package/dist/src/analysis/__tests__/performance.test.d.ts +15 -0
  16. package/dist/src/analysis/__tests__/performance.test.d.ts.map +1 -0
  17. package/dist/src/analysis/__tests__/performance.test.js +402 -0
  18. package/dist/src/analysis/__tests__/performance.test.js.map +1 -0
  19. package/dist/src/analysis/adapters/__tests__/go.test.d.ts +12 -0
  20. package/dist/src/analysis/adapters/__tests__/go.test.d.ts.map +1 -0
  21. package/dist/src/analysis/adapters/__tests__/go.test.js +561 -0
  22. package/dist/src/analysis/adapters/__tests__/go.test.js.map +1 -0
  23. package/dist/src/analysis/adapters/__tests__/python.test.d.ts +11 -0
  24. package/dist/src/analysis/adapters/__tests__/python.test.d.ts.map +1 -0
  25. package/dist/src/analysis/adapters/__tests__/python.test.js +669 -0
  26. package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -0
  27. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts +12 -0
  28. package/dist/src/analysis/adapters/__tests__/rust.test.d.ts.map +1 -0
  29. package/dist/src/analysis/adapters/__tests__/rust.test.js +676 -0
  30. package/dist/src/analysis/adapters/__tests__/rust.test.js.map +1 -0
  31. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +14 -0
  32. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts.map +1 -0
  33. package/dist/src/analysis/adapters/__tests__/typescript.test.js +381 -0
  34. package/dist/src/analysis/adapters/__tests__/typescript.test.js.map +1 -0
  35. package/dist/src/analysis/adapters/base.d.ts +83 -0
  36. package/dist/src/analysis/adapters/base.d.ts.map +1 -0
  37. package/dist/src/analysis/adapters/base.js +40 -0
  38. package/dist/src/analysis/adapters/base.js.map +1 -0
  39. package/dist/src/analysis/adapters/factory.d.ts +150 -0
  40. package/dist/src/analysis/adapters/factory.d.ts.map +1 -0
  41. package/dist/src/analysis/adapters/factory.js +244 -0
  42. package/dist/src/analysis/adapters/factory.js.map +1 -0
  43. package/dist/src/analysis/adapters/go.d.ts +131 -0
  44. package/dist/src/analysis/adapters/go.d.ts.map +1 -0
  45. package/dist/src/analysis/adapters/go.js +414 -0
  46. package/dist/src/analysis/adapters/go.js.map +1 -0
  47. package/dist/src/analysis/adapters/index.d.ts +20 -0
  48. package/dist/src/analysis/adapters/index.d.ts.map +1 -0
  49. package/dist/src/analysis/adapters/index.js +23 -0
  50. package/dist/src/analysis/adapters/index.js.map +1 -0
  51. package/dist/src/analysis/adapters/java.d.ts +154 -0
  52. package/dist/src/analysis/adapters/java.d.ts.map +1 -0
  53. package/dist/src/analysis/adapters/java.js +407 -0
  54. package/dist/src/analysis/adapters/java.js.map +1 -0
  55. package/dist/src/analysis/adapters/python.d.ts +165 -0
  56. package/dist/src/analysis/adapters/python.d.ts.map +1 -0
  57. package/dist/src/analysis/adapters/python.js +475 -0
  58. package/dist/src/analysis/adapters/python.js.map +1 -0
  59. package/dist/src/analysis/adapters/rust.d.ts +116 -0
  60. package/dist/src/analysis/adapters/rust.d.ts.map +1 -0
  61. package/dist/src/analysis/adapters/rust.js +476 -0
  62. package/dist/src/analysis/adapters/rust.js.map +1 -0
  63. package/dist/src/analysis/adapters/typescript.d.ts +68 -0
  64. package/dist/src/analysis/adapters/typescript.d.ts.map +1 -0
  65. package/dist/src/analysis/adapters/typescript.js +79 -0
  66. package/dist/src/analysis/adapters/typescript.js.map +1 -0
  67. package/dist/src/analysis/aggregator.d.ts +193 -0
  68. package/dist/src/analysis/aggregator.d.ts.map +1 -0
  69. package/dist/src/analysis/aggregator.js +283 -0
  70. package/dist/src/analysis/aggregator.js.map +1 -0
  71. package/dist/src/analysis/cache.d.ts +180 -0
  72. package/dist/src/analysis/cache.d.ts.map +1 -0
  73. package/dist/src/analysis/cache.js +279 -0
  74. package/dist/src/analysis/cache.js.map +1 -0
  75. package/dist/src/analysis/file-streamer.d.ts +136 -0
  76. package/dist/src/analysis/file-streamer.d.ts.map +1 -0
  77. package/dist/src/analysis/file-streamer.js +291 -0
  78. package/dist/src/analysis/file-streamer.js.map +1 -0
  79. package/dist/src/analysis/incremental-parser.d.ts +186 -0
  80. package/dist/src/analysis/incremental-parser.d.ts.map +1 -0
  81. package/dist/src/analysis/incremental-parser.js +291 -0
  82. package/dist/src/analysis/incremental-parser.js.map +1 -0
  83. package/dist/src/analysis/incremental.d.ts +186 -0
  84. package/dist/src/analysis/incremental.d.ts.map +1 -0
  85. package/dist/src/analysis/incremental.js +247 -0
  86. package/dist/src/analysis/incremental.js.map +1 -0
  87. package/dist/src/analysis/index.d.ts +25 -3
  88. package/dist/src/analysis/index.d.ts.map +1 -1
  89. package/dist/src/analysis/index.js +45 -3
  90. package/dist/src/analysis/index.js.map +1 -1
  91. package/dist/src/analysis/language-detector.d.ts +92 -0
  92. package/dist/src/analysis/language-detector.d.ts.map +1 -0
  93. package/dist/src/analysis/language-detector.js +602 -0
  94. package/dist/src/analysis/language-detector.js.map +1 -0
  95. package/dist/src/analysis/memory-monitor.d.ts +199 -0
  96. package/dist/src/analysis/memory-monitor.d.ts.map +1 -0
  97. package/dist/src/analysis/memory-monitor.js +271 -0
  98. package/dist/src/analysis/memory-monitor.js.map +1 -0
  99. package/dist/src/analysis/metrics.d.ts +300 -0
  100. package/dist/src/analysis/metrics.d.ts.map +1 -0
  101. package/dist/src/analysis/metrics.js +537 -0
  102. package/dist/src/analysis/metrics.js.map +1 -0
  103. package/dist/src/analysis/router.d.ts +264 -0
  104. package/dist/src/analysis/router.d.ts.map +1 -0
  105. package/dist/src/analysis/router.js +398 -0
  106. package/dist/src/analysis/router.js.map +1 -0
  107. package/dist/src/analysis/tree-cache.d.ts +208 -0
  108. package/dist/src/analysis/tree-cache.d.ts.map +1 -0
  109. package/dist/src/analysis/tree-cache.js +288 -0
  110. package/dist/src/analysis/tree-cache.js.map +1 -0
  111. package/dist/src/analysis/tree-sitter/manager.d.ts +141 -0
  112. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -0
  113. package/dist/src/analysis/tree-sitter/manager.js +239 -0
  114. package/dist/src/analysis/tree-sitter/manager.js.map +1 -0
  115. package/dist/src/analysis/types.d.ts +69 -6
  116. package/dist/src/analysis/types.d.ts.map +1 -1
  117. package/dist/src/analysis/types.js +23 -2
  118. package/dist/src/analysis/types.js.map +1 -1
  119. package/dist/src/analysis/worker-pool.d.ts +141 -0
  120. package/dist/src/analysis/worker-pool.d.ts.map +1 -0
  121. package/dist/src/analysis/worker-pool.js +418 -0
  122. package/dist/src/analysis/worker-pool.js.map +1 -0
  123. package/dist/src/analytics/schema.d.ts +1 -1
  124. package/dist/src/analytics/schema.d.ts.map +1 -1
  125. package/dist/src/analytics/schema.js +72 -0
  126. package/dist/src/analytics/schema.js.map +1 -1
  127. package/dist/src/api/cache.d.ts +24 -1
  128. package/dist/src/api/cache.d.ts.map +1 -1
  129. package/dist/src/api/cache.js +50 -2
  130. package/dist/src/api/cache.js.map +1 -1
  131. package/dist/src/api/client.d.ts +132 -2
  132. package/dist/src/api/client.d.ts.map +1 -1
  133. package/dist/src/api/client.js +214 -18
  134. package/dist/src/api/client.js.map +1 -1
  135. package/dist/src/api/index.d.ts +2 -0
  136. package/dist/src/api/index.d.ts.map +1 -1
  137. package/dist/src/api/index.js +7 -0
  138. package/dist/src/api/index.js.map +1 -1
  139. package/dist/src/api/types.d.ts +251 -0
  140. package/dist/src/api/types.d.ts.map +1 -0
  141. package/dist/src/api/types.js +9 -0
  142. package/dist/src/api/types.js.map +1 -0
  143. package/dist/src/benchmarks/memory/MemoryProfiler.d.ts.map +1 -1
  144. package/dist/src/benchmarks/memory/MemoryProfiler.js.map +1 -1
  145. package/dist/src/embeddings/index.d.ts.map +1 -1
  146. package/dist/src/embeddings/index.js.map +1 -1
  147. package/dist/src/errors.d.ts +1 -0
  148. package/dist/src/errors.d.ts.map +1 -1
  149. package/dist/src/errors.js +1 -0
  150. package/dist/src/errors.js.map +1 -1
  151. package/dist/src/index.d.ts +3 -3
  152. package/dist/src/index.d.ts.map +1 -1
  153. package/dist/src/index.js +4 -4
  154. package/dist/src/index.js.map +1 -1
  155. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  156. package/dist/src/repositories/IndexerRepository.js +1 -0
  157. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  158. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  159. package/dist/src/repositories/SkillRepository.js +1 -0
  160. package/dist/src/repositories/SkillRepository.js.map +1 -1
  161. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  162. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  163. package/dist/src/repositories/quarantine/query-builder.d.ts.map +1 -1
  164. package/dist/src/repositories/quarantine/query-builder.js +1 -1
  165. package/dist/src/repositories/quarantine/query-builder.js.map +1 -1
  166. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +3 -3
  167. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  168. package/dist/src/scripts/github-import/index.js.map +1 -1
  169. package/dist/src/scripts/import-github-skills.js +1 -1
  170. package/dist/src/scripts/import-github-skills.js.map +1 -1
  171. package/dist/src/scripts/skill-scanner/reporter.d.ts.map +1 -1
  172. package/dist/src/scripts/skill-scanner/reporter.js.map +1 -1
  173. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
  174. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
  175. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
  176. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  177. package/dist/src/scripts/validation/index.js +1 -2
  178. package/dist/src/scripts/validation/index.js.map +1 -1
  179. package/dist/src/scripts/validation/pipeline.d.ts.map +1 -1
  180. package/dist/src/scripts/validation/pipeline.js.map +1 -1
  181. package/dist/src/scripts/validation/types.d.ts +2 -2
  182. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  183. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  184. package/dist/src/services/SearchService.d.ts.map +1 -1
  185. package/dist/src/services/SearchService.js +1 -0
  186. package/dist/src/services/SearchService.js.map +1 -1
  187. package/dist/src/session/SessionHealthMonitor.d.ts +1 -1
  188. package/dist/src/session/SessionHealthMonitor.d.ts.map +1 -1
  189. package/dist/src/session/SessionHealthMonitor.js +1 -1
  190. package/dist/src/session/SessionHealthMonitor.js.map +1 -1
  191. package/dist/src/telemetry/index.d.ts +1 -1
  192. package/dist/src/telemetry/index.d.ts.map +1 -1
  193. package/dist/src/telemetry/index.js +2 -2
  194. package/dist/src/telemetry/index.js.map +1 -1
  195. package/dist/src/telemetry/posthog.d.ts +27 -5
  196. package/dist/src/telemetry/posthog.d.ts.map +1 -1
  197. package/dist/src/telemetry/posthog.js +20 -5
  198. package/dist/src/telemetry/posthog.js.map +1 -1
  199. package/dist/src/types/skill.d.ts +3 -0
  200. package/dist/src/types/skill.d.ts.map +1 -1
  201. package/dist/src/types.d.ts +2 -1
  202. package/dist/src/types.d.ts.map +1 -1
  203. package/dist/src/types.js +2 -2
  204. package/dist/src/types.js.map +1 -1
  205. package/dist/tests/adapters-factory.test.d.ts +13 -0
  206. package/dist/tests/adapters-factory.test.d.ts.map +1 -0
  207. package/dist/tests/adapters-factory.test.js +308 -0
  208. package/dist/tests/adapters-factory.test.js.map +1 -0
  209. package/dist/tests/adapters-java.test.d.ts +13 -0
  210. package/dist/tests/adapters-java.test.d.ts.map +1 -0
  211. package/dist/tests/adapters-java.test.js +925 -0
  212. package/dist/tests/adapters-java.test.js.map +1 -0
  213. package/dist/tests/api/client.validation.test.d.ts +7 -0
  214. package/dist/tests/api/client.validation.test.d.ts.map +1 -0
  215. package/dist/tests/api/client.validation.test.js +183 -0
  216. package/dist/tests/api/client.validation.test.js.map +1 -0
  217. package/dist/tests/language-detector.test.d.ts +13 -0
  218. package/dist/tests/language-detector.test.d.ts.map +1 -0
  219. package/dist/tests/language-detector.test.js +674 -0
  220. package/dist/tests/language-detector.test.js.map +1 -0
  221. package/dist/tests/telemetry/posthog.test.d.ts +13 -0
  222. package/dist/tests/telemetry/posthog.test.d.ts.map +1 -0
  223. package/dist/tests/telemetry/posthog.test.js +600 -0
  224. package/dist/tests/telemetry/posthog.test.js.map +1 -0
  225. package/package.json +5 -6
  226. package/dist/src/security/RateLimiter.d.ts +0 -337
  227. package/dist/src/security/RateLimiter.d.ts.map +0 -1
  228. package/dist/src/security/RateLimiter.js +0 -782
  229. package/dist/src/security/RateLimiter.js.map +0 -1
  230. package/dist/src/security/scanner.d.ts +0 -151
  231. package/dist/src/security/scanner.d.ts.map +0 -1
  232. package/dist/src/security/scanner.js +0 -599
  233. package/dist/src/security/scanner.js.map +0 -1
@@ -1,599 +0,0 @@
1
- /**
2
- * SMI-587: Security Scanner
3
- * SMI-685: Enhanced security scanning with severity scoring
4
- * SMI-882: ReDoS protection with input length limits and safe regex matching
5
- * Security scanning for skill content with advanced pattern detection
6
- */
7
- // Default allowed domains
8
- const DEFAULT_ALLOWED_DOMAINS = [
9
- 'github.com',
10
- 'githubusercontent.com',
11
- 'raw.githubusercontent.com',
12
- 'npmjs.com',
13
- 'npmjs.org',
14
- 'docs.anthropic.com',
15
- 'anthropic.com',
16
- 'claude.ai',
17
- 'docs.github.com',
18
- 'developer.mozilla.org',
19
- 'nodejs.org',
20
- 'typescriptlang.org',
21
- ];
22
- // Sensitive file path patterns
23
- const SENSITIVE_PATH_PATTERNS = [
24
- /\.env/i,
25
- /credentials/i,
26
- /secrets?/i,
27
- /\.pem$/i,
28
- /\.key$/i,
29
- /\.crt$/i,
30
- /password/i,
31
- /api[_-]?key/i,
32
- /auth[_-]?token/i,
33
- /~\/\.ssh/i,
34
- /~\/\.aws/i,
35
- /~\/\.config/i,
36
- ];
37
- // Jailbreak attempt patterns
38
- const JAILBREAK_PATTERNS = [
39
- /ignore\s+(all\s+)?(previous|prior|above)\s+(instructions?|prompts?|rules?)/i,
40
- /disregard\s+(all\s+)?(previous|prior|your)\s+(instructions?|programming)/i,
41
- /developer\s+mode/i,
42
- /\bDAN\b/,
43
- /do\s+anything\s+now/i,
44
- /jailbreak/i,
45
- /bypass\s+(all\s+)?(restrictions?|filters?|safety)/i,
46
- /pretend\s+(you\s+)?(are|have)\s+no\s+(restrictions?|limits?)/i,
47
- /act\s+as\s+(if\s+)?you\s+(have\s+)?no\s+ethics/i,
48
- /you\s+are\s+now\s+(free|unrestricted|unfiltered)/i,
49
- /ignore\s+your\s+(safety|ethical)\s+(guidelines?|rules?)/i,
50
- /hypothetical\s+scenario\s+where\s+you\s+can/i,
51
- ];
52
- // Suspicious patterns that might indicate malicious intent
53
- const SUSPICIOUS_PATTERNS = [
54
- /eval\s*\(/i,
55
- /exec\s*\(/i,
56
- /child_process/i,
57
- /\$\(\s*[`'"]/i, // Command substitution
58
- /base64\s*\.\s*decode/i,
59
- /from\s+base64\s+import/i,
60
- /subprocess\s*\.\s*(run|call|Popen)/i,
61
- /os\s*\.\s*(system|popen|exec)/i,
62
- /\brm\s+-rf\b/i,
63
- /curl\s+.*\|\s*(bash|sh)/i, // Curl pipe to shell
64
- /wget\s+.*\|\s*(bash|sh)/i,
65
- ];
66
- // SMI-685: Social engineering attempt patterns
67
- const SOCIAL_ENGINEERING_PATTERNS = [
68
- /pretend\s+(to\s+be|you\s+are|that\s+you)/i,
69
- /roleplay\s+as/i,
70
- /you\s+are\s+now\s+(?!free|unrestricted)/i, // Exclude jailbreak patterns
71
- /act\s+as\s+(if\s+you\s+were|though\s+you\s+are)/i,
72
- /imagine\s+you\s+are/i,
73
- /for\s+the\s+purposes?\s+of\s+this/i,
74
- /let'?s?\s+say\s+you\s+are/i,
75
- /assume\s+the\s+role\s+of/i,
76
- /from\s+now\s+on\s+you\s+are/i,
77
- /i\s+want\s+you\s+to\s+act\s+as/i,
78
- /please\s+behave\s+as\s+if/i,
79
- /can\s+you\s+pretend/i,
80
- ];
81
- // SMI-685: Prompt leaking attempt patterns
82
- const PROMPT_LEAKING_PATTERNS = [
83
- /show\s+(me\s+)?your\s+(system\s+)?(instructions?|prompt)/i,
84
- /what\s+are\s+your\s+(\w+\s+)?rules/i,
85
- /reveal\s+your\s+(system\s+)?prompt/i,
86
- /display\s+your\s+(initial\s+)?instructions?/i,
87
- /output\s+your\s+(system\s+)?prompt/i,
88
- /print\s+your\s+(hidden\s+)?instructions?/i,
89
- /tell\s+me\s+your\s+(secret\s+)?instructions?/i,
90
- /what\s+(were|are)\s+you\s+(told|instructed)\s+to\s+do/i,
91
- /repeat\s+(back\s+)?your\s+(\w+\s+)?prompt/i,
92
- /what\s+is\s+your\s+(original\s+)?programming/i,
93
- /dump\s+(your\s+)?system\s+(prompt|instructions?)/i,
94
- /list\s+your\s+(hidden\s+)?directives?/i,
95
- /what\s+(constraints?|limitations?)\s+do\s+you\s+have/i,
96
- /echo\s+(back\s+)?your\s+(initial\s+)?prompt/i,
97
- ];
98
- // SMI-685: Data exfiltration patterns
99
- const DATA_EXFILTRATION_PATTERNS = [
100
- /btoa\s*\(/i, // Base64 encode in JS
101
- /atob\s*\(/i, // Base64 decode in JS
102
- /Buffer\.from\s*\([^)]*,\s*['"]base64['"]/i,
103
- /\.toString\s*\(\s*['"]base64['"]\s*\)/i,
104
- /encodeURIComponent\s*\(/i,
105
- /fetch\s*\(\s*['"`][^'"`]*\?.*=/i, // Fetch with query params
106
- /XMLHttpRequest/i,
107
- /navigator\.sendBeacon/i,
108
- /\.upload\s*\(/i,
109
- /formData\.append/i,
110
- /new\s+FormData/i,
111
- /multipart\/form-data/i,
112
- /webhook\s*[=:]/i,
113
- /exfil/i,
114
- /data\s*:\s*['"]/i, // Data URLs
115
- /\.writeFile.*https?:\/\//i,
116
- /send\s+.*(to|the)\s+(external|remote)/i,
117
- /upload\s+.*(to|the)\s+(server|cloud|remote)/i,
118
- /post\s+data\s+to/i,
119
- /to\s+external\s+(api|server|endpoint)/i,
120
- ];
121
- // SMI-685: Privilege escalation patterns
122
- const PRIVILEGE_ESCALATION_PATTERNS = [
123
- /sudo\s+.*(-S|--stdin)/i, // sudo with password from stdin
124
- /echo\s+.*\|\s*sudo/i, // Echo password to sudo
125
- /sudo\s+-S/i,
126
- /\bchmod\s+[0-7]*[4-7][0-7][0-7]\b/i, // chmod with setuid/setgid
127
- /\bchmod\s+\+s\b/i, // chmod setuid
128
- /\bchmod\s+777\b/i, // World writable
129
- /\bchmod\s+666\b/i, // World readable/writable
130
- /\bchown\s+root/i,
131
- /\bchgrp\s+root/i,
132
- /visudo/i,
133
- /\/etc\/sudoers/i,
134
- /NOPASSWD/i,
135
- /setuid/i,
136
- /setgid/i,
137
- /capability\s+cap_/i,
138
- /escalat(e|ion)/i,
139
- /privilege[ds]?\s+(elevat|escal)/i,
140
- /run\s+.*as\s+root/i,
141
- /(run|execute)\s+as\s+(root|admin)/i,
142
- /admin(istrator)?\s+access/i,
143
- /root\s+(access|user)/i,
144
- /as\s+root\s+user/i,
145
- /su\s+-\s+root/i,
146
- /become\s+root/i,
147
- ];
148
- /**
149
- * Severity weights for risk score calculation
150
- */
151
- const SEVERITY_WEIGHTS = {
152
- low: 5,
153
- medium: 15,
154
- high: 30,
155
- critical: 50,
156
- };
157
- /**
158
- * Category weights for risk score calculation
159
- */
160
- const CATEGORY_WEIGHTS = {
161
- jailbreak: 2.0,
162
- social_engineering: 1.5,
163
- prompt_leaking: 1.8,
164
- data_exfiltration: 1.7,
165
- privilege_escalation: 1.9,
166
- suspicious_pattern: 1.3,
167
- sensitive_path: 1.2,
168
- url: 0.8,
169
- };
170
- /**
171
- * SMI-882: ReDoS Protection Constants
172
- * Maximum line length to process with regex patterns.
173
- * Lines exceeding this limit are truncated before regex matching
174
- * to prevent catastrophic backtracking attacks.
175
- */
176
- const MAX_LINE_LENGTH_FOR_REGEX = 10000;
177
- /**
178
- * SMI-882: Safe regex test with length limit
179
- * Applies input length limit before regex matching to prevent ReDoS attacks.
180
- *
181
- * @param pattern - Regex pattern to test
182
- * @param input - Input string to test against
183
- * @param maxLength - Maximum input length (default: MAX_LINE_LENGTH_FOR_REGEX)
184
- * @returns Match result or null if input is too long/no match
185
- */
186
- function safeRegexTest(pattern, input, maxLength = MAX_LINE_LENGTH_FOR_REGEX) {
187
- // Truncate input if it exceeds max length to prevent ReDoS
188
- const safeInput = input.length > maxLength ? input.slice(0, maxLength) : input;
189
- return safeInput.match(pattern);
190
- }
191
- /**
192
- * SMI-882: Check if pattern matches safely
193
- * Returns boolean instead of match array for simple tests.
194
- *
195
- * @param pattern - Regex pattern to test
196
- * @param input - Input string to test against
197
- * @param maxLength - Maximum input length (default: MAX_LINE_LENGTH_FOR_REGEX)
198
- * @returns True if pattern matches (within safe input limits)
199
- */
200
- function safeRegexCheck(pattern, input, maxLength = MAX_LINE_LENGTH_FOR_REGEX) {
201
- // Truncate input if it exceeds max length to prevent ReDoS
202
- const safeInput = input.length > maxLength ? input.slice(0, maxLength) : input;
203
- return pattern.test(safeInput);
204
- }
205
- export class SecurityScanner {
206
- allowedDomains;
207
- blockedPatterns;
208
- maxContentLength;
209
- riskThreshold;
210
- constructor(options = {}) {
211
- this.allowedDomains = new Set(options.allowedDomains ?? DEFAULT_ALLOWED_DOMAINS);
212
- this.blockedPatterns = options.blockedPatterns ?? [];
213
- this.maxContentLength = options.maxContentLength ?? 1_000_000; // 1MB
214
- this.riskThreshold = options.riskThreshold ?? 40;
215
- }
216
- /**
217
- * Extract all URLs from content
218
- */
219
- extractUrls(content) {
220
- const urlPattern = /https?:\/\/[^\s<>"')\]]+/gi;
221
- const lines = content.split('\n');
222
- const results = [];
223
- lines.forEach((line, index) => {
224
- let match;
225
- while ((match = urlPattern.exec(line)) !== null) {
226
- results.push({ url: match[0], line: index + 1 });
227
- }
228
- });
229
- return results;
230
- }
231
- /**
232
- * Check if URL domain is allowed
233
- */
234
- isAllowedDomain(url) {
235
- try {
236
- const parsed = new URL(url);
237
- const hostname = parsed.hostname.toLowerCase();
238
- // Check exact match or subdomain match
239
- return Array.from(this.allowedDomains).some((domain) => hostname === domain || hostname.endsWith('.' + domain));
240
- }
241
- catch {
242
- return false;
243
- }
244
- }
245
- /**
246
- * Scan for non-allowlisted URLs
247
- */
248
- scanUrls(content) {
249
- const findings = [];
250
- const urls = this.extractUrls(content);
251
- for (const { url, line } of urls) {
252
- if (!this.isAllowedDomain(url)) {
253
- findings.push({
254
- type: 'url',
255
- severity: 'medium',
256
- message: `External URL not in allowlist: ${url}`,
257
- location: url,
258
- lineNumber: line,
259
- });
260
- }
261
- }
262
- return findings;
263
- }
264
- /**
265
- * Scan for sensitive file path references
266
- * SMI-882: Uses safeRegexCheck to prevent ReDoS
267
- */
268
- scanSensitivePaths(content) {
269
- const findings = [];
270
- const lines = content.split('\n');
271
- lines.forEach((line, index) => {
272
- for (const pattern of SENSITIVE_PATH_PATTERNS) {
273
- // SMI-882: Use safe regex check with length limit
274
- if (safeRegexCheck(pattern, line)) {
275
- findings.push({
276
- type: 'sensitive_path',
277
- severity: 'high',
278
- message: `Reference to potentially sensitive path: ${pattern.source}`,
279
- location: line.trim().slice(0, 100),
280
- lineNumber: index + 1,
281
- });
282
- break; // One finding per line
283
- }
284
- }
285
- });
286
- return findings;
287
- }
288
- /**
289
- * Scan for jailbreak attempts
290
- * SMI-882: Uses safeRegexTest to prevent ReDoS
291
- */
292
- scanJailbreakPatterns(content) {
293
- const findings = [];
294
- const lines = content.split('\n');
295
- lines.forEach((line, index) => {
296
- for (const pattern of JAILBREAK_PATTERNS) {
297
- // SMI-882: Use safe regex test with length limit
298
- const match = safeRegexTest(pattern, line);
299
- if (match) {
300
- findings.push({
301
- type: 'jailbreak',
302
- severity: 'critical',
303
- message: `Potential jailbreak pattern detected: "${match[0]}"`,
304
- location: line.trim().slice(0, 100),
305
- lineNumber: index + 1,
306
- });
307
- break; // One finding per line
308
- }
309
- }
310
- });
311
- return findings;
312
- }
313
- /**
314
- * Scan for suspicious code patterns
315
- * SMI-882: Uses safeRegexTest to prevent ReDoS
316
- */
317
- scanSuspiciousPatterns(content) {
318
- const findings = [];
319
- const lines = content.split('\n');
320
- lines.forEach((line, index) => {
321
- for (const pattern of SUSPICIOUS_PATTERNS) {
322
- // SMI-882: Use safe regex test with length limit
323
- const match = safeRegexTest(pattern, line);
324
- if (match) {
325
- findings.push({
326
- type: 'suspicious_pattern',
327
- severity: 'medium',
328
- message: `Suspicious pattern detected: "${match[0]}"`,
329
- location: line.trim().slice(0, 100),
330
- lineNumber: index + 1,
331
- });
332
- break; // One finding per line
333
- }
334
- }
335
- // Check custom blocked patterns
336
- for (const pattern of this.blockedPatterns) {
337
- // SMI-882: Use safe regex test with length limit
338
- const match = safeRegexTest(pattern, line);
339
- if (match) {
340
- findings.push({
341
- type: 'suspicious_pattern',
342
- severity: 'high',
343
- message: `Blocked pattern detected: "${match[0]}"`,
344
- location: line.trim().slice(0, 100),
345
- lineNumber: index + 1,
346
- });
347
- break;
348
- }
349
- }
350
- });
351
- return findings;
352
- }
353
- /**
354
- * SMI-685: Scan for social engineering attempts
355
- * SMI-882: Uses safeRegexTest to prevent ReDoS
356
- * Detects patterns like "pretend to be", "roleplay as", "you are now"
357
- */
358
- scanSocialEngineering(content) {
359
- const findings = [];
360
- const lines = content.split('\n');
361
- lines.forEach((line, index) => {
362
- for (const pattern of SOCIAL_ENGINEERING_PATTERNS) {
363
- // SMI-882: Use safe regex test with length limit
364
- const match = safeRegexTest(pattern, line);
365
- if (match) {
366
- findings.push({
367
- type: 'social_engineering',
368
- severity: 'high',
369
- message: `Social engineering attempt detected: "${match[0]}"`,
370
- location: line.trim().slice(0, 100),
371
- lineNumber: index + 1,
372
- category: 'social_engineering',
373
- });
374
- break; // One finding per line
375
- }
376
- }
377
- });
378
- return findings;
379
- }
380
- /**
381
- * SMI-685: Scan for prompt leaking attempts
382
- * SMI-882: Uses safeRegexTest to prevent ReDoS
383
- * Detects patterns like "show me your instructions", "what are your rules"
384
- */
385
- scanPromptLeaking(content) {
386
- const findings = [];
387
- const lines = content.split('\n');
388
- lines.forEach((line, index) => {
389
- for (const pattern of PROMPT_LEAKING_PATTERNS) {
390
- // SMI-882: Use safe regex test with length limit
391
- const match = safeRegexTest(pattern, line);
392
- if (match) {
393
- findings.push({
394
- type: 'prompt_leaking',
395
- severity: 'critical',
396
- message: `Prompt leaking attempt detected: "${match[0]}"`,
397
- location: line.trim().slice(0, 100),
398
- lineNumber: index + 1,
399
- category: 'prompt_leaking',
400
- });
401
- break; // One finding per line
402
- }
403
- }
404
- });
405
- return findings;
406
- }
407
- /**
408
- * SMI-685: Scan for data exfiltration patterns
409
- * SMI-882: Uses safeRegexTest to prevent ReDoS
410
- * Detects encoding to external URLs, file upload patterns
411
- */
412
- scanDataExfiltration(content) {
413
- const findings = [];
414
- const lines = content.split('\n');
415
- lines.forEach((line, index) => {
416
- for (const pattern of DATA_EXFILTRATION_PATTERNS) {
417
- // SMI-882: Use safe regex test with length limit
418
- const match = safeRegexTest(pattern, line);
419
- if (match) {
420
- findings.push({
421
- type: 'data_exfiltration',
422
- severity: 'high',
423
- message: `Potential data exfiltration pattern: "${match[0]}"`,
424
- location: line.trim().slice(0, 100),
425
- lineNumber: index + 1,
426
- category: 'data_exfiltration',
427
- });
428
- break; // One finding per line
429
- }
430
- }
431
- });
432
- return findings;
433
- }
434
- /**
435
- * SMI-685: Scan for privilege escalation patterns
436
- * SMI-882: Uses safeRegexTest to prevent ReDoS
437
- * Detects sudo with passwords, chmod patterns, root access attempts
438
- */
439
- scanPrivilegeEscalation(content) {
440
- const findings = [];
441
- const lines = content.split('\n');
442
- lines.forEach((line, index) => {
443
- for (const pattern of PRIVILEGE_ESCALATION_PATTERNS) {
444
- // SMI-882: Use safe regex test with length limit
445
- const match = safeRegexTest(pattern, line);
446
- if (match) {
447
- findings.push({
448
- type: 'privilege_escalation',
449
- severity: 'critical',
450
- message: `Privilege escalation pattern detected: "${match[0]}"`,
451
- location: line.trim().slice(0, 100),
452
- lineNumber: index + 1,
453
- category: 'privilege_escalation',
454
- });
455
- break; // One finding per line
456
- }
457
- }
458
- });
459
- return findings;
460
- }
461
- /**
462
- * SMI-685: Calculate risk score from findings
463
- * Aggregates multiple findings into a risk score from 0-100
464
- * @param findings - Array of security findings
465
- * @returns Risk score breakdown and total
466
- */
467
- calculateRiskScore(findings) {
468
- const breakdown = {
469
- jailbreak: 0,
470
- socialEngineering: 0,
471
- promptLeaking: 0,
472
- dataExfiltration: 0,
473
- privilegeEscalation: 0,
474
- suspiciousCode: 0,
475
- sensitivePaths: 0,
476
- externalUrls: 0,
477
- };
478
- // Calculate raw scores by category
479
- for (const finding of findings) {
480
- const severityWeight = SEVERITY_WEIGHTS[finding.severity];
481
- const categoryWeight = CATEGORY_WEIGHTS[finding.type] ?? 1.0;
482
- const score = severityWeight * categoryWeight;
483
- switch (finding.type) {
484
- case 'jailbreak':
485
- breakdown.jailbreak += score;
486
- break;
487
- case 'social_engineering':
488
- breakdown.socialEngineering += score;
489
- break;
490
- case 'prompt_leaking':
491
- breakdown.promptLeaking += score;
492
- break;
493
- case 'data_exfiltration':
494
- breakdown.dataExfiltration += score;
495
- break;
496
- case 'privilege_escalation':
497
- breakdown.privilegeEscalation += score;
498
- break;
499
- case 'suspicious_pattern':
500
- breakdown.suspiciousCode += score;
501
- break;
502
- case 'sensitive_path':
503
- breakdown.sensitivePaths += score;
504
- break;
505
- case 'url':
506
- breakdown.externalUrls += score;
507
- break;
508
- }
509
- }
510
- // Cap each category at 100
511
- breakdown.jailbreak = Math.min(100, breakdown.jailbreak);
512
- breakdown.socialEngineering = Math.min(100, breakdown.socialEngineering);
513
- breakdown.promptLeaking = Math.min(100, breakdown.promptLeaking);
514
- breakdown.dataExfiltration = Math.min(100, breakdown.dataExfiltration);
515
- breakdown.privilegeEscalation = Math.min(100, breakdown.privilegeEscalation);
516
- breakdown.suspiciousCode = Math.min(100, breakdown.suspiciousCode);
517
- breakdown.sensitivePaths = Math.min(100, breakdown.sensitivePaths);
518
- breakdown.externalUrls = Math.min(100, breakdown.externalUrls);
519
- // Calculate total as weighted average, capped at 100
520
- const total = Math.min(100, Math.round(breakdown.jailbreak * 0.25 +
521
- breakdown.socialEngineering * 0.15 +
522
- breakdown.promptLeaking * 0.15 +
523
- breakdown.dataExfiltration * 0.12 +
524
- breakdown.privilegeEscalation * 0.13 +
525
- breakdown.suspiciousCode * 0.1 +
526
- breakdown.sensitivePaths * 0.05 +
527
- breakdown.externalUrls * 0.05));
528
- return { total, breakdown };
529
- }
530
- /**
531
- * Perform full security scan
532
- * SMI-685: Enhanced with new pattern detection and risk scoring
533
- */
534
- scan(skillId, content) {
535
- const startTime = performance.now();
536
- const findings = [];
537
- // Check content length
538
- if (content.length > this.maxContentLength) {
539
- findings.push({
540
- type: 'suspicious_pattern',
541
- severity: 'low',
542
- message: `Content exceeds maximum length (${this.maxContentLength} bytes)`,
543
- });
544
- }
545
- // Run all scans (original)
546
- findings.push(...this.scanUrls(content));
547
- findings.push(...this.scanSensitivePaths(content));
548
- findings.push(...this.scanJailbreakPatterns(content));
549
- findings.push(...this.scanSuspiciousPatterns(content));
550
- // SMI-685: Run new scans
551
- findings.push(...this.scanSocialEngineering(content));
552
- findings.push(...this.scanPromptLeaking(content));
553
- findings.push(...this.scanDataExfiltration(content));
554
- findings.push(...this.scanPrivilegeEscalation(content));
555
- const endTime = performance.now();
556
- // SMI-685: Calculate risk score
557
- const { total: riskScore, breakdown: riskBreakdown } = this.calculateRiskScore(findings);
558
- // Determine if scan passed based on risk threshold and severity
559
- const hasCritical = findings.some((f) => f.severity === 'critical');
560
- const hasHigh = findings.some((f) => f.severity === 'high');
561
- const exceedsThreshold = riskScore >= this.riskThreshold;
562
- return {
563
- skillId,
564
- passed: !hasCritical && !hasHigh && !exceedsThreshold,
565
- findings,
566
- scannedAt: new Date(),
567
- scanDurationMs: endTime - startTime,
568
- riskScore,
569
- riskBreakdown,
570
- };
571
- }
572
- /**
573
- * Quick check without full scan
574
- * SMI-882: Uses safeRegexCheck to prevent ReDoS
575
- */
576
- quickCheck(content) {
577
- // Check for critical patterns only
578
- for (const pattern of JAILBREAK_PATTERNS) {
579
- // SMI-882: Use safe regex check with length limit
580
- if (safeRegexCheck(pattern, content))
581
- return false;
582
- }
583
- return true;
584
- }
585
- /**
586
- * Add allowed domain
587
- */
588
- addAllowedDomain(domain) {
589
- this.allowedDomains.add(domain.toLowerCase());
590
- }
591
- /**
592
- * Add blocked pattern
593
- */
594
- addBlockedPattern(pattern) {
595
- this.blockedPatterns.push(pattern);
596
- }
597
- }
598
- export default SecurityScanner;
599
- //# sourceMappingURL=scanner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/security/scanner.ts"],"names":[],"mappings":"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"}