@cybedefend/vibedefend 1.4.7 → 1.6.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 +77 -2
- package/dist/api/gateway-request.js +49 -0
- package/dist/api/gateway-request.js.map +1 -0
- package/dist/api/projects.js +67 -0
- package/dist/api/projects.js.map +1 -1
- package/dist/api/repository-link.js +157 -0
- package/dist/api/repository-link.js.map +1 -0
- package/dist/auth/auth-store.js +107 -25
- package/dist/auth/auth-store.js.map +1 -1
- package/dist/auth/auth.js +21 -0
- package/dist/auth/auth.js.map +1 -1
- package/dist/clients/cursor.js +5 -1
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/vscode.js +38 -29
- package/dist/clients/vscode.js.map +1 -1
- package/dist/commands/mcp/allow.js +219 -0
- package/dist/commands/mcp/allow.js.map +1 -0
- package/dist/commands/mcp/connect.js +337 -0
- package/dist/commands/mcp/connect.js.map +1 -0
- package/dist/commands/mcp/index.js +170 -0
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/mcp/proxy.js +264 -0
- package/dist/commands/mcp/proxy.js.map +1 -0
- package/dist/commands/mcp/scan.js +349 -0
- package/dist/commands/mcp/scan.js.map +1 -0
- package/dist/commands/mcp/sync.js +215 -0
- package/dist/commands/mcp/sync.js.map +1 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/diagnostics.js +78 -12
- package/dist/diagnostics.js.map +1 -1
- package/dist/doctor.js +19 -0
- package/dist/doctor.js.map +1 -1
- package/dist/guards-evaluator/analysis-types.js +27 -0
- package/dist/guards-evaluator/analysis-types.js.map +1 -0
- package/dist/guards-evaluator/command-analysis.js +572 -0
- package/dist/guards-evaluator/command-analysis.js.map +1 -0
- package/dist/guards-evaluator/command-view.js +586 -0
- package/dist/guards-evaluator/command-view.js.map +1 -0
- package/dist/guards-evaluator/env.js +11 -0
- package/dist/guards-evaluator/env.js.map +1 -0
- package/dist/guards-evaluator/evaluate.js +91 -41
- package/dist/guards-evaluator/evaluate.js.map +1 -1
- package/dist/guards-evaluator/index.js +2 -1
- package/dist/guards-evaluator/index.js.map +1 -1
- package/dist/guards-evaluator/inline-code.js +259 -0
- package/dist/guards-evaluator/inline-code.js.map +1 -0
- package/dist/guards-evaluator/normalize.js +716 -0
- package/dist/guards-evaluator/normalize.js.map +1 -0
- package/dist/guards-evaluator/preprocess.js +13 -5
- package/dist/guards-evaluator/preprocess.js.map +1 -1
- package/dist/guards-evaluator/redact.js +19 -0
- package/dist/guards-evaluator/redact.js.map +1 -1
- package/dist/guards-evaluator/regex.js +25 -3
- package/dist/guards-evaluator/regex.js.map +1 -1
- package/dist/guards-evaluator/safe-commands.js +155 -0
- package/dist/guards-evaluator/safe-commands.js.map +1 -0
- package/dist/guards-evaluator/triage.js +315 -0
- package/dist/guards-evaluator/triage.js.map +1 -0
- package/dist/hook-runner.js +24873 -5068
- package/dist/hooks/install.js +38 -0
- package/dist/hooks/install.js.map +1 -1
- package/dist/hooks/runtime/config.js +38 -0
- package/dist/hooks/runtime/config.js.map +1 -1
- package/dist/hooks/runtime/emit.js +126 -53
- package/dist/hooks/runtime/emit.js.map +1 -1
- package/dist/hooks/runtime/fetch-rules.js +27 -7
- package/dist/hooks/runtime/fetch-rules.js.map +1 -1
- package/dist/hooks/runtime/gateway-http-error.js +34 -0
- package/dist/hooks/runtime/gateway-http-error.js.map +1 -0
- package/dist/hooks/runtime/guard-rules-cache.js +139 -17
- package/dist/hooks/runtime/guard-rules-cache.js.map +1 -1
- package/dist/hooks/runtime/guard-violations-buffer.js +321 -48
- package/dist/hooks/runtime/guard-violations-buffer.js.map +1 -1
- package/dist/hooks/runtime/judge-cache.js +6 -0
- package/dist/hooks/runtime/judge-cache.js.map +1 -1
- package/dist/hooks/runtime/judge-triage.js +193 -0
- package/dist/hooks/runtime/judge-triage.js.map +1 -0
- package/dist/hooks/runtime/judge.js +7 -1
- package/dist/hooks/runtime/judge.js.map +1 -1
- package/dist/hooks/runtime/pre-compact.js +21 -6
- package/dist/hooks/runtime/pre-compact.js.map +1 -1
- package/dist/hooks/runtime/resolve.js +108 -17
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/retry-policy.js +57 -0
- package/dist/hooks/runtime/retry-policy.js.map +1 -0
- package/dist/hooks/runtime/review-sessions.js +74 -0
- package/dist/hooks/runtime/review-sessions.js.map +1 -0
- package/dist/hooks/runtime/script-resolve.js +695 -0
- package/dist/hooks/runtime/script-resolve.js.map +1 -0
- package/dist/hooks/runtime/session-activation.js +226 -0
- package/dist/hooks/runtime/session-activation.js.map +1 -0
- package/dist/hooks/runtime/session-review.js +174 -46
- package/dist/hooks/runtime/session-review.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +35 -4
- package/dist/hooks/runtime/session-start.js.map +1 -1
- package/dist/hooks/runtime/session-writes.js +232 -0
- package/dist/hooks/runtime/session-writes.js.map +1 -0
- package/dist/hooks/runtime/sniff.js +26 -7
- package/dist/hooks/runtime/sniff.js.map +1 -1
- package/dist/hooks/runtime/target-resolve.js +336 -0
- package/dist/hooks/runtime/target-resolve.js.map +1 -0
- package/dist/hooks/runtime/unmapped-tools.js +93 -0
- package/dist/hooks/runtime/unmapped-tools.js.map +1 -0
- package/dist/hooks/runtime/usage-block.js +4 -0
- package/dist/hooks/runtime/usage-block.js.map +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js +8 -2
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/hooks/runtime/wire-text.js +41 -0
- package/dist/hooks/runtime/wire-text.js.map +1 -0
- package/dist/hooks/runtime/work-dir.js +84 -0
- package/dist/hooks/runtime/work-dir.js.map +1 -0
- package/dist/index.js +45 -12
- package/dist/index.js.map +1 -1
- package/dist/install.js +174 -11
- package/dist/install.js.map +1 -1
- package/dist/link.js +74 -48
- package/dist/link.js.map +1 -1
- package/dist/login.js +99 -14
- package/dist/login.js.map +1 -1
- package/dist/mcp/auth/agent-sign-ins.js +174 -0
- package/dist/mcp/auth/agent-sign-ins.js.map +1 -0
- package/dist/mcp/auth/callback.js +200 -0
- package/dist/mcp/auth/callback.js.map +1 -0
- package/dist/mcp/auth/connect.js +392 -0
- package/dist/mcp/auth/connect.js.map +1 -0
- package/dist/mcp/auth/discovery.js +399 -0
- package/dist/mcp/auth/discovery.js.map +1 -0
- package/dist/mcp/auth/oauth.js +326 -0
- package/dist/mcp/auth/oauth.js.map +1 -0
- package/dist/mcp/auth/probe.js +128 -0
- package/dist/mcp/auth/probe.js.map +1 -0
- package/dist/mcp/auth/secrets.js +446 -0
- package/dist/mcp/auth/secrets.js.map +1 -0
- package/dist/mcp/auth/store.js +260 -0
- package/dist/mcp/auth/store.js.map +1 -0
- package/dist/mcp/auth/tokenSource.js +55 -0
- package/dist/mcp/auth/tokenSource.js.map +1 -0
- package/dist/mcp/config/atomicWrite.js +98 -0
- package/dist/mcp/config/atomicWrite.js.map +1 -0
- package/dist/mcp/config/clients.js +171 -0
- package/dist/mcp/config/clients.js.map +1 -0
- package/dist/mcp/config/cybedefend-servers.js +48 -0
- package/dist/mcp/config/cybedefend-servers.js.map +1 -0
- package/dist/mcp/config/discover.js +114 -0
- package/dist/mcp/config/discover.js.map +1 -0
- package/dist/mcp/config/hook.js +123 -0
- package/dist/mcp/config/hook.js.map +1 -0
- package/dist/mcp/config/index.js +11 -0
- package/dist/mcp/config/index.js.map +1 -0
- package/dist/mcp/config/install.js +132 -0
- package/dist/mcp/config/install.js.map +1 -0
- package/dist/mcp/config/installed.js +37 -0
- package/dist/mcp/config/installed.js.map +1 -0
- package/dist/mcp/config/jsonEdit.js +119 -0
- package/dist/mcp/config/jsonEdit.js.map +1 -0
- package/dist/mcp/config/lock.js +102 -0
- package/dist/mcp/config/lock.js.map +1 -0
- package/dist/mcp/config/proxyBinary.js +211 -0
- package/dist/mcp/config/proxyBinary.js.map +1 -0
- package/dist/mcp/config/rewrite.js +388 -0
- package/dist/mcp/config/rewrite.js.map +1 -0
- package/dist/mcp/config/types.js +34 -0
- package/dist/mcp/config/types.js.map +1 -0
- package/dist/mcp/proxy/audit.js +83 -0
- package/dist/mcp/proxy/audit.js.map +1 -0
- package/dist/mcp/proxy/authInterceptor.js +119 -0
- package/dist/mcp/proxy/authInterceptor.js.map +1 -0
- package/dist/mcp/proxy/expand.js +93 -0
- package/dist/mcp/proxy/expand.js.map +1 -0
- package/dist/mcp/proxy/inject.js +397 -0
- package/dist/mcp/proxy/inject.js.map +1 -0
- package/dist/mcp/proxy/intercept.js +37 -0
- package/dist/mcp/proxy/intercept.js.map +1 -0
- package/dist/mcp/proxy/jsonrpc.js +153 -0
- package/dist/mcp/proxy/jsonrpc.js.map +1 -0
- package/dist/mcp/proxy/log.js +109 -0
- package/dist/mcp/proxy/log.js.map +1 -0
- package/dist/mcp/proxy/paths.js +53 -0
- package/dist/mcp/proxy/paths.js.map +1 -0
- package/dist/mcp/proxy/proxy.js +510 -0
- package/dist/mcp/proxy/proxy.js.map +1 -0
- package/dist/mcp/proxy/spec.js +203 -0
- package/dist/mcp/proxy/spec.js.map +1 -0
- package/dist/mcp/proxy/sse.js +77 -0
- package/dist/mcp/proxy/sse.js.map +1 -0
- package/dist/mcp/proxy/upstream.js +2 -0
- package/dist/mcp/proxy/upstream.js.map +1 -0
- package/dist/mcp/proxy/upstreamHttp.js +499 -0
- package/dist/mcp/proxy/upstreamHttp.js.map +1 -0
- package/dist/mcp/proxy/upstreamStdio.js +188 -0
- package/dist/mcp/proxy/upstreamStdio.js.map +1 -0
- package/dist/mcp/proxy/upstreams.js +143 -0
- package/dist/mcp/proxy/upstreams.js.map +1 -0
- package/dist/mcp/proxy/verifyInterceptor.js +559 -0
- package/dist/mcp/proxy/verifyInterceptor.js.map +1 -0
- package/dist/mcp/proxy/windowsCommand.js +99 -0
- package/dist/mcp/proxy/windowsCommand.js.map +1 -0
- package/dist/mcp/scan/args.js +228 -0
- package/dist/mcp/scan/args.js.map +1 -0
- package/dist/mcp/scan/results.js +253 -0
- package/dist/mcp/scan/results.js.map +1 -0
- package/dist/mcp/scan/types.js +40 -0
- package/dist/mcp/scan/types.js.map +1 -0
- package/dist/mcp/verify/api.js +475 -0
- package/dist/mcp/verify/api.js.map +1 -0
- package/dist/mcp/verify/backend.js +143 -0
- package/dist/mcp/verify/backend.js.map +1 -0
- package/dist/mcp/verify/cache.js +182 -0
- package/dist/mcp/verify/cache.js.map +1 -0
- package/dist/mcp/verify/contract-errors.js +198 -0
- package/dist/mcp/verify/contract-errors.js.map +1 -0
- package/dist/mcp/verify/digest.js +91 -0
- package/dist/mcp/verify/digest.js.map +1 -0
- package/dist/mcp/verify/factory.js +56 -0
- package/dist/mcp/verify/factory.js.map +1 -0
- package/dist/mcp/verify/identity.js +173 -0
- package/dist/mcp/verify/identity.js.map +1 -0
- package/dist/mcp/verify/policy-store.js +63 -0
- package/dist/mcp/verify/policy-store.js.map +1 -0
- package/dist/mcp/verify/policy.js +158 -0
- package/dist/mcp/verify/policy.js.map +1 -0
- package/dist/mcp/verify/pool.js +27 -0
- package/dist/mcp/verify/pool.js.map +1 -0
- package/dist/mcp/verify/token-refresh.js +44 -0
- package/dist/mcp/verify/token-refresh.js.map +1 -0
- package/dist/mcp/verify/token.js +67 -0
- package/dist/mcp/verify/token.js.map +1 -0
- package/dist/mcp/verify/verifier.js +1009 -0
- package/dist/mcp/verify/verifier.js.map +1 -0
- package/dist/org-gate.js +1 -1
- package/dist/org-gate.js.map +1 -1
- package/dist/org.js +146 -0
- package/dist/org.js.map +1 -0
- package/dist/project-create.js +129 -0
- package/dist/project-create.js.map +1 -0
- package/dist/prompts.js +21 -0
- package/dist/prompts.js.map +1 -1
- package/dist/re2.wasm +0 -0
- package/dist/status.js +61 -0
- package/dist/status.js.map +1 -1
- package/dist/uninstall.js +49 -4
- package/dist/uninstall.js.map +1 -1
- package/dist/utils.js +62 -6
- package/dist/utils.js.map +1 -1
- package/package.json +10 -3
|
@@ -14,6 +14,8 @@ import { matchAnyGlob, matchAllGlobExcludes, matchGlob } from './glob.js';
|
|
|
14
14
|
import { compileRegex } from './regex.js';
|
|
15
15
|
import { bucketRules, targetTypeBucket } from './bucketing.js';
|
|
16
16
|
import { stripDataArgs } from './preprocess.js';
|
|
17
|
+
import { buildCommandViews } from './command-view.js';
|
|
18
|
+
import { redactTarget } from './redact.js';
|
|
17
19
|
// -----------------------------------------------------------------------
|
|
18
20
|
// Severity ordering
|
|
19
21
|
// -----------------------------------------------------------------------
|
|
@@ -29,35 +31,53 @@ function compareSeverityDesc(a, b) {
|
|
|
29
31
|
// -----------------------------------------------------------------------
|
|
30
32
|
// Message formatter
|
|
31
33
|
// -----------------------------------------------------------------------
|
|
34
|
+
/**
|
|
35
|
+
* Longest command {target} echoes back. A heredoc runs to kilobytes, and the
|
|
36
|
+
* message lands both in a terminal and in the model's context.
|
|
37
|
+
*/
|
|
38
|
+
const COMMAND_TARGET_MAX = 160;
|
|
39
|
+
/**
|
|
40
|
+
* {target} of a command is the WHOLE command. `target.command` alone is only
|
|
41
|
+
* its first word — the mapper splits `cd x && cat .env` into `cd` + argv — and
|
|
42
|
+
* a deny message then accused `cd` of containing credentials (BACK-207).
|
|
43
|
+
*
|
|
44
|
+
* The command as the tokenizer left it (quotes are gone), on one line, redacted
|
|
45
|
+
* like the violation summary, then capped: redacting after the cap would let
|
|
46
|
+
* the head of a secret cut in half slip through. The cap counts code points so
|
|
47
|
+
* it never splits an emoji into a lone surrogate.
|
|
48
|
+
*/
|
|
49
|
+
function describeCommand(target) {
|
|
50
|
+
const oneLine = [target.command, ...target.argv].join(' ').replace(/\s+/g, ' ').trim();
|
|
51
|
+
const chars = Array.from(redactTarget(oneLine, Number.MAX_SAFE_INTEGER));
|
|
52
|
+
return chars.length > COMMAND_TARGET_MAX
|
|
53
|
+
? chars.slice(0, COMMAND_TARGET_MAX - 1).join('') + '…'
|
|
54
|
+
: chars.join('');
|
|
55
|
+
}
|
|
56
|
+
function describeTarget(target) {
|
|
57
|
+
switch (target.type) {
|
|
58
|
+
case 'file': return target.path;
|
|
59
|
+
case 'command': return describeCommand(target);
|
|
60
|
+
case 'env': return target.name;
|
|
61
|
+
case 'http': return target.url;
|
|
62
|
+
case 'git': return `git ${target.subcommand}`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
32
65
|
/**
|
|
33
66
|
* Format a message template substituting {target} and {rule_name}.
|
|
34
67
|
*
|
|
35
|
-
* {target} → human-readable description of the target
|
|
68
|
+
* {target} → human-readable description of the target (a command: the
|
|
69
|
+
* whole command, redacted and capped — see describeCommand)
|
|
36
70
|
* {rule_name} → rule.name if set, else rule.id
|
|
71
|
+
*
|
|
72
|
+
* One pass with a function replacer on purpose: a command is arbitrary text. A
|
|
73
|
+
* string replacement would expand the `$&` / `$'` it contains, and a second
|
|
74
|
+
* pass would substitute a `{rule_name}` written inside the command. The target
|
|
75
|
+
* is only described when the template asks for it: no built-in command rule
|
|
76
|
+
* does, and redacting a kilobyte heredoc for nothing is wasted work.
|
|
37
77
|
*/
|
|
38
78
|
export function formatMessage(template, target, rule) {
|
|
39
|
-
let targetStr;
|
|
40
|
-
switch (target.type) {
|
|
41
|
-
case 'file':
|
|
42
|
-
targetStr = target.path;
|
|
43
|
-
break;
|
|
44
|
-
case 'command':
|
|
45
|
-
targetStr = target.command;
|
|
46
|
-
break;
|
|
47
|
-
case 'env':
|
|
48
|
-
targetStr = target.name;
|
|
49
|
-
break;
|
|
50
|
-
case 'http':
|
|
51
|
-
targetStr = target.url;
|
|
52
|
-
break;
|
|
53
|
-
case 'git':
|
|
54
|
-
targetStr = `git ${target.subcommand}`;
|
|
55
|
-
break;
|
|
56
|
-
}
|
|
57
79
|
const ruleName = rule.name ?? rule.id;
|
|
58
|
-
return template
|
|
59
|
-
.replace(/\{target\}/g, targetStr)
|
|
60
|
-
.replace(/\{rule_name\}/g, ruleName);
|
|
80
|
+
return template.replace(/\{(target|rule_name)\}/g, (_, key) => key === 'target' ? describeTarget(target) : ruleName);
|
|
61
81
|
}
|
|
62
82
|
// -----------------------------------------------------------------------
|
|
63
83
|
// Per-target matchers
|
|
@@ -77,25 +97,51 @@ function matchesFile(rule, target, homeDir) {
|
|
|
77
97
|
return false;
|
|
78
98
|
return true;
|
|
79
99
|
}
|
|
80
|
-
|
|
100
|
+
/**
|
|
101
|
+
* What the command regexes see — computed ONCE per evaluation, not per rule.
|
|
102
|
+
*
|
|
103
|
+
* With the raw command available (BACK-174) the evaluator builds
|
|
104
|
+
* command-position VIEWS: shell structure intact, but heredoc bodies, URL
|
|
105
|
+
* query strings, quoted data and non-shell interpreter code no longer chain
|
|
106
|
+
* into the rule's bypass prefix. See command-view.ts.
|
|
107
|
+
*
|
|
108
|
+
* Legacy path (no `raw`): reconstruct the command from the argv-tuple and
|
|
109
|
+
* strip data-bearing arg values (`git commit -m "..."`). CRITICAL: pass the
|
|
110
|
+
* argv-tuple to stripDataArgs directly (not a joined string) — joining loses
|
|
111
|
+
* quote boundaries and the preprocessor would only strip the first token of
|
|
112
|
+
* a message containing spaces.
|
|
113
|
+
*/
|
|
114
|
+
function commandViews(target) {
|
|
115
|
+
return target.raw !== undefined
|
|
116
|
+
? buildCommandViews(target.raw)
|
|
117
|
+
: [stripDataArgs([target.command, ...target.argv])];
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* BACK-207's built-in secret-file rule was hardened server-side against the
|
|
121
|
+
* `process.env` false positive using the quote-stripped argv representation.
|
|
122
|
+
* BACK-174 normally replaces that representation with command-position views;
|
|
123
|
+
* those deliberately remove the interpreter prefix from `python -c` / `node
|
|
124
|
+
* -e` code, which would make the hardened rule miss a real `open('.env')`.
|
|
125
|
+
*
|
|
126
|
+
* Keep the legacy view for this one stable built-in key in addition to the
|
|
127
|
+
* structured views. The exception is intentionally metadata-driven: applying
|
|
128
|
+
* it to every command rule would undo BACK-174 and make quoted data look like
|
|
129
|
+
* executable shell syntax again.
|
|
130
|
+
*/
|
|
131
|
+
function viewsForRule(rule, target, views) {
|
|
132
|
+
if (rule.builtinKey !== 'fs.read.secrets_via_shell' ||
|
|
133
|
+
target.raw === undefined) {
|
|
134
|
+
return views;
|
|
135
|
+
}
|
|
136
|
+
const legacy = stripDataArgs([target.command, ...target.argv]);
|
|
137
|
+
return views.includes(legacy) ? views : [...views, legacy];
|
|
138
|
+
}
|
|
139
|
+
function matchesCommand(rule, target, homeDir, views) {
|
|
81
140
|
const opts = { homeDir };
|
|
82
141
|
const hasRegex = !!rule.commandRegex;
|
|
83
142
|
const hasArgGlobs = rule.commandArgGlobs && rule.commandArgGlobs.length > 0;
|
|
84
143
|
if (!hasRegex && !hasArgGlobs)
|
|
85
144
|
return false;
|
|
86
|
-
// Reconstruct full command string for regex matching (command + args joined).
|
|
87
|
-
// Then strip data-bearing arg values (e.g. `git commit -m "..."`, `gh pr
|
|
88
|
-
// --body "..."`) so the regex doesn't false-positive on user-provided text
|
|
89
|
-
// that happens to mention a dangerous keyword. See preprocess.ts header for
|
|
90
|
-
// the full rationale.
|
|
91
|
-
//
|
|
92
|
-
// CRITICAL: pass the argv-tuple to stripDataArgs directly (not the joined
|
|
93
|
-
// string). Naively joining `[cmd, ...argv].join(' ')` LOSES quote boundaries
|
|
94
|
-
// — a message arg "fix: drop table users" becomes 4 separate tokens, and
|
|
95
|
-
// the preprocessor only strips the first one. Passing the already-tokenized
|
|
96
|
-
// argv preserves each argument as one indivisible token regardless of
|
|
97
|
-
// whether it contains spaces.
|
|
98
|
-
const fullCommand = stripDataArgs([target.command, ...target.argv]);
|
|
99
145
|
if (hasRegex) {
|
|
100
146
|
// A single malformed rule (e.g. an unsupported `(?i)` inline flag rejected
|
|
101
147
|
// by native RegExp when re2-wasm isn't available) MUST NOT poison the
|
|
@@ -104,7 +150,7 @@ function matchesCommand(rule, target, homeDir) {
|
|
|
104
150
|
// rule as non-matching, and continue. The other rules still enforce.
|
|
105
151
|
try {
|
|
106
152
|
const re = compileRegex(rule.commandRegex);
|
|
107
|
-
if (!re.test(
|
|
153
|
+
if (!viewsForRule(rule, target, views).some((v) => re.test(v)))
|
|
108
154
|
return false;
|
|
109
155
|
}
|
|
110
156
|
catch (e) {
|
|
@@ -195,7 +241,7 @@ function matchesGit(rule, target, homeDir) {
|
|
|
195
241
|
return false;
|
|
196
242
|
return true;
|
|
197
243
|
}
|
|
198
|
-
function ruleMatches(rule, req) {
|
|
244
|
+
function ruleMatches(rule, req, ctx) {
|
|
199
245
|
// toolMatch filter
|
|
200
246
|
if (rule.toolMatch && rule.toolMatch.length > 0) {
|
|
201
247
|
if (!rule.toolMatch.includes(req.tool))
|
|
@@ -204,7 +250,7 @@ function ruleMatches(rule, req) {
|
|
|
204
250
|
const { target, homeDir } = req;
|
|
205
251
|
switch (target.type) {
|
|
206
252
|
case 'file': return matchesFile(rule, target, homeDir);
|
|
207
|
-
case 'command': return matchesCommand(rule, target, homeDir);
|
|
253
|
+
case 'command': return matchesCommand(rule, target, homeDir, ctx.commandViews ?? []);
|
|
208
254
|
case 'env': return matchesEnv(rule, target, homeDir);
|
|
209
255
|
case 'http': return matchesHttp(rule, target, homeDir);
|
|
210
256
|
case 'git': return matchesGit(rule, target, homeDir);
|
|
@@ -227,10 +273,14 @@ export function evaluate(rules, req) {
|
|
|
227
273
|
const bucketed = bucketRules(active);
|
|
228
274
|
const bucket = targetTypeBucket(req.target);
|
|
229
275
|
const candidates = bucketed[bucket];
|
|
230
|
-
// 3. Match each candidate
|
|
276
|
+
// 3. Match each candidate. The command views are lexed once here, not
|
|
277
|
+
// once per rule — this runs on every Bash tool call.
|
|
278
|
+
const ctx = {
|
|
279
|
+
commandViews: req.target.type === 'command' ? commandViews(req.target) : null,
|
|
280
|
+
};
|
|
231
281
|
const matched = [];
|
|
232
282
|
for (const rule of candidates) {
|
|
233
|
-
if (ruleMatches(rule, req)) {
|
|
283
|
+
if (ruleMatches(rule, req, ctx)) {
|
|
234
284
|
matched.push(rule);
|
|
235
285
|
}
|
|
236
286
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/guards-evaluator/evaluate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/guards-evaluator/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export * from './types.js';
|
|
2
2
|
export { evaluate, formatMessage } from './evaluate.js';
|
|
3
3
|
export { validateRule } from './validation.js';
|
|
4
|
-
export { redactTarget, hashTarget } from './redact.js';
|
|
4
|
+
export { redactTarget, redactScriptText, hashTarget } from './redact.js';
|
|
5
5
|
export { matchGlob, matchAnyGlob, matchAllGlobExcludes } from './glob.js';
|
|
6
6
|
export { compileRegex, isRegexSafe, isRe2Available, waitForRe2 } from './regex.js';
|
|
7
7
|
export { targetTypeBucket, ruleBuckets, bucketRules } from './bucketing.js';
|
|
8
8
|
export { stripDataArgs } from './preprocess.js';
|
|
9
|
+
export { buildCommandViews, rewriteScratchDirs } from './command-view.js';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guards-evaluator/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guards-evaluator/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The program text an agent hands to an interpreter on the command line, for
|
|
3
|
+
* the script judge (guard-check.ts) to read like a script file:
|
|
4
|
+
*
|
|
5
|
+
* - a flag: `python -c`, `node -e/--eval/-p/--print`, `tsx -e`, `bun -e`,
|
|
6
|
+
* `ruby -e`, `perl -e` (and clusters such as `-ne`, `-pi -e`), `php -r`,
|
|
7
|
+
* `Rscript -e`, `lua -e`, `deno eval`;
|
|
8
|
+
* - a heredoc fed to an interpreter that reads its program from stdin
|
|
9
|
+
* (`python3 - <<EOF`, `node <<EOF`). A heredoc given to an interpreter that
|
|
10
|
+
* also names a script file is that script's input, not code.
|
|
11
|
+
*
|
|
12
|
+
* Shell code (`bash -c`, `eval`, a heredoc fed to `sh`) is not returned: it is
|
|
13
|
+
* a command, which the normalizer de-nests and the rules evaluate. Its text is
|
|
14
|
+
* read for the interpreter code it runs (`bash -c "python3 -c '…'"`), two
|
|
15
|
+
* levels deep.
|
|
16
|
+
*
|
|
17
|
+
* Pure (no I/O), never throws, at most `MAX_INLINE` pieces per command.
|
|
18
|
+
*/
|
|
19
|
+
import { parse as shellParse } from 'shell-quote';
|
|
20
|
+
const MAX_INLINE = 3;
|
|
21
|
+
const PYTHON = {
|
|
22
|
+
language: 'python',
|
|
23
|
+
codeFlags: new Set(['-c']),
|
|
24
|
+
valueFlags: new Set(['-W', '-X', '-Q']),
|
|
25
|
+
stopFlags: new Set(['-m']),
|
|
26
|
+
readsStdin: true,
|
|
27
|
+
};
|
|
28
|
+
const NODE_FLAGS = new Set(['-e', '--eval', '-p', '--print']);
|
|
29
|
+
const NODE_VALUE_FLAGS = new Set(['-r', '--require', '--loader', '--import', '--experimental-loader']);
|
|
30
|
+
const NODE = {
|
|
31
|
+
language: 'javascript',
|
|
32
|
+
codeFlags: NODE_FLAGS,
|
|
33
|
+
codeFlagPrefixes: ['--eval=', '--print='],
|
|
34
|
+
valueFlags: NODE_VALUE_FLAGS,
|
|
35
|
+
readsStdin: true,
|
|
36
|
+
};
|
|
37
|
+
const TS_NODE = { ...NODE, language: 'typescript' };
|
|
38
|
+
const SPECS = new Map([
|
|
39
|
+
['python', PYTHON],
|
|
40
|
+
['python2', PYTHON],
|
|
41
|
+
['python3', PYTHON],
|
|
42
|
+
['node', NODE],
|
|
43
|
+
['nodejs', NODE],
|
|
44
|
+
['bun', { ...NODE, readsStdin: false }],
|
|
45
|
+
['tsx', TS_NODE],
|
|
46
|
+
['ts-node', TS_NODE],
|
|
47
|
+
['ruby', { language: 'ruby', codeFlags: new Set(['-e']), valueFlags: new Set(['-r', '-I', '-C']), readsStdin: true }],
|
|
48
|
+
[
|
|
49
|
+
'perl',
|
|
50
|
+
{
|
|
51
|
+
language: 'perl',
|
|
52
|
+
codeFlags: new Set(['-e', '-E']),
|
|
53
|
+
codeCluster: /^-[A-Za-z0-9]*[eE]$/,
|
|
54
|
+
valueFlags: new Set(['-I']),
|
|
55
|
+
readsStdin: true,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
['php', { language: 'php', codeFlags: new Set(['-r']), valueFlags: new Set(['-c', '-d', '-z']), readsStdin: true }],
|
|
59
|
+
['rscript', { language: 'r', codeFlags: new Set(['-e']), valueFlags: new Set(), readsStdin: true }],
|
|
60
|
+
['lua', { language: 'lua', codeFlags: new Set(['-e']), valueFlags: new Set(['-l']), readsStdin: true }],
|
|
61
|
+
]);
|
|
62
|
+
/** Wrappers that do not change which program runs. */
|
|
63
|
+
const TRANSPARENT = new Set(['sudo', 'doas', 'nohup', 'command', 'time', 'nice', 'stdbuf', 'setsid', 'exec']);
|
|
64
|
+
const SEGMENT_OPS = new Set([';', '&&', '||', '|', '|&', '&', '(', ')', '\n']);
|
|
65
|
+
/** Same opener as the normalizer's (normalize.ts `HEREDOC_OPEN`). */
|
|
66
|
+
const HEREDOC_OPEN = /<<-?\s*(['"]?)([A-Za-z_][A-Za-z0-9_]*)\1/;
|
|
67
|
+
function canonical(token) {
|
|
68
|
+
const noEsc = token.startsWith('\\') ? token.slice(1) : token;
|
|
69
|
+
return (noEsc.split('/').pop() ?? noEsc).toLowerCase();
|
|
70
|
+
}
|
|
71
|
+
/** Simple-command argv arrays of a command line, `$VAR` kept literal. */
|
|
72
|
+
function segments(text) {
|
|
73
|
+
let tokens;
|
|
74
|
+
try {
|
|
75
|
+
tokens = shellParse(text, (k) => '$' + k);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
const out = [];
|
|
81
|
+
let argv = [];
|
|
82
|
+
for (const tok of tokens) {
|
|
83
|
+
if (typeof tok === 'object' && tok !== null && 'op' in tok) {
|
|
84
|
+
if (SEGMENT_OPS.has(tok.op)) {
|
|
85
|
+
if (argv.length)
|
|
86
|
+
out.push(argv);
|
|
87
|
+
argv = [];
|
|
88
|
+
}
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (typeof tok === 'string')
|
|
92
|
+
argv.push(tok);
|
|
93
|
+
else if (typeof tok === 'object' && tok !== null && 'pattern' in tok)
|
|
94
|
+
argv.push(tok.pattern);
|
|
95
|
+
}
|
|
96
|
+
if (argv.length)
|
|
97
|
+
out.push(argv);
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
/** Drop `VAR=v`, wrappers (`sudo`, `env -i …`) and package launchers. */
|
|
101
|
+
function peel(argv) {
|
|
102
|
+
let i = 0;
|
|
103
|
+
while (i < argv.length) {
|
|
104
|
+
const tok = argv[i];
|
|
105
|
+
const name = canonical(tok);
|
|
106
|
+
const sub = argv[i + 1];
|
|
107
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*=/.test(tok) || TRANSPARENT.has(name)) {
|
|
108
|
+
i++;
|
|
109
|
+
}
|
|
110
|
+
else if (name === 'env') {
|
|
111
|
+
i++;
|
|
112
|
+
while (i < argv.length && (argv[i].startsWith('-') || /^[A-Za-z_][A-Za-z0-9_]*=/.test(argv[i]))) {
|
|
113
|
+
if (argv[i] === '-u' || argv[i] === '--unset')
|
|
114
|
+
i++;
|
|
115
|
+
i++;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (name === 'npx' || name === 'bunx' || name === 'pnpx') {
|
|
119
|
+
i++;
|
|
120
|
+
while (i < argv.length && argv[i].startsWith('-'))
|
|
121
|
+
i++;
|
|
122
|
+
}
|
|
123
|
+
else if (((name === 'pnpm' || name === 'yarn') && (sub === 'exec' || sub === 'dlx')) ||
|
|
124
|
+
((name === 'uv' || name === 'poetry' || name === 'pipenv') && sub === 'run')) {
|
|
125
|
+
i += 2;
|
|
126
|
+
while (i < argv.length && argv[i].startsWith('-'))
|
|
127
|
+
i++;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return argv.slice(i);
|
|
134
|
+
}
|
|
135
|
+
/** The program text of a flag-passed inline program, or null. */
|
|
136
|
+
function codeOfFlags(exe, args) {
|
|
137
|
+
if (exe === 'deno') {
|
|
138
|
+
if (args[0] !== 'eval')
|
|
139
|
+
return null;
|
|
140
|
+
const code = args.slice(1).find((a) => !a.startsWith('-'));
|
|
141
|
+
return code ?? null;
|
|
142
|
+
}
|
|
143
|
+
const spec = SPECS.get(exe);
|
|
144
|
+
if (!spec)
|
|
145
|
+
return null;
|
|
146
|
+
for (let i = 0; i < args.length; i++) {
|
|
147
|
+
const a = args[i];
|
|
148
|
+
if (spec.stopFlags?.has(a))
|
|
149
|
+
return null;
|
|
150
|
+
if (spec.codeFlags.has(a))
|
|
151
|
+
return args[i + 1] ?? null;
|
|
152
|
+
const prefix = spec.codeFlagPrefixes?.find((p) => a.startsWith(p));
|
|
153
|
+
if (prefix)
|
|
154
|
+
return a.slice(prefix.length);
|
|
155
|
+
if (spec.codeCluster && spec.codeCluster.test(a))
|
|
156
|
+
return args[i + 1] ?? null;
|
|
157
|
+
if (spec.valueFlags.has(a)) {
|
|
158
|
+
i++;
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (a.startsWith('-'))
|
|
162
|
+
continue;
|
|
163
|
+
return null; // a script file: what follows are its own arguments
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
/** The interpreter a heredoc opener line feeds, when it reads code from stdin. */
|
|
168
|
+
function stdinInterpreter(opener) {
|
|
169
|
+
const segs = segments(opener);
|
|
170
|
+
const last = segs[segs.length - 1];
|
|
171
|
+
if (!last)
|
|
172
|
+
return null;
|
|
173
|
+
const argv = peel(last);
|
|
174
|
+
if (argv.length === 0)
|
|
175
|
+
return null;
|
|
176
|
+
const spec = SPECS.get(canonical(argv[0]));
|
|
177
|
+
if (!spec || !spec.readsStdin)
|
|
178
|
+
return null;
|
|
179
|
+
// Every argument is a flag or `-` (stdin): no script file is named.
|
|
180
|
+
const namesFile = argv.slice(1).some((a) => a !== '-' && !a.startsWith('-'));
|
|
181
|
+
return namesFile ? null : spec;
|
|
182
|
+
}
|
|
183
|
+
function push(out, language, code) {
|
|
184
|
+
if (typeof code !== 'string' || code.trim().length === 0)
|
|
185
|
+
return;
|
|
186
|
+
if (out.length >= MAX_INLINE)
|
|
187
|
+
return;
|
|
188
|
+
if (out.some((c) => c.language === language && c.code === code))
|
|
189
|
+
return;
|
|
190
|
+
out.push({ language, code });
|
|
191
|
+
}
|
|
192
|
+
const SHELLS = new Set(['bash', 'sh', 'zsh', 'dash', 'ksh', 'ash']);
|
|
193
|
+
/** A shell's `-c`, alone or in a cluster (`-lc`, `-xc`). */
|
|
194
|
+
const SHELL_C = /^-[A-Za-z]*c[A-Za-z]*$/;
|
|
195
|
+
/** How deep `bash -c "…"` / `eval "…"` are followed. */
|
|
196
|
+
const MAX_SHELL_DEPTH = 2;
|
|
197
|
+
/** The shell command a `bash -c` / `eval` segment runs, or null. */
|
|
198
|
+
function nestedShellCommand(exe, args) {
|
|
199
|
+
if (exe === 'eval')
|
|
200
|
+
return args.length > 0 ? args.join(' ') : null;
|
|
201
|
+
if (!SHELLS.has(exe))
|
|
202
|
+
return null;
|
|
203
|
+
const at = args.findIndex((a) => SHELL_C.test(a));
|
|
204
|
+
return at >= 0 ? (args[at + 1] ?? null) : null;
|
|
205
|
+
}
|
|
206
|
+
/** The inline programs of a raw Bash command, in order, at most three. */
|
|
207
|
+
export function extractInlineCode(raw) {
|
|
208
|
+
const out = [];
|
|
209
|
+
collect(raw, 0, out);
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
function collect(raw, depth, out) {
|
|
213
|
+
try {
|
|
214
|
+
if (typeof raw !== 'string' || raw.trim().length === 0)
|
|
215
|
+
return;
|
|
216
|
+
// Heredocs first: their bodies are removed from what the flag scan reads.
|
|
217
|
+
const lines = raw.split('\n');
|
|
218
|
+
const kept = [];
|
|
219
|
+
for (let i = 0; i < lines.length; i++) {
|
|
220
|
+
const line = lines[i];
|
|
221
|
+
const m = HEREDOC_OPEN.exec(line);
|
|
222
|
+
if (!m) {
|
|
223
|
+
kept.push(line);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
const delim = m[2];
|
|
227
|
+
kept.push(line.slice(0, m.index) + line.slice(m.index + m[0].length));
|
|
228
|
+
const body = [];
|
|
229
|
+
i++;
|
|
230
|
+
while (i < lines.length && lines[i].trim() !== delim) {
|
|
231
|
+
body.push(lines[i]);
|
|
232
|
+
i++;
|
|
233
|
+
}
|
|
234
|
+
const spec = stdinInterpreter(line.slice(0, m.index));
|
|
235
|
+
if (spec)
|
|
236
|
+
push(out, spec.language, body.join('\n'));
|
|
237
|
+
}
|
|
238
|
+
for (const argv of segments(kept.join('\n'))) {
|
|
239
|
+
const peeled = peel(argv);
|
|
240
|
+
if (peeled.length === 0)
|
|
241
|
+
continue;
|
|
242
|
+
const exe = canonical(peeled[0]);
|
|
243
|
+
const nested = nestedShellCommand(exe, peeled.slice(1));
|
|
244
|
+
if (nested !== null) {
|
|
245
|
+
if (depth < MAX_SHELL_DEPTH)
|
|
246
|
+
collect(nested, depth + 1, out);
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
const language = exe === 'deno' ? 'typescript' : SPECS.get(exe)?.language;
|
|
250
|
+
if (!language)
|
|
251
|
+
continue;
|
|
252
|
+
push(out, language, codeOfFlags(exe, peeled.slice(1)));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
/* never throw: keep what was found */
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=inline-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-code.js","sourceRoot":"","sources":["../../src/guards-evaluator/inline-code.ts"],"names":[],"mappings":"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"}
|