@skillsmith/core 0.11.3 → 0.11.4

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 (131) hide show
  1. package/CHANGELOG.md +21 -9
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/index.d.ts +3 -1
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +9 -1
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/logging/logger.test.js +57 -0
  8. package/dist/src/logging/logger.test.js.map +1 -1
  9. package/dist/src/logging/rotation.d.ts +27 -2
  10. package/dist/src/logging/rotation.d.ts.map +1 -1
  11. package/dist/src/logging/rotation.js +44 -3
  12. package/dist/src/logging/rotation.js.map +1 -1
  13. package/dist/src/logging/rotation.test.js +69 -0
  14. package/dist/src/logging/rotation.test.js.map +1 -1
  15. package/dist/src/logging/types.d.ts +8 -2
  16. package/dist/src/logging/types.d.ts.map +1 -1
  17. package/dist/src/security/index.d.ts +2 -1
  18. package/dist/src/security/index.d.ts.map +1 -1
  19. package/dist/src/security/index.js +3 -0
  20. package/dist/src/security/index.js.map +1 -1
  21. package/dist/src/security/scanner/SecurityScanner.d.ts +2 -2
  22. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  23. package/dist/src/security/scanner/SecurityScanner.evidence.d.ts +76 -0
  24. package/dist/src/security/scanner/SecurityScanner.evidence.d.ts.map +1 -0
  25. package/dist/src/security/scanner/SecurityScanner.evidence.js +176 -0
  26. package/dist/src/security/scanner/SecurityScanner.evidence.js.map +1 -0
  27. package/dist/src/security/scanner/SecurityScanner.exec.d.ts +8 -1
  28. package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -1
  29. package/dist/src/security/scanner/SecurityScanner.exec.js +58 -2
  30. package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -1
  31. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +35 -10
  32. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
  33. package/dist/src/security/scanner/SecurityScanner.helpers.js +106 -59
  34. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
  35. package/dist/src/security/scanner/SecurityScanner.js +41 -13
  36. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  37. package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -1
  38. package/dist/src/security/scanner/SecurityScanner.pii.js +23 -1
  39. package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -1
  40. package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
  41. package/dist/src/security/scanner/SecurityScanner.scanners.js +15 -3
  42. package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
  43. package/dist/src/security/scanner/SecurityScanner.ssrf.d.ts +11 -1
  44. package/dist/src/security/scanner/SecurityScanner.ssrf.d.ts.map +1 -1
  45. package/dist/src/security/scanner/SecurityScanner.ssrf.js +18 -7
  46. package/dist/src/security/scanner/SecurityScanner.ssrf.js.map +1 -1
  47. package/dist/src/security/scanner/index.d.ts +3 -3
  48. package/dist/src/security/scanner/index.d.ts.map +1 -1
  49. package/dist/src/security/scanner/index.js +5 -2
  50. package/dist/src/security/scanner/index.js.map +1 -1
  51. package/dist/src/security/scanner/patterns.d.ts +41 -14
  52. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  53. package/dist/src/security/scanner/patterns.jailbreak.d.ts +41 -0
  54. package/dist/src/security/scanner/patterns.jailbreak.d.ts.map +1 -0
  55. package/dist/src/security/scanner/patterns.jailbreak.evidence.d.ts +35 -0
  56. package/dist/src/security/scanner/patterns.jailbreak.evidence.d.ts.map +1 -0
  57. package/dist/src/security/scanner/patterns.jailbreak.evidence.js +119 -0
  58. package/dist/src/security/scanner/patterns.jailbreak.evidence.js.map +1 -0
  59. package/dist/src/security/scanner/patterns.jailbreak.js +370 -0
  60. package/dist/src/security/scanner/patterns.jailbreak.js.map +1 -0
  61. package/dist/src/security/scanner/patterns.js +101 -82
  62. package/dist/src/security/scanner/patterns.js.map +1 -1
  63. package/dist/src/security/scanner/patterns.scope.d.ts +62 -0
  64. package/dist/src/security/scanner/patterns.scope.d.ts.map +1 -0
  65. package/dist/src/security/scanner/patterns.scope.js +207 -0
  66. package/dist/src/security/scanner/patterns.scope.js.map +1 -0
  67. package/dist/src/security/scanner/regex-utils.d.ts +20 -0
  68. package/dist/src/security/scanner/regex-utils.d.ts.map +1 -1
  69. package/dist/src/security/scanner/regex-utils.js +20 -0
  70. package/dist/src/security/scanner/regex-utils.js.map +1 -1
  71. package/dist/src/security/scanner/types.d.ts +35 -0
  72. package/dist/src/security/scanner/types.d.ts.map +1 -1
  73. package/dist/src/services/skill-installation.io.d.ts.map +1 -1
  74. package/dist/src/services/skill-installation.io.js +12 -1
  75. package/dist/src/services/skill-installation.io.js.map +1 -1
  76. package/dist/src/sync/inventory-collector.d.ts.map +1 -1
  77. package/dist/src/sync/inventory-collector.js +2 -2
  78. package/dist/src/sync/inventory-collector.js.map +1 -1
  79. package/dist/tests/SecurityScanner.ai-defence.test.js +32 -7
  80. package/dist/tests/SecurityScanner.ai-defence.test.js.map +1 -1
  81. package/dist/tests/SecurityScanner.exec.test.js +79 -0
  82. package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
  83. package/dist/tests/security/ContinuousSecurity.performance.test.js +6 -0
  84. package/dist/tests/security/ContinuousSecurity.performance.test.js.map +1 -1
  85. package/dist/tests/security/ContinuousSecurity.test.js +15 -0
  86. package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
  87. package/dist/tests/security/ad-crlf-injection.test.d.ts +18 -0
  88. package/dist/tests/security/ad-crlf-injection.test.d.ts.map +1 -0
  89. package/dist/tests/security/ad-crlf-injection.test.js +150 -0
  90. package/dist/tests/security/ad-crlf-injection.test.js.map +1 -0
  91. package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts +25 -0
  92. package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts.map +1 -0
  93. package/dist/tests/security/ai-defence-multiline-promotion.test.js +138 -0
  94. package/dist/tests/security/ai-defence-multiline-promotion.test.js.map +1 -0
  95. package/dist/tests/security/nested-instruction-long-attribute.test.d.ts +15 -0
  96. package/dist/tests/security/nested-instruction-long-attribute.test.d.ts.map +1 -0
  97. package/dist/tests/security/nested-instruction-long-attribute.test.js +60 -0
  98. package/dist/tests/security/nested-instruction-long-attribute.test.js.map +1 -0
  99. package/dist/tests/security/pattern-scope.test.d.ts +17 -0
  100. package/dist/tests/security/pattern-scope.test.d.ts.map +1 -0
  101. package/dist/tests/security/pattern-scope.test.js +128 -0
  102. package/dist/tests/security/pattern-scope.test.js.map +1 -0
  103. package/dist/tests/security/pii-detection.test.js +39 -0
  104. package/dist/tests/security/pii-detection.test.js.map +1 -1
  105. package/dist/tests/security/scanner-evidence-tiers.test.d.ts +30 -0
  106. package/dist/tests/security/scanner-evidence-tiers.test.d.ts.map +1 -0
  107. package/dist/tests/security/scanner-evidence-tiers.test.js +258 -0
  108. package/dist/tests/security/scanner-evidence-tiers.test.js.map +1 -0
  109. package/dist/tests/security/scanner-privesc-severity.test.d.ts +23 -0
  110. package/dist/tests/security/scanner-privesc-severity.test.d.ts.map +1 -0
  111. package/dist/tests/security/scanner-privesc-severity.test.js +43 -0
  112. package/dist/tests/security/scanner-privesc-severity.test.js.map +1 -0
  113. package/dist/tests/security/scanner-regression-guard.exec-locality.test.d.ts +20 -0
  114. package/dist/tests/security/scanner-regression-guard.exec-locality.test.d.ts.map +1 -0
  115. package/dist/tests/security/scanner-regression-guard.exec-locality.test.js +71 -0
  116. package/dist/tests/security/scanner-regression-guard.exec-locality.test.js.map +1 -0
  117. package/dist/tests/security/scanner-regression-guard.test.d.ts +24 -0
  118. package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
  119. package/dist/tests/security/scanner-regression-guard.test.js +59 -3
  120. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
  121. package/dist/tests/security/scanner-ssrf-word-boundary.test.d.ts +19 -0
  122. package/dist/tests/security/scanner-ssrf-word-boundary.test.d.ts.map +1 -0
  123. package/dist/tests/security/scanner-ssrf-word-boundary.test.js +65 -0
  124. package/dist/tests/security/scanner-ssrf-word-boundary.test.js.map +1 -0
  125. package/dist/tests/security.test.js +11 -2
  126. package/dist/tests/security.test.js.map +1 -1
  127. package/dist/tests/skill-scanner/allowlist.test.js +15 -7
  128. package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
  129. package/dist/tests/unit/services/skill-installation.io.test.js +54 -1
  130. package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
  131. package/package.json +1 -1
@@ -4,24 +4,35 @@
4
4
  * Detects SSRF instructions in skill content.
5
5
  * Extracted from SecurityScanner to keep file sizes under 500 lines.
6
6
  */
7
- import { analyzeMarkdownContext, isDocumentationContext, isWithinInlineCode, isMultilinePattern, } from './SecurityScanner.helpers.js';
7
+ import { analyzeMarkdownContext, isDocumentationContext, isWithinInlineCode, } from './SecurityScanner.helpers.js';
8
8
  import { SSRF_INSTRUCTION_PATTERNS } from './patterns.js';
9
+ import { resolvePatternScope } from './patterns.scope.js';
9
10
  import { safeRegexTest } from './regex-utils.js';
10
11
  /**
11
12
  * Scan content for SSRF instruction patterns.
12
13
  * Uses documentation context to reduce severity for patterns in code blocks/tables.
13
14
  * SMI-3522: Supports multi-line patterns via scanPatternsWithMultilineSupport approach.
15
+ *
16
+ * SMI-5881: uses PATTERN_SCOPE (patterns.scope.ts) instead of the old
17
+ * per-source-text multiline-detection heuristic. This function's older
18
+ * skip-based two-pass (flaggedLines) can only correctly service
19
+ * 'line' | 'content' scope, never 'both' — assertScopeCoverage()
20
+ * (patterns.scope.ts) enforces at module-load time that no
21
+ * SSRF_INSTRUCTION_PATTERNS member is ever scoped 'both'.
14
22
  */
15
- export function scanSsrfPatterns(content, lineContexts) {
23
+ export function scanSsrfPatterns(content, lineContexts,
24
+ /** SMI-5881: explicit cap (UTF-16 code units) for the pass-1 full-content
25
+ * regex scan — see scanPatternsWithMultilineSupport's identical parameter. */
26
+ maxLength) {
16
27
  const findings = [];
17
28
  const lines = content.split('\n');
18
29
  const contexts = lineContexts ?? analyzeMarkdownContext(content);
19
30
  const flaggedLines = new Set();
20
- // SMI-3522: First pass — multi-line SSRF patterns against full content
31
+ // SMI-3522: First pass — 'content'-scope SSRF patterns against full content
21
32
  for (const pattern of SSRF_INSTRUCTION_PATTERNS) {
22
- if (!isMultilinePattern(pattern))
33
+ if (resolvePatternScope(pattern) === 'line')
23
34
  continue;
24
- const match = safeRegexTest(pattern, content);
35
+ const match = safeRegexTest(pattern, content, maxLength);
25
36
  if (match) {
26
37
  const matchIndex = content.indexOf(match[0]);
27
38
  const lineNumber = content.slice(0, matchIndex).split('\n').length;
@@ -43,13 +54,13 @@ export function scanSsrfPatterns(content, lineContexts) {
43
54
  flaggedLines.add(lineNumber);
44
55
  }
45
56
  }
46
- // Second pass — single-line SSRF patterns per-line
57
+ // Second pass — 'line'-scope SSRF patterns, per-line
47
58
  lines.forEach((line, index) => {
48
59
  if (flaggedLines.has(index + 1))
49
60
  return;
50
61
  const ctx = contexts[index];
51
62
  for (const pattern of SSRF_INSTRUCTION_PATTERNS) {
52
- if (isMultilinePattern(pattern))
63
+ if (resolvePatternScope(pattern) === 'content')
53
64
  continue;
54
65
  const match = safeRegexTest(pattern, line);
55
66
  if (match) {
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityScanner.ssrf.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.ssrf.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,YAA4B;IAC5E,MAAM,QAAQ,GAAsB,EAAE,CAAA;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,YAAY,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAChE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IAEtC,uEAAuE;IACvE,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;QAChD,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YAAE,SAAQ;QAC1C,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC7C,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;YAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;YACpC,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;YAC9D,MAAM,UAAU,GAAsB,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;YACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;YACjD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAEvC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,QAAQ;gBACR,OAAO,EAAE,uCAAuC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG;gBAChG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACvC,UAAU;gBACV,QAAQ,EAAE,MAAM;gBAChB,sBAAsB,EAAE,YAAY;gBACpC,UAAU;aACX,CAAC,CAAA;YACF,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,OAAM;QACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAE3B,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;YAChD,IAAI,kBAAkB,CAAC,OAAO,CAAC;gBAAE,SAAQ;YACzC,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,YAAY,GAAG,GAAG,EAAE,YAAY,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;gBACpF,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,CAAA;gBAC9E,MAAM,UAAU,GAAsB,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;gBACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;gBAEjD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,QAAQ;oBACR,OAAO,EAAE,uCAAuC,KAAK,CAAC,CAAC,CAAC,GAAG;oBAC3D,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACnC,UAAU,EAAE,KAAK,GAAG,CAAC;oBACrB,QAAQ,EAAE,MAAM;oBAChB,sBAAsB,EAAE,YAAY;oBACpC,UAAU;iBACX,CAAC,CAAA;gBACF,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC"}
1
+ {"version":3,"file":"SecurityScanner.ssrf.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.ssrf.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,YAA4B;AAC5B;8EAC8E;AAC9E,SAAkB;IAElB,MAAM,QAAQ,GAAsB,EAAE,CAAA;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,QAAQ,GAAG,YAAY,IAAI,sBAAsB,CAAC,OAAO,CAAC,CAAA;IAChE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAA;IAEtC,4EAA4E;IAC5E,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;QAChD,IAAI,mBAAmB,CAAC,OAAO,CAAC,KAAK,MAAM;YAAE,SAAQ;QACrD,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QACxD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;YAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;YACpC,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;YAC9D,MAAM,UAAU,GAAsB,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;YACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;YACjD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YAEvC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,QAAQ;gBACR,OAAO,EAAE,uCAAuC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG;gBAChG,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACvC,UAAU;gBACV,QAAQ,EAAE,MAAM;gBAChB,sBAAsB,EAAE,YAAY;gBACpC,UAAU;aACX,CAAC,CAAA;YACF,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC5B,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YAAE,OAAM;QACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAE3B,KAAK,MAAM,OAAO,IAAI,yBAAyB,EAAE,CAAC;YAChD,IAAI,mBAAmB,CAAC,OAAO,CAAC,KAAK,SAAS;gBAAE,SAAQ;YACxD,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,YAAY,GAAG,GAAG,EAAE,YAAY,IAAI,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;gBACpF,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,KAAK,CAAA;gBAC9E,MAAM,UAAU,GAAsB,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;gBACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAA;gBAEjD,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,QAAQ;oBACR,OAAO,EAAE,uCAAuC,KAAK,CAAC,CAAC,CAAC,GAAG;oBAC3D,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACnC,UAAU,EAAE,KAAK,GAAG,CAAC;oBACrB,QAAQ,EAAE,MAAM;oBAChB,sBAAsB,EAAE,YAAY;oBACpC,UAAU;iBACX,CAAC,CAAA;gBACF,MAAK;YACP,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -3,10 +3,10 @@
3
3
  *
4
4
  * Re-exports for security scanning functionality.
5
5
  */
6
- export type { SecurityFindingType, SecuritySeverity, SecurityFinding, RiskScoreBreakdown, ScanReport, ScannerOptions, HostileUpdateVerdict, TyposquatEnforcementMode, } from './types.js';
7
- export { DEFAULT_ALLOWED_DOMAINS, SENSITIVE_PATH_PATTERNS, JAILBREAK_PATTERNS, SUSPICIOUS_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, AI_DEFENCE_PATTERNS, SSRF_INSTRUCTION_PATTERNS, PII_PATTERNS, CODE_EXECUTION_PATTERNS, } from './patterns.js';
6
+ export type { SecurityFindingType, SecuritySeverity, SecurityFinding, RiskScoreBreakdown, ScanReport, ScannerOptions, HostileUpdateVerdict, TyposquatEnforcementMode, EvidenceType, } from './types.js';
7
+ export { DEFAULT_ALLOWED_DOMAINS, SENSITIVE_PATH_PATTERNS, JAILBREAK_PATTERNS, SUSPICIOUS_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, AI_DEFENCE_PATTERNS, SSRF_INSTRUCTION_PATTERNS, PII_PATTERNS, CODE_EXECUTION_PATTERNS, SCANNER_RULESET_VERSION, } from './patterns.js';
8
8
  export { SEVERITY_WEIGHTS, CATEGORY_WEIGHTS } from './weights.js';
9
- export { MAX_LINE_LENGTH_FOR_REGEX, safeRegexTest, safeRegexCheck } from './regex-utils.js';
9
+ export { MAX_LINE_LENGTH_FOR_REGEX, MAX_CONTENT_LENGTH_FOR_REGEX, safeRegexTest, safeRegexCheck, } from './regex-utils.js';
10
10
  export { stripInvisible } from './SecurityScanner.exec.js';
11
11
  export { CONFUSABLES, isFullwidthLatin, isMathAlphanumeric, confusableSkeleton, } from './confusables.js';
12
12
  export { BRAND_ALIASES, levenshteinDistance, scanTyposquat, detectTyposquat, applyTyposquatEnforcementMode, resolveTyposquatEnforcementMode, DEFAULT_TYPOSQUAT_ENFORCEMENT_MODE, } from './typosquat.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,mBAAmB,EACnB,yBAAyB,EACzB,YAAY,EACZ,uBAAuB,GACxB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGjE,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAK3F,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI1D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,6BAA6B,EAC7B,+BAA+B,EAC/B,kCAAkC,GACnC,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kCAAkC,GACnC,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAGjE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAG/D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,cAAc,EACd,oBAAoB,EACpB,wBAAwB,EAExB,YAAY,GACb,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,mBAAmB,EACnB,yBAAyB,EACzB,YAAY,EACZ,uBAAuB,EAGvB,uBAAuB,GACxB,MAAM,eAAe,CAAA;AAGtB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGjE,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAA;AAKzB,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI1D,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,6BAA6B,EAC7B,+BAA+B,EAC/B,kCAAkC,GACnC,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,kCAAkC,GACnC,MAAM,+BAA+B,CAAA;AAGtC,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAGjE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAG/D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA"}
@@ -4,11 +4,14 @@
4
4
  * Re-exports for security scanning functionality.
5
5
  */
6
6
  // Patterns (for testing/extending)
7
- export { DEFAULT_ALLOWED_DOMAINS, SENSITIVE_PATH_PATTERNS, JAILBREAK_PATTERNS, SUSPICIOUS_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, AI_DEFENCE_PATTERNS, SSRF_INSTRUCTION_PATTERNS, PII_PATTERNS, CODE_EXECUTION_PATTERNS, } from './patterns.js';
7
+ export { DEFAULT_ALLOWED_DOMAINS, SENSITIVE_PATH_PATTERNS, JAILBREAK_PATTERNS, SUSPICIOUS_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, AI_DEFENCE_PATTERNS, SSRF_INSTRUCTION_PATTERNS, PII_PATTERNS, CODE_EXECUTION_PATTERNS,
8
+ // SMI-5876: ruleset version stamp, consumed by the security-audit baseline
9
+ // to force a re-scan when the pattern/evidence-tier definitions change.
10
+ SCANNER_RULESET_VERSION, } from './patterns.js';
8
11
  // Weights (for testing/extending)
9
12
  export { SEVERITY_WEIGHTS, CATEGORY_WEIGHTS } from './weights.js';
10
13
  // Regex utilities (for testing/extending)
11
- export { MAX_LINE_LENGTH_FOR_REGEX, safeRegexTest, safeRegexCheck } from './regex-utils.js';
14
+ export { MAX_LINE_LENGTH_FOR_REGEX, MAX_CONTENT_LENGTH_FOR_REGEX, safeRegexTest, safeRegexCheck, } from './regex-utils.js';
12
15
  // Obfuscation-defeat primitive (SMI-4703: reused by
13
16
  // packages/doc-retrieval-mcp/src/security/memory-injection-scanner.ts's
14
17
  // normalization pipeline rather than reimplemented there)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/security/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,mCAAmC;AACnC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,mBAAmB,EACnB,yBAAyB,EACzB,YAAY,EACZ,uBAAuB,GACxB,MAAM,eAAe,CAAA;AAEtB,kCAAkC;AAClC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEjE,0CAA0C;AAC1C,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAE3F,oDAAoD;AACpD,wEAAwE;AACxE,0DAA0D;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,4FAA4F;AAC5F,8EAA8E;AAC9E,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAEzB,+BAA+B;AAC/B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,6BAA6B,EAC7B,+BAA+B,EAC/B,kCAAkC,GACnC,MAAM,gBAAgB,CAAA;AAEvB,kDAAkD;AAClD,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAA;AAOtC,mDAAmD;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEjE,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE/D,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/security/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,mCAAmC;AACnC,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,EAC7B,mBAAmB,EACnB,yBAAyB,EACzB,YAAY,EACZ,uBAAuB;AACvB,2EAA2E;AAC3E,wEAAwE;AACxE,uBAAuB,GACxB,MAAM,eAAe,CAAA;AAEtB,kCAAkC;AAClC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEjE,0CAA0C;AAC1C,OAAO,EACL,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EACb,cAAc,GACf,MAAM,kBAAkB,CAAA;AAEzB,oDAAoD;AACpD,wEAAwE;AACxE,0DAA0D;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,4FAA4F;AAC5F,8EAA8E;AAC9E,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAEzB,+BAA+B;AAC/B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,6BAA6B,EAC7B,+BAA+B,EAC/B,kCAAkC,GACnC,MAAM,gBAAgB,CAAA;AAEvB,kDAAkD;AAClD,OAAO,EACL,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,+BAA+B,CAAA;AAOtC,mDAAmD;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEjE,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAE/D,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA"}
@@ -7,7 +7,34 @@ export declare const DEFAULT_ALLOWED_DOMAINS: string[];
7
7
  export declare const ENV_PATH_PATTERN: RegExp;
8
8
  export declare const SENSITIVE_PATH_PATTERNS: RegExp[];
9
9
  export declare const VALUE_GATED_KEYWORD_PATTERNS: ReadonlySet<RegExp>;
10
- export declare const JAILBREAK_PATTERNS: RegExp[];
10
+ export { JAILBREAK_PATTERNS, AI_DEFENCE_PATTERNS } from './patterns.jailbreak.js';
11
+ export { EVIDENCE_TYPE_BY_PATTERN } from './patterns.jailbreak.evidence.js';
12
+ /**
13
+ * SMI-5876 §0.1/§0.2: bump on ANY pattern-array or evidence-table change in
14
+ * this module or patterns.jailbreak.ts. The security-audit baseline
15
+ * (packages/mcp-server/src/audit/security-baseline.ts /
16
+ * security-audit.ts) stamps every stored entry with the version that
17
+ * produced it and treats a mismatch as "not comparable" — forcing a re-scan
18
+ * instead of silently reusing a stale verdict from a scanner that no longer
19
+ * exists. Without this, the pattern/evidence-tier fix could not clear an
20
+ * already-flagged skill's stale `malicious` baseline on any machine that had
21
+ * scanned it before (see the security-audit.ts `comparable` gate).
22
+ *
23
+ * Bumped to `.2`: SMI-5876 design-pass follow-up added the `state_assertion`
24
+ * evidence tier + 5 new JAILBREAK_PATTERNS entries (J-S1/S2/S3a/S3b/S4) and
25
+ * widened #6 (bypass) + J-N1 in place — this is precisely the
26
+ * previously-clean-content-now-fires scenario the ruleset-version gate
27
+ * exists for.
28
+ *
29
+ * Bumped to `2026-07-29.1`: SMI-5881 P0 — AD_CRLF_INJECTION's source changed
30
+ * (ReDoS fix, same match language, see patterns.jailbreak.ts) and 4
31
+ * AI_DEFENCE_PATTERNS entries were promoted from 'line' to 'both' scope
32
+ * (AD_HTML_COMMENT_VERB/NOUN, AD_NESTED_INSTRUCTION_BLOCK, AD_ZERO_WIDTH — new
33
+ * cross-line matches now possible where none fired before), plus SSRF_
34
+ * INSTRUCTION_PATTERNS word-boundary narrowing (some previously-firing
35
+ * substring FPs, e.g. "budget to localhost", no longer match).
36
+ */
37
+ export declare const SCANNER_RULESET_VERSION: "2026-07-29.1";
11
38
  export declare const SUSPICIOUS_PATTERNS: RegExp[];
12
39
  /**
13
40
  * SMI-5359 Wave 4.2: Remote-fetch-to-interpreter ("code_execution") patterns.
@@ -33,30 +60,30 @@ export declare const CODE_EXECUTION_PATTERNS: RegExp[];
33
60
  export declare const SOCIAL_ENGINEERING_PATTERNS: RegExp[];
34
61
  export declare const PROMPT_LEAKING_PATTERNS: RegExp[];
35
62
  export declare const DATA_EXFILTRATION_PATTERNS: RegExp[];
63
+ export declare const CREDENTIAL_SUBSTITUTION_PATTERNS: RegExp[];
36
64
  export declare const PRIVILEGE_ESCALATION_PATTERNS: RegExp[];
37
65
  /**
38
66
  * SMI-3509: SSRF instruction patterns
39
67
  * Detects content instructing fetches to internal/dangerous endpoints.
40
68
  * These are text-oriented patterns for skill content scanning (not URL validators).
41
- */
42
- export declare const SSRF_INSTRUCTION_PATTERNS: RegExp[];
43
- /**
44
- * SMI-1532: AIDefence CVE-hardened injection patterns
45
- * Optimized for sub-10ms scan time with compiled regex and no backtracking
46
69
  *
47
- * These patterns detect sophisticated prompt injection attacks based on
48
- * known CVEs and security research findings.
49
- *
50
- * References:
51
- * - OWASP LLM Top 10: LLM01 Prompt Injection
52
- * - Anthropic Responsible Disclosure Program findings
53
- * - Academic research on prompt injection attacks
70
+ * SMI-5881: leading `\b` added to every verb alternation below — the verbs
71
+ * (fetch/request/curl/wget/get/open/load/read/connect/send) previously had no
72
+ * boundary, so they matched as a SUBSTRING of an unrelated word ("get" inside
73
+ * "budget"/"target"/"forget"/"widget", "connect" inside "disconnect", "load"
74
+ * inside "download"/"reload", "open" inside "reopen", "read" inside
75
+ * "bread"/"spread"/"thread"). A trailing `\b` was also added after the bare
76
+ * `localhost` literal (both the single-line and multiline forms) so
77
+ * "localhosting" no longer matches via a "localhost" prefix. Every existing
78
+ * `\s` quantifier is unchanged — replacing them with newline-exclusive classes
79
+ * was tried and reverted (breaks a verb+target split across a real line
80
+ * break, a real evasion). See scanner-ssrf-word-boundary.test.ts.
54
81
  */
82
+ export declare const SSRF_INSTRUCTION_PATTERNS: RegExp[];
55
83
  /**
56
84
  * SMI-3864: PII detection patterns
57
85
  * Detects personally identifiable information and credentials in skill content.
58
86
  * Complements AIDefence's aidefence_has_pii() for offline/local scanning.
59
87
  */
60
88
  export declare const PII_PATTERNS: RegExp[];
61
- export declare const AI_DEFENCE_PATTERNS: RegExp[];
62
89
  //# sourceMappingURL=patterns.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,eAAO,MAAM,uBAAuB,UAanC,CAAA;AA4BD,eAAO,MAAM,gBAAgB,QAAoE,CAAA;AAMjG,eAAO,MAAM,uBAAuB,UAsBnC,CAAA;AAID,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAG3D,CAAA;AAGF,eAAO,MAAM,kBAAkB,UAkB9B,CAAA;AAGD,eAAO,MAAM,mBAAmB,UAY/B,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,uBAAuB,UAmBnC,CAAA;AAGD,eAAO,MAAM,2BAA2B,UAavC,CAAA;AAGD,eAAO,MAAM,uBAAuB,UAenC,CAAA;AAGD,eAAO,MAAM,0BAA0B,UA2DtC,CAAA;AAGD,eAAO,MAAM,6BAA6B,UA8CzC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,UAuBrC,CAAA;AAED;;;;;;;;;;;GAWG;AACH;;;;GAIG;AACH,eAAO,MAAM,YAAY,UAwBxB,CAAA;AAED,eAAO,MAAM,mBAAmB,UAwD/B,CAAA"}
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,eAAO,MAAM,uBAAuB,UAanC,CAAA;AA4BD,eAAO,MAAM,gBAAgB,QAAoE,CAAA;AAMjG,eAAO,MAAM,uBAAuB,UAsBnC,CAAA;AAID,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,CAG3D,CAAA;AAUF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAIjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,uBAAuB,EAAG,cAAuB,CAAA;AAG9D,eAAO,MAAM,mBAAmB,UAY/B,CAAA;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,uBAAuB,UAmBnC,CAAA;AAGD,eAAO,MAAM,2BAA2B,UAavC,CAAA;AAGD,eAAO,MAAM,uBAAuB,UAenC,CAAA;AAGD,eAAO,MAAM,0BAA0B,UA2DtC,CAAA;AAMD,eAAO,MAAM,gCAAgC,UAG5C,CAAA;AAGD,eAAO,MAAM,6BAA6B,UA8EzC,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,yBAAyB,UAuBrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,UAwBxB,CAAA"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * SMI-5876 Wave 1: Jailbreak / AI-Defence pattern arrays + evidence-tier map.
3
+ * @module @skillsmith/core/security/scanner/patterns.jailbreak
4
+ *
5
+ * Split out of patterns.ts (which was approaching the 500-line audit:standards
6
+ * gate) to hold `JAILBREAK_PATTERNS` and `AI_DEFENCE_PATTERNS`; the
7
+ * evidence-tier classification that governs their severity now lives
8
+ * alongside them in `patterns.jailbreak.evidence.ts` (SMI-5881, split out for
9
+ * the same 500-line reason).
10
+ *
11
+ * Background: both arrays previously matched bare vocabulary with no context
12
+ * requirement (`/jailbreak/i`, `/\bDAN\b/`, a bare role marker, a bare `[[...]]`
13
+ * bracket, ...) — a security-checklist skill's prose tripped the same
14
+ * CRITICAL/HIGH severity as a real attack. `EVIDENCE_TYPE_BY_PATTERN`
15
+ * classifies every pattern in both arrays into one of FIVE evidence tiers
16
+ * (`types.ts`'s `EvidenceType` — `mention`, `role_turn_with_body`,
17
+ * `imperative_instruction`, `instruction_override`, and `state_assertion`, the
18
+ * last added in a design-pass follow-up for declarative state assertions like
19
+ * "Jailbreak activated" that no frame-based directive pattern can catch);
20
+ * `SecurityScanner.evidence.ts` turns that tier (+ documentation context) into
21
+ * a severity/confidence pair, and `SecurityScanner.helpers.ts`'s merge-loop
22
+ * picks the STRONGEST tier per line across both the multi-line and
23
+ * single-line scan passes.
24
+ *
25
+ * Discriminator (see the SMI-5876 design doc for the full worked argument): a
26
+ * pattern is `mention`-tier iff its matched text, read in isolation, instructs
27
+ * nothing — pure nouns/names/labels/structural markers/payload-free
28
+ * obfuscation artifacts. Anything with a verb+object pairing or a
29
+ * second-person predicate is directive-tier (`imperative_instruction` /
30
+ * `instruction_override`). A descriptive-frame negative guard (demote when
31
+ * preceded by "guards against" / "for example" / ...) was deliberately
32
+ * REJECTED — for prompt injection the text IS the attack, so any framing-based
33
+ * exemption is itself a bypass vector ("for example, ignore all previous
34
+ * instructions" would be suppressed). This is why JAILBREAK's `bypass ...
35
+ * restrictions/filters/safety` entry stays directive-tier: it's a genuine
36
+ * attack on its own, and the only tool that would separate it from the
37
+ * "guards against bypass" documentation case is the rejected frame guard.
38
+ */
39
+ export declare const JAILBREAK_PATTERNS: RegExp[];
40
+ export declare const AI_DEFENCE_PATTERNS: RegExp[];
41
+ //# sourceMappingURL=patterns.jailbreak.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.jailbreak.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.jailbreak.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAoLH,eAAO,MAAM,kBAAkB,UA4B9B,CAAA;AAuLD,eAAO,MAAM,mBAAmB,UAuB/B,CAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * SMI-5876 Wave 1 / SMI-5881: evidence-tier classification for
3
+ * JAILBREAK_PATTERNS + AI_DEFENCE_PATTERNS.
4
+ * @module @skillsmith/core/security/scanner/patterns.jailbreak.evidence
5
+ *
6
+ * Split out of patterns.jailbreak.ts (SMI-5881 — that file was approaching
7
+ * the 500-line audit:standards gate again, same reason it was split out of
8
+ * patterns.ts in SMI-5876) so EVIDENCE_TYPE_BY_PATTERN's declaration doesn't
9
+ * grow patterns.jailbreak.ts every time a new pattern is added.
10
+ *
11
+ * Keyed by OBJECT IDENTITY, exhaustive over both arrays (asserted by test in
12
+ * scanner-evidence-tiers.test.ts), but classifyEvidence() (SecurityScanner.
13
+ * evidence.ts) still defaults UNMAPPED patterns to `imperative_instruction` —
14
+ * fail-closed: forgetting to classify a newly added pattern makes it
15
+ * strongest, never weakest.
16
+ *
17
+ * Built from parallel index-aligned arrays (not per-named-const references)
18
+ * because the individual pattern consts (JB_IGNORE_PREVIOUS, AD_ROLE_MARKER_
19
+ * BARE, ...) are private to patterns.jailbreak.ts and intentionally not
20
+ * exported — this file only ever sees the same JAILBREAK_PATTERNS /
21
+ * AI_DEFENCE_PATTERNS arrays every other consumer sees, so a length mismatch
22
+ * (pattern added to one array, tier forgotten here) is impossible to
23
+ * misalign silently: the two arrays below MUST stay index-aligned with the
24
+ * exported pattern arrays, or scanner-evidence-tiers.test.ts's exhaustiveness
25
+ * assertion catches it immediately.
26
+ *
27
+ * Consumed ONLY by SecurityScanner's severity resolution. Every other
28
+ * consumer of JAILBREAK_PATTERNS / AI_DEFENCE_PATTERNS (memory-injection-
29
+ * scanner.ts's quarantine gate, SecurityScanner.quickCheck()) ignores it by
30
+ * design — both those call sites test bare pattern presence, not evidence
31
+ * tier, and that is intentional (see their own inline comments).
32
+ */
33
+ import type { EvidenceType } from './types.js';
34
+ export declare const EVIDENCE_TYPE_BY_PATTERN: ReadonlyMap<RegExp, EvidenceType>;
35
+ //# sourceMappingURL=patterns.jailbreak.evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.jailbreak.evidence.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.jailbreak.evidence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAuD9C,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAMrE,CAAA"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * SMI-5876 Wave 1 / SMI-5881: evidence-tier classification for
3
+ * JAILBREAK_PATTERNS + AI_DEFENCE_PATTERNS.
4
+ * @module @skillsmith/core/security/scanner/patterns.jailbreak.evidence
5
+ *
6
+ * Split out of patterns.jailbreak.ts (SMI-5881 — that file was approaching
7
+ * the 500-line audit:standards gate again, same reason it was split out of
8
+ * patterns.ts in SMI-5876) so EVIDENCE_TYPE_BY_PATTERN's declaration doesn't
9
+ * grow patterns.jailbreak.ts every time a new pattern is added.
10
+ *
11
+ * Keyed by OBJECT IDENTITY, exhaustive over both arrays (asserted by test in
12
+ * scanner-evidence-tiers.test.ts), but classifyEvidence() (SecurityScanner.
13
+ * evidence.ts) still defaults UNMAPPED patterns to `imperative_instruction` —
14
+ * fail-closed: forgetting to classify a newly added pattern makes it
15
+ * strongest, never weakest.
16
+ *
17
+ * Built from parallel index-aligned arrays (not per-named-const references)
18
+ * because the individual pattern consts (JB_IGNORE_PREVIOUS, AD_ROLE_MARKER_
19
+ * BARE, ...) are private to patterns.jailbreak.ts and intentionally not
20
+ * exported — this file only ever sees the same JAILBREAK_PATTERNS /
21
+ * AI_DEFENCE_PATTERNS arrays every other consumer sees, so a length mismatch
22
+ * (pattern added to one array, tier forgotten here) is impossible to
23
+ * misalign silently: the two arrays below MUST stay index-aligned with the
24
+ * exported pattern arrays, or scanner-evidence-tiers.test.ts's exhaustiveness
25
+ * assertion catches it immediately.
26
+ *
27
+ * Consumed ONLY by SecurityScanner's severity resolution. Every other
28
+ * consumer of JAILBREAK_PATTERNS / AI_DEFENCE_PATTERNS (memory-injection-
29
+ * scanner.ts's quarantine gate, SecurityScanner.quickCheck()) ignores it by
30
+ * design — both those call sites test bare pattern presence, not evidence
31
+ * tier, and that is intentional (see their own inline comments).
32
+ */
33
+ import { JAILBREAK_PATTERNS, AI_DEFENCE_PATTERNS } from './patterns.jailbreak.js';
34
+ // Index-aligned with JAILBREAK_PATTERNS (patterns.jailbreak.ts) — keep in sync.
35
+ const JAILBREAK_EVIDENCE = [
36
+ 'instruction_override', // JB_IGNORE_PREVIOUS
37
+ 'instruction_override', // JB_DISREGARD_PREVIOUS
38
+ 'mention', // JB_DEVELOPER_MODE
39
+ 'mention', // JB_DAN_BARE
40
+ 'mention', // JB_DO_ANYTHING_NOW
41
+ 'mention', // JB_JAILBREAK_BARE
42
+ 'imperative_instruction', // JB_BYPASS_RESTRICTIONS
43
+ 'imperative_instruction', // JB_PRETEND_NO_RESTRICTIONS
44
+ 'imperative_instruction', // JB_ACT_NO_ETHICS
45
+ 'imperative_instruction', // JB_YOU_ARE_NOW_FREE
46
+ 'instruction_override', // JB_IGNORE_SAFETY_GUIDELINES
47
+ 'imperative_instruction', // JB_HYPOTHETICAL_SCENARIO
48
+ 'imperative_instruction', // JB_JN1_MODE_FRAME
49
+ 'imperative_instruction', // JB_JN2_DEVELOPER_MODE_FRAME
50
+ 'imperative_instruction', // JB_JN3_PERSONA_FRAME
51
+ 'state_assertion', // JB_JS1_STATE_BARE
52
+ 'state_assertion', // JB_JS2_NOUN_MODE_STATE
53
+ 'state_assertion', // JB_JS3A_DEV_MODE_THEN_CAPABILITY
54
+ 'state_assertion', // JB_JS3B_CAPABILITY_THEN_DEV_MODE
55
+ 'imperative_instruction', // JB_JS4_OBEDIENCE_COMPULSION
56
+ 'instruction_override', // JB_SPLIT_IGNORE
57
+ 'instruction_override', // JB_SPLIT_DISREGARD
58
+ 'imperative_instruction', // JB_SPLIT_BYPASS
59
+ ];
60
+ // Index-aligned with AI_DEFENCE_PATTERNS (patterns.jailbreak.ts) — keep in sync.
61
+ const AI_DEFENCE_EVIDENCE = [
62
+ 'mention', // AD_ROLE_MARKER_BARE
63
+ 'mention', // AD_BRACKET_HIDDEN
64
+ 'instruction_override', // AD_HTML_COMMENT_VERB
65
+ 'mention', // AD_HTML_COMMENT_NOUN
66
+ 'imperative_instruction', // AD_HOMOGRAPH_RUN_PLUS_KEYWORD
67
+ 'mention', // AD_MIXED_SCRIPT_WORD
68
+ 'mention', // AD_XML_TAG_BARE
69
+ 'imperative_instruction', // AD_BASE64_INSTRUCTIONS
70
+ 'mention', // AD_DELIMITER_BARE
71
+ 'mention', // AD_JSON_ROLE_FIELD
72
+ 'role_turn_with_body', // AD_NESTED_INSTRUCTION_BLOCK
73
+ 'instruction_override', // AD_CRLF_INJECTION
74
+ 'mention', // AD_TEMPLATE_LITERAL
75
+ 'mention', // AD_ZERO_WIDTH
76
+ 'imperative_instruction', // AD_MARKDOWN_LINK_PAYLOAD
77
+ 'imperative_instruction', // AD_ESCAPE_SEQUENCE_ABUSE
78
+ 'mention', // AD_ZALGO_COMBINING
79
+ 'role_turn_with_body', // AD_AN1_ROLE_BODY_SAME_LINE
80
+ 'role_turn_with_body', // AD_AN2_ROLE_BODY_NEXT_LINE
81
+ 'role_turn_with_body', // AD_AN3A_CHAT_TOKEN_BODY_SAME_LINE
82
+ 'role_turn_with_body', // AD_AN3B_CHAT_TOKEN_BODY_NEXT_LINE
83
+ ];
84
+ export const EVIDENCE_TYPE_BY_PATTERN = new Map([
85
+ ...JAILBREAK_PATTERNS.map((p, i) => [p, JAILBREAK_EVIDENCE[i]]),
86
+ ...AI_DEFENCE_PATTERNS.map((p, i) => [p, AI_DEFENCE_EVIDENCE[i]]),
87
+ ]);
88
+ /**
89
+ * Module-load gate: unlike patterns.scope.ts's PATTERN_SCOPE, an unmapped
90
+ * entry here degrades safely (classifyEvidence() fail-closes to the
91
+ * strongest tier), so this isn't a silent-coverage-gap risk the way scope is.
92
+ * Still asserted directly rather than relying solely on `Map.has()` via
93
+ * scanner-evidence-tiers.test.ts's exhaustiveness check: `new Map([[p,
94
+ * undefined]])` reports `.has(p) === true`, so an out-of-range EVIDENCE[i]
95
+ * read during construction (a length mismatch between a PATTERNS array and
96
+ * its index-aligned EVIDENCE array) would pass a has()-only check silently.
97
+ */
98
+ function assertEvidenceCoverage() {
99
+ const pairs = [
100
+ { name: 'JAILBREAK_PATTERNS', patterns: JAILBREAK_PATTERNS, evidence: JAILBREAK_EVIDENCE },
101
+ { name: 'AI_DEFENCE_PATTERNS', patterns: AI_DEFENCE_PATTERNS, evidence: AI_DEFENCE_EVIDENCE },
102
+ ];
103
+ for (const { name, patterns, evidence } of pairs) {
104
+ if (patterns.length !== evidence.length) {
105
+ throw new Error(`[SecurityScanner] ${name} has ${patterns.length} pattern(s) but its evidence array has ` +
106
+ `${evidence.length} entries — they must be index-aligned and equal length. ` +
107
+ `Add or remove an evidence entry in patterns.jailbreak.evidence.ts to match.`);
108
+ }
109
+ patterns.forEach((pattern, index) => {
110
+ const evidenceType = EVIDENCE_TYPE_BY_PATTERN.get(pattern);
111
+ if (!EVIDENCE_TYPE_BY_PATTERN.has(pattern) || evidenceType === undefined) {
112
+ throw new Error(`[SecurityScanner] ${name}[${index}] (/${pattern.source}/${pattern.flags}) has no ` +
113
+ `EVIDENCE_TYPE_BY_PATTERN entry.`);
114
+ }
115
+ });
116
+ }
117
+ }
118
+ assertEvidenceCoverage();
119
+ //# sourceMappingURL=patterns.jailbreak.evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.jailbreak.evidence.js","sourceRoot":"","sources":["../../../../src/security/scanner/patterns.jailbreak.evidence.ts"],"names":[],"mappings":"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"}