@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.
Files changed (64) hide show
  1. package/README.md +65 -0
  2. package/dist/analyzers/base.d.ts +38 -0
  3. package/dist/analyzers/base.d.ts.map +1 -0
  4. package/dist/analyzers/base.js +2 -0
  5. package/dist/analyzers/base.js.map +1 -0
  6. package/dist/analyzers/command.d.ts +44 -0
  7. package/dist/analyzers/command.d.ts.map +1 -0
  8. package/dist/analyzers/command.js +544 -0
  9. package/dist/analyzers/command.js.map +1 -0
  10. package/dist/analyzers/file-read.d.ts +31 -0
  11. package/dist/analyzers/file-read.d.ts.map +1 -0
  12. package/dist/analyzers/file-read.js +159 -0
  13. package/dist/analyzers/file-read.js.map +1 -0
  14. package/dist/analyzers/file-write.d.ts +32 -0
  15. package/dist/analyzers/file-write.d.ts.map +1 -0
  16. package/dist/analyzers/file-write.js +177 -0
  17. package/dist/analyzers/file-write.js.map +1 -0
  18. package/dist/analyzers/index.d.ts +7 -0
  19. package/dist/analyzers/index.d.ts.map +1 -0
  20. package/dist/analyzers/index.js +6 -0
  21. package/dist/analyzers/index.js.map +1 -0
  22. package/dist/analyzers/text.d.ts +30 -0
  23. package/dist/analyzers/text.d.ts.map +1 -0
  24. package/dist/analyzers/text.js +139 -0
  25. package/dist/analyzers/text.js.map +1 -0
  26. package/dist/analyzers/url.d.ts +33 -0
  27. package/dist/analyzers/url.d.ts.map +1 -0
  28. package/dist/analyzers/url.js +325 -0
  29. package/dist/analyzers/url.js.map +1 -0
  30. package/dist/classifier.d.ts +7 -0
  31. package/dist/classifier.d.ts.map +1 -0
  32. package/dist/classifier.js +12 -0
  33. package/dist/classifier.js.map +1 -0
  34. package/dist/context.d.ts +10 -0
  35. package/dist/context.d.ts.map +1 -0
  36. package/dist/context.js +9 -0
  37. package/dist/context.js.map +1 -0
  38. package/dist/engine.d.ts +49 -0
  39. package/dist/engine.d.ts.map +1 -0
  40. package/dist/engine.js +122 -0
  41. package/dist/engine.js.map +1 -0
  42. package/dist/index.d.ts +12 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +10 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/patterns.d.ts +8 -0
  47. package/dist/patterns.d.ts.map +1 -0
  48. package/dist/patterns.js +66 -0
  49. package/dist/patterns.js.map +1 -0
  50. package/dist/scorer.d.ts +23 -0
  51. package/dist/scorer.d.ts.map +1 -0
  52. package/dist/scorer.js +52 -0
  53. package/dist/scorer.js.map +1 -0
  54. package/dist/verdict.d.ts +7 -0
  55. package/dist/verdict.d.ts.map +1 -0
  56. package/dist/verdict.js +41 -0
  57. package/dist/verdict.js.map +1 -0
  58. package/package.json +44 -0
  59. package/patterns/brands.json +205 -0
  60. package/patterns/commands.json +44 -0
  61. package/patterns/file-read.json +85 -0
  62. package/patterns/file-write.json +100 -0
  63. package/patterns/text.json +190 -0
  64. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.js.map
@@ -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"}