@dotsetlabs/tollgate 0.2.2 → 0.3.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 +138 -0
- package/dist/analyzers/filesystem.d.ts +5 -0
- package/dist/analyzers/filesystem.d.ts.map +1 -1
- package/dist/analyzers/filesystem.js +61 -7
- package/dist/analyzers/filesystem.js.map +1 -1
- package/dist/analyzers/loader.d.ts +5 -0
- package/dist/analyzers/loader.d.ts.map +1 -1
- package/dist/analyzers/loader.js +112 -6
- package/dist/analyzers/loader.js.map +1 -1
- package/dist/analyzers/prompt-injection.d.ts +1 -0
- package/dist/analyzers/prompt-injection.d.ts.map +1 -1
- package/dist/analyzers/prompt-injection.js +48 -2
- package/dist/analyzers/prompt-injection.js.map +1 -1
- package/dist/analyzers/shell.d.ts +8 -0
- package/dist/analyzers/shell.d.ts.map +1 -1
- package/dist/analyzers/shell.js +109 -8
- package/dist/analyzers/shell.js.map +1 -1
- package/dist/analyzers/sql.d.ts.map +1 -1
- package/dist/analyzers/sql.js +8 -7
- package/dist/analyzers/sql.js.map +1 -1
- package/dist/approval/interactive.d.ts +1 -1
- package/dist/approval/interactive.d.ts.map +1 -1
- package/dist/approval/interactive.js +13 -1
- package/dist/approval/interactive.js.map +1 -1
- package/dist/approval/rate-limiter.d.ts +115 -0
- package/dist/approval/rate-limiter.d.ts.map +1 -0
- package/dist/approval/rate-limiter.js +200 -0
- package/dist/approval/rate-limiter.js.map +1 -0
- package/dist/approval/url-validator.d.ts +51 -0
- package/dist/approval/url-validator.d.ts.map +1 -0
- package/dist/approval/url-validator.js +184 -0
- package/dist/approval/url-validator.js.map +1 -0
- package/dist/approval/webhook.d.ts +48 -0
- package/dist/approval/webhook.d.ts.map +1 -1
- package/dist/approval/webhook.js +89 -0
- package/dist/approval/webhook.js.map +1 -1
- package/dist/audit/integrity.d.ts +107 -0
- package/dist/audit/integrity.d.ts.map +1 -0
- package/dist/audit/integrity.js +191 -0
- package/dist/audit/integrity.js.map +1 -0
- package/dist/audit/logger.d.ts.map +1 -1
- package/dist/audit/logger.js +6 -5
- package/dist/audit/logger.js.map +1 -1
- package/dist/audit/redaction.js +6 -4
- package/dist/audit/redaction.js.map +1 -1
- package/dist/cli/commands/guard.d.ts +97 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +456 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/serve.js +1 -1
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/input-validation.d.ts +83 -0
- package/dist/cli/input-validation.d.ts.map +1 -0
- package/dist/cli/input-validation.js +237 -0
- package/dist/cli/input-validation.js.map +1 -0
- package/dist/cli/ui.js +2 -2
- package/dist/cli/ui.js.map +1 -1
- package/dist/guard/alternatives/index.d.ts +68 -0
- package/dist/guard/alternatives/index.d.ts.map +1 -0
- package/dist/guard/alternatives/index.js +224 -0
- package/dist/guard/alternatives/index.js.map +1 -0
- package/dist/guard/alternatives/registry.d.ts +16 -0
- package/dist/guard/alternatives/registry.d.ts.map +1 -0
- package/dist/guard/alternatives/registry.js +518 -0
- package/dist/guard/alternatives/registry.js.map +1 -0
- package/dist/guard/alternatives/types.d.ts +86 -0
- package/dist/guard/alternatives/types.d.ts.map +1 -0
- package/dist/guard/alternatives/types.js +5 -0
- package/dist/guard/alternatives/types.js.map +1 -0
- package/dist/guard/approval/enhanced-terminal.d.ts +110 -0
- package/dist/guard/approval/enhanced-terminal.d.ts.map +1 -0
- package/dist/guard/approval/enhanced-terminal.js +387 -0
- package/dist/guard/approval/enhanced-terminal.js.map +1 -0
- package/dist/guard/config.d.ts +80 -0
- package/dist/guard/config.d.ts.map +1 -0
- package/dist/guard/config.js +260 -0
- package/dist/guard/config.js.map +1 -0
- package/dist/guard/context/directory.d.ts +35 -0
- package/dist/guard/context/directory.d.ts.map +1 -0
- package/dist/guard/context/directory.js +243 -0
- package/dist/guard/context/directory.js.map +1 -0
- package/dist/guard/context/environment.d.ts +31 -0
- package/dist/guard/context/environment.d.ts.map +1 -0
- package/dist/guard/context/environment.js +204 -0
- package/dist/guard/context/environment.js.map +1 -0
- package/dist/guard/context/git.d.ts +52 -0
- package/dist/guard/context/git.d.ts.map +1 -0
- package/dist/guard/context/git.js +278 -0
- package/dist/guard/context/git.js.map +1 -0
- package/dist/guard/context/index.d.ts +64 -0
- package/dist/guard/context/index.d.ts.map +1 -0
- package/dist/guard/context/index.js +227 -0
- package/dist/guard/context/index.js.map +1 -0
- package/dist/guard/context/project.d.ts +47 -0
- package/dist/guard/context/project.d.ts.map +1 -0
- package/dist/guard/context/project.js +281 -0
- package/dist/guard/context/project.js.map +1 -0
- package/dist/guard/context/types.d.ts +152 -0
- package/dist/guard/context/types.d.ts.map +1 -0
- package/dist/guard/context/types.js +7 -0
- package/dist/guard/context/types.js.map +1 -0
- package/dist/guard/engine.d.ts +107 -0
- package/dist/guard/engine.d.ts.map +1 -0
- package/dist/guard/engine.js +430 -0
- package/dist/guard/engine.js.map +1 -0
- package/dist/guard/enhanced-engine.d.ts +151 -0
- package/dist/guard/enhanced-engine.d.ts.map +1 -0
- package/dist/guard/enhanced-engine.js +622 -0
- package/dist/guard/enhanced-engine.js.map +1 -0
- package/dist/guard/hooks/index.d.ts +50 -0
- package/dist/guard/hooks/index.d.ts.map +1 -0
- package/dist/guard/hooks/index.js +325 -0
- package/dist/guard/hooks/index.js.map +1 -0
- package/dist/guard/index.d.ts +29 -0
- package/dist/guard/index.d.ts.map +1 -0
- package/dist/guard/index.js +31 -0
- package/dist/guard/index.js.map +1 -0
- package/dist/guard/learning/index.d.ts +136 -0
- package/dist/guard/learning/index.d.ts.map +1 -0
- package/dist/guard/learning/index.js +314 -0
- package/dist/guard/learning/index.js.map +1 -0
- package/dist/guard/learning/pattern-extractor.d.ts +50 -0
- package/dist/guard/learning/pattern-extractor.d.ts.map +1 -0
- package/dist/guard/learning/pattern-extractor.js +372 -0
- package/dist/guard/learning/pattern-extractor.js.map +1 -0
- package/dist/guard/learning/rule-suggester.d.ts +67 -0
- package/dist/guard/learning/rule-suggester.d.ts.map +1 -0
- package/dist/guard/learning/rule-suggester.js +345 -0
- package/dist/guard/learning/rule-suggester.js.map +1 -0
- package/dist/guard/learning/types.d.ts +211 -0
- package/dist/guard/learning/types.d.ts.map +1 -0
- package/dist/guard/learning/types.js +18 -0
- package/dist/guard/learning/types.js.map +1 -0
- package/dist/guard/preview/effects.d.ts +15 -0
- package/dist/guard/preview/effects.d.ts.map +1 -0
- package/dist/guard/preview/effects.js +413 -0
- package/dist/guard/preview/effects.js.map +1 -0
- package/dist/guard/preview/index.d.ts +49 -0
- package/dist/guard/preview/index.d.ts.map +1 -0
- package/dist/guard/preview/index.js +196 -0
- package/dist/guard/preview/index.js.map +1 -0
- package/dist/guard/preview/parser.d.ts +34 -0
- package/dist/guard/preview/parser.d.ts.map +1 -0
- package/dist/guard/preview/parser.js +292 -0
- package/dist/guard/preview/parser.js.map +1 -0
- package/dist/guard/preview/types.d.ts +140 -0
- package/dist/guard/preview/types.d.ts.map +1 -0
- package/dist/guard/preview/types.js +5 -0
- package/dist/guard/preview/types.js.map +1 -0
- package/dist/guard/reversibility/index.d.ts +88 -0
- package/dist/guard/reversibility/index.d.ts.map +1 -0
- package/dist/guard/reversibility/index.js +310 -0
- package/dist/guard/reversibility/index.js.map +1 -0
- package/dist/guard/types.d.ts +192 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +8 -0
- package/dist/guard/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/manager.d.ts.map +1 -1
- package/dist/orchestrator/manager.js +6 -1
- package/dist/orchestrator/manager.js.map +1 -1
- package/dist/policy/engine.d.ts.map +1 -1
- package/dist/policy/engine.js +11 -3
- package/dist/policy/engine.js.map +1 -1
- package/dist/policy/parser.d.ts.map +1 -1
- package/dist/policy/parser.js +3 -0
- package/dist/policy/parser.js.map +1 -1
- package/dist/proxy/server.d.ts.map +1 -1
- package/dist/proxy/server.js +8 -6
- package/dist/proxy/server.js.map +1 -1
- package/dist/session/manager.d.ts +2 -2
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +106 -88
- package/dist/session/manager.js.map +1 -1
- package/dist/session/signing.d.ts +88 -0
- package/dist/session/signing.d.ts.map +1 -0
- package/dist/session/signing.js +166 -0
- package/dist/session/signing.js.map +1 -0
- package/dist/session/types.d.ts +2 -0
- package/dist/session/types.d.ts.map +1 -1
- package/dist/session/types.js.map +1 -1
- package/dist/utils/security-logger.d.ts +146 -0
- package/dist/utils/security-logger.d.ts.map +1 -0
- package/dist/utils/security-logger.js +222 -0
- package/dist/utils/security-logger.js.map +1 -0
- package/dist/wizard.d.ts.map +1 -1
- package/dist/wizard.js +7 -1
- package/dist/wizard.js.map +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -826,6 +826,144 @@ Examples:
|
|
|
826
826
|
|
|
827
827
|
---
|
|
828
828
|
|
|
829
|
+
## AI Shell Guardian
|
|
830
|
+
|
|
831
|
+
Tollgate includes a shell guardian that protects against dangerous AI-suggested shell commands. It integrates with your shell to analyze commands before execution.
|
|
832
|
+
|
|
833
|
+
### Quick Start
|
|
834
|
+
|
|
835
|
+
```bash
|
|
836
|
+
# Install shell integration
|
|
837
|
+
tollgate guard init
|
|
838
|
+
|
|
839
|
+
# Restart your shell or source the config
|
|
840
|
+
source ~/.zshrc # or ~/.bashrc
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
Now when AI suggests dangerous commands, they'll be blocked or require confirmation.
|
|
844
|
+
|
|
845
|
+
### How It Works
|
|
846
|
+
|
|
847
|
+
```
|
|
848
|
+
┌──────────────────────────────────────────────────────────────┐
|
|
849
|
+
│ AI Agent suggests: rm -rf / │
|
|
850
|
+
├──────────────────────────────────────────────────────────────┤
|
|
851
|
+
│ Guard Analysis: │
|
|
852
|
+
│ Risk: DANGEROUS │
|
|
853
|
+
│ Reason: Recursive deletion of root filesystem │
|
|
854
|
+
│ Action: BLOCKED │
|
|
855
|
+
│ │
|
|
856
|
+
│ The command was prevented from executing. │
|
|
857
|
+
└──────────────────────────────────────────────────────────────┘
|
|
858
|
+
```
|
|
859
|
+
|
|
860
|
+
### Guard Commands
|
|
861
|
+
|
|
862
|
+
```
|
|
863
|
+
tollgate guard init [options]
|
|
864
|
+
|
|
865
|
+
Install shell integration.
|
|
866
|
+
|
|
867
|
+
Options:
|
|
868
|
+
--shell <type> Shell type: bash, zsh, fish
|
|
869
|
+
--no-modify Don't modify shell config (print hook only)
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
```
|
|
873
|
+
tollgate guard hook <shell>
|
|
874
|
+
|
|
875
|
+
Output the hook script for manual installation.
|
|
876
|
+
|
|
877
|
+
Arguments:
|
|
878
|
+
<shell> Shell type: bash, zsh, fish
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
```
|
|
882
|
+
tollgate guard check <command> [options]
|
|
883
|
+
|
|
884
|
+
Check if a command is safe to execute.
|
|
885
|
+
|
|
886
|
+
Arguments:
|
|
887
|
+
<command> The command to check
|
|
888
|
+
|
|
889
|
+
Options:
|
|
890
|
+
--json Output as JSON
|
|
891
|
+
--no-prompt Don't prompt for approval
|
|
892
|
+
-c, --config <path> Custom config path
|
|
893
|
+
--timeout <ms> Approval timeout
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
```
|
|
897
|
+
tollgate guard analyze <command>
|
|
898
|
+
|
|
899
|
+
Analyze a command and show detailed risk assessment.
|
|
900
|
+
|
|
901
|
+
Arguments:
|
|
902
|
+
<command> The command to analyze
|
|
903
|
+
|
|
904
|
+
Options:
|
|
905
|
+
--json Output as JSON
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
```
|
|
909
|
+
tollgate guard sessions [options]
|
|
910
|
+
|
|
911
|
+
List active approval sessions.
|
|
912
|
+
|
|
913
|
+
Options:
|
|
914
|
+
--json Output as JSON
|
|
915
|
+
```
|
|
916
|
+
|
|
917
|
+
```
|
|
918
|
+
tollgate guard revoke [id] [options]
|
|
919
|
+
|
|
920
|
+
Revoke approval sessions.
|
|
921
|
+
|
|
922
|
+
Arguments:
|
|
923
|
+
[id] Session ID to revoke (optional)
|
|
924
|
+
|
|
925
|
+
Options:
|
|
926
|
+
--all Revoke all sessions
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
```
|
|
930
|
+
tollgate guard log [options]
|
|
931
|
+
|
|
932
|
+
View command execution log.
|
|
933
|
+
|
|
934
|
+
Options:
|
|
935
|
+
-n, --limit <count> Number of entries (default: 20)
|
|
936
|
+
--risk <level> Filter by risk level
|
|
937
|
+
--denied Show only denied commands
|
|
938
|
+
```
|
|
939
|
+
|
|
940
|
+
```
|
|
941
|
+
tollgate guard config
|
|
942
|
+
|
|
943
|
+
Show current guard configuration.
|
|
944
|
+
```
|
|
945
|
+
|
|
946
|
+
### Example Usage
|
|
947
|
+
|
|
948
|
+
```bash
|
|
949
|
+
# Check if a command is safe before running
|
|
950
|
+
tollgate guard check "sudo rm -rf /var/log/*"
|
|
951
|
+
|
|
952
|
+
# Analyze command risk
|
|
953
|
+
tollgate guard analyze "curl https://example.com | bash"
|
|
954
|
+
|
|
955
|
+
# View recent blocked commands
|
|
956
|
+
tollgate guard log --denied -n 10
|
|
957
|
+
|
|
958
|
+
# View high-risk commands
|
|
959
|
+
tollgate guard log --risk high
|
|
960
|
+
|
|
961
|
+
# Revoke all approval sessions
|
|
962
|
+
tollgate guard revoke --all
|
|
963
|
+
```
|
|
964
|
+
|
|
965
|
+
---
|
|
966
|
+
|
|
829
967
|
## Full Configuration Example
|
|
830
968
|
|
|
831
969
|
```yaml
|
|
@@ -17,6 +17,11 @@ export declare class FilesystemAnalyzer implements ContentAnalyzer {
|
|
|
17
17
|
private inferOperation;
|
|
18
18
|
private normalizePath;
|
|
19
19
|
private hasPathTraversal;
|
|
20
|
+
/**
|
|
21
|
+
* Check if a path might be a symlink that resolves to a forbidden location.
|
|
22
|
+
* This prevents attackers from creating symlinks that bypass path checks.
|
|
23
|
+
*/
|
|
24
|
+
private checkSymlinkEscape;
|
|
20
25
|
/**
|
|
21
26
|
* Detect paths that might be used for symlink-based escapes
|
|
22
27
|
* These are special filesystem paths that can be exploited
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/analyzers/filesystem.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/analyzers/filesystem.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,eAAe;IACxD,QAAQ,CAAC,IAAI,gBAAgB;IAG7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAgB9B;IAGF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAS9B;IAGF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAsEjC;IAGF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAajC;IAEF,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,cAAc;IAgIhE,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,gBAAgB;IAmDxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAqC1B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,uBAAuB;CAQhC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { homedir } from 'node:os';
|
|
2
|
-
import { normalize, isAbsolute } from 'node:path';
|
|
2
|
+
import { normalize, isAbsolute, resolve } from 'node:path';
|
|
3
|
+
import { realpathSync } from 'node:fs';
|
|
3
4
|
/**
|
|
4
5
|
* Filesystem Path Analyzer
|
|
5
6
|
*
|
|
@@ -137,6 +138,15 @@ export class FilesystemAnalyzer {
|
|
|
137
138
|
triggers: ['symlink escape', path.match(/\/(proc|dev|sys)\//)?.[0] || '/dev/'],
|
|
138
139
|
};
|
|
139
140
|
}
|
|
141
|
+
// Check if path resolves via symlink to a forbidden/sensitive location
|
|
142
|
+
const symlinkCheck = this.checkSymlinkEscape(path);
|
|
143
|
+
if (symlinkCheck.isEscape) {
|
|
144
|
+
return {
|
|
145
|
+
risk: 'dangerous',
|
|
146
|
+
reason: `Symlink resolves to restricted path: ${symlinkCheck.realPath}`,
|
|
147
|
+
triggers: ['symlink escape', symlinkCheck.realPath ?? 'unknown'],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
140
150
|
// Check for glob patterns that could match too much
|
|
141
151
|
if (this.hasDangerousGlob(path)) {
|
|
142
152
|
return {
|
|
@@ -281,19 +291,63 @@ export class FilesystemAnalyzer {
|
|
|
281
291
|
if (/\.{3,}/.test(path)) {
|
|
282
292
|
return true;
|
|
283
293
|
}
|
|
284
|
-
// Check for .. that
|
|
294
|
+
// Check for .. that could escape current directory context
|
|
285
295
|
const normalized = normalize(path);
|
|
286
|
-
// If
|
|
296
|
+
// If the path contains '..' and normalizing removes it, the path was attempting traversal
|
|
287
297
|
if (path.includes('..') && !normalized.includes('..')) {
|
|
288
|
-
//
|
|
289
|
-
|
|
298
|
+
// Check if the normalized path is trying to escape to a system directory
|
|
299
|
+
const absoluteNormalized = isAbsolute(normalized)
|
|
300
|
+
? normalized
|
|
301
|
+
: resolve(process.cwd(), normalized);
|
|
302
|
+
// If normalized path goes to forbidden areas, it's traversal
|
|
303
|
+
if (this.matchesForbiddenPath(absoluteNormalized)) {
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
290
306
|
}
|
|
291
|
-
// Direct check for suspicious patterns
|
|
307
|
+
// Direct check for suspicious patterns - multiple traversals
|
|
292
308
|
if (/\.\.\/.*\.\./.test(path)) {
|
|
293
|
-
return true;
|
|
309
|
+
return true;
|
|
294
310
|
}
|
|
295
311
|
return false;
|
|
296
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Check if a path might be a symlink that resolves to a forbidden location.
|
|
315
|
+
* This prevents attackers from creating symlinks that bypass path checks.
|
|
316
|
+
*/
|
|
317
|
+
checkSymlinkEscape(path) {
|
|
318
|
+
try {
|
|
319
|
+
// First, check if the path or any parent is a symlink
|
|
320
|
+
const normalizedPath = this.normalizePath(path);
|
|
321
|
+
const absolutePath = isAbsolute(normalizedPath)
|
|
322
|
+
? normalizedPath
|
|
323
|
+
: resolve(process.cwd(), normalizedPath);
|
|
324
|
+
// Try to get the real path (resolves all symlinks)
|
|
325
|
+
let realPath;
|
|
326
|
+
try {
|
|
327
|
+
realPath = realpathSync(absolutePath);
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
// Path doesn't exist yet, can't check symlinks
|
|
331
|
+
return { isEscape: false };
|
|
332
|
+
}
|
|
333
|
+
// If the real path differs from the absolute path, a symlink was involved
|
|
334
|
+
if (realPath !== absolutePath) {
|
|
335
|
+
// Check if the real path is in a forbidden location
|
|
336
|
+
if (this.matchesForbiddenPath(realPath)) {
|
|
337
|
+
return { isEscape: true, realPath };
|
|
338
|
+
}
|
|
339
|
+
// Check if it's a sensitive file
|
|
340
|
+
if (this.matchesSensitivePattern(realPath)) {
|
|
341
|
+
return { isEscape: true, realPath };
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return { isEscape: false };
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// If we can't check, assume it's not an escape
|
|
348
|
+
return { isEscape: false };
|
|
349
|
+
}
|
|
350
|
+
}
|
|
297
351
|
/**
|
|
298
352
|
* Detect paths that might be used for symlink-based escapes
|
|
299
353
|
* These are special filesystem paths that can be exploited
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/analyzers/filesystem.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/analyzers/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
* Handles dynamic loading of custom analyzers from file paths specified
|
|
5
5
|
* in the tollgate.yaml configuration.
|
|
6
6
|
*
|
|
7
|
+
* SECURITY: This module validates all paths to prevent arbitrary code execution.
|
|
8
|
+
* Only paths within the project directory or trusted npm packages are allowed.
|
|
9
|
+
*
|
|
7
10
|
* @module analyzers/loader
|
|
8
11
|
*/
|
|
9
12
|
import { type CustomAnalyzer } from './sdk.js';
|
|
@@ -47,6 +50,8 @@ export declare function resolveAnalyzerPath(analyzerPath: string, baseDir: strin
|
|
|
47
50
|
/**
|
|
48
51
|
* Load a single custom analyzer from a path.
|
|
49
52
|
*
|
|
53
|
+
* SECURITY: All paths are validated before loading to prevent arbitrary code execution.
|
|
54
|
+
*
|
|
50
55
|
* @param analyzerPath - Path to the analyzer module
|
|
51
56
|
* @param options - Loader options
|
|
52
57
|
* @returns Load result with success status and loaded analyzer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/analyzers/loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/analyzers/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,UAAU,CAAC;AAuGjE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;CACtE;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAYjF;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC,CA6ErB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,UAAU,EAAE,CAAC,CASvB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EAAE,GAAG,SAAS,EACnC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC;IACT,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CA0BD;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEzD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}
|
package/dist/analyzers/loader.js
CHANGED
|
@@ -4,16 +4,104 @@
|
|
|
4
4
|
* Handles dynamic loading of custom analyzers from file paths specified
|
|
5
5
|
* in the tollgate.yaml configuration.
|
|
6
6
|
*
|
|
7
|
+
* SECURITY: This module validates all paths to prevent arbitrary code execution.
|
|
8
|
+
* Only paths within the project directory or trusted npm packages are allowed.
|
|
9
|
+
*
|
|
7
10
|
* @module analyzers/loader
|
|
8
11
|
*/
|
|
9
12
|
import { pathToFileURL } from 'node:url';
|
|
10
|
-
import { resolve, isAbsolute } from 'node:path';
|
|
11
|
-
import { existsSync } from 'node:fs';
|
|
13
|
+
import { resolve, isAbsolute, relative, normalize } from 'node:path';
|
|
14
|
+
import { existsSync, realpathSync } from 'node:fs';
|
|
12
15
|
import { analyzerRegistry } from './index.js';
|
|
13
16
|
import { isCustomAnalyzer } from './sdk.js';
|
|
17
|
+
import { createLogger } from '../utils/logger.js';
|
|
18
|
+
const loaderLogger = createLogger('analyzer-loader');
|
|
19
|
+
/**
|
|
20
|
+
* Trusted npm package prefixes for analyzers.
|
|
21
|
+
* Only packages from these organizations are allowed.
|
|
22
|
+
*/
|
|
23
|
+
const TRUSTED_PACKAGE_PREFIXES = [
|
|
24
|
+
'@dotsetlabs/',
|
|
25
|
+
'@tollgate/',
|
|
26
|
+
'tollgate-analyzer-',
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* Dangerous path patterns that should never be loaded.
|
|
30
|
+
*/
|
|
31
|
+
const DANGEROUS_PATH_PATTERNS = [
|
|
32
|
+
/^\/etc\//,
|
|
33
|
+
/^\/usr\//,
|
|
34
|
+
/^\/var\//,
|
|
35
|
+
/^\/tmp\//,
|
|
36
|
+
/^\/proc\//,
|
|
37
|
+
/^\/sys\//,
|
|
38
|
+
/^\/dev\//,
|
|
39
|
+
/^\/root\//,
|
|
40
|
+
/^\/home\/[^/]+\/\.[^/]+/, // Hidden directories in home
|
|
41
|
+
/node_modules\/(?!@dotsetlabs|@tollgate|tollgate-analyzer)/, // node_modules except trusted
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Validates that an analyzer path is safe to load.
|
|
45
|
+
* Prevents arbitrary code execution via configuration.
|
|
46
|
+
*
|
|
47
|
+
* @param absolutePath - The resolved absolute path
|
|
48
|
+
* @param baseDir - The base directory for the project
|
|
49
|
+
* @returns Error message if invalid, null if valid
|
|
50
|
+
*/
|
|
51
|
+
function validateAnalyzerPath(absolutePath, baseDir) {
|
|
52
|
+
// Resolve symlinks to get the real path
|
|
53
|
+
let realPath;
|
|
54
|
+
try {
|
|
55
|
+
realPath = realpathSync(absolutePath);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// File doesn't exist yet, use the absolute path
|
|
59
|
+
realPath = absolutePath;
|
|
60
|
+
}
|
|
61
|
+
// Normalize both paths for comparison
|
|
62
|
+
const normalizedPath = normalize(realPath);
|
|
63
|
+
const normalizedBase = normalize(baseDir);
|
|
64
|
+
// Check for dangerous path patterns
|
|
65
|
+
for (const pattern of DANGEROUS_PATH_PATTERNS) {
|
|
66
|
+
if (pattern.test(normalizedPath)) {
|
|
67
|
+
return `Path matches dangerous pattern: ${pattern}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Path must be within the base directory (project root) or in node_modules of base
|
|
71
|
+
const relativePath = relative(normalizedBase, normalizedPath);
|
|
72
|
+
// If relative path starts with '..', the file is outside baseDir
|
|
73
|
+
if (relativePath.startsWith('..') && !relativePath.startsWith('..\\') === false) {
|
|
74
|
+
// Allow node_modules paths that are trusted
|
|
75
|
+
if (normalizedPath.includes('node_modules')) {
|
|
76
|
+
const nodeModulesMatch = normalizedPath.match(/node_modules\/(@[^/]+\/[^/]+|[^/]+)/);
|
|
77
|
+
if (nodeModulesMatch) {
|
|
78
|
+
const packageName = nodeModulesMatch[1];
|
|
79
|
+
const isTrusted = TRUSTED_PACKAGE_PREFIXES.some(prefix => packageName.startsWith(prefix));
|
|
80
|
+
if (isTrusted) {
|
|
81
|
+
return null; // Trusted package
|
|
82
|
+
}
|
|
83
|
+
return `Untrusted npm package: ${packageName}. Only packages from ${TRUSTED_PACKAGE_PREFIXES.join(', ')} are allowed.`;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return `Path is outside project directory: ${relativePath}`;
|
|
87
|
+
}
|
|
88
|
+
return null; // Path is valid
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validates that a package name is trusted.
|
|
92
|
+
*
|
|
93
|
+
* @param packageName - The npm package name
|
|
94
|
+
* @returns Error message if untrusted, null if trusted
|
|
95
|
+
*/
|
|
96
|
+
function validatePackageName(packageName) {
|
|
97
|
+
const isTrusted = TRUSTED_PACKAGE_PREFIXES.some(prefix => packageName.startsWith(prefix));
|
|
98
|
+
if (!isTrusted) {
|
|
99
|
+
return `Untrusted npm package: ${packageName}. Only packages from ${TRUSTED_PACKAGE_PREFIXES.join(', ')} are allowed.`;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
14
103
|
const defaultLogger = (message, level) => {
|
|
15
|
-
|
|
16
|
-
console.log(`${prefix} ${message}`);
|
|
104
|
+
loaderLogger[level](message);
|
|
17
105
|
};
|
|
18
106
|
/**
|
|
19
107
|
* Resolve an analyzer path to an absolute path or module specifier.
|
|
@@ -41,6 +129,8 @@ export function resolveAnalyzerPath(analyzerPath, baseDir) {
|
|
|
41
129
|
/**
|
|
42
130
|
* Load a single custom analyzer from a path.
|
|
43
131
|
*
|
|
132
|
+
* SECURITY: All paths are validated before loading to prevent arbitrary code execution.
|
|
133
|
+
*
|
|
44
134
|
* @param analyzerPath - Path to the analyzer module
|
|
45
135
|
* @param options - Loader options
|
|
46
136
|
* @returns Load result with success status and loaded analyzer
|
|
@@ -49,8 +139,24 @@ export async function loadAnalyzer(analyzerPath, options = {}) {
|
|
|
49
139
|
const { baseDir = process.cwd(), logger = defaultLogger } = options;
|
|
50
140
|
const resolvedPath = resolveAnalyzerPath(analyzerPath, baseDir);
|
|
51
141
|
try {
|
|
52
|
-
//
|
|
142
|
+
// Determine if this is a file path or a package name
|
|
53
143
|
const isFilePath = resolvedPath.startsWith('/') || resolvedPath.includes('\\');
|
|
144
|
+
const isPackageName = !isFilePath && (resolvedPath.startsWith('@') ||
|
|
145
|
+
(!resolvedPath.startsWith('./') && !resolvedPath.startsWith('../')));
|
|
146
|
+
// SECURITY: Validate the path/package before loading
|
|
147
|
+
if (isFilePath) {
|
|
148
|
+
const validationError = validateAnalyzerPath(resolvedPath, baseDir);
|
|
149
|
+
if (validationError) {
|
|
150
|
+
throw new Error(`Security: ${validationError}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else if (isPackageName) {
|
|
154
|
+
const validationError = validatePackageName(resolvedPath);
|
|
155
|
+
if (validationError) {
|
|
156
|
+
throw new Error(`Security: ${validationError}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Check if file exists for file paths
|
|
54
160
|
if (isFilePath && !existsSync(resolvedPath)) {
|
|
55
161
|
throw new Error(`Analyzer file not found: ${resolvedPath}`);
|
|
56
162
|
}
|
|
@@ -58,7 +164,7 @@ export async function loadAnalyzer(analyzerPath, options = {}) {
|
|
|
58
164
|
const importPath = isFilePath
|
|
59
165
|
? pathToFileURL(resolvedPath).href
|
|
60
166
|
: resolvedPath;
|
|
61
|
-
// Dynamically import the module
|
|
167
|
+
// Dynamically import the module (now safe after validation)
|
|
62
168
|
const module = await import(importPath);
|
|
63
169
|
// Get the analyzer from the module
|
|
64
170
|
const analyzer = module.default ?? module.analyzer ?? module;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/analyzers/loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/analyzers/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,7 @@ export declare class PromptInjectionAnalyzer implements ContentAnalyzer {
|
|
|
57
57
|
private checkBase64Encoding;
|
|
58
58
|
/**
|
|
59
59
|
* Check for Unicode obfuscation techniques.
|
|
60
|
+
* Distinguishes between legitimate multilingual content and obfuscation attacks.
|
|
60
61
|
*/
|
|
61
62
|
private checkUnicodeObfuscation;
|
|
62
63
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-injection.d.ts","sourceRoot":"","sources":["../../src/analyzers/prompt-injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;;;;GASG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,QAAQ,CAAC,IAAI,sBAAsB;IAEnC;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,cAAc;IA6GpE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA6DhC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA4DrC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2D1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgD3B
|
|
1
|
+
{"version":3,"file":"prompt-injection.d.ts","sourceRoot":"","sources":["../../src/analyzers/prompt-injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;;;;GASG;AACH,qBAAa,uBAAwB,YAAW,eAAe;IAC7D,QAAQ,CAAC,IAAI,sBAAsB;IAEnC;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,cAAc;IA6GpE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA6DhC;;OAEG;IACH,OAAO,CAAC,6BAA6B;IA4DrC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2D1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgD3B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAsI/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuF9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4D/B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoC7B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAmBjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,YAAY;IAKpB;;OAEG;IACH,OAAO,CAAC,aAAa;CAetB"}
|
|
@@ -356,10 +356,13 @@ export class PromptInjectionAnalyzer {
|
|
|
356
356
|
}
|
|
357
357
|
/**
|
|
358
358
|
* Check for Unicode obfuscation techniques.
|
|
359
|
+
* Distinguishes between legitimate multilingual content and obfuscation attacks.
|
|
359
360
|
*/
|
|
360
361
|
checkUnicodeObfuscation(content) {
|
|
361
362
|
const triggers = [];
|
|
362
363
|
// Check for homoglyph attacks (lookalike characters)
|
|
364
|
+
// Only flag as suspicious if homoglyphs are MIXED with ASCII in a way
|
|
365
|
+
// that suggests obfuscation rather than legitimate multilingual content
|
|
363
366
|
const homoglyphs = {
|
|
364
367
|
// Cyrillic lookalikes
|
|
365
368
|
'\u0430': 'a', '\u0435': 'e', '\u043E': 'o', '\u0440': 'p',
|
|
@@ -384,13 +387,56 @@ export class PromptInjectionAnalyzer {
|
|
|
384
387
|
'\u{1D622}': 'a', '\u{1D623}': 'b', '\u{1D624}': 'c', // monospace
|
|
385
388
|
};
|
|
386
389
|
let homoglyphCount = 0;
|
|
390
|
+
let asciiLetterCount = 0;
|
|
391
|
+
let cyrillicCount = 0;
|
|
392
|
+
let greekCount = 0;
|
|
387
393
|
for (const char of content) {
|
|
394
|
+
const code = char.charCodeAt(0);
|
|
388
395
|
if (homoglyphs[char]) {
|
|
389
396
|
homoglyphCount++;
|
|
397
|
+
// Track specific scripts to detect legitimate multilingual vs obfuscation
|
|
398
|
+
if (code >= 0x0400 && code <= 0x04FF)
|
|
399
|
+
cyrillicCount++;
|
|
400
|
+
if (code >= 0x0370 && code <= 0x03FF)
|
|
401
|
+
greekCount++;
|
|
402
|
+
}
|
|
403
|
+
// Count ASCII letters
|
|
404
|
+
if ((code >= 65 && code <= 90) || (code >= 97 && code <= 122)) {
|
|
405
|
+
asciiLetterCount++;
|
|
390
406
|
}
|
|
391
407
|
}
|
|
392
|
-
|
|
393
|
-
|
|
408
|
+
// Only flag as homoglyph obfuscation if:
|
|
409
|
+
// 1. There are homoglyphs present, AND
|
|
410
|
+
// 2. They are MIXED with ASCII in a suspicious way (not purely one script)
|
|
411
|
+
// This prevents false positives on legitimate Cyrillic/Greek text
|
|
412
|
+
const totalLetters = homoglyphCount + asciiLetterCount;
|
|
413
|
+
if (homoglyphCount > 0 && asciiLetterCount > 0 && totalLetters > 10) {
|
|
414
|
+
// Calculate mixing ratio - legitimate multilingual content tends to have
|
|
415
|
+
// clear separation between scripts, while obfuscation mixes them
|
|
416
|
+
const homoglyphRatio = homoglyphCount / totalLetters;
|
|
417
|
+
// Suspicious if homoglyphs are sprinkled in (5-50% of letters)
|
|
418
|
+
// Pure Cyrillic/Greek text would have near 100%, pure ASCII would have 0%
|
|
419
|
+
if (homoglyphRatio > 0.05 && homoglyphRatio < 0.5) {
|
|
420
|
+
// Further check: if it looks like English words with substituted letters
|
|
421
|
+
// this is obfuscation, not legitimate multilingual content
|
|
422
|
+
// Normalize homoglyphs to ASCII to detect obfuscated keywords
|
|
423
|
+
let normalizedContent = content.toLowerCase();
|
|
424
|
+
for (const [homoglyph, ascii] of Object.entries(homoglyphs)) {
|
|
425
|
+
normalizedContent = normalizedContent.replaceAll(homoglyph, ascii);
|
|
426
|
+
}
|
|
427
|
+
const hasInjectionKeywords = this.containsInjectionKeywords(normalizedContent);
|
|
428
|
+
if (hasInjectionKeywords) {
|
|
429
|
+
triggers.push('homoglyph obfuscation');
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
else if (homoglyphRatio >= 0.5 && (cyrillicCount > 10 || greekCount > 10)) {
|
|
433
|
+
// Appears to be legitimate Cyrillic or Greek text - don't flag
|
|
434
|
+
// (high ratio of non-ASCII with consistent script)
|
|
435
|
+
}
|
|
436
|
+
else if (homoglyphCount > 10 && homoglyphRatio > 0.05) {
|
|
437
|
+
// Many homoglyphs mixed with ASCII - likely obfuscation
|
|
438
|
+
triggers.push('homoglyph obfuscation');
|
|
439
|
+
}
|
|
394
440
|
}
|
|
395
441
|
// Check for invisible characters
|
|
396
442
|
const invisibleChars = [
|