@taliesinb/mash 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/mash.ts +253 -0
- package/dist/bin/mash.d.ts +39 -0
- package/dist/bin/mash.d.ts.map +1 -0
- package/dist/bin/mash.js +281 -0
- package/dist/bin/mash.js.map +1 -0
- package/dist/src/analysis/analyze.d.ts +97 -0
- package/dist/src/analysis/analyze.d.ts.map +1 -0
- package/dist/src/analysis/analyze.js +1406 -0
- package/dist/src/analysis/analyze.js.map +1 -0
- package/dist/src/analysis/fs.d.ts +39 -0
- package/dist/src/analysis/fs.d.ts.map +1 -0
- package/dist/src/analysis/fs.js +117 -0
- package/dist/src/analysis/fs.js.map +1 -0
- package/dist/src/analysis/outputs.d.ts +16 -0
- package/dist/src/analysis/outputs.d.ts.map +1 -0
- package/dist/src/analysis/outputs.js +277 -0
- package/dist/src/analysis/outputs.js.map +1 -0
- package/dist/src/analysis/value.d.ts +76 -0
- package/dist/src/analysis/value.d.ts.map +1 -0
- package/dist/src/analysis/value.js +248 -0
- package/dist/src/analysis/value.js.map +1 -0
- package/dist/src/behaviors/defs/core.d.ts +15 -0
- package/dist/src/behaviors/defs/core.d.ts.map +1 -0
- package/dist/src/behaviors/defs/core.js +1084 -0
- package/dist/src/behaviors/defs/core.js.map +1 -0
- package/dist/src/behaviors/defs/devtools.d.ts +9 -0
- package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/devtools.js +432 -0
- package/dist/src/behaviors/defs/devtools.js.map +1 -0
- package/dist/src/behaviors/defs/macos.d.ts +12 -0
- package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
- package/dist/src/behaviors/defs/macos.js +454 -0
- package/dist/src/behaviors/defs/macos.js.map +1 -0
- package/dist/src/behaviors/defs/tools.d.ts +9 -0
- package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/tools.js +639 -0
- package/dist/src/behaviors/defs/tools.js.map +1 -0
- package/dist/src/behaviors/dsl.d.ts +95 -0
- package/dist/src/behaviors/dsl.d.ts.map +1 -0
- package/dist/src/behaviors/dsl.js +267 -0
- package/dist/src/behaviors/dsl.js.map +1 -0
- package/dist/src/behaviors/index.d.ts +12 -0
- package/dist/src/behaviors/index.d.ts.map +1 -0
- package/dist/src/behaviors/index.js +18 -0
- package/dist/src/behaviors/index.js.map +1 -0
- package/dist/src/behaviors/registry.d.ts +45 -0
- package/dist/src/behaviors/registry.d.ts.map +1 -0
- package/dist/src/behaviors/registry.js +266 -0
- package/dist/src/behaviors/registry.js.map +1 -0
- package/dist/src/behaviors/roles.d.ts +29 -0
- package/dist/src/behaviors/roles.d.ts.map +1 -0
- package/dist/src/behaviors/roles.js +198 -0
- package/dist/src/behaviors/roles.js.map +1 -0
- package/dist/src/behaviors/types.d.ts +120 -0
- package/dist/src/behaviors/types.d.ts.map +1 -0
- package/dist/src/behaviors/types.js +12 -0
- package/dist/src/behaviors/types.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/deepsea.d.ts +121 -0
- package/dist/src/integrations/deepsea.d.ts.map +1 -0
- package/dist/src/integrations/deepsea.js +199 -0
- package/dist/src/integrations/deepsea.js.map +1 -0
- package/dist/src/machine.d.ts +139 -0
- package/dist/src/machine.d.ts.map +1 -0
- package/dist/src/machine.js +400 -0
- package/dist/src/machine.js.map +1 -0
- package/dist/src/parser/ast.d.ts +369 -0
- package/dist/src/parser/ast.d.ts.map +1 -0
- package/dist/src/parser/ast.js +17 -0
- package/dist/src/parser/ast.js.map +1 -0
- package/dist/src/parser/parser.d.ts +48 -0
- package/dist/src/parser/parser.d.ts.map +1 -0
- package/dist/src/parser/parser.js +1950 -0
- package/dist/src/parser/parser.js.map +1 -0
- package/dist/src/policy/effects.d.ts +86 -0
- package/dist/src/policy/effects.d.ts.map +1 -0
- package/dist/src/policy/effects.js +53 -0
- package/dist/src/policy/effects.js.map +1 -0
- package/dist/src/policy/policy.d.ts +130 -0
- package/dist/src/policy/policy.d.ts.map +1 -0
- package/dist/src/policy/policy.js +532 -0
- package/dist/src/policy/policy.js.map +1 -0
- package/dist/src/printer/doc.d.ts +151 -0
- package/dist/src/printer/doc.d.ts.map +1 -0
- package/dist/src/printer/doc.js +409 -0
- package/dist/src/printer/doc.js.map +1 -0
- package/dist/src/printer/highlight.d.ts +53 -0
- package/dist/src/printer/highlight.d.ts.map +1 -0
- package/dist/src/printer/highlight.js +339 -0
- package/dist/src/printer/highlight.js.map +1 -0
- package/dist/src/printer/html.d.ts +72 -0
- package/dist/src/printer/html.d.ts.map +1 -0
- package/dist/src/printer/html.js +423 -0
- package/dist/src/printer/html.js.map +1 -0
- package/dist/src/printer/print.d.ts +63 -0
- package/dist/src/printer/print.d.ts.map +1 -0
- package/dist/src/printer/print.js +484 -0
- package/dist/src/printer/print.js.map +1 -0
- package/dist/src/printer/summary.d.ts +50 -0
- package/dist/src/printer/summary.d.ts.map +1 -0
- package/dist/src/printer/summary.js +621 -0
- package/dist/src/printer/summary.js.map +1 -0
- package/dist/src/trace/events.d.ts +183 -0
- package/dist/src/trace/events.d.ts.map +1 -0
- package/dist/src/trace/events.js +9 -0
- package/dist/src/trace/events.js.map +1 -0
- package/dist/src/trace/progress.d.ts +58 -0
- package/dist/src/trace/progress.d.ts.map +1 -0
- package/dist/src/trace/progress.js +83 -0
- package/dist/src/trace/progress.js.map +1 -0
- package/dist/src/vm/arith.d.ts +29 -0
- package/dist/src/vm/arith.d.ts.map +1 -0
- package/dist/src/vm/arith.js +258 -0
- package/dist/src/vm/arith.js.map +1 -0
- package/dist/src/vm/builtins.d.ts +31 -0
- package/dist/src/vm/builtins.d.ts.map +1 -0
- package/dist/src/vm/builtins.js +1773 -0
- package/dist/src/vm/builtins.js.map +1 -0
- package/dist/src/vm/emulate.d.ts +75 -0
- package/dist/src/vm/emulate.d.ts.map +1 -0
- package/dist/src/vm/emulate.js +380 -0
- package/dist/src/vm/emulate.js.map +1 -0
- package/dist/src/vm/expand.d.ts +68 -0
- package/dist/src/vm/expand.d.ts.map +1 -0
- package/dist/src/vm/expand.js +744 -0
- package/dist/src/vm/expand.js.map +1 -0
- package/dist/src/vm/external.d.ts +34 -0
- package/dist/src/vm/external.d.ts.map +1 -0
- package/dist/src/vm/external.js +228 -0
- package/dist/src/vm/external.js.map +1 -0
- package/dist/src/vm/fifo.d.ts +66 -0
- package/dist/src/vm/fifo.d.ts.map +1 -0
- package/dist/src/vm/fifo.js +232 -0
- package/dist/src/vm/fifo.js.map +1 -0
- package/dist/src/vm/interp.d.ts +209 -0
- package/dist/src/vm/interp.d.ts.map +1 -0
- package/dist/src/vm/interp.js +1641 -0
- package/dist/src/vm/interp.js.map +1 -0
- package/dist/src/vm/io.d.ts +180 -0
- package/dist/src/vm/io.d.ts.map +1 -0
- package/dist/src/vm/io.js +502 -0
- package/dist/src/vm/io.js.map +1 -0
- package/dist/src/vm/pattern.d.ts +46 -0
- package/dist/src/vm/pattern.d.ts.map +1 -0
- package/dist/src/vm/pattern.js +498 -0
- package/dist/src/vm/pattern.js.map +1 -0
- package/dist/src/vm/proc.d.ts +94 -0
- package/dist/src/vm/proc.d.ts.map +1 -0
- package/dist/src/vm/proc.js +130 -0
- package/dist/src/vm/proc.js.map +1 -0
- package/dist/src/vm/state.d.ts +104 -0
- package/dist/src/vm/state.d.ts.map +1 -0
- package/dist/src/vm/state.js +233 -0
- package/dist/src/vm/state.js.map +1 -0
- package/dist/src/vm/test.d.ts +11 -0
- package/dist/src/vm/test.d.ts.map +1 -0
- package/dist/src/vm/test.js +277 -0
- package/dist/src/vm/test.js.map +1 -0
- package/package.json +63 -4
- package/src/analysis/analyze.ts +1395 -0
- package/src/analysis/fs.ts +121 -0
- package/src/analysis/outputs.ts +242 -0
- package/src/analysis/value.ts +264 -0
- package/src/behaviors/defs/core.ts +970 -0
- package/src/behaviors/defs/devtools.ts +400 -0
- package/src/behaviors/defs/macos.ts +426 -0
- package/src/behaviors/defs/tools.ts +596 -0
- package/src/behaviors/dsl.ts +293 -0
- package/src/behaviors/index.ts +19 -0
- package/src/behaviors/registry.ts +261 -0
- package/src/behaviors/roles.ts +187 -0
- package/src/behaviors/types.ts +127 -0
- package/src/index.ts +27 -0
- package/src/integrations/deepsea.ts +259 -0
- package/src/machine.ts +483 -0
- package/src/parser/ast.ts +472 -0
- package/src/parser/parser.ts +1826 -0
- package/src/policy/effects.ts +102 -0
- package/src/policy/policy.ts +578 -0
- package/src/printer/doc.ts +454 -0
- package/src/printer/highlight.ts +283 -0
- package/src/printer/html.ts +441 -0
- package/src/printer/print.ts +528 -0
- package/src/printer/summary.ts +601 -0
- package/src/trace/events.ts +102 -0
- package/src/trace/progress.ts +119 -0
- package/src/vm/arith.ts +236 -0
- package/src/vm/builtins.ts +1590 -0
- package/src/vm/emulate.ts +337 -0
- package/src/vm/expand.ts +721 -0
- package/src/vm/external.ts +265 -0
- package/src/vm/fifo.ts +226 -0
- package/src/vm/interp.ts +1623 -0
- package/src/vm/io.ts +570 -0
- package/src/vm/pattern.ts +477 -0
- package/src/vm/proc.ts +147 -0
- package/src/vm/state.ts +267 -0
- package/src/vm/test.ts +253 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The public entry point: a {@link Machine} runs bash snippets under a policy,
|
|
3
|
+
* with behavior definitions, hooks and a trace event stream.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* const m = new Machine({ cwd, policy: { mode: 'workspace-write', workspaceRoot: cwd } })
|
|
7
|
+
* m.on((e) => console.log(e.type))
|
|
8
|
+
* const r = await m.run('ls | wc -l')
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
import type * as A from './parser/ast.ts';
|
|
12
|
+
import { BehaviorRegistry } from './behaviors/registry.ts';
|
|
13
|
+
import { type Policy } from './policy/policy.ts';
|
|
14
|
+
import type { Hooks, TraceListener } from './trace/events.ts';
|
|
15
|
+
import { type SpawnFn } from './vm/external.ts';
|
|
16
|
+
import { type FdPassing } from './vm/fifo.ts';
|
|
17
|
+
import { Capture, type DataListener } from './vm/io.ts';
|
|
18
|
+
import { type AnalysisReport, type AnalyzeOptions } from './analysis/analyze.ts';
|
|
19
|
+
export interface MachineOptions {
|
|
20
|
+
/** Initial working directory (default: process.cwd()). */
|
|
21
|
+
cwd?: string;
|
|
22
|
+
/** Environment (default: process.env). */
|
|
23
|
+
env?: Record<string, string | undefined>;
|
|
24
|
+
/** Sandbox policy (default: workspace-write rooted at cwd). */
|
|
25
|
+
policy?: Policy;
|
|
26
|
+
behaviors?: BehaviorRegistry;
|
|
27
|
+
hooks?: Hooks;
|
|
28
|
+
/** Host stdin (default: empty). */
|
|
29
|
+
stdin?: AsyncIterable<Uint8Array | string>;
|
|
30
|
+
/** Host stdout/stderr sinks. Default: captured and returned by `run`. */
|
|
31
|
+
stdout?: (chunk: Uint8Array) => void | Promise<void>;
|
|
32
|
+
stderr?: (chunk: Uint8Array) => void | Promise<void>;
|
|
33
|
+
/** Spawn function for external commands (wrap it to confine children). */
|
|
34
|
+
spawn?: SpawnFn;
|
|
35
|
+
/** Report `data` events for every channel (pipes, redirections, captures). Default false. */
|
|
36
|
+
traceData?: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* What to do with background jobs still running when the script ends:
|
|
39
|
+
* `detach` (like bash: leave them running), `wait`, or `kill`. Default `wait`.
|
|
40
|
+
*/
|
|
41
|
+
background?: 'detach' | 'wait' | 'kill';
|
|
42
|
+
/**
|
|
43
|
+
* Deny commands whose policy verdict is `unknown` (effects not provably
|
|
44
|
+
* allowed). Default false: unknown effects are allowed (the OS sandbox
|
|
45
|
+
* still confines them) but reported.
|
|
46
|
+
*/
|
|
47
|
+
denyUnknown?: boolean;
|
|
48
|
+
/** Status of a denied command (default 126). */
|
|
49
|
+
deniedStatus?: number;
|
|
50
|
+
/** Abort the whole run on the first denial instead of failing the command. */
|
|
51
|
+
abortOnDeny?: boolean;
|
|
52
|
+
/** Dry run: never execute external commands; report their predicted effects instead. */
|
|
53
|
+
dryRun?: boolean;
|
|
54
|
+
/** `$0` (default `mash`). */
|
|
55
|
+
arg0?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Run nested `bash -c`, `bash file` and bash/sh shebang scripts inside the
|
|
58
|
+
* VM so their commands are traced and checked individually (default true).
|
|
59
|
+
*/
|
|
60
|
+
inlineScripts?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Emulate `xargs` and `find -exec/-delete` inside the VM so every command
|
|
63
|
+
* they run is traced and checked individually (default true).
|
|
64
|
+
*/
|
|
65
|
+
emulate?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* How process substitutions and other `/dev/fd/N` arguments naming VM fds
|
|
68
|
+
* reach external commands. `devfd`: an extra stdio slot, passed as
|
|
69
|
+
* `/dev/fd/K` (works on macOS, where the child can open a socket by that
|
|
70
|
+
* name). `fifo`: a named FIFO in a private temp dir, passed by path (needed
|
|
71
|
+
* on Linux, where opening `/dev/fd/K` on a socket fails with ENXIO).
|
|
72
|
+
* Default: the `MASH_PROCSUBST` environment variable (`fifo`|`devfd`), else
|
|
73
|
+
* `devfd` on macOS and `fifo` elsewhere.
|
|
74
|
+
*/
|
|
75
|
+
procSubst?: FdPassing;
|
|
76
|
+
}
|
|
77
|
+
export interface RunOptions {
|
|
78
|
+
/** Positional parameters ($1...). */
|
|
79
|
+
args?: string[];
|
|
80
|
+
signal?: AbortSignal;
|
|
81
|
+
}
|
|
82
|
+
export interface RunResult {
|
|
83
|
+
status: number;
|
|
84
|
+
/** Captured output when no stdout/stderr sink was configured. */
|
|
85
|
+
stdout: string;
|
|
86
|
+
stderr: string;
|
|
87
|
+
/** Set when the run was aborted (policy abort or signal). */
|
|
88
|
+
aborted?: string;
|
|
89
|
+
/** Commands denied by policy or hooks during the run. */
|
|
90
|
+
denials: {
|
|
91
|
+
argv: string[];
|
|
92
|
+
reason: string;
|
|
93
|
+
}[];
|
|
94
|
+
}
|
|
95
|
+
export declare class Machine {
|
|
96
|
+
readonly options: MachineOptions;
|
|
97
|
+
readonly policy: Policy;
|
|
98
|
+
readonly behaviors: BehaviorRegistry;
|
|
99
|
+
private readonly listeners;
|
|
100
|
+
private readonly dataListeners;
|
|
101
|
+
private nextId;
|
|
102
|
+
private readonly sources;
|
|
103
|
+
private channelCounter;
|
|
104
|
+
private pidCounter;
|
|
105
|
+
private execCounter;
|
|
106
|
+
private runCounter;
|
|
107
|
+
private readonly contexts;
|
|
108
|
+
constructor(options?: MachineOptions);
|
|
109
|
+
/** Subscribe to trace events. Returns an unsubscribe function. */
|
|
110
|
+
on(listener: TraceListener): () => void;
|
|
111
|
+
/** Tap the bytes flowing through every channel (pipes, redirections, captures, stdio). */
|
|
112
|
+
tap(listener: DataListener): () => void;
|
|
113
|
+
private emit;
|
|
114
|
+
/** Parse source, registering it so trace consumers can map node ids back to text. */
|
|
115
|
+
parse(source: string, origin?: string, opts?: {
|
|
116
|
+
partial?: boolean;
|
|
117
|
+
}): A.Script;
|
|
118
|
+
private sourceOf;
|
|
119
|
+
/** Source text of a node. */
|
|
120
|
+
textOf(node: {
|
|
121
|
+
id: number;
|
|
122
|
+
span: A.Span;
|
|
123
|
+
}): string;
|
|
124
|
+
/** Static analysis: predicted commands, effects and policy findings, without running anything. */
|
|
125
|
+
analyze(source: string | A.Script, options?: Partial<AnalyzeOptions>): AnalysisReport;
|
|
126
|
+
private analyzeNested;
|
|
127
|
+
private initialEnv;
|
|
128
|
+
/** Run a snippet. */
|
|
129
|
+
run(source: string | A.Script, opts?: RunOptions): Promise<RunResult>;
|
|
130
|
+
private nextPidValue;
|
|
131
|
+
private channel;
|
|
132
|
+
/** Effects of a builtin (most have none). */
|
|
133
|
+
private builtinEffects;
|
|
134
|
+
private invocation;
|
|
135
|
+
private assess;
|
|
136
|
+
private assessEffectsOnly;
|
|
137
|
+
}
|
|
138
|
+
export { Capture };
|
|
139
|
+
//# sourceMappingURL=machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../../src/machine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The public entry point: a {@link Machine} runs bash snippets under a policy,
|
|
3
|
+
* with behavior definitions, hooks and a trace event stream.
|
|
4
|
+
*
|
|
5
|
+
* ```ts
|
|
6
|
+
* const m = new Machine({ cwd, policy: { mode: 'workspace-write', workspaceRoot: cwd } })
|
|
7
|
+
* m.on((e) => console.log(e.type))
|
|
8
|
+
* const r = await m.run('ls | wc -l')
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
11
|
+
import * as os from 'node:os';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { parse, lineColumn } from "./parser/parser.js";
|
|
14
|
+
import { known } from "./analysis/value.js";
|
|
15
|
+
import { BehaviorRegistry, basename } from "./behaviors/registry.js";
|
|
16
|
+
import { defaultBehaviors } from "./behaviors/index.js";
|
|
17
|
+
import { checkCommandName, checkEffects, checkExecEffects, defaultPolicy } from "./policy/policy.js";
|
|
18
|
+
import { asPossible, viaSuffix, withVia } from "./policy/effects.js";
|
|
19
|
+
import { defaultSpawn } from "./vm/external.js";
|
|
20
|
+
import { defaultFdPassing } from "./vm/fifo.js";
|
|
21
|
+
import { Interpreter } from "./vm/interp.js";
|
|
22
|
+
import { Capture, FdTable, HostStream } from "./vm/io.js";
|
|
23
|
+
import { AbortRun, Proc } from "./vm/proc.js";
|
|
24
|
+
import { initShellVars, newVar, ShellState } from "./vm/state.js";
|
|
25
|
+
import { analyzeScript } from "./analysis/analyze.js";
|
|
26
|
+
export class Machine {
|
|
27
|
+
options;
|
|
28
|
+
policy;
|
|
29
|
+
behaviors;
|
|
30
|
+
listeners = [];
|
|
31
|
+
dataListeners = [];
|
|
32
|
+
nextId = 1;
|
|
33
|
+
sources = [];
|
|
34
|
+
channelCounter = 0;
|
|
35
|
+
pidCounter = 0;
|
|
36
|
+
execCounter = 0;
|
|
37
|
+
runCounter = 0;
|
|
38
|
+
contexts = new Map();
|
|
39
|
+
constructor(options = {}) {
|
|
40
|
+
this.options = options;
|
|
41
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
42
|
+
this.policy = options.policy ?? defaultPolicy(cwd);
|
|
43
|
+
this.behaviors = options.behaviors ?? defaultBehaviors();
|
|
44
|
+
this.behaviors.scriptAnalyzer ??= (source, positional, inv, info) => this.analyzeNested(source, positional, inv, info);
|
|
45
|
+
if (options.traceData) {
|
|
46
|
+
this.dataListeners.push((channel, bytes, direction) => this.emit({ type: 'data', channel, bytes, direction }));
|
|
47
|
+
}
|
|
48
|
+
this.pidCounter = 10000 + (process.pid % 1000) * 10;
|
|
49
|
+
}
|
|
50
|
+
/** Subscribe to trace events. Returns an unsubscribe function. */
|
|
51
|
+
on(listener) {
|
|
52
|
+
this.listeners.push(listener);
|
|
53
|
+
return () => {
|
|
54
|
+
const i = this.listeners.indexOf(listener);
|
|
55
|
+
if (i >= 0)
|
|
56
|
+
this.listeners.splice(i, 1);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/** Tap the bytes flowing through every channel (pipes, redirections, captures, stdio). */
|
|
60
|
+
tap(listener) {
|
|
61
|
+
this.dataListeners.push(listener);
|
|
62
|
+
return () => {
|
|
63
|
+
const i = this.dataListeners.indexOf(listener);
|
|
64
|
+
if (i >= 0)
|
|
65
|
+
this.dataListeners.splice(i, 1);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
emit(e) {
|
|
69
|
+
for (const l of this.listeners) {
|
|
70
|
+
try {
|
|
71
|
+
l(e);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// listeners must not break execution
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Parse source, registering it so trace consumers can map node ids back to text. */
|
|
79
|
+
parse(source, origin = 'script', opts = {}) {
|
|
80
|
+
const firstId = this.nextId;
|
|
81
|
+
const script = parse(source, { firstId, partial: opts.partial });
|
|
82
|
+
this.nextId = script.id + 1;
|
|
83
|
+
this.sources.push({ firstId, lastId: script.id, text: source, origin });
|
|
84
|
+
return script;
|
|
85
|
+
}
|
|
86
|
+
sourceOf(id) {
|
|
87
|
+
for (let i = this.sources.length - 1; i >= 0; i--) {
|
|
88
|
+
const s = this.sources[i];
|
|
89
|
+
if (id >= s.firstId && id <= s.lastId)
|
|
90
|
+
return s;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
/** Source text of a node. */
|
|
95
|
+
textOf(node) {
|
|
96
|
+
const s = this.sourceOf(node.id);
|
|
97
|
+
return s ? s.text.slice(node.span.start, node.span.end) : '';
|
|
98
|
+
}
|
|
99
|
+
/** Static analysis: predicted commands, effects and policy findings, without running anything. */
|
|
100
|
+
analyze(source, options = {}) {
|
|
101
|
+
const script = typeof source === 'string' ? this.parse(source, 'analysis') : source;
|
|
102
|
+
const text = typeof source === 'string' ? source : this.sourceOf(source.id)?.text ?? '';
|
|
103
|
+
const cwd = path.resolve(this.options.cwd ?? process.cwd());
|
|
104
|
+
return analyzeScript(script, text, {
|
|
105
|
+
cwd: known(cwd),
|
|
106
|
+
env: this.initialEnv(),
|
|
107
|
+
policy: this.policy,
|
|
108
|
+
behaviors: this.behaviors,
|
|
109
|
+
...options,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
analyzeNested(source, positional, inv, info = {}) {
|
|
113
|
+
const text = source.alts.length === 1 && source.alts[0].every((s) => typeof s === 'string') ? source.alts[0].join('') : undefined;
|
|
114
|
+
if (text === undefined)
|
|
115
|
+
return { effects: [{ kind: 'unknown', detail: 'script text is not known statically' }], complete: false };
|
|
116
|
+
const file = info.file ? path.normalize(info.file) : undefined;
|
|
117
|
+
if (file && inv.mayHaveChanged?.(file))
|
|
118
|
+
return { effects: [{ kind: 'unknown', detail: `script ${file} may be changed by the snippet before it runs` }], complete: false };
|
|
119
|
+
let script;
|
|
120
|
+
try {
|
|
121
|
+
script = parse(text, { firstId: 2_000_000_000 });
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
return { effects: [{ kind: 'unknown', detail: `script does not parse: ${e.message}` }], complete: false };
|
|
125
|
+
}
|
|
126
|
+
const env = {};
|
|
127
|
+
const report = analyzeScript(script, text, {
|
|
128
|
+
cwd: inv.cwd,
|
|
129
|
+
env,
|
|
130
|
+
envValues: (n) => inv.env(n),
|
|
131
|
+
policy: this.policy,
|
|
132
|
+
behaviors: this.behaviors,
|
|
133
|
+
positional,
|
|
134
|
+
nested: true,
|
|
135
|
+
});
|
|
136
|
+
// Every effect says which inner command it comes from. Conditional (`may`)
|
|
137
|
+
// effects are only possible effects of the outer command: never a definite
|
|
138
|
+
// violation, and checked individually when the script runs.
|
|
139
|
+
// External commands become `exec` effects, so denied command names are seen.
|
|
140
|
+
const effects = report.commands.flatMap((c) => {
|
|
141
|
+
const own = c.kind === 'external' || c.kind === 'not-found' ? [{ kind: 'exec', argv: c.argv }, ...c.effects] : c.effects;
|
|
142
|
+
return own.map((e) => {
|
|
143
|
+
const nested = withVia(e, { text: c.text, line: c.line, ...(file ? { file } : {}) });
|
|
144
|
+
return c.reach === 'may' ? asPossible(nested) : nested;
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
return { effects, complete: report.commands.every((c) => c.complete), readsStdin: 'maybe' };
|
|
148
|
+
}
|
|
149
|
+
initialEnv() {
|
|
150
|
+
const env = {};
|
|
151
|
+
for (const [k, v] of Object.entries(this.options.env ?? process.env))
|
|
152
|
+
if (v !== undefined)
|
|
153
|
+
env[k] = v;
|
|
154
|
+
return env;
|
|
155
|
+
}
|
|
156
|
+
/** Run a snippet. */
|
|
157
|
+
async run(source, opts = {}) {
|
|
158
|
+
// bash reads scripts line by line: lines before a syntax error still run
|
|
159
|
+
const script = typeof source === 'string' ? this.parse(source, 'script', { partial: true }) : source;
|
|
160
|
+
const runId = ++this.runCounter;
|
|
161
|
+
const controller = new AbortController();
|
|
162
|
+
const external = opts.signal;
|
|
163
|
+
const onExternalAbort = () => controller.abort();
|
|
164
|
+
external?.addEventListener('abort', onExternalAbort, { once: true });
|
|
165
|
+
if (external?.aborted)
|
|
166
|
+
controller.abort();
|
|
167
|
+
const cwd = path.resolve(this.options.cwd ?? process.cwd());
|
|
168
|
+
const state = new ShellState(cwd);
|
|
169
|
+
for (const [k, v] of Object.entries(this.initialEnv()))
|
|
170
|
+
state.globals.set(k, newVar({ kind: 'string', value: v }, { exported: true }));
|
|
171
|
+
state.globals.set('PWD', newVar({ kind: 'string', value: cwd }, { exported: true }));
|
|
172
|
+
if (!state.globals.has('HOME'))
|
|
173
|
+
state.globals.set('HOME', newVar({ kind: 'string', value: os.homedir() }, { exported: true }));
|
|
174
|
+
const shlvl = Number(state.getString('SHLVL') ?? '0') + 1;
|
|
175
|
+
state.globals.set('SHLVL', newVar({ kind: 'string', value: String(shlvl) }, { exported: true }));
|
|
176
|
+
initShellVars(state);
|
|
177
|
+
state.positional = opts.args ?? [];
|
|
178
|
+
state.arg0 = this.options.arg0 ?? 'mash';
|
|
179
|
+
const stdoutCapture = [];
|
|
180
|
+
const stderrCapture = [];
|
|
181
|
+
const denials = [];
|
|
182
|
+
const fds = new FdTable();
|
|
183
|
+
const dl = this.dataListeners;
|
|
184
|
+
fds.set(0, new HostStream(this.channel('host', 'stdin'), dl, { input: this.options.stdin ?? (async function* () { })() }));
|
|
185
|
+
fds.set(1, new HostStream(this.channel('host', 'stdout'), dl, { write: this.options.stdout ?? ((c) => void stdoutCapture.push(c)) }));
|
|
186
|
+
fds.set(2, new HostStream(this.channel('host', 'stderr'), dl, { write: this.options.stderr ?? ((c) => void stderrCapture.push(c)) }));
|
|
187
|
+
const shellPid = this.nextPidValue();
|
|
188
|
+
const jobs = new Map();
|
|
189
|
+
const allJobs = [];
|
|
190
|
+
const tracked = [];
|
|
191
|
+
const proc = new Proc(state, fds, shellPid, process.pid, 0, jobs, false);
|
|
192
|
+
const rt = {
|
|
193
|
+
emit: (e) => this.emit(e),
|
|
194
|
+
listeners: dl,
|
|
195
|
+
channel: (kind, label, extra) => this.channel(kind, label, extra),
|
|
196
|
+
nextPid: () => this.nextPidValue(),
|
|
197
|
+
nextExecId: () => ++this.execCounter,
|
|
198
|
+
shellPid,
|
|
199
|
+
assess: async (intent) => {
|
|
200
|
+
const a = await this.assess(intent);
|
|
201
|
+
if (a.action === 'deny' || a.action === 'abort')
|
|
202
|
+
denials.push({ argv: intent.argv, reason: a.reason });
|
|
203
|
+
return a;
|
|
204
|
+
},
|
|
205
|
+
assessRedirects: async (effects, node, p) => {
|
|
206
|
+
const a = await this.assessEffectsOnly(effects, node);
|
|
207
|
+
if (a.action === 'deny' || a.action === 'abort')
|
|
208
|
+
denials.push({ argv: [this.textOf(node)], reason: a.reason });
|
|
209
|
+
return a;
|
|
210
|
+
},
|
|
211
|
+
afterCommand: async (execId, status) => {
|
|
212
|
+
const ctx = this.contexts.get(execId);
|
|
213
|
+
this.contexts.delete(execId);
|
|
214
|
+
if (ctx && this.options.hooks?.afterCommand)
|
|
215
|
+
await this.options.hooks.afterCommand(ctx, status);
|
|
216
|
+
},
|
|
217
|
+
spawn: this.options.spawn ?? defaultSpawn,
|
|
218
|
+
signal: controller.signal,
|
|
219
|
+
text: (node) => this.textOf(node),
|
|
220
|
+
line: (node) => {
|
|
221
|
+
const s = this.sourceOf(node.id);
|
|
222
|
+
return s ? lineColumn(s.text, node.span.start).line : 0;
|
|
223
|
+
},
|
|
224
|
+
parse: (text, origin, opts) => this.parse(text, origin, opts),
|
|
225
|
+
findJob: (pid) => allJobs.find((j) => j.pid === pid),
|
|
226
|
+
track: (p) => void tracked.push(p.catch(() => { })),
|
|
227
|
+
registerJob: (job) => void allJobs.push(job),
|
|
228
|
+
inlineScripts: this.options.inlineScripts ?? true,
|
|
229
|
+
emulate: this.options.emulate ?? true,
|
|
230
|
+
fdPassing: this.options.procSubst ?? defaultFdPassing(),
|
|
231
|
+
};
|
|
232
|
+
const interp = new Interpreter(rt);
|
|
233
|
+
this.emit({ type: 'run:start', runId, pid: shellPid });
|
|
234
|
+
let status;
|
|
235
|
+
let aborted;
|
|
236
|
+
try {
|
|
237
|
+
status = await interp.runTop(script, proc);
|
|
238
|
+
}
|
|
239
|
+
catch (e) {
|
|
240
|
+
if (e instanceof AbortRun) {
|
|
241
|
+
status = e.status;
|
|
242
|
+
aborted = e.message;
|
|
243
|
+
controller.abort();
|
|
244
|
+
for (const j of allJobs)
|
|
245
|
+
j.kill();
|
|
246
|
+
const errText = `mash: aborted: ${e.message}\n`;
|
|
247
|
+
await fds.get(2)?.write(errText).catch(() => { });
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
throw e;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
const bg = this.options.background ?? 'wait';
|
|
254
|
+
if (bg === 'wait')
|
|
255
|
+
await Promise.all(allJobs.map((j) => j.done.catch(() => 0)));
|
|
256
|
+
else if (bg === 'kill') {
|
|
257
|
+
for (const j of allJobs)
|
|
258
|
+
if (j.status === null)
|
|
259
|
+
j.kill();
|
|
260
|
+
await Promise.all(allJobs.map((j) => j.done.catch(() => 0)));
|
|
261
|
+
}
|
|
262
|
+
if (bg !== 'detach')
|
|
263
|
+
await Promise.all(tracked);
|
|
264
|
+
fds.closeAll();
|
|
265
|
+
external?.removeEventListener('abort', onExternalAbort);
|
|
266
|
+
this.emit({ type: 'run:end', runId, status });
|
|
267
|
+
const dec = new TextDecoder();
|
|
268
|
+
const join = (chunks) => chunks.map((c) => dec.decode(c, { stream: true })).join('') + dec.decode();
|
|
269
|
+
return { status, stdout: join(stdoutCapture), stderr: join(stderrCapture), aborted, denials };
|
|
270
|
+
}
|
|
271
|
+
nextPidValue() {
|
|
272
|
+
return ++this.pidCounter;
|
|
273
|
+
}
|
|
274
|
+
channel(kind, label, extra = {}) {
|
|
275
|
+
const ch = { id: ++this.channelCounter, kind, label, ...extra };
|
|
276
|
+
if (kind !== 'host' && kind !== 'null')
|
|
277
|
+
this.emit({ type: 'channel:open', channel: ch });
|
|
278
|
+
return ch;
|
|
279
|
+
}
|
|
280
|
+
// -------------------------------------------------------------------------
|
|
281
|
+
// Assessment: behavior → effects → policy → hooks
|
|
282
|
+
// -------------------------------------------------------------------------
|
|
283
|
+
/** Effects of a builtin (most have none). */
|
|
284
|
+
builtinEffects(argv, cwd, env) {
|
|
285
|
+
const name = argv[0];
|
|
286
|
+
const resolve = (p) => known(path.resolve(cwd, p));
|
|
287
|
+
switch (name) {
|
|
288
|
+
case 'cd':
|
|
289
|
+
case 'pushd':
|
|
290
|
+
return { effects: argv[1] && argv[1] !== '-' ? [{ kind: 'chdir', path: resolve(argv[1]) }] : [] };
|
|
291
|
+
case 'source':
|
|
292
|
+
case '.':
|
|
293
|
+
return { effects: argv[1] ? [{ kind: 'read', path: resolve(argv[1]) }] : [] };
|
|
294
|
+
case 'exec':
|
|
295
|
+
case 'command':
|
|
296
|
+
case 'builtin': {
|
|
297
|
+
const rest = argv.slice(1).filter((a, i) => !(i === 0 && a.startsWith('-')));
|
|
298
|
+
if (rest.length === 0 || argv.slice(1).some((a) => a === '-v' || a === '-V'))
|
|
299
|
+
return { effects: [] };
|
|
300
|
+
return this.behaviors.analyze(this.invocation(rest, cwd, env));
|
|
301
|
+
}
|
|
302
|
+
case 'kill':
|
|
303
|
+
return { effects: [{ kind: 'process', detail: `kill ${argv.slice(1).join(' ')}` }] };
|
|
304
|
+
default:
|
|
305
|
+
return { effects: [] };
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
invocation(argv, cwd, env, stdin = 'unknown') {
|
|
309
|
+
return {
|
|
310
|
+
name: basename(argv[0]),
|
|
311
|
+
argv: argv.map(known),
|
|
312
|
+
cwd: known(cwd),
|
|
313
|
+
env: (n) => (env[n] === undefined ? undefined : known(env[n])),
|
|
314
|
+
stdin,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
async assess(intent) {
|
|
318
|
+
const policy = this.policy;
|
|
319
|
+
let result;
|
|
320
|
+
if (intent.kind === 'external') {
|
|
321
|
+
result = this.behaviors.analyze(this.invocation(intent.argv, intent.cwd, intent.env, intent.stdinKind));
|
|
322
|
+
}
|
|
323
|
+
else if (intent.kind === 'builtin') {
|
|
324
|
+
result = this.builtinEffects(intent.argv, intent.cwd, intent.env);
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
result = { effects: [] };
|
|
328
|
+
}
|
|
329
|
+
const effects = [...intent.redirectEffects, ...result.effects];
|
|
330
|
+
const findings = checkEffects(effects, policy, { runtime: true });
|
|
331
|
+
const nameFinding = intent.kind === 'external' || intent.kind === 'not-found' ? checkCommandName(intent.argv[0], policy) : null;
|
|
332
|
+
if (nameFinding)
|
|
333
|
+
findings.unshift(nameFinding);
|
|
334
|
+
findings.unshift(...checkExecEffects(result.effects, policy));
|
|
335
|
+
const denied = findings.filter((f) => f.verdict === 'deny');
|
|
336
|
+
const unknown = findings.filter((f) => f.verdict === 'unknown');
|
|
337
|
+
let decision = denied.length > 0 || (this.options.denyUnknown && unknown.length > 0) ? 'deny' : 'allow';
|
|
338
|
+
const ctx = {
|
|
339
|
+
execId: intent.execId,
|
|
340
|
+
nodeId: intent.node.id,
|
|
341
|
+
span: intent.node.span,
|
|
342
|
+
text: this.textOf(intent.node),
|
|
343
|
+
argv: intent.argv,
|
|
344
|
+
kind: intent.kind,
|
|
345
|
+
path: intent.path,
|
|
346
|
+
cwd: intent.cwd,
|
|
347
|
+
env: intent.env,
|
|
348
|
+
effects,
|
|
349
|
+
effectsComplete: result.complete !== false,
|
|
350
|
+
findings,
|
|
351
|
+
decision,
|
|
352
|
+
pid: intent.pid,
|
|
353
|
+
};
|
|
354
|
+
this.contexts.set(intent.execId, ctx);
|
|
355
|
+
let hook = undefined;
|
|
356
|
+
if (this.options.hooks?.beforeCommand)
|
|
357
|
+
hook = await this.options.hooks.beforeCommand(ctx);
|
|
358
|
+
const reasonOf = () => (denied.length > 0 ? denied : unknown).map((f) => f.reason + viaSuffix(f.effect)).join('; ') || 'denied by policy';
|
|
359
|
+
const status = this.options.deniedStatus ?? 126;
|
|
360
|
+
if (hook) {
|
|
361
|
+
switch (hook.action) {
|
|
362
|
+
case 'allow':
|
|
363
|
+
decision = 'allow';
|
|
364
|
+
break;
|
|
365
|
+
case 'deny':
|
|
366
|
+
this.emit({ type: 'command:denied', execId: intent.execId, nodeId: intent.node.id, argv: intent.argv, reason: hook.reason, findings });
|
|
367
|
+
return { action: 'deny', reason: hook.reason, status: hook.status ?? status };
|
|
368
|
+
case 'abort':
|
|
369
|
+
this.emit({ type: 'command:denied', execId: intent.execId, nodeId: intent.node.id, argv: intent.argv, reason: hook.reason, findings });
|
|
370
|
+
return { action: 'abort', reason: hook.reason, status: hook.status ?? status };
|
|
371
|
+
case 'simulate':
|
|
372
|
+
return { action: 'simulate', stdout: hook.stdout ?? '', stderr: hook.stderr ?? '', status: hook.status ?? 0 };
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
if (decision === 'deny') {
|
|
376
|
+
const reason = `denied by policy: ${reasonOf()}`;
|
|
377
|
+
this.emit({ type: 'command:denied', execId: intent.execId, nodeId: intent.node.id, argv: intent.argv, reason, findings });
|
|
378
|
+
return this.options.abortOnDeny ? { action: 'abort', reason, status } : { action: 'deny', reason, status };
|
|
379
|
+
}
|
|
380
|
+
if (this.options.dryRun && intent.kind === 'external') {
|
|
381
|
+
return { action: 'simulate', stdout: '', stderr: '', status: 0 };
|
|
382
|
+
}
|
|
383
|
+
return { action: 'run', readsStdin: result.readsStdin ?? 'maybe' };
|
|
384
|
+
}
|
|
385
|
+
async assessEffectsOnly(effects, node) {
|
|
386
|
+
if (effects.length === 0)
|
|
387
|
+
return { action: 'run', readsStdin: 'maybe' };
|
|
388
|
+
const findings = checkEffects(effects, this.policy, { runtime: true });
|
|
389
|
+
const denied = findings.filter((f) => f.verdict === 'deny');
|
|
390
|
+
if (denied.length > 0) {
|
|
391
|
+
const reason = `denied by policy: ${denied.map((f) => f.reason + viaSuffix(f.effect)).join('; ')}`;
|
|
392
|
+
this.emit({ type: 'command:denied', execId: 0, nodeId: node.id, argv: [this.textOf(node)], reason, findings });
|
|
393
|
+
const status = this.options.deniedStatus ?? 126;
|
|
394
|
+
return this.options.abortOnDeny ? { action: 'abort', reason, status } : { action: 'deny', reason, status };
|
|
395
|
+
}
|
|
396
|
+
return { action: 'run', readsStdin: 'maybe' };
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
export { Capture };
|
|
400
|
+
//# sourceMappingURL=machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.js","sourceRoot":"","sources":["../../src/machine.ts"],"names":[],"mappings":"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"}
|