@skillsmith/core 0.11.2 → 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 +36 -9
- package/README.md +6 -7
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/McpReferenceExtractor.d.ts +59 -5
- package/dist/src/analysis/McpReferenceExtractor.d.ts.map +1 -1
- package/dist/src/analysis/McpReferenceExtractor.hardening.test.d.ts +2 -0
- package/dist/src/analysis/McpReferenceExtractor.hardening.test.d.ts.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.hardening.test.js +278 -0
- package/dist/src/analysis/McpReferenceExtractor.hardening.test.js.map +1 -0
- package/dist/src/analysis/McpReferenceExtractor.js +276 -20
- package/dist/src/analysis/McpReferenceExtractor.js.map +1 -1
- package/dist/src/analysis/McpReferenceExtractor.test.js +4 -0
- package/dist/src/analysis/McpReferenceExtractor.test.js.map +1 -1
- package/dist/src/config/config-atomic-write.d.ts +58 -0
- package/dist/src/config/config-atomic-write.d.ts.map +1 -0
- package/dist/src/config/config-atomic-write.js +151 -0
- package/dist/src/config/config-atomic-write.js.map +1 -0
- package/dist/src/config/config-atomic-write.test.d.ts +9 -0
- package/dist/src/config/config-atomic-write.test.d.ts.map +1 -0
- package/dist/src/config/config-atomic-write.test.js +92 -0
- package/dist/src/config/config-atomic-write.test.js.map +1 -0
- package/dist/src/config/device-identity.d.ts +16 -0
- package/dist/src/config/device-identity.d.ts.map +1 -1
- package/dist/src/config/device-identity.js +82 -14
- package/dist/src/config/device-identity.js.map +1 -1
- package/dist/src/config/device-identity.test.js +158 -1
- package/dist/src/config/device-identity.test.js.map +1 -1
- package/dist/src/config/index.d.ts +14 -0
- package/dist/src/config/index.d.ts.map +1 -1
- package/dist/src/config/index.js +31 -15
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/exports/services.d.ts +2 -1
- package/dist/src/exports/services.d.ts.map +1 -1
- package/dist/src/exports/services.js +1 -0
- package/dist/src/exports/services.js.map +1 -1
- package/dist/src/index.d.ts +4 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/SwarmIndexer.d.ts +1 -1
- package/dist/src/indexer/SwarmIndexer.js +2 -2
- package/dist/src/indexer/SwarmIndexer.js.map +1 -1
- package/dist/src/install/paths.d.ts +1 -1
- package/dist/src/install/paths.d.ts.map +1 -1
- package/dist/src/install/paths.js +2 -0
- package/dist/src/install/paths.js.map +1 -1
- package/dist/src/install/paths.test.js +10 -1
- package/dist/src/install/paths.test.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/scripts/__tests__/scan-imported-skills.test.js +5 -0
- package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
- package/dist/src/security/audit-types.d.ts +1 -1
- package/dist/src/security/audit-types.d.ts.map +1 -1
- package/dist/src/security/audit-types.js.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 +15 -1
- package/dist/src/security/scanner/SecurityScanner.exec.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.exec.js +68 -76
- package/dist/src/security/scanner/SecurityScanner.exec.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.formatters.d.ts +14 -1
- package/dist/src/security/scanner/SecurityScanner.formatters.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.formatters.js +33 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.formatters.test.d.ts +9 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.test.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.test.js +65 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.test.js.map +1 -0
- 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 +121 -60
- 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/confusables.d.ts +28 -0
- package/dist/src/security/scanner/confusables.d.ts.map +1 -0
- package/dist/src/security/scanner/confusables.js +87 -0
- package/dist/src/security/scanner/confusables.js.map +1 -0
- package/dist/src/security/scanner/confusables.test.d.ts +10 -0
- package/dist/src/security/scanner/confusables.test.d.ts.map +1 -0
- package/dist/src/security/scanner/confusables.test.js +44 -0
- package/dist/src/security/scanner/confusables.test.js.map +1 -0
- package/dist/src/security/scanner/index.d.ts +9 -3
- package/dist/src/security/scanner/index.d.ts.map +1 -1
- package/dist/src/security/scanner/index.js +18 -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 +49 -1
- package/dist/src/security/scanner/types.d.ts.map +1 -1
- package/dist/src/security/scanner/typosquat-reference-list.d.ts +54 -0
- package/dist/src/security/scanner/typosquat-reference-list.d.ts.map +1 -0
- package/dist/src/security/scanner/typosquat-reference-list.js +55 -0
- package/dist/src/security/scanner/typosquat-reference-list.js.map +1 -0
- package/dist/src/security/scanner/typosquat-reference-list.test.d.ts +5 -0
- package/dist/src/security/scanner/typosquat-reference-list.test.d.ts.map +1 -0
- package/dist/src/security/scanner/typosquat-reference-list.test.js +52 -0
- package/dist/src/security/scanner/typosquat-reference-list.test.js.map +1 -0
- package/dist/src/security/scanner/typosquat.d.ts +100 -0
- package/dist/src/security/scanner/typosquat.d.ts.map +1 -0
- package/dist/src/security/scanner/typosquat.js +256 -0
- package/dist/src/security/scanner/typosquat.js.map +1 -0
- package/dist/src/security/scanner/typosquat.test.d.ts +12 -0
- package/dist/src/security/scanner/typosquat.test.d.ts.map +1 -0
- package/dist/src/security/scanner/typosquat.test.js +140 -0
- package/dist/src/security/scanner/typosquat.test.js.map +1 -0
- package/dist/src/security/scanner/weights.d.ts.map +1 -1
- package/dist/src/security/scanner/weights.js +10 -0
- package/dist/src/security/scanner/weights.js.map +1 -1
- package/dist/src/services/skill-installation.helpers.d.ts +21 -0
- package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
- package/dist/src/services/skill-installation.helpers.js +46 -2
- package/dist/src/services/skill-installation.helpers.js.map +1 -1
- package/dist/src/services/skill-installation.helpers.test.d.ts +2 -0
- package/dist/src/services/skill-installation.helpers.test.d.ts.map +1 -0
- package/dist/src/services/skill-installation.helpers.test.js +80 -0
- package/dist/src/services/skill-installation.helpers.test.js.map +1 -0
- 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 +15 -4
- package/dist/src/sync/inventory-collector.d.ts.map +1 -1
- package/dist/src/sync/inventory-collector.js +75 -26
- package/dist/src/sync/inventory-collector.js.map +1 -1
- package/dist/src/sync/inventory-collector.test.d.ts +15 -1
- package/dist/src/sync/inventory-collector.test.d.ts.map +1 -1
- package/dist/src/sync/inventory-collector.test.js +75 -5
- package/dist/src/sync/inventory-collector.test.js.map +1 -1
- package/dist/src/telemetry/tracer-imports.d.ts +1 -1
- package/dist/src/telemetry/tracer-imports.js +1 -1
- package/dist/src/telemetry/tracer.js +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/SecurityScanner.scoring.test.js +60 -0
- package/dist/tests/SecurityScanner.scoring.test.js.map +1 -1
- package/dist/tests/SwarmIndexer.test.js +4 -5
- package/dist/tests/SwarmIndexer.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 +60 -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/services/aidefence-feedback.test.js +1 -0
- package/dist/tests/services/aidefence-feedback.test.js.map +1 -1
- package/dist/tests/skill-scanner/allowlist.test.js +16 -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 +13 -8
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* them out is behaviour-preserving (guarded by the scoring + regression-guard
|
|
11
11
|
* + ai-defence test suites).
|
|
12
12
|
*/
|
|
13
|
-
import { SENSITIVE_PATH_PATTERNS, ENV_PATH_PATTERN, VALUE_GATED_KEYWORD_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, } from './patterns.js';
|
|
13
|
+
import { SENSITIVE_PATH_PATTERNS, ENV_PATH_PATTERN, VALUE_GATED_KEYWORD_PATTERNS, SOCIAL_ENGINEERING_PATTERNS, PROMPT_LEAKING_PATTERNS, DATA_EXFILTRATION_PATTERNS, PRIVILEGE_ESCALATION_PATTERNS, CREDENTIAL_SUBSTITUTION_PATTERNS, } from './patterns.js';
|
|
14
14
|
import { safeRegexTest, safeRegexCheck } from './regex-utils.js';
|
|
15
15
|
import { analyzeMarkdownContext, isDocumentationContext, isWithinInlineCode, } from './SecurityScanner.helpers.js';
|
|
16
16
|
import { looksLikePlaceholderSecret, shannonEntropy, scanPiiPatterns, } from './SecurityScanner.pii.js';
|
|
@@ -181,8 +181,20 @@ export function scanPrivilegeEscalation(content, lineContexts) {
|
|
|
181
181
|
if (match) {
|
|
182
182
|
const inInlineCode = ctx?.isInlineCode && isWithinInlineCode(line, match.index ?? 0);
|
|
183
183
|
const inDocContext = ctx ? isDocumentationContext(ctx) || inInlineCode : false;
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
// SMI-5838: the credential-substitution pattern pair (SMI-5833) is purely
|
|
185
|
+
// lexical and can false-positive on benign dev/test troubleshooting text
|
|
186
|
+
// (e.g. "get around the 403 in local testing... mock token instead of
|
|
187
|
+
// your expired token"). Cap severity at 'medium' for just these two
|
|
188
|
+
// patterns so a false positive surfaces for review instead of blocking
|
|
189
|
+
// a skill install (SecurityScanner.ts only blocks on 'critical'/'high');
|
|
190
|
+
// every other privilege_escalation pattern keeps its existing severity.
|
|
191
|
+
const isCredentialSubstitution = CREDENTIAL_SUBSTITUTION_PATTERNS.includes(pattern);
|
|
192
|
+
const confidence = isCredentialSubstitution
|
|
193
|
+
? 'low'
|
|
194
|
+
: inDocContext
|
|
195
|
+
? 'low'
|
|
196
|
+
: 'high';
|
|
197
|
+
const severity = isCredentialSubstitution ? 'medium' : inDocContext ? 'high' : 'critical';
|
|
186
198
|
findings.push({
|
|
187
199
|
type: 'privilege_escalation',
|
|
188
200
|
severity,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityScanner.scanners.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.scanners.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,4BAA4B,EAC5B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,6BAA6B,
|
|
1
|
+
{"version":3,"file":"SecurityScanner.scanners.js","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.scanners.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,16 @@ import type { LineContext } from './SecurityScanner.helpers.js';
|
|
|
10
10
|
* Scan content for SSRF instruction patterns.
|
|
11
11
|
* Uses documentation context to reduce severity for patterns in code blocks/tables.
|
|
12
12
|
* SMI-3522: Supports multi-line patterns via scanPatternsWithMultilineSupport approach.
|
|
13
|
+
*
|
|
14
|
+
* SMI-5881: uses PATTERN_SCOPE (patterns.scope.ts) instead of the old
|
|
15
|
+
* per-source-text multiline-detection heuristic. This function's older
|
|
16
|
+
* skip-based two-pass (flaggedLines) can only correctly service
|
|
17
|
+
* 'line' | 'content' scope, never 'both' — assertScopeCoverage()
|
|
18
|
+
* (patterns.scope.ts) enforces at module-load time that no
|
|
19
|
+
* SSRF_INSTRUCTION_PATTERNS member is ever scoped 'both'.
|
|
13
20
|
*/
|
|
14
|
-
export declare function scanSsrfPatterns(content: string, lineContexts?: LineContext[]
|
|
21
|
+
export declare function scanSsrfPatterns(content: string, lineContexts?: LineContext[],
|
|
22
|
+
/** SMI-5881: explicit cap (UTF-16 code units) for the pass-1 full-content
|
|
23
|
+
* regex scan — see scanPatternsWithMultilineSupport's identical parameter. */
|
|
24
|
+
maxLength?: number): SecurityFinding[];
|
|
15
25
|
//# sourceMappingURL=SecurityScanner.ssrf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityScanner.ssrf.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.ssrf.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAU/D
|
|
1
|
+
{"version":3,"file":"SecurityScanner.ssrf.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/SecurityScanner.ssrf.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,YAAY,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAU/D;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,WAAW,EAAE;AAC5B;8EAC8E;AAC9E,SAAS,CAAC,EAAE,MAAM,GACjB,eAAe,EAAE,CA+DnB"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confusable / homoglyph normalization primitives
|
|
3
|
+
* @module @skillsmith/core/security/scanner/confusables
|
|
4
|
+
*
|
|
5
|
+
* SMI-595: extracted from `SecurityScanner.exec.ts` (originally built there
|
|
6
|
+
* under SMI-5359 Wave 4.2 for *content* obfuscation detection) so the
|
|
7
|
+
* name-agnostic folding primitives can be reused for *skill-name* typosquat
|
|
8
|
+
* comparison (`typosquat.ts`) without coupling it to the code-execution /
|
|
9
|
+
* obfuscated-directive detectors. Pure extraction — no behavior change:
|
|
10
|
+
* `SecurityScanner.exec.ts` re-imports these symbols and its own test suite
|
|
11
|
+
* (`SecurityScanner.exec.test.ts`) passes unchanged.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Conservative homoglyph map (a curated subset of UTS-#39 confusables): only the
|
|
15
|
+
* unambiguous Cyrillic / Greek look-alikes that real homoglyph attacks use to
|
|
16
|
+
* disguise Latin letters. Fullwidth Latin (offset 0xFEE0) and the Mathematical
|
|
17
|
+
* Alphanumeric Symbols block (U+1D400-1D7FF, e.g. bold/italic/script 𝐢𝐠𝐧𝐨𝐫𝐞)
|
|
18
|
+
* are handled programmatically below — never via a blanket NFKC pass, which would
|
|
19
|
+
* also fold fullwidth CJK to ASCII and false-positive. (NFKC is applied per-char
|
|
20
|
+
* ONLY to the math-alphanumeric range, which contains no CJK.)
|
|
21
|
+
*/
|
|
22
|
+
export declare const CONFUSABLES: Record<string, string>;
|
|
23
|
+
export declare function isFullwidthLatin(cp: number): boolean;
|
|
24
|
+
/** Mathematical Alphanumeric Symbols (bold/italic/script/fraktur/double-struck/sans/mono). */
|
|
25
|
+
export declare function isMathAlphanumeric(cp: number): boolean;
|
|
26
|
+
/** Map homoglyphs + fullwidth Latin + math-alphanumeric to their ASCII skeleton. */
|
|
27
|
+
export declare function confusableSkeleton(s: string): string;
|
|
28
|
+
//# sourceMappingURL=confusables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confusables.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/confusables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAgC9C,CAAA;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAoBpD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Confusable / homoglyph normalization primitives
|
|
3
|
+
* @module @skillsmith/core/security/scanner/confusables
|
|
4
|
+
*
|
|
5
|
+
* SMI-595: extracted from `SecurityScanner.exec.ts` (originally built there
|
|
6
|
+
* under SMI-5359 Wave 4.2 for *content* obfuscation detection) so the
|
|
7
|
+
* name-agnostic folding primitives can be reused for *skill-name* typosquat
|
|
8
|
+
* comparison (`typosquat.ts`) without coupling it to the code-execution /
|
|
9
|
+
* obfuscated-directive detectors. Pure extraction — no behavior change:
|
|
10
|
+
* `SecurityScanner.exec.ts` re-imports these symbols and its own test suite
|
|
11
|
+
* (`SecurityScanner.exec.test.ts`) passes unchanged.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Conservative homoglyph map (a curated subset of UTS-#39 confusables): only the
|
|
15
|
+
* unambiguous Cyrillic / Greek look-alikes that real homoglyph attacks use to
|
|
16
|
+
* disguise Latin letters. Fullwidth Latin (offset 0xFEE0) and the Mathematical
|
|
17
|
+
* Alphanumeric Symbols block (U+1D400-1D7FF, e.g. bold/italic/script 𝐢𝐠𝐧𝐨𝐫𝐞)
|
|
18
|
+
* are handled programmatically below — never via a blanket NFKC pass, which would
|
|
19
|
+
* also fold fullwidth CJK to ASCII and false-positive. (NFKC is applied per-char
|
|
20
|
+
* ONLY to the math-alphanumeric range, which contains no CJK.)
|
|
21
|
+
*/
|
|
22
|
+
export const CONFUSABLES = {
|
|
23
|
+
// Cyrillic -> Latin
|
|
24
|
+
а: 'a',
|
|
25
|
+
е: 'e',
|
|
26
|
+
о: 'o',
|
|
27
|
+
р: 'p',
|
|
28
|
+
с: 'c',
|
|
29
|
+
у: 'y',
|
|
30
|
+
х: 'x',
|
|
31
|
+
і: 'i',
|
|
32
|
+
ј: 'j',
|
|
33
|
+
ѕ: 's',
|
|
34
|
+
ԁ: 'd',
|
|
35
|
+
һ: 'h',
|
|
36
|
+
к: 'k',
|
|
37
|
+
м: 'm',
|
|
38
|
+
т: 't',
|
|
39
|
+
в: 'b',
|
|
40
|
+
н: 'h',
|
|
41
|
+
// Greek -> Latin
|
|
42
|
+
ο: 'o',
|
|
43
|
+
α: 'a',
|
|
44
|
+
ρ: 'p',
|
|
45
|
+
ε: 'e',
|
|
46
|
+
τ: 't',
|
|
47
|
+
ι: 'i',
|
|
48
|
+
κ: 'k',
|
|
49
|
+
υ: 'u',
|
|
50
|
+
χ: 'x',
|
|
51
|
+
ν: 'v',
|
|
52
|
+
ϲ: 'c',
|
|
53
|
+
β: 'b',
|
|
54
|
+
};
|
|
55
|
+
export function isFullwidthLatin(cp) {
|
|
56
|
+
return (cp >= 0xff21 && cp <= 0xff3a) || (cp >= 0xff41 && cp <= 0xff5a);
|
|
57
|
+
}
|
|
58
|
+
/** Mathematical Alphanumeric Symbols (bold/italic/script/fraktur/double-struck/sans/mono). */
|
|
59
|
+
export function isMathAlphanumeric(cp) {
|
|
60
|
+
return cp >= 0x1d400 && cp <= 0x1d7ff;
|
|
61
|
+
}
|
|
62
|
+
/** Map homoglyphs + fullwidth Latin + math-alphanumeric to their ASCII skeleton. */
|
|
63
|
+
export function confusableSkeleton(s) {
|
|
64
|
+
let out = '';
|
|
65
|
+
for (const ch of s) {
|
|
66
|
+
const cp = ch.codePointAt(0) ?? 0;
|
|
67
|
+
if (isFullwidthLatin(cp)) {
|
|
68
|
+
out += String.fromCodePoint(cp - 0xfee0);
|
|
69
|
+
}
|
|
70
|
+
else if (isMathAlphanumeric(cp)) {
|
|
71
|
+
// NFKC folds a math-styled glyph to its base; chain through CONFUSABLES so a
|
|
72
|
+
// math-styled Greek/Cyrillic homoglyph (folds to Greek/Cyrillic) still maps
|
|
73
|
+
// to Latin (SMI-5359 retro NIT). Safe: the range contains no CJK; a reserved
|
|
74
|
+
// hole stays unchanged (won't match).
|
|
75
|
+
const folded = ch.normalize('NFKC');
|
|
76
|
+
out += CONFUSABLES[folded] ?? folded;
|
|
77
|
+
}
|
|
78
|
+
else if (CONFUSABLES[ch]) {
|
|
79
|
+
out += CONFUSABLES[ch];
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
out += ch;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=confusables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confusables.js","sourceRoot":"","sources":["../../../../src/security/scanner/confusables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAA2B;IACjD,oBAAoB;IACpB,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,iBAAiB;IACjB,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;CACP,CAAA;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAU;IACzC,OAAO,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,CAAA;AACzE,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,kBAAkB,CAAC,EAAU;IAC3C,OAAO,EAAE,IAAI,OAAO,IAAI,EAAE,IAAI,OAAO,CAAA;AACvC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,kBAAkB,CAAC,CAAS;IAC1C,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,GAAG,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;QAC1C,CAAC;aAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,6EAA6E;YAC7E,4EAA4E;YAC5E,6EAA6E;YAC7E,sCAAsC;YACtC,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACnC,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,MAAM,CAAA;QACtC,CAAC;aAAM,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC;YAC3B,GAAG,IAAI,WAAW,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC;aAAM,CAAC;YACN,GAAG,IAAI,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-595: confusables.ts — extraction sanity tests.
|
|
3
|
+
*
|
|
4
|
+
* The real regression guard for "this extraction changed no behavior" is
|
|
5
|
+
* `SecurityScanner.exec.test.ts` passing unchanged (it exercises these
|
|
6
|
+
* primitives indirectly through `scanObfuscatedDirective`). These tests cover
|
|
7
|
+
* the extracted module directly, in isolation from content-scanning.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=confusables.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confusables.test.d.ts","sourceRoot":"","sources":["../../../../src/security/scanner/confusables.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-595: confusables.ts — extraction sanity tests.
|
|
3
|
+
*
|
|
4
|
+
* The real regression guard for "this extraction changed no behavior" is
|
|
5
|
+
* `SecurityScanner.exec.test.ts` passing unchanged (it exercises these
|
|
6
|
+
* primitives indirectly through `scanObfuscatedDirective`). These tests cover
|
|
7
|
+
* the extracted module directly, in isolation from content-scanning.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import { CONFUSABLES, isFullwidthLatin, isMathAlphanumeric, confusableSkeleton, } from './confusables.js';
|
|
11
|
+
describe('confusables — extraction sanity (SMI-595)', () => {
|
|
12
|
+
it('maps known Cyrillic homoglyphs to their Latin look-alike', () => {
|
|
13
|
+
expect(CONFUSABLES['а']).toBe('a'); // Cyrillic а (U+0430)
|
|
14
|
+
expect(CONFUSABLES['е']).toBe('e'); // Cyrillic е (U+0435)
|
|
15
|
+
expect(CONFUSABLES['о']).toBe('o'); // Cyrillic о (U+043E)
|
|
16
|
+
});
|
|
17
|
+
it('maps known Greek homoglyphs to their Latin look-alike', () => {
|
|
18
|
+
expect(CONFUSABLES['ο']).toBe('o');
|
|
19
|
+
expect(CONFUSABLES['α']).toBe('a');
|
|
20
|
+
});
|
|
21
|
+
it('identifies fullwidth Latin code points', () => {
|
|
22
|
+
expect(isFullwidthLatin('a'.codePointAt(0))).toBe(true); // fullwidth 'a'
|
|
23
|
+
expect(isFullwidthLatin('a'.codePointAt(0))).toBe(false); // ordinary ascii 'a'
|
|
24
|
+
});
|
|
25
|
+
it('identifies Mathematical Alphanumeric Symbols code points', () => {
|
|
26
|
+
expect(isMathAlphanumeric(0x1d400)).toBe(true); // start of the block
|
|
27
|
+
expect(isMathAlphanumeric(0x1d7ff)).toBe(true); // end of the block
|
|
28
|
+
expect(isMathAlphanumeric(0x0061)).toBe(false); // ascii 'a'
|
|
29
|
+
});
|
|
30
|
+
it('confusableSkeleton folds Cyrillic homoglyphs to ASCII', () => {
|
|
31
|
+
expect(confusableSkeleton('аnthropic')).toBe('anthropic'); // Cyrillic а
|
|
32
|
+
});
|
|
33
|
+
it('confusableSkeleton folds fullwidth Latin to ASCII by offset', () => {
|
|
34
|
+
expect(confusableSkeleton('hello')).toBe('hello');
|
|
35
|
+
});
|
|
36
|
+
it('confusableSkeleton leaves plain ASCII untouched', () => {
|
|
37
|
+
expect(confusableSkeleton('anthropic-community-tools')).toBe('anthropic-community-tools');
|
|
38
|
+
});
|
|
39
|
+
it('confusableSkeleton leaves benign CJK untouched (no blanket NFKC)', () => {
|
|
40
|
+
const cjk = '全角文字のテスト';
|
|
41
|
+
expect(confusableSkeleton(cjk)).toBe(cjk);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=confusables.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confusables.test.js","sourceRoot":"","sources":["../../../../src/security/scanner/confusables.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAA;AAEzB,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,sBAAsB;QACzD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,sBAAsB;QACzD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,sBAAsB;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,gBAAgB;QACzE,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,qBAAqB;IACjF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,qBAAqB;QACpE,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,mBAAmB;QAClE,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,YAAY;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,CAAC,aAAa;IACzE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,kBAAkB,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IAC3F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,GAAG,GAAG,UAAU,CAAA;QACtB,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -3,10 +3,16 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Re-exports for security scanning functionality.
|
|
5
5
|
*/
|
|
6
|
-
export type { SecurityFindingType, SecuritySeverity, SecurityFinding, RiskScoreBreakdown, ScanReport, ScannerOptions, HostileUpdateVerdict, } 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
|
+
export { stripInvisible } from './SecurityScanner.exec.js';
|
|
11
|
+
export { CONFUSABLES, isFullwidthLatin, isMathAlphanumeric, confusableSkeleton, } from './confusables.js';
|
|
12
|
+
export { BRAND_ALIASES, levenshteinDistance, scanTyposquat, detectTyposquat, applyTyposquatEnforcementMode, resolveTyposquatEnforcementMode, DEFAULT_TYPOSQUAT_ENFORCEMENT_MODE, } from './typosquat.js';
|
|
13
|
+
export { buildTyposquatReferenceList, DEFAULT_TOP_INSTALLED_LIMIT, } from './typosquat-reference-list.js';
|
|
14
|
+
export type { ReferenceSkillEntry, InstalledSkillEntry, BuildTyposquatReferenceListOptions, } from './typosquat-reference-list.js';
|
|
15
|
+
export { describeSignals } from './SecurityScanner.formatters.js';
|
|
10
16
|
export { SecurityScanner, default } from './SecurityScanner.js';
|
|
11
17
|
export { compareScanReports, DEFAULT_RISK_THRESHOLD } from './SecurityScanner.hostile-update.js';
|
|
12
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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,
|
|
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,27 @@
|
|
|
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';
|
|
15
|
+
// Obfuscation-defeat primitive (SMI-4703: reused by
|
|
16
|
+
// packages/doc-retrieval-mcp/src/security/memory-injection-scanner.ts's
|
|
17
|
+
// normalization pipeline rather than reimplemented there)
|
|
18
|
+
export { stripInvisible } from './SecurityScanner.exec.js';
|
|
19
|
+
// Confusable/homoglyph normalization primitives (SMI-595 extraction, for testing/extending;
|
|
20
|
+
// also reused by SMI-4703's memory-injection-scanner.ts confusable-fold step)
|
|
21
|
+
export { CONFUSABLES, isFullwidthLatin, isMathAlphanumeric, confusableSkeleton, } from './confusables.js';
|
|
22
|
+
// Typosquat detector (SMI-595)
|
|
23
|
+
export { BRAND_ALIASES, levenshteinDistance, scanTyposquat, detectTyposquat, applyTyposquatEnforcementMode, resolveTyposquatEnforcementMode, DEFAULT_TYPOSQUAT_ENFORCEMENT_MODE, } from './typosquat.js';
|
|
24
|
+
// Typosquat reference-name list builder (SMI-595)
|
|
25
|
+
export { buildTyposquatReferenceList, DEFAULT_TOP_INSTALLED_LIMIT, } from './typosquat-reference-list.js';
|
|
26
|
+
// describeSignals (SMI-595, for testing/extending)
|
|
27
|
+
export { describeSignals } from './SecurityScanner.formatters.js';
|
|
12
28
|
// Main class
|
|
13
29
|
export { SecurityScanner, default } from './SecurityScanner.js';
|
|
14
30
|
// Hostile-update comparator (SMI-5535, R0 Wave 2A)
|
|
@@ -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"}
|