@surfinguard/core-engine 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/README.md +65 -0
- package/dist/analyzers/base.d.ts +38 -0
- package/dist/analyzers/base.d.ts.map +1 -0
- package/dist/analyzers/base.js +2 -0
- package/dist/analyzers/base.js.map +1 -0
- package/dist/analyzers/command.d.ts +44 -0
- package/dist/analyzers/command.d.ts.map +1 -0
- package/dist/analyzers/command.js +544 -0
- package/dist/analyzers/command.js.map +1 -0
- package/dist/analyzers/file-read.d.ts +31 -0
- package/dist/analyzers/file-read.d.ts.map +1 -0
- package/dist/analyzers/file-read.js +159 -0
- package/dist/analyzers/file-read.js.map +1 -0
- package/dist/analyzers/file-write.d.ts +32 -0
- package/dist/analyzers/file-write.d.ts.map +1 -0
- package/dist/analyzers/file-write.js +177 -0
- package/dist/analyzers/file-write.js.map +1 -0
- package/dist/analyzers/index.d.ts +7 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +6 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/text.d.ts +30 -0
- package/dist/analyzers/text.d.ts.map +1 -0
- package/dist/analyzers/text.js +139 -0
- package/dist/analyzers/text.js.map +1 -0
- package/dist/analyzers/url.d.ts +33 -0
- package/dist/analyzers/url.d.ts.map +1 -0
- package/dist/analyzers/url.js +325 -0
- package/dist/analyzers/url.js.map +1 -0
- package/dist/classifier.d.ts +7 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +12 -0
- package/dist/classifier.js.map +1 -0
- package/dist/context.d.ts +10 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +9 -0
- package/dist/context.js.map +1 -0
- package/dist/engine.d.ts +49 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +122 -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 +10 -0
- package/dist/index.js.map +1 -0
- package/dist/patterns.d.ts +8 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +66 -0
- package/dist/patterns.js.map +1 -0
- package/dist/scorer.d.ts +23 -0
- package/dist/scorer.d.ts.map +1 -0
- package/dist/scorer.js +52 -0
- package/dist/scorer.js.map +1 -0
- package/dist/verdict.d.ts +7 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +41 -0
- package/dist/verdict.js.map +1 -0
- package/package.json +44 -0
- package/patterns/brands.json +205 -0
- package/patterns/commands.json +44 -0
- package/patterns/file-read.json +85 -0
- package/patterns/file-write.json +100 -0
- package/patterns/text.json +190 -0
- package/patterns/urls.json +412 -0
package/README.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# @surfinguard/core-engine
|
|
2
|
+
|
|
3
|
+
Heuristic scoring engine for the [Surfinguard](https://surfinguard.com) AI Security SDK. Analyzes AI agent actions against 5 risk primitives with 68 threat patterns — zero network calls, runs entirely in-process.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @surfinguard/core-engine
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
> **Note:** Most users should install `@surfinguard/sdk` instead, which provides a higher-level `Guard` class.
|
|
12
|
+
|
|
13
|
+
## Analyzers
|
|
14
|
+
|
|
15
|
+
| Analyzer | Threats | Patterns |
|
|
16
|
+
|----------|---------|----------|
|
|
17
|
+
| `UrlAnalyzer` | U01-U14 | Data URIs, IP addresses, brand impersonation, shorteners, risky TLDs, cloud metadata, free hosting |
|
|
18
|
+
| `CommandAnalyzer` | C01-C20 | Destructive ops, exfiltration, reverse shells, pipe-to-shell, privilege escalation, persistence, fork bombs, container escape |
|
|
19
|
+
| `TextAnalyzer` | P01-P12 | Prompt injection, goal hijacking, tool manipulation, persona hijacking, encoding evasion, markup injection |
|
|
20
|
+
| `FileReadAnalyzer` | FR01-FR10 | SSH keys, system credentials, cloud credentials, environment files, browser data |
|
|
21
|
+
| `FileWriteAnalyzer` | FW01-FW12 | System config overwrite, SSH authorized_keys injection, startup persistence, git hook injection |
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { CoreEngine } from '@surfinguard/core-engine';
|
|
27
|
+
|
|
28
|
+
const engine = new CoreEngine();
|
|
29
|
+
|
|
30
|
+
const result = engine.check('url', 'https://paypa1.com/login');
|
|
31
|
+
// { score: 9, level: 'DANGER', primitive: 'MANIPULATION', reasons: ['Brand impersonation: paypal'], ... }
|
|
32
|
+
|
|
33
|
+
const cmd = engine.check('command', 'rm -rf /');
|
|
34
|
+
// { score: 10, level: 'DANGER', primitive: 'DESTRUCTION', ... }
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Scoring Model
|
|
38
|
+
|
|
39
|
+
- **Within each primitive**: Scores are additive (sum), capped at 10
|
|
40
|
+
- **Composite score**: `max(primitive_scores)`
|
|
41
|
+
- **Risk levels**: SAFE (0-2), CAUTION (3-6), DANGER (7+)
|
|
42
|
+
|
|
43
|
+
## Risk Primitives
|
|
44
|
+
|
|
45
|
+
| Primitive | Description |
|
|
46
|
+
|-----------|-------------|
|
|
47
|
+
| DESTRUCTION | Data loss, system damage |
|
|
48
|
+
| EXFILTRATION | Data theft, credential access |
|
|
49
|
+
| ESCALATION | Privilege escalation |
|
|
50
|
+
| PERSISTENCE | Backdoor installation, startup modification |
|
|
51
|
+
| MANIPULATION | Phishing, prompt injection, deception |
|
|
52
|
+
|
|
53
|
+
## Pattern Databases
|
|
54
|
+
|
|
55
|
+
Versioned JSON files in `patterns/`:
|
|
56
|
+
- `urls.json` — URL threat patterns
|
|
57
|
+
- `brands.json` — Brand impersonation patterns
|
|
58
|
+
- `commands.json` — Command threat patterns
|
|
59
|
+
- `text.json` — Prompt injection patterns
|
|
60
|
+
- `file-read.json` — Sensitive file read patterns
|
|
61
|
+
- `file-write.json` — Sensitive file write patterns
|
|
62
|
+
|
|
63
|
+
## License
|
|
64
|
+
|
|
65
|
+
MIT
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ActionType, RiskPrimitive } from '@surfinguard/types';
|
|
2
|
+
/**
|
|
3
|
+
* A single finding from an analyzer check.
|
|
4
|
+
*/
|
|
5
|
+
export interface AnalyzerFinding {
|
|
6
|
+
/** Which risk primitive this finding maps to */
|
|
7
|
+
primitive: RiskPrimitive;
|
|
8
|
+
/** Score contribution (positive integer) */
|
|
9
|
+
score: number;
|
|
10
|
+
/** Human-readable reason */
|
|
11
|
+
reason: string;
|
|
12
|
+
/** Threat ID (e.g., "U01") if applicable */
|
|
13
|
+
threatId?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Complete result from an analyzer.
|
|
17
|
+
*/
|
|
18
|
+
export interface AnalyzerResult {
|
|
19
|
+
/** The action type this result is for */
|
|
20
|
+
actionType: ActionType;
|
|
21
|
+
/** All findings from the analysis */
|
|
22
|
+
findings: AnalyzerFinding[];
|
|
23
|
+
/** Whether the analysis short-circuited (e.g., known safe) */
|
|
24
|
+
shortCircuit?: {
|
|
25
|
+
safe: boolean;
|
|
26
|
+
reason: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Base interface for all action analyzers.
|
|
31
|
+
*/
|
|
32
|
+
export interface Analyzer {
|
|
33
|
+
/** The action type this analyzer handles */
|
|
34
|
+
readonly actionType: ActionType;
|
|
35
|
+
/** Analyze a value and return findings */
|
|
36
|
+
analyze(value: string): AnalyzerResult;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/analyzers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,SAAS,EAAE,aAAa,CAAC;IACzB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,UAAU,EAAE,UAAU,CAAC;IACvB,qCAAqC;IACrC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,OAAO,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,4CAA4C;IAC5C,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,0CAA0C;IAC1C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CAAC;CACxC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/analyzers/base.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { CommandPatternDatabase } from '@surfinguard/types';
|
|
2
|
+
import type { Analyzer, AnalyzerResult } from './base.js';
|
|
3
|
+
/**
|
|
4
|
+
* Command Analyzer — heuristic shell command threat detection.
|
|
5
|
+
*
|
|
6
|
+
* Analyzes shell commands against 20 threat patterns (C01-C20)
|
|
7
|
+
* mapped to 5 risk primitives.
|
|
8
|
+
*/
|
|
9
|
+
export declare class CommandAnalyzer implements Analyzer {
|
|
10
|
+
readonly actionType: "command";
|
|
11
|
+
private readonly db;
|
|
12
|
+
private readonly safeCommandsSet;
|
|
13
|
+
private readonly destructiveCommandsSet;
|
|
14
|
+
private readonly exfiltrationCommandsSet;
|
|
15
|
+
private readonly networkCommandsSet;
|
|
16
|
+
private readonly packageManagersSet;
|
|
17
|
+
private readonly encodingCommandsSet;
|
|
18
|
+
constructor(patterns: CommandPatternDatabase);
|
|
19
|
+
analyze(value: string): AnalyzerResult;
|
|
20
|
+
/**
|
|
21
|
+
* Split a command string into pipeline segments.
|
|
22
|
+
* Splits on |, &&, ||, ; respecting quotes.
|
|
23
|
+
*/
|
|
24
|
+
private tokenize;
|
|
25
|
+
/**
|
|
26
|
+
* Split on |, &&, ||, ; while respecting quotes and subshells.
|
|
27
|
+
*/
|
|
28
|
+
private splitPipeline;
|
|
29
|
+
/**
|
|
30
|
+
* Tokenize a single command segment into command + args.
|
|
31
|
+
* Handles single/double quotes.
|
|
32
|
+
*/
|
|
33
|
+
private tokenizeSegment;
|
|
34
|
+
private isForkBomb;
|
|
35
|
+
private isEncodedCommand;
|
|
36
|
+
private hasVariableExpansionRisk;
|
|
37
|
+
private targetsCriticalPath;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a command segment has arguments that elevate risk
|
|
40
|
+
* beyond what the safe command alone would imply.
|
|
41
|
+
*/
|
|
42
|
+
private hasRiskyArgs;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/analyzers/command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAc3E;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,UAAU,EAAG,SAAS,CAAU;IAEzC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAyB;IAC5C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAc;IACtD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAc;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAc;IACjD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAc;gBAEtC,QAAQ,EAAE,sBAAsB;IAU5C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;IAsUtC;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAqBhB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0ErB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAuCvB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,wBAAwB;IAOhC,OAAO,CAAC,mBAAmB;IAe3B;;;OAGG;IACH,OAAO,CAAC,YAAY;CA6BrB"}
|