@kairosinternational/watchman 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PHASE_3A_COMPLETE.md +63 -0
- package/dist/engine.d.ts +9 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +99 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/scanners/ai-tool-integrity/index.d.ts +2 -0
- package/dist/scanners/ai-tool-integrity/index.d.ts.map +1 -0
- package/dist/scanners/ai-tool-integrity/index.js +6 -0
- package/dist/scanners/ai-tool-integrity/index.js.map +1 -0
- package/dist/scanners/ai-tool-integrity/patterns/injection-signatures.d.ts +7 -0
- package/dist/scanners/ai-tool-integrity/patterns/injection-signatures.d.ts.map +1 -0
- package/dist/scanners/ai-tool-integrity/patterns/injection-signatures.js +51 -0
- package/dist/scanners/ai-tool-integrity/patterns/injection-signatures.js.map +1 -0
- package/dist/scanners/ai-tool-integrity/rules/prompt-injection.rule.d.ts +3 -0
- package/dist/scanners/ai-tool-integrity/rules/prompt-injection.rule.d.ts.map +1 -0
- package/dist/scanners/ai-tool-integrity/rules/prompt-injection.rule.js +49 -0
- package/dist/scanners/ai-tool-integrity/rules/prompt-injection.rule.js.map +1 -0
- package/dist/scanners/ai-tool-integrity/rules/tool-manifest-drift.rule.d.ts +3 -0
- package/dist/scanners/ai-tool-integrity/rules/tool-manifest-drift.rule.d.ts.map +1 -0
- package/dist/scanners/ai-tool-integrity/rules/tool-manifest-drift.rule.js +71 -0
- package/dist/scanners/ai-tool-integrity/rules/tool-manifest-drift.rule.js.map +1 -0
- package/dist/scanners/ai-tool-integrity/rules/unauthorized-model-call.rule.d.ts +3 -0
- package/dist/scanners/ai-tool-integrity/rules/unauthorized-model-call.rule.d.ts.map +1 -0
- package/dist/scanners/ai-tool-integrity/rules/unauthorized-model-call.rule.js +56 -0
- package/dist/scanners/ai-tool-integrity/rules/unauthorized-model-call.rule.js.map +1 -0
- package/dist/scanners/ai-tool-integrity/scanner.d.ts +3 -0
- package/dist/scanners/ai-tool-integrity/scanner.d.ts.map +1 -0
- package/dist/scanners/ai-tool-integrity/scanner.js +26 -0
- package/dist/scanners/ai-tool-integrity/scanner.js.map +1 -0
- package/dist/scanners/dependency-integrity/index.d.ts +2 -0
- package/dist/scanners/dependency-integrity/index.d.ts.map +1 -0
- package/dist/scanners/dependency-integrity/index.js +6 -0
- package/dist/scanners/dependency-integrity/index.js.map +1 -0
- package/dist/scanners/dependency-integrity/patterns/known-typosquats.d.ts +8 -0
- package/dist/scanners/dependency-integrity/patterns/known-typosquats.d.ts.map +1 -0
- package/dist/scanners/dependency-integrity/patterns/known-typosquats.js +38 -0
- package/dist/scanners/dependency-integrity/patterns/known-typosquats.js.map +1 -0
- package/dist/scanners/dependency-integrity/rules/hash-validation.rule.d.ts +3 -0
- package/dist/scanners/dependency-integrity/rules/hash-validation.rule.d.ts.map +1 -0
- package/dist/scanners/dependency-integrity/rules/hash-validation.rule.js +64 -0
- package/dist/scanners/dependency-integrity/rules/hash-validation.rule.js.map +1 -0
- package/dist/scanners/dependency-integrity/rules/transitive-drift.rule.d.ts +3 -0
- package/dist/scanners/dependency-integrity/rules/transitive-drift.rule.d.ts.map +1 -0
- package/dist/scanners/dependency-integrity/rules/transitive-drift.rule.js +69 -0
- package/dist/scanners/dependency-integrity/rules/transitive-drift.rule.js.map +1 -0
- package/dist/scanners/dependency-integrity/rules/typosquat-check.rule.d.ts +3 -0
- package/dist/scanners/dependency-integrity/rules/typosquat-check.rule.d.ts.map +1 -0
- package/dist/scanners/dependency-integrity/rules/typosquat-check.rule.js +94 -0
- package/dist/scanners/dependency-integrity/rules/typosquat-check.rule.js.map +1 -0
- package/dist/scanners/dependency-integrity/scanner.d.ts +3 -0
- package/dist/scanners/dependency-integrity/scanner.d.ts.map +1 -0
- package/dist/scanners/dependency-integrity/scanner.js +26 -0
- package/dist/scanners/dependency-integrity/scanner.js.map +1 -0
- package/dist/scanners/runtime-monitor/index.d.ts +2 -0
- package/dist/scanners/runtime-monitor/index.d.ts.map +1 -0
- package/dist/scanners/runtime-monitor/index.js +6 -0
- package/dist/scanners/runtime-monitor/index.js.map +1 -0
- package/dist/scanners/runtime-monitor/patterns/known-bad-destinations.d.ts +8 -0
- package/dist/scanners/runtime-monitor/patterns/known-bad-destinations.d.ts.map +1 -0
- package/dist/scanners/runtime-monitor/patterns/known-bad-destinations.js +52 -0
- package/dist/scanners/runtime-monitor/patterns/known-bad-destinations.js.map +1 -0
- package/dist/scanners/runtime-monitor/rules/filesystem-access.rule.d.ts +3 -0
- package/dist/scanners/runtime-monitor/rules/filesystem-access.rule.d.ts.map +1 -0
- package/dist/scanners/runtime-monitor/rules/filesystem-access.rule.js +68 -0
- package/dist/scanners/runtime-monitor/rules/filesystem-access.rule.js.map +1 -0
- package/dist/scanners/runtime-monitor/rules/outbound-network.rule.d.ts +3 -0
- package/dist/scanners/runtime-monitor/rules/outbound-network.rule.d.ts.map +1 -0
- package/dist/scanners/runtime-monitor/rules/outbound-network.rule.js +62 -0
- package/dist/scanners/runtime-monitor/rules/outbound-network.rule.js.map +1 -0
- package/dist/scanners/runtime-monitor/rules/process-spawn.rule.d.ts +3 -0
- package/dist/scanners/runtime-monitor/rules/process-spawn.rule.d.ts.map +1 -0
- package/dist/scanners/runtime-monitor/rules/process-spawn.rule.js +55 -0
- package/dist/scanners/runtime-monitor/rules/process-spawn.rule.js.map +1 -0
- package/dist/scanners/runtime-monitor/rules/resource-anomaly.rule.d.ts +3 -0
- package/dist/scanners/runtime-monitor/rules/resource-anomaly.rule.d.ts.map +1 -0
- package/dist/scanners/runtime-monitor/rules/resource-anomaly.rule.js +76 -0
- package/dist/scanners/runtime-monitor/rules/resource-anomaly.rule.js.map +1 -0
- package/dist/scanners/runtime-monitor/scanner.d.ts +3 -0
- package/dist/scanners/runtime-monitor/scanner.d.ts.map +1 -0
- package/dist/scanners/runtime-monitor/scanner.js +28 -0
- package/dist/scanners/runtime-monitor/scanner.js.map +1 -0
- package/dist/scanners/secrets-exposure/index.d.ts +2 -0
- package/dist/scanners/secrets-exposure/index.d.ts.map +1 -0
- package/dist/scanners/secrets-exposure/index.js +6 -0
- package/dist/scanners/secrets-exposure/index.js.map +1 -0
- package/dist/scanners/secrets-exposure/patterns/secret-signatures.d.ts +7 -0
- package/dist/scanners/secrets-exposure/patterns/secret-signatures.d.ts.map +1 -0
- package/dist/scanners/secrets-exposure/patterns/secret-signatures.js +76 -0
- package/dist/scanners/secrets-exposure/patterns/secret-signatures.js.map +1 -0
- package/dist/scanners/secrets-exposure/rules/entropy-check.rule.d.ts +3 -0
- package/dist/scanners/secrets-exposure/rules/entropy-check.rule.d.ts.map +1 -0
- package/dist/scanners/secrets-exposure/rules/entropy-check.rule.js +77 -0
- package/dist/scanners/secrets-exposure/rules/entropy-check.rule.js.map +1 -0
- package/dist/scanners/secrets-exposure/rules/known-patterns.rule.d.ts +3 -0
- package/dist/scanners/secrets-exposure/rules/known-patterns.rule.d.ts.map +1 -0
- package/dist/scanners/secrets-exposure/rules/known-patterns.rule.js +62 -0
- package/dist/scanners/secrets-exposure/rules/known-patterns.rule.js.map +1 -0
- package/dist/scanners/secrets-exposure/rules/response-echo.rule.d.ts +3 -0
- package/dist/scanners/secrets-exposure/rules/response-echo.rule.d.ts.map +1 -0
- package/dist/scanners/secrets-exposure/rules/response-echo.rule.js +67 -0
- package/dist/scanners/secrets-exposure/rules/response-echo.rule.js.map +1 -0
- package/dist/scanners/secrets-exposure/scanner.d.ts +3 -0
- package/dist/scanners/secrets-exposure/scanner.d.ts.map +1 -0
- package/dist/scanners/secrets-exposure/scanner.js +26 -0
- package/dist/scanners/secrets-exposure/scanner.js.map +1 -0
- package/dist/types/config.types.d.ts +22 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +15 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/context.types.d.ts +23 -0
- package/dist/types/context.types.d.ts.map +1 -0
- package/dist/types/context.types.js +3 -0
- package/dist/types/context.types.js.map +1 -0
- package/dist/types/finding.types.d.ts +33 -0
- package/dist/types/finding.types.d.ts.map +1 -0
- package/dist/types/finding.types.js +3 -0
- package/dist/types/finding.types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +32 -0
- package/src/engine.ts +129 -0
- package/src/index.ts +28 -0
- package/src/scanners/ai-tool-integrity/index.ts +1 -0
- package/src/scanners/ai-tool-integrity/patterns/injection-signatures.ts +53 -0
- package/src/scanners/ai-tool-integrity/rules/prompt-injection.rule.ts +50 -0
- package/src/scanners/ai-tool-integrity/rules/tool-manifest-drift.rule.ts +81 -0
- package/src/scanners/ai-tool-integrity/rules/unauthorized-model-call.rule.ts +59 -0
- package/src/scanners/ai-tool-integrity/scanner.ts +25 -0
- package/src/scanners/dependency-integrity/index.ts +1 -0
- package/src/scanners/dependency-integrity/patterns/known-typosquats.ts +41 -0
- package/src/scanners/dependency-integrity/rules/hash-validation.rule.ts +72 -0
- package/src/scanners/dependency-integrity/rules/transitive-drift.rule.ts +71 -0
- package/src/scanners/dependency-integrity/rules/typosquat-check.rule.ts +100 -0
- package/src/scanners/dependency-integrity/scanner.ts +25 -0
- package/src/scanners/runtime-monitor/index.ts +1 -0
- package/src/scanners/runtime-monitor/patterns/known-bad-destinations.ts +55 -0
- package/src/scanners/runtime-monitor/rules/filesystem-access.rule.ts +74 -0
- package/src/scanners/runtime-monitor/rules/outbound-network.rule.ts +67 -0
- package/src/scanners/runtime-monitor/rules/process-spawn.rule.ts +58 -0
- package/src/scanners/runtime-monitor/rules/resource-anomaly.rule.ts +79 -0
- package/src/scanners/runtime-monitor/scanner.ts +27 -0
- package/src/scanners/secrets-exposure/index.ts +1 -0
- package/src/scanners/secrets-exposure/patterns/secret-signatures.ts +78 -0
- package/src/scanners/secrets-exposure/rules/entropy-check.rule.ts +79 -0
- package/src/scanners/secrets-exposure/rules/known-patterns.rule.ts +64 -0
- package/src/scanners/secrets-exposure/rules/response-echo.rule.ts +70 -0
- package/src/scanners/secrets-exposure/scanner.ts +25 -0
- package/src/types/config.types.ts +40 -0
- package/src/types/context.types.ts +25 -0
- package/src/types/finding.types.ts +36 -0
- package/src/types/index.ts +21 -0
- package/tsconfig.json +21 -0
- package/watchman.config.ts +16 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Phase 3a Complete -- Watchman Core Engine
|
|
2
|
+
|
|
3
|
+
Package: @kairosinternational/watchman v0.1.0
|
|
4
|
+
Completed: 2026-04-09
|
|
5
|
+
Theological anchor: Ezekiel 3:17
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
Framework-agnostic Node.js/TypeScript security engine.
|
|
10
|
+
No UI, no Supabase, no middleware. Everything else wraps this.
|
|
11
|
+
|
|
12
|
+
4 scanners, 13 rules, unified Finding/Report type system.
|
|
13
|
+
|
|
14
|
+
## Threat Model -- Rules by Scanner
|
|
15
|
+
|
|
16
|
+
### 1. AI Tool Integrity (`ai-tool-integrity`)
|
|
17
|
+
|
|
18
|
+
| Rule | Detects | Default Severity |
|
|
19
|
+
|------|---------|-----------------|
|
|
20
|
+
| `prompt-injection` | Prompt injection signatures in source files and config (9 signature patterns: direct override, persona hijack, fake system prompt, rule suppression, role coercion, prompt extraction, token boundary injection, encoded payload, translation bypass) | critical/high/medium (per pattern) |
|
|
21
|
+
| `tool-manifest-drift` | Tool definitions with missing names or suspiciously long descriptions that could hide injected instructions | high |
|
|
22
|
+
| `unauthorized-model-call` | Direct AI provider API calls (OpenAI, Anthropic, Google, Cohere, Replicate, AI SDK) that bypass approved routing/gateway | medium |
|
|
23
|
+
|
|
24
|
+
### 2. Secrets Exposure (`secrets-exposure`)
|
|
25
|
+
|
|
26
|
+
| Rule | Detects | Default Severity |
|
|
27
|
+
|------|---------|-----------------|
|
|
28
|
+
| `known-patterns` | Hardcoded API keys and credentials matching 14 provider signatures (Anthropic, OpenAI, GitHub, Slack, Supabase JWT, AWS, npm, Stripe, Square, SendGrid, private keys) | critical |
|
|
29
|
+
| `entropy-check` | High-entropy strings (Shannon >= 4.5 bits) in secret-like assignment contexts | high |
|
|
30
|
+
| `response-echo` | Secrets or sensitive data echoed in HTTP responses, logs, or serialized env objects; stack trace exposure | high/medium |
|
|
31
|
+
|
|
32
|
+
### 3. Dependency Integrity (`dependency-integrity`)
|
|
33
|
+
|
|
34
|
+
| Rule | Detects | Default Severity |
|
|
35
|
+
|------|---------|-----------------|
|
|
36
|
+
| `hash-validation` | Lockfile entries missing integrity hashes or using weak SHA-1 | high/medium |
|
|
37
|
+
| `typosquat-check` | Known malicious typosquat packages (21 entries) and fuzzy matches within edit distance 1 of popular packages | critical/high |
|
|
38
|
+
| `transitive-drift` | Missing lockfiles and packages declared in package.json but absent from lockfile | high/medium |
|
|
39
|
+
|
|
40
|
+
### 4. Runtime Monitor (`runtime-monitor`)
|
|
41
|
+
|
|
42
|
+
| Rule | Detects | Default Severity |
|
|
43
|
+
|------|---------|-----------------|
|
|
44
|
+
| `process-spawn` | Shell execution (child_process, exec, eval, Function constructor) with special focus on user-input-to-exec flows | critical/medium |
|
|
45
|
+
| `filesystem-access` | Access to sensitive paths (/etc/passwd, .ssh/, .aws/credentials) and user-controlled filesystem operations (path traversal) | critical/high/medium |
|
|
46
|
+
| `outbound-network` | Connections to known bad destinations (C2, exfiltration services, cryptominers, ephemeral file hosts) and suspicious ports (4444, 9001, 31337, etc.) | critical/high/medium |
|
|
47
|
+
| `resource-anomaly` | Infinite loops, tight intervals, large buffer allocations, user-controlled RegExp (ReDoS), user-controlled crypto parameters | high/medium |
|
|
48
|
+
|
|
49
|
+
## Key Design Decisions
|
|
50
|
+
|
|
51
|
+
- All scanners implement the same Scanner/Rule interface
|
|
52
|
+
- Engine orchestrates scanners, collects findings, produces WatchmanReport
|
|
53
|
+
- Severity hierarchy: critical > high > medium > low > info
|
|
54
|
+
- `failOn` config determines pass/fail threshold (default: high)
|
|
55
|
+
- Runtime monitor disabled by default (requires opt-in)
|
|
56
|
+
- File collection excludes node_modules, .git, dist, build, .next by default
|
|
57
|
+
|
|
58
|
+
## Patent-Relevant Innovation
|
|
59
|
+
|
|
60
|
+
The combination of AI-specific threat detection (prompt injection,
|
|
61
|
+
tool manifest drift, unauthorized model calls) with traditional
|
|
62
|
+
security scanning (secrets, dependencies, runtime) in a single
|
|
63
|
+
unified engine designed for AI-augmented development workflows.
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { WatchmanConfig, Scanner, WatchmanReport } from './types/index.js';
|
|
2
|
+
export declare class WatchmanEngine {
|
|
3
|
+
private scanners;
|
|
4
|
+
private config;
|
|
5
|
+
constructor(config: WatchmanConfig);
|
|
6
|
+
register(scanner: Scanner): void;
|
|
7
|
+
scan(): Promise<WatchmanReport>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EAEd,OAAO,EAIP,cAAc,EAEf,MAAM,kBAAkB,CAAC;AAkD1B,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1B,IAAI,IAAI,OAAO,CAAC,cAAc,CAAC;CAsDtC"}
|
package/dist/engine.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WatchmanEngine = void 0;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const node_crypto_1 = require("node:crypto");
|
|
7
|
+
const SEVERITY_ORDER = {
|
|
8
|
+
critical: 4,
|
|
9
|
+
high: 3,
|
|
10
|
+
medium: 2,
|
|
11
|
+
low: 1,
|
|
12
|
+
info: 0,
|
|
13
|
+
};
|
|
14
|
+
function severityAtLeast(a, threshold) {
|
|
15
|
+
return SEVERITY_ORDER[a] >= SEVERITY_ORDER[threshold];
|
|
16
|
+
}
|
|
17
|
+
function maxSeverity(findings) {
|
|
18
|
+
if (findings.length === 0)
|
|
19
|
+
return null;
|
|
20
|
+
return findings.reduce((max, f) => SEVERITY_ORDER[f.severity] > SEVERITY_ORDER[max] ? f.severity : max, 'info');
|
|
21
|
+
}
|
|
22
|
+
async function collectFiles(dir, exclude) {
|
|
23
|
+
const files = [];
|
|
24
|
+
async function walk(current) {
|
|
25
|
+
const entries = await (0, promises_1.readdir)(current, { withFileTypes: true });
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
const fullPath = (0, node_path_1.join)(current, entry.name);
|
|
28
|
+
const rel = (0, node_path_1.relative)(dir, fullPath);
|
|
29
|
+
if (exclude.some((pattern) => rel.startsWith(pattern) || entry.name === pattern)) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (entry.isDirectory()) {
|
|
33
|
+
await walk(fullPath);
|
|
34
|
+
}
|
|
35
|
+
else if (entry.isFile()) {
|
|
36
|
+
files.push(fullPath);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
await walk(dir);
|
|
41
|
+
return files;
|
|
42
|
+
}
|
|
43
|
+
class WatchmanEngine {
|
|
44
|
+
scanners = new Map();
|
|
45
|
+
config;
|
|
46
|
+
constructor(config) {
|
|
47
|
+
this.config = config;
|
|
48
|
+
}
|
|
49
|
+
register(scanner) {
|
|
50
|
+
this.scanners.set(scanner.id, scanner);
|
|
51
|
+
}
|
|
52
|
+
async scan() {
|
|
53
|
+
const start = performance.now();
|
|
54
|
+
const files = await collectFiles(this.config.projectRoot, this.config.exclude ?? []);
|
|
55
|
+
const results = [];
|
|
56
|
+
for (const [id, scanner] of this.scanners) {
|
|
57
|
+
const scannerConfig = this.config.scanners[id];
|
|
58
|
+
if (!scannerConfig?.enabled)
|
|
59
|
+
continue;
|
|
60
|
+
const findings = [];
|
|
61
|
+
const scanStart = performance.now();
|
|
62
|
+
const ctx = {
|
|
63
|
+
config: this.config,
|
|
64
|
+
scannerId: id,
|
|
65
|
+
scannerConfig,
|
|
66
|
+
files,
|
|
67
|
+
addFinding: (partial) => {
|
|
68
|
+
findings.push({
|
|
69
|
+
...partial,
|
|
70
|
+
id: (0, node_crypto_1.randomUUID)(),
|
|
71
|
+
scanner: id,
|
|
72
|
+
});
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
await scanner.scan(ctx);
|
|
76
|
+
results.push({
|
|
77
|
+
scanner: id,
|
|
78
|
+
findings,
|
|
79
|
+
duration: performance.now() - scanStart,
|
|
80
|
+
filesScanned: files.length,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const allFindings = results.flatMap((r) => r.findings);
|
|
84
|
+
const maxSev = maxSeverity(allFindings);
|
|
85
|
+
const failOn = this.config.failOn ?? 'high';
|
|
86
|
+
const passed = maxSev === null || !severityAtLeast(maxSev, failOn);
|
|
87
|
+
return {
|
|
88
|
+
timestamp: new Date().toISOString(),
|
|
89
|
+
projectRoot: this.config.projectRoot,
|
|
90
|
+
results,
|
|
91
|
+
totalFindings: allFindings.length,
|
|
92
|
+
maxSeverity: maxSev,
|
|
93
|
+
passed,
|
|
94
|
+
duration: performance.now() - start,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.WatchmanEngine = WatchmanEngine;
|
|
99
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { WatchmanEngine } from './engine.js';
|
|
2
|
+
export type { Severity, ScannerId, RuleConfig, ScannerConfig, WatchmanConfig, SourceLocation, Finding, ScanResult, WatchmanReport, ScanContext, Rule, Scanner, } from './types/index.js';
|
|
3
|
+
export { DEFAULT_CONFIG } from './types/index.js';
|
|
4
|
+
export { aiToolIntegrityScanner } from './scanners/ai-tool-integrity/index.js';
|
|
5
|
+
export { secretsExposureScanner } from './scanners/secrets-exposure/index.js';
|
|
6
|
+
export { dependencyIntegrityScanner } from './scanners/dependency-integrity/index.js';
|
|
7
|
+
export { runtimeMonitorScanner } from './scanners/runtime-monitor/index.js';
|
|
8
|
+
export { INJECTION_SIGNATURES } from './scanners/ai-tool-integrity/patterns/injection-signatures.js';
|
|
9
|
+
export type { InjectionSignature } from './scanners/ai-tool-integrity/patterns/injection-signatures.js';
|
|
10
|
+
export { SECRET_SIGNATURES } from './scanners/secrets-exposure/patterns/secret-signatures.js';
|
|
11
|
+
export type { SecretSignature } from './scanners/secrets-exposure/patterns/secret-signatures.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,YAAY,EACV,QAAQ,EACR,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACd,cAAc,EACd,OAAO,EACP,UAAU,EACV,cAAc,EACd,WAAW,EACX,IAAI,EACJ,OAAO,GACR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+DAA+D,CAAC;AACrG,YAAY,EAAE,kBAAkB,EAAE,MAAM,+DAA+D,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,2DAA2D,CAAC;AAC9F,YAAY,EAAE,eAAe,EAAE,MAAM,2DAA2D,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SECRET_SIGNATURES = exports.INJECTION_SIGNATURES = exports.runtimeMonitorScanner = exports.dependencyIntegrityScanner = exports.secretsExposureScanner = exports.aiToolIntegrityScanner = exports.DEFAULT_CONFIG = exports.WatchmanEngine = void 0;
|
|
4
|
+
var engine_js_1 = require("./engine.js");
|
|
5
|
+
Object.defineProperty(exports, "WatchmanEngine", { enumerable: true, get: function () { return engine_js_1.WatchmanEngine; } });
|
|
6
|
+
var index_js_1 = require("./types/index.js");
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return index_js_1.DEFAULT_CONFIG; } });
|
|
8
|
+
var index_js_2 = require("./scanners/ai-tool-integrity/index.js");
|
|
9
|
+
Object.defineProperty(exports, "aiToolIntegrityScanner", { enumerable: true, get: function () { return index_js_2.aiToolIntegrityScanner; } });
|
|
10
|
+
var index_js_3 = require("./scanners/secrets-exposure/index.js");
|
|
11
|
+
Object.defineProperty(exports, "secretsExposureScanner", { enumerable: true, get: function () { return index_js_3.secretsExposureScanner; } });
|
|
12
|
+
var index_js_4 = require("./scanners/dependency-integrity/index.js");
|
|
13
|
+
Object.defineProperty(exports, "dependencyIntegrityScanner", { enumerable: true, get: function () { return index_js_4.dependencyIntegrityScanner; } });
|
|
14
|
+
var index_js_5 = require("./scanners/runtime-monitor/index.js");
|
|
15
|
+
Object.defineProperty(exports, "runtimeMonitorScanner", { enumerable: true, get: function () { return index_js_5.runtimeMonitorScanner; } });
|
|
16
|
+
// Pattern exports for in-memory scanning (used by adapters)
|
|
17
|
+
var injection_signatures_js_1 = require("./scanners/ai-tool-integrity/patterns/injection-signatures.js");
|
|
18
|
+
Object.defineProperty(exports, "INJECTION_SIGNATURES", { enumerable: true, get: function () { return injection_signatures_js_1.INJECTION_SIGNATURES; } });
|
|
19
|
+
var secret_signatures_js_1 = require("./scanners/secrets-exposure/patterns/secret-signatures.js");
|
|
20
|
+
Object.defineProperty(exports, "SECRET_SIGNATURES", { enumerable: true, get: function () { return secret_signatures_js_1.SECRET_SIGNATURES; } });
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA6C;AAApC,2GAAA,cAAc,OAAA;AAgBvB,6CAAkD;AAAzC,0GAAA,cAAc,OAAA;AAEvB,kEAA+E;AAAtE,kHAAA,sBAAsB,OAAA;AAC/B,iEAA8E;AAArE,kHAAA,sBAAsB,OAAA;AAC/B,qEAAsF;AAA7E,sHAAA,0BAA0B,OAAA;AACnC,gEAA4E;AAAnE,iHAAA,qBAAqB,OAAA;AAE9B,4DAA4D;AAC5D,yGAAqG;AAA5F,+HAAA,oBAAoB,OAAA;AAE7B,kGAA8F;AAArF,yHAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/ai-tool-integrity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aiToolIntegrityScanner = void 0;
|
|
4
|
+
var scanner_js_1 = require("./scanner.js");
|
|
5
|
+
Object.defineProperty(exports, "aiToolIntegrityScanner", { enumerable: true, get: function () { return scanner_js_1.aiToolIntegrityScanner; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/ai-tool-integrity/index.ts"],"names":[],"mappings":";;;AAAA,2CAAsD;AAA7C,oHAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-signatures.d.ts","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/patterns/injection-signatures.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC1C;AAED,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EA8CpD,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INJECTION_SIGNATURES = void 0;
|
|
4
|
+
exports.INJECTION_SIGNATURES = [
|
|
5
|
+
{
|
|
6
|
+
pattern: /ignore\s+(all\s+)?(previous|prior|above)\s+(instructions|prompts|rules)/i,
|
|
7
|
+
label: 'direct-override',
|
|
8
|
+
severity: 'critical',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
pattern: /you\s+are\s+now\s+(a|an|the)\b/i,
|
|
12
|
+
label: 'persona-hijack',
|
|
13
|
+
severity: 'critical',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
pattern: /system\s*:\s*\n/i,
|
|
17
|
+
label: 'fake-system-prompt',
|
|
18
|
+
severity: 'critical',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
pattern: /\bdo\s+not\s+follow\s+(your|the)\s+(rules|guidelines|instructions)/i,
|
|
22
|
+
label: 'rule-suppression',
|
|
23
|
+
severity: 'high',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
pattern: /\bpretend\s+(you\s+)?(are|to\s+be)\b/i,
|
|
27
|
+
label: 'role-coercion',
|
|
28
|
+
severity: 'high',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
pattern: /\brepeat\s+(back|everything|the\s+(system|hidden))/i,
|
|
32
|
+
label: 'prompt-extraction',
|
|
33
|
+
severity: 'high',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
pattern: /\[INST\]|\[\/INST\]|<\|im_start\|>|<\|im_end\|>/i,
|
|
37
|
+
label: 'token-boundary-injection',
|
|
38
|
+
severity: 'critical',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
pattern: /\bbase64\s*[:(]\s*[A-Za-z0-9+/=]{20,}/,
|
|
42
|
+
label: 'encoded-payload',
|
|
43
|
+
severity: 'medium',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
pattern: /\btranslate\s+(the\s+)?(following|this)\s+to\s+\w+\s*:/i,
|
|
47
|
+
label: 'translation-bypass',
|
|
48
|
+
severity: 'medium',
|
|
49
|
+
},
|
|
50
|
+
];
|
|
51
|
+
//# sourceMappingURL=injection-signatures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection-signatures.js","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/patterns/injection-signatures.ts"],"names":[],"mappings":";;;AAMa,QAAA,oBAAoB,GAAyB;IACxD;QACE,OAAO,EAAE,0EAA0E;QACnF,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,UAAU;KACrB;IACD;QACE,OAAO,EAAE,iCAAiC;QAC1C,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,UAAU;KACrB;IACD;QACE,OAAO,EAAE,kBAAkB;QAC3B,KAAK,EAAE,oBAAoB;QAC3B,QAAQ,EAAE,UAAU;KACrB;IACD;QACE,OAAO,EAAE,qEAAqE;QAC9E,KAAK,EAAE,kBAAkB;QACzB,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,uCAAuC;QAChD,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,qDAAqD;QAC9D,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE,MAAM;KACjB;IACD;QACE,OAAO,EAAE,kDAAkD;QAC3D,KAAK,EAAE,0BAA0B;QACjC,QAAQ,EAAE,UAAU;KACrB;IACD;QACE,OAAO,EAAE,uCAAuC;QAChD,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAE,QAAQ;KACnB;IACD;QACE,OAAO,EAAE,yDAAyD;QAClE,KAAK,EAAE,oBAAoB;QAC3B,QAAQ,EAAE,QAAQ;KACnB;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-injection.rule.d.ts","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/rules/prompt-injection.rule.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,yBAAyB,CAAC;AAcjE,eAAO,MAAM,mBAAmB,EAAE,IAkCjC,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.promptInjectionRule = void 0;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const injection_signatures_js_1 = require("../patterns/injection-signatures.js");
|
|
6
|
+
const SCANNABLE_EXTENSIONS = new Set([
|
|
7
|
+
'.ts', '.tsx', '.js', '.jsx', '.json', '.yaml', '.yml',
|
|
8
|
+
'.md', '.txt', '.env', '.toml', '.cfg', '.ini',
|
|
9
|
+
]);
|
|
10
|
+
function hasScannableExtension(file) {
|
|
11
|
+
const dot = file.lastIndexOf('.');
|
|
12
|
+
if (dot === -1)
|
|
13
|
+
return false;
|
|
14
|
+
return SCANNABLE_EXTENSIONS.has(file.slice(dot).toLowerCase());
|
|
15
|
+
}
|
|
16
|
+
exports.promptInjectionRule = {
|
|
17
|
+
id: 'prompt-injection',
|
|
18
|
+
name: 'Prompt Injection Detection',
|
|
19
|
+
description: 'Scans source files and config for prompt injection signatures',
|
|
20
|
+
async run(ctx) {
|
|
21
|
+
const targets = ctx.files.filter(hasScannableExtension);
|
|
22
|
+
for (const file of targets) {
|
|
23
|
+
let content;
|
|
24
|
+
try {
|
|
25
|
+
content = await (0, promises_1.readFile)(file, 'utf-8');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const lines = content.split('\n');
|
|
31
|
+
for (let i = 0; i < lines.length; i++) {
|
|
32
|
+
const line = lines[i];
|
|
33
|
+
for (const sig of injection_signatures_js_1.INJECTION_SIGNATURES) {
|
|
34
|
+
if (sig.pattern.test(line)) {
|
|
35
|
+
ctx.addFinding({
|
|
36
|
+
rule: 'prompt-injection',
|
|
37
|
+
severity: sig.severity,
|
|
38
|
+
message: `Prompt injection signature detected: ${sig.label}`,
|
|
39
|
+
location: { file, line: i + 1 },
|
|
40
|
+
evidence: line.trim().slice(0, 200),
|
|
41
|
+
suggestion: 'Review this content for prompt injection attempts. Sanitize user-facing strings.',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=prompt-injection.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-injection.rule.js","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/rules/prompt-injection.rule.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAE5C,iFAA2E;AAE3E,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC;IACnC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM;IACtD,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;CAC/C,CAAC,CAAC;AAEH,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACjE,CAAC;AAEY,QAAA,mBAAmB,GAAS;IACvC,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,4BAA4B;IAClC,WAAW,EAAE,+DAA+D;IAE5E,KAAK,CAAC,GAAG,CAAC,GAAgB;QACxB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAExD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,KAAK,MAAM,GAAG,IAAI,8CAAoB,EAAE,CAAC;oBACvC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC3B,GAAG,CAAC,UAAU,CAAC;4BACb,IAAI,EAAE,kBAAkB;4BACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;4BACtB,OAAO,EAAE,wCAAwC,GAAG,CAAC,KAAK,EAAE;4BAC5D,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;4BAC/B,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;4BACnC,UAAU,EAAE,kFAAkF;yBAC/F,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-manifest-drift.rule.d.ts","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/rules/tool-manifest-drift.rule.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,yBAAyB,CAAC;AAiBjE,eAAO,MAAM,qBAAqB,EAAE,IA6DnC,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toolManifestDriftRule = void 0;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const MANIFEST_FILENAMES = new Set([
|
|
7
|
+
'tools.json',
|
|
8
|
+
'tool-manifest.json',
|
|
9
|
+
'mcp.json',
|
|
10
|
+
'.mcp.json',
|
|
11
|
+
'ai-plugin.json',
|
|
12
|
+
]);
|
|
13
|
+
exports.toolManifestDriftRule = {
|
|
14
|
+
id: 'tool-manifest-drift',
|
|
15
|
+
name: 'Tool Manifest Drift',
|
|
16
|
+
description: 'Detects tool definitions with missing or suspicious fields that could indicate manifest tampering',
|
|
17
|
+
async run(ctx) {
|
|
18
|
+
const manifests = ctx.files.filter((f) => MANIFEST_FILENAMES.has((0, node_path_1.basename)(f)));
|
|
19
|
+
for (const file of manifests) {
|
|
20
|
+
let content;
|
|
21
|
+
try {
|
|
22
|
+
content = await (0, promises_1.readFile)(file, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
let parsed;
|
|
28
|
+
try {
|
|
29
|
+
parsed = JSON.parse(content);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
ctx.addFinding({
|
|
33
|
+
rule: 'tool-manifest-drift',
|
|
34
|
+
severity: 'medium',
|
|
35
|
+
message: 'Tool manifest is not valid JSON',
|
|
36
|
+
location: { file },
|
|
37
|
+
suggestion: 'Fix JSON syntax in this manifest file.',
|
|
38
|
+
});
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const tools = Array.isArray(parsed)
|
|
42
|
+
? parsed
|
|
43
|
+
: parsed?.tools ?? [];
|
|
44
|
+
if (!Array.isArray(tools))
|
|
45
|
+
continue;
|
|
46
|
+
for (let i = 0; i < tools.length; i++) {
|
|
47
|
+
const tool = tools[i];
|
|
48
|
+
if (!tool.name) {
|
|
49
|
+
ctx.addFinding({
|
|
50
|
+
rule: 'tool-manifest-drift',
|
|
51
|
+
severity: 'high',
|
|
52
|
+
message: `Tool at index ${i} has no name — possible injection point`,
|
|
53
|
+
location: { file },
|
|
54
|
+
suggestion: 'Every tool definition must have an explicit name.',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (tool.description && tool.description.length > 2000) {
|
|
58
|
+
ctx.addFinding({
|
|
59
|
+
rule: 'tool-manifest-drift',
|
|
60
|
+
severity: 'high',
|
|
61
|
+
message: `Tool "${tool.name ?? i}" has suspiciously long description (${tool.description.length} chars)`,
|
|
62
|
+
location: { file },
|
|
63
|
+
evidence: tool.description.slice(0, 200),
|
|
64
|
+
suggestion: 'Long descriptions may hide injected instructions. Review for embedded prompts.',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=tool-manifest-drift.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-manifest-drift.rule.js","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/rules/tool-manifest-drift.rule.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAC5C,yCAAqC;AAGrC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACjC,YAAY;IACZ,oBAAoB;IACpB,UAAU;IACV,WAAW;IACX,gBAAgB;CACjB,CAAC,CAAC;AASU,QAAA,qBAAqB,GAAS;IACzC,EAAE,EAAE,qBAAqB;IACzB,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EAAE,mGAAmG;IAEhH,KAAK,CAAC,GAAG,CAAC,GAAgB;QACxB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAA,oBAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,UAAU,CAAC;oBACb,IAAI,EAAE,qBAAqB;oBAC3B,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,iCAAiC;oBAC1C,QAAQ,EAAE,EAAE,IAAI,EAAE;oBAClB,UAAU,EAAE,wCAAwC;iBACrD,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAqB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACnD,CAAC,CAAC,MAAM;gBACR,CAAC,CAAE,MAAkC,EAAE,KAAyB,IAAI,EAAE,CAAC;YAEzE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACf,GAAG,CAAC,UAAU,CAAC;wBACb,IAAI,EAAE,qBAAqB;wBAC3B,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,iBAAiB,CAAC,yCAAyC;wBACpE,QAAQ,EAAE,EAAE,IAAI,EAAE;wBAClB,UAAU,EAAE,mDAAmD;qBAChE,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;oBACvD,GAAG,CAAC,UAAU,CAAC;wBACb,IAAI,EAAE,qBAAqB;wBAC3B,QAAQ,EAAE,MAAM;wBAChB,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,wCAAwC,IAAI,CAAC,WAAW,CAAC,MAAM,SAAS;wBACxG,QAAQ,EAAE,EAAE,IAAI,EAAE;wBAClB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;wBACxC,UAAU,EAAE,gFAAgF;qBAC7F,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unauthorized-model-call.rule.d.ts","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/rules/unauthorized-model-call.rule.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,yBAAyB,CAAC;AAsBjE,eAAO,MAAM,yBAAyB,EAAE,IAmCvC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unauthorizedModelCallRule = void 0;
|
|
4
|
+
const promises_1 = require("node:fs/promises");
|
|
5
|
+
const MODEL_CALL_PATTERNS = [
|
|
6
|
+
{ pattern: /openai\.chat\.completions\.create/g, provider: 'OpenAI' },
|
|
7
|
+
{ pattern: /anthropic\.messages\.create/g, provider: 'Anthropic' },
|
|
8
|
+
{ pattern: /new\s+OpenAI\s*\(/g, provider: 'OpenAI' },
|
|
9
|
+
{ pattern: /new\s+Anthropic\s*\(/g, provider: 'Anthropic' },
|
|
10
|
+
{ pattern: /generateText\s*\(/g, provider: 'AI SDK' },
|
|
11
|
+
{ pattern: /streamText\s*\(/g, provider: 'AI SDK' },
|
|
12
|
+
{ pattern: /generateObject\s*\(/g, provider: 'AI SDK' },
|
|
13
|
+
{ pattern: /google\.generativeai/gi, provider: 'Google AI' },
|
|
14
|
+
{ pattern: /cohere\.chat\(/g, provider: 'Cohere' },
|
|
15
|
+
{ pattern: /replicate\.run\(/g, provider: 'Replicate' },
|
|
16
|
+
];
|
|
17
|
+
const CODE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
|
|
18
|
+
function isCodeFile(file) {
|
|
19
|
+
const dot = file.lastIndexOf('.');
|
|
20
|
+
return dot !== -1 && CODE_EXTENSIONS.has(file.slice(dot).toLowerCase());
|
|
21
|
+
}
|
|
22
|
+
exports.unauthorizedModelCallRule = {
|
|
23
|
+
id: 'unauthorized-model-call',
|
|
24
|
+
name: 'Unauthorized Model Call',
|
|
25
|
+
description: 'Flags direct AI provider calls that may bypass approved routing or gateway patterns',
|
|
26
|
+
async run(ctx) {
|
|
27
|
+
const codeFiles = ctx.files.filter(isCodeFile);
|
|
28
|
+
for (const file of codeFiles) {
|
|
29
|
+
let content;
|
|
30
|
+
try {
|
|
31
|
+
content = await (0, promises_1.readFile)(file, 'utf-8');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const lines = content.split('\n');
|
|
37
|
+
for (let i = 0; i < lines.length; i++) {
|
|
38
|
+
const line = lines[i];
|
|
39
|
+
for (const { pattern, provider } of MODEL_CALL_PATTERNS) {
|
|
40
|
+
pattern.lastIndex = 0;
|
|
41
|
+
if (pattern.test(line)) {
|
|
42
|
+
ctx.addFinding({
|
|
43
|
+
rule: 'unauthorized-model-call',
|
|
44
|
+
severity: 'medium',
|
|
45
|
+
message: `Direct ${provider} API call detected — verify this is an approved integration point`,
|
|
46
|
+
location: { file, line: i + 1 },
|
|
47
|
+
evidence: line.trim().slice(0, 200),
|
|
48
|
+
suggestion: `Route model calls through your approved AI gateway or service layer.`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=unauthorized-model-call.rule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unauthorized-model-call.rule.js","sourceRoot":"","sources":["../../../../src/scanners/ai-tool-integrity/rules/unauthorized-model-call.rule.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAG5C,MAAM,mBAAmB,GAAG;IAC1B,EAAE,OAAO,EAAE,oCAAoC,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrE,EAAE,OAAO,EAAE,8BAA8B,EAAE,QAAQ,EAAE,WAAW,EAAE;IAClE,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrD,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC3D,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrD,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACnD,EAAE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACvD,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC5D,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAClD,EAAE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE;CACxD,CAAC;AAEF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEhF,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1E,CAAC;AAEY,QAAA,yBAAyB,GAAS;IAC7C,EAAE,EAAE,yBAAyB;IAC7B,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EAAE,qFAAqF;IAElG,KAAK,CAAC,GAAG,CAAC,GAAgB;QACxB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,KAAK,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,mBAAmB,EAAE,CAAC;oBACxD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;oBACtB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,GAAG,CAAC,UAAU,CAAC;4BACb,IAAI,EAAE,yBAAyB;4BAC/B,QAAQ,EAAE,QAAQ;4BAClB,OAAO,EAAE,UAAU,QAAQ,mEAAmE;4BAC9F,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE;4BAC/B,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;4BACnC,UAAU,EAAE,sEAAsE;yBACnF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/scanners/ai-tool-integrity/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,sBAAsB,CAAC;AAWvE,eAAO,MAAM,sBAAsB,EAAE,OAapC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.aiToolIntegrityScanner = void 0;
|
|
4
|
+
const prompt_injection_rule_js_1 = require("./rules/prompt-injection.rule.js");
|
|
5
|
+
const tool_manifest_drift_rule_js_1 = require("./rules/tool-manifest-drift.rule.js");
|
|
6
|
+
const unauthorized_model_call_rule_js_1 = require("./rules/unauthorized-model-call.rule.js");
|
|
7
|
+
const rules = [
|
|
8
|
+
prompt_injection_rule_js_1.promptInjectionRule,
|
|
9
|
+
tool_manifest_drift_rule_js_1.toolManifestDriftRule,
|
|
10
|
+
unauthorized_model_call_rule_js_1.unauthorizedModelCallRule,
|
|
11
|
+
];
|
|
12
|
+
exports.aiToolIntegrityScanner = {
|
|
13
|
+
id: 'ai-tool-integrity',
|
|
14
|
+
name: 'AI Tool Integrity',
|
|
15
|
+
description: 'Detects prompt injection, tool manifest drift, and unauthorized model calls',
|
|
16
|
+
rules,
|
|
17
|
+
async scan(ctx) {
|
|
18
|
+
for (const rule of rules) {
|
|
19
|
+
const ruleConfig = ctx.scannerConfig.rules?.[rule.id];
|
|
20
|
+
if (ruleConfig?.enabled === false)
|
|
21
|
+
continue;
|
|
22
|
+
await rule.run(ctx);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/scanners/ai-tool-integrity/scanner.ts"],"names":[],"mappings":";;;AACA,+EAAuE;AACvE,qFAA4E;AAC5E,6FAAoF;AAEpF,MAAM,KAAK,GAAW;IACpB,8CAAmB;IACnB,mDAAqB;IACrB,2DAAyB;CAC1B,CAAC;AAEW,QAAA,sBAAsB,GAAY;IAC7C,EAAE,EAAE,mBAAmB;IACvB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,6EAA6E;IAC1F,KAAK;IAEL,KAAK,CAAC,IAAI,CAAC,GAAgB;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtD,IAAI,UAAU,EAAE,OAAO,KAAK,KAAK;gBAAE,SAAS;YAC5C,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/dependency-integrity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.dependencyIntegrityScanner = void 0;
|
|
4
|
+
var scanner_js_1 = require("./scanner.js");
|
|
5
|
+
Object.defineProperty(exports, "dependencyIntegrityScanner", { enumerable: true, get: function () { return scanner_js_1.dependencyIntegrityScanner; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/dependency-integrity/index.ts"],"names":[],"mappings":";;;AAAA,2CAA0D;AAAjD,wHAAA,0BAA0B,OAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface TyposquatEntry {
|
|
2
|
+
malicious: string;
|
|
3
|
+
legitimate: string;
|
|
4
|
+
technique: 'typosquat' | 'combosquat' | 'starjack' | 'scope-confusion';
|
|
5
|
+
}
|
|
6
|
+
export declare const KNOWN_TYPOSQUATS: TyposquatEntry[];
|
|
7
|
+
export declare const SUBSTITUTION_PAIRS: [string, string][];
|
|
8
|
+
//# sourceMappingURL=known-typosquats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-typosquats.d.ts","sourceRoot":"","sources":["../../../../src/scanners/dependency-integrity/patterns/known-typosquats.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,iBAAiB,CAAC;CACxE;AAGD,eAAO,MAAM,gBAAgB,EAAE,cAAc,EAsB5C,CAAC;AAGF,eAAO,MAAM,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAQhD,CAAC"}
|