@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.
- package/CHANGELOG.md +21 -9
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +9 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/logging/logger.test.js +57 -0
- package/dist/src/logging/logger.test.js.map +1 -1
- package/dist/src/logging/rotation.d.ts +27 -2
- package/dist/src/logging/rotation.d.ts.map +1 -1
- package/dist/src/logging/rotation.js +44 -3
- package/dist/src/logging/rotation.js.map +1 -1
- package/dist/src/logging/rotation.test.js +69 -0
- package/dist/src/logging/rotation.test.js.map +1 -1
- package/dist/src/logging/types.d.ts +8 -2
- package/dist/src/logging/types.d.ts.map +1 -1
- package/dist/src/security/index.d.ts +2 -1
- package/dist/src/security/index.d.ts.map +1 -1
- package/dist/src/security/index.js +3 -0
- package/dist/src/security/index.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +2 -2
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.evidence.d.ts +76 -0
- package/dist/src/security/scanner/SecurityScanner.evidence.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.evidence.js +176 -0
- package/dist/src/security/scanner/SecurityScanner.evidence.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts +8 -1
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.exec.js +58 -2
- package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +35 -10
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.helpers.js +106 -59
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.js +41 -13
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.pii.js +23 -1
- package/dist/src/security/scanner/SecurityScanner.pii.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.scanners.js +15 -3
- package/dist/src/security/scanner/SecurityScanner.scanners.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.ssrf.d.ts +11 -1
- package/dist/src/security/scanner/SecurityScanner.ssrf.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.ssrf.js +18 -7
- package/dist/src/security/scanner/SecurityScanner.ssrf.js.map +1 -1
- package/dist/src/security/scanner/index.d.ts +3 -3
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +5 -2
- package/dist/src/security/scanner/index.js.map +1 -1
- package/dist/src/security/scanner/patterns.d.ts +41 -14
- package/dist/src/security/scanner/patterns.d.ts.map +1 -1
- package/dist/src/security/scanner/patterns.jailbreak.d.ts +41 -0
- package/dist/src/security/scanner/patterns.jailbreak.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.jailbreak.evidence.d.ts +35 -0
- package/dist/src/security/scanner/patterns.jailbreak.evidence.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.jailbreak.evidence.js +119 -0
- package/dist/src/security/scanner/patterns.jailbreak.evidence.js.map +1 -0
- package/dist/src/security/scanner/patterns.jailbreak.js +370 -0
- package/dist/src/security/scanner/patterns.jailbreak.js.map +1 -0
- package/dist/src/security/scanner/patterns.js +101 -82
- package/dist/src/security/scanner/patterns.js.map +1 -1
- package/dist/src/security/scanner/patterns.scope.d.ts +62 -0
- package/dist/src/security/scanner/patterns.scope.d.ts.map +1 -0
- package/dist/src/security/scanner/patterns.scope.js +207 -0
- package/dist/src/security/scanner/patterns.scope.js.map +1 -0
- package/dist/src/security/scanner/regex-utils.d.ts +20 -0
- package/dist/src/security/scanner/regex-utils.d.ts.map +1 -1
- package/dist/src/security/scanner/regex-utils.js +20 -0
- package/dist/src/security/scanner/regex-utils.js.map +1 -1
- package/dist/src/security/scanner/types.d.ts +35 -0
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.d.ts.map +1 -1
- package/dist/src/services/skill-installation.io.js +12 -1
- package/dist/src/services/skill-installation.io.js.map +1 -1
- package/dist/src/sync/inventory-collector.d.ts.map +1 -1
- package/dist/src/sync/inventory-collector.js +2 -2
- package/dist/src/sync/inventory-collector.js.map +1 -1
- package/dist/tests/SecurityScanner.ai-defence.test.js +32 -7
- package/dist/tests/SecurityScanner.ai-defence.test.js.map +1 -1
- package/dist/tests/SecurityScanner.exec.test.js +79 -0
- package/dist/tests/SecurityScanner.exec.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.performance.test.js +6 -0
- package/dist/tests/security/ContinuousSecurity.performance.test.js.map +1 -1
- package/dist/tests/security/ContinuousSecurity.test.js +15 -0
- package/dist/tests/security/ContinuousSecurity.test.js.map +1 -1
- package/dist/tests/security/ad-crlf-injection.test.d.ts +18 -0
- package/dist/tests/security/ad-crlf-injection.test.d.ts.map +1 -0
- package/dist/tests/security/ad-crlf-injection.test.js +150 -0
- package/dist/tests/security/ad-crlf-injection.test.js.map +1 -0
- package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts +25 -0
- package/dist/tests/security/ai-defence-multiline-promotion.test.d.ts.map +1 -0
- package/dist/tests/security/ai-defence-multiline-promotion.test.js +138 -0
- package/dist/tests/security/ai-defence-multiline-promotion.test.js.map +1 -0
- package/dist/tests/security/nested-instruction-long-attribute.test.d.ts +15 -0
- package/dist/tests/security/nested-instruction-long-attribute.test.d.ts.map +1 -0
- package/dist/tests/security/nested-instruction-long-attribute.test.js +60 -0
- package/dist/tests/security/nested-instruction-long-attribute.test.js.map +1 -0
- package/dist/tests/security/pattern-scope.test.d.ts +17 -0
- package/dist/tests/security/pattern-scope.test.d.ts.map +1 -0
- package/dist/tests/security/pattern-scope.test.js +128 -0
- package/dist/tests/security/pattern-scope.test.js.map +1 -0
- package/dist/tests/security/pii-detection.test.js +39 -0
- package/dist/tests/security/pii-detection.test.js.map +1 -1
- package/dist/tests/security/scanner-evidence-tiers.test.d.ts +30 -0
- package/dist/tests/security/scanner-evidence-tiers.test.d.ts.map +1 -0
- package/dist/tests/security/scanner-evidence-tiers.test.js +258 -0
- package/dist/tests/security/scanner-evidence-tiers.test.js.map +1 -0
- package/dist/tests/security/scanner-privesc-severity.test.d.ts +23 -0
- package/dist/tests/security/scanner-privesc-severity.test.d.ts.map +1 -0
- package/dist/tests/security/scanner-privesc-severity.test.js +43 -0
- package/dist/tests/security/scanner-privesc-severity.test.js.map +1 -0
- package/dist/tests/security/scanner-regression-guard.exec-locality.test.d.ts +20 -0
- package/dist/tests/security/scanner-regression-guard.exec-locality.test.d.ts.map +1 -0
- package/dist/tests/security/scanner-regression-guard.exec-locality.test.js +71 -0
- package/dist/tests/security/scanner-regression-guard.exec-locality.test.js.map +1 -0
- package/dist/tests/security/scanner-regression-guard.test.d.ts +24 -0
- package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
- package/dist/tests/security/scanner-regression-guard.test.js +59 -3
- package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
- package/dist/tests/security/scanner-ssrf-word-boundary.test.d.ts +19 -0
- package/dist/tests/security/scanner-ssrf-word-boundary.test.d.ts.map +1 -0
- package/dist/tests/security/scanner-ssrf-word-boundary.test.js +65 -0
- package/dist/tests/security/scanner-ssrf-word-boundary.test.js.map +1 -0
- package/dist/tests/security.test.js +11 -2
- package/dist/tests/security.test.js.map +1 -1
- package/dist/tests/skill-scanner/allowlist.test.js +15 -7
- package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
- package/dist/tests/unit/services/skill-installation.io.test.js +54 -1
- package/dist/tests/unit/services/skill-installation.io.test.js.map +1 -1
- 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,
|
|
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 —
|
|
31
|
+
// SMI-3522: First pass — 'content'-scope SSRF patterns against full content
|
|
21
32
|
for (const pattern of SSRF_INSTRUCTION_PATTERNS) {
|
|
22
|
-
if (
|
|
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 —
|
|
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 (
|
|
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,
|
|
1
|
+
{"version":3,"file":"SecurityScanner.ssrf.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.ssrf.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,
|
|
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,
|
|
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;
|
|
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
|
|
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
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
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;
|
|
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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"}
|