atabey-shared 0.0.36 → 0.1.0-beta.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 +2 -2
- package/dist/agent-identity.d.ts +34 -0
- package/dist/agent-identity.js +77 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/api-catalog.d.ts +57 -0
- package/dist/api-catalog.js +254 -0
- package/dist/api-catalog.js.map +1 -0
- package/dist/audit-chain.d.ts +32 -3
- package/dist/audit-chain.js +188 -11
- package/dist/audit-chain.js.map +1 -1
- package/dist/audit.d.ts +8 -0
- package/dist/audit.js +44 -7
- package/dist/audit.js.map +1 -1
- package/dist/constants.d.ts +4 -3
- package/dist/constants.js +11 -12
- package/dist/constants.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/file-lock.d.ts +5 -0
- package/dist/file-lock.js +20 -31
- package/dist/file-lock.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +33 -7
- package/dist/logger.js.map +1 -1
- package/dist/memory-prune.d.ts +18 -0
- package/dist/memory-prune.js +48 -0
- package/dist/memory-prune.js.map +1 -0
- package/dist/migrations.d.ts +69 -0
- package/dist/migrations.js +375 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +39 -0
- package/dist/otel.js +93 -0
- package/dist/otel.js.map +1 -0
- package/dist/outbound-http.d.ts +32 -0
- package/dist/outbound-http.js +88 -0
- package/dist/outbound-http.js.map +1 -0
- package/dist/pii.d.ts +1 -0
- package/dist/pii.js +82 -26
- package/dist/pii.js.map +1 -1
- package/dist/policy-gate.js +27 -3
- package/dist/policy-gate.js.map +1 -1
- package/dist/retention.d.ts +6 -1
- package/dist/retention.js +56 -9
- package/dist/retention.js.map +1 -1
- package/dist/sandbox-fs.d.ts +1 -1
- package/dist/sandbox-fs.js +34 -39
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-runtime.d.ts +21 -28
- package/dist/sandbox-runtime.js +124 -92
- package/dist/sandbox-runtime.js.map +1 -1
- package/dist/secrets.d.ts +99 -0
- package/dist/secrets.js +371 -0
- package/dist/secrets.js.map +1 -0
- package/dist/storage.d.ts +67 -0
- package/dist/storage.js +291 -11
- package/dist/storage.js.map +1 -1
- package/dist/time.js +6 -2
- package/dist/time.js.map +1 -1
- package/dist/tls.d.ts +87 -0
- package/dist/tls.js +154 -0
- package/dist/tls.js.map +1 -0
- package/dist/tokenizer.d.ts +54 -0
- package/dist/tokenizer.js +272 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/worker-pool.js +19 -0
- package/dist/worker-pool.js.map +1 -1
- package/package.json +18 -6
|
@@ -1,35 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sandbox Runtime —
|
|
2
|
+
* Sandbox Runtime — Pure local OS process isolation for agent commands (Zero Docker/Container).
|
|
3
3
|
*
|
|
4
4
|
* Modes (ATABEY_SANDBOX_RUNTIME):
|
|
5
|
-
* none — host spawn (
|
|
6
|
-
* uid — host spawn with uid/gid drop (see sandbox.ts)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* none — host spawn (allow-list + env scrubbing)
|
|
6
|
+
* uid — host spawn with POSIX uid/gid drop (see sandbox.ts)
|
|
7
|
+
* seatbelt — macOS kernel sandbox (/usr/bin/sandbox-exec) confining writes to projectRoot
|
|
8
|
+
* and denying network access by default
|
|
9
|
+
* auto — seatbelt if available on macOS, else uid if configured, else none
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
+
* Hardening:
|
|
11
12
|
* ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
|
|
12
|
-
*
|
|
13
|
-
* Container defaults:
|
|
14
|
-
* ATABEY_SANDBOX_ENGINE=podman|docker|auto (prefer podman, then docker)
|
|
15
|
-
* ATABEY_SANDBOX_IMAGE=node:20-bookworm-slim
|
|
16
|
-
* ATABEY_SANDBOX_MEMORY=512m
|
|
17
|
-
* ATABEY_SANDBOX_CPUS=1
|
|
18
|
-
* ATABEY_SANDBOX_PIDS=256
|
|
19
|
-
* ATABEY_SANDBOX_NETWORK=none
|
|
13
|
+
* ATABEY_SANDBOX_NETWORK=none → deny outbound/inbound network inside seatbelt (default: none)
|
|
20
14
|
*/
|
|
21
15
|
import { resolveSandboxIdentity } from "./sandbox.js";
|
|
22
|
-
export type SandboxRuntimeMode = "none" | "uid" | "
|
|
23
|
-
export type SandboxEngine = "
|
|
16
|
+
export type SandboxRuntimeMode = "none" | "uid" | "seatbelt" | "auto";
|
|
17
|
+
export type SandboxEngine = "seatbelt" | "none";
|
|
24
18
|
export interface SandboxRuntimeConfig {
|
|
25
19
|
mode: SandboxRuntimeMode;
|
|
26
20
|
/** Resolved effective mode after auto detection. */
|
|
27
|
-
effectiveMode: "none" | "uid" | "
|
|
21
|
+
effectiveMode: "none" | "uid" | "seatbelt";
|
|
28
22
|
engine: SandboxEngine;
|
|
29
|
-
image: string;
|
|
30
|
-
memory: string;
|
|
31
|
-
cpus: string;
|
|
32
|
-
pidsLimit: number;
|
|
33
23
|
network: string;
|
|
34
24
|
required: boolean;
|
|
35
25
|
projectRoot: string;
|
|
@@ -41,7 +31,7 @@ export interface RunInSandboxRequest {
|
|
|
41
31
|
projectRoot: string;
|
|
42
32
|
timeoutMs?: number;
|
|
43
33
|
env?: NodeJS.ProcessEnv;
|
|
44
|
-
/** Optional stdin payload
|
|
34
|
+
/** Optional stdin payload. */
|
|
45
35
|
stdin?: string | Buffer;
|
|
46
36
|
}
|
|
47
37
|
export interface RunInSandboxResult {
|
|
@@ -56,10 +46,12 @@ export interface RunInSandboxResult {
|
|
|
56
46
|
export declare class SandboxRequiredError extends Error {
|
|
57
47
|
constructor(message: string);
|
|
58
48
|
}
|
|
49
|
+
export declare const SEATBELT_BINARY = "/usr/bin/sandbox-exec";
|
|
50
|
+
export declare function resolveDefaultSandboxRequired(_mode?: SandboxRuntimeMode): boolean;
|
|
59
51
|
/**
|
|
60
|
-
* Detect available
|
|
52
|
+
* Detect available native OS sandbox engine (cached).
|
|
61
53
|
*/
|
|
62
|
-
export declare function
|
|
54
|
+
export declare function detectOsSandboxEngine(): SandboxEngine;
|
|
63
55
|
/** Test helper */
|
|
64
56
|
export declare function clearSandboxRuntimeCache(): void;
|
|
65
57
|
/**
|
|
@@ -67,12 +59,13 @@ export declare function clearSandboxRuntimeCache(): void;
|
|
|
67
59
|
*/
|
|
68
60
|
export declare function resolveSandboxRuntimeConfig(projectRoot: string, timeoutMs?: number): SandboxRuntimeConfig;
|
|
69
61
|
/**
|
|
70
|
-
* Build
|
|
71
|
-
*
|
|
62
|
+
* Build macOS Seatbelt (`/usr/bin/sandbox-exec`) SBPL profile and argv.
|
|
63
|
+
* Confines file writes strictly to `projectRoot` and OS temp directories,
|
|
64
|
+
* and denies network access when `cfg.network === "none"`.
|
|
72
65
|
*/
|
|
73
|
-
export declare function
|
|
66
|
+
export declare function buildSeatbeltArgs(cfg: SandboxRuntimeConfig, command: string, args: string[]): string[];
|
|
74
67
|
/**
|
|
75
|
-
* Run a command under the configured sandbox runtime.
|
|
68
|
+
* Run a command under the configured local OS sandbox runtime.
|
|
76
69
|
*/
|
|
77
70
|
export declare function runInSandbox(req: RunInSandboxRequest): Promise<RunInSandboxResult>;
|
|
78
71
|
/**
|
package/dist/sandbox-runtime.js
CHANGED
|
@@ -1,33 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sandbox Runtime —
|
|
2
|
+
* Sandbox Runtime — Pure local OS process isolation for agent commands (Zero Docker/Container).
|
|
3
3
|
*
|
|
4
4
|
* Modes (ATABEY_SANDBOX_RUNTIME):
|
|
5
|
-
* none — host spawn (
|
|
6
|
-
* uid — host spawn with uid/gid drop (see sandbox.ts)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* none — host spawn (allow-list + env scrubbing)
|
|
6
|
+
* uid — host spawn with POSIX uid/gid drop (see sandbox.ts)
|
|
7
|
+
* seatbelt — macOS kernel sandbox (/usr/bin/sandbox-exec) confining writes to projectRoot
|
|
8
|
+
* and denying network access by default
|
|
9
|
+
* auto — seatbelt if available on macOS, else uid if configured, else none
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
+
* Hardening:
|
|
11
12
|
* ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
|
|
12
|
-
*
|
|
13
|
-
* Container defaults:
|
|
14
|
-
* ATABEY_SANDBOX_ENGINE=podman|docker|auto (prefer podman, then docker)
|
|
15
|
-
* ATABEY_SANDBOX_IMAGE=node:20-bookworm-slim
|
|
16
|
-
* ATABEY_SANDBOX_MEMORY=512m
|
|
17
|
-
* ATABEY_SANDBOX_CPUS=1
|
|
18
|
-
* ATABEY_SANDBOX_PIDS=256
|
|
19
|
-
* ATABEY_SANDBOX_NETWORK=none
|
|
13
|
+
* ATABEY_SANDBOX_NETWORK=none → deny outbound/inbound network inside seatbelt (default: none)
|
|
20
14
|
*/
|
|
21
15
|
import { spawn, execFileSync } from "child_process";
|
|
22
16
|
import fs from "fs";
|
|
23
17
|
import path from "path";
|
|
24
18
|
import { applySandboxToSpawnOptions, resolveSandboxIdentity, sandboxSpawn, } from "./sandbox.js";
|
|
19
|
+
import { scrubEnvForSubprocess } from "./secrets.js";
|
|
25
20
|
export class SandboxRequiredError extends Error {
|
|
26
21
|
constructor(message) {
|
|
27
22
|
super(message);
|
|
28
23
|
this.name = "SandboxRequiredError";
|
|
29
24
|
}
|
|
30
25
|
}
|
|
26
|
+
export const SEATBELT_BINARY = "/usr/bin/sandbox-exec";
|
|
31
27
|
let cachedEngine = null;
|
|
32
28
|
function envStr(key, fallback) {
|
|
33
29
|
const v = process.env[key];
|
|
@@ -39,40 +35,53 @@ function envBool(key, fallback = false) {
|
|
|
39
35
|
return fallback;
|
|
40
36
|
return v === "true" || v === "1" || v === "yes";
|
|
41
37
|
}
|
|
38
|
+
let warnedDevUnsandboxed = false;
|
|
39
|
+
export function resolveDefaultSandboxRequired(_mode = "auto") {
|
|
40
|
+
if (process.env.ATABEY_SANDBOX_REQUIRED !== undefined) {
|
|
41
|
+
return envBool("ATABEY_SANDBOX_REQUIRED", true);
|
|
42
|
+
}
|
|
43
|
+
if (envBool("ATABEY_ALLOW_UNSANDBOXED", false)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const profile = (process.env.ATABEY_PROFILE || "").toLowerCase();
|
|
47
|
+
if (process.env.NODE_ENV === "production" || profile === "enterprise") {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const isTestEnv = Boolean(process.env.VITEST) || process.env.NODE_ENV === "test";
|
|
51
|
+
if (isTestEnv) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (!warnedDevUnsandboxed) {
|
|
55
|
+
warnedDevUnsandboxed = true;
|
|
56
|
+
process.stderr.write("[SANDBOX] No isolation enforced (local dev). Set ATABEY_SANDBOX_REQUIRED=true " +
|
|
57
|
+
"to enforce OS process isolation (seatbelt/uid).\n");
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
42
61
|
/**
|
|
43
|
-
* Detect available
|
|
62
|
+
* Detect available native OS sandbox engine (cached).
|
|
44
63
|
*/
|
|
45
|
-
export function
|
|
64
|
+
export function detectOsSandboxEngine() {
|
|
46
65
|
if (cachedEngine)
|
|
47
66
|
return cachedEngine;
|
|
48
67
|
const prefer = envStr("ATABEY_SANDBOX_ENGINE", "auto").toLowerCase();
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
execFileSync(name, ["--version"], {
|
|
52
|
-
encoding: "utf8",
|
|
53
|
-
timeout: 3000,
|
|
54
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
55
|
-
});
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
if (prefer === "podman" || prefer === "docker") {
|
|
63
|
-
cachedEngine = tryEngine(prefer) ? prefer : "none";
|
|
68
|
+
if (prefer === "none") {
|
|
69
|
+
cachedEngine = "none";
|
|
64
70
|
return cachedEngine;
|
|
65
71
|
}
|
|
66
|
-
|
|
67
|
-
|
|
72
|
+
try {
|
|
73
|
+
execFileSync(SEATBELT_BINARY, ["-p", "(version 1)(allow default)", "/usr/bin/true"], {
|
|
74
|
+
encoding: "utf8",
|
|
75
|
+
timeout: 3000,
|
|
76
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
77
|
+
});
|
|
78
|
+
cachedEngine = "seatbelt";
|
|
68
79
|
return cachedEngine;
|
|
69
80
|
}
|
|
70
|
-
|
|
71
|
-
cachedEngine = "
|
|
81
|
+
catch {
|
|
82
|
+
cachedEngine = "none";
|
|
72
83
|
return cachedEngine;
|
|
73
84
|
}
|
|
74
|
-
cachedEngine = "none";
|
|
75
|
-
return cachedEngine;
|
|
76
85
|
}
|
|
77
86
|
/** Test helper */
|
|
78
87
|
export function clearSandboxRuntimeCache() {
|
|
@@ -82,10 +91,13 @@ export function clearSandboxRuntimeCache() {
|
|
|
82
91
|
* Resolve full runtime configuration for a project.
|
|
83
92
|
*/
|
|
84
93
|
export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
|
|
85
|
-
const
|
|
86
|
-
const
|
|
94
|
+
const rawMode = envStr("ATABEY_SANDBOX_RUNTIME", "auto").toLowerCase() || "auto";
|
|
95
|
+
const mode = ["none", "uid", "seatbelt", "auto"].includes(rawMode)
|
|
96
|
+
? rawMode
|
|
97
|
+
: "auto";
|
|
98
|
+
const engine = detectOsSandboxEngine();
|
|
87
99
|
const identity = resolveSandboxIdentity();
|
|
88
|
-
const required =
|
|
100
|
+
const required = resolveDefaultSandboxRequired(mode);
|
|
89
101
|
let effectiveMode;
|
|
90
102
|
if (mode === "none") {
|
|
91
103
|
effectiveMode = "none";
|
|
@@ -93,26 +105,22 @@ export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
|
|
|
93
105
|
else if (mode === "uid") {
|
|
94
106
|
effectiveMode = identity.enabled ? "uid" : "none";
|
|
95
107
|
}
|
|
96
|
-
else if (mode === "
|
|
97
|
-
effectiveMode = engine
|
|
108
|
+
else if (mode === "seatbelt") {
|
|
109
|
+
effectiveMode = engine === "seatbelt" ? "seatbelt" : "none";
|
|
98
110
|
}
|
|
99
111
|
else {
|
|
100
|
-
// auto
|
|
101
|
-
if (engine
|
|
102
|
-
effectiveMode = "
|
|
112
|
+
// auto: prefer native OS seatbelt, then uid drop, else none
|
|
113
|
+
if (engine === "seatbelt")
|
|
114
|
+
effectiveMode = "seatbelt";
|
|
103
115
|
else if (identity.enabled)
|
|
104
116
|
effectiveMode = "uid";
|
|
105
117
|
else
|
|
106
118
|
effectiveMode = "none";
|
|
107
119
|
}
|
|
108
120
|
return {
|
|
109
|
-
mode
|
|
121
|
+
mode,
|
|
110
122
|
effectiveMode,
|
|
111
|
-
engine,
|
|
112
|
-
image: envStr("ATABEY_SANDBOX_IMAGE", "node:20-bookworm-slim"),
|
|
113
|
-
memory: envStr("ATABEY_SANDBOX_MEMORY", "512m"),
|
|
114
|
-
cpus: envStr("ATABEY_SANDBOX_CPUS", "1"),
|
|
115
|
-
pidsLimit: parseInt(envStr("ATABEY_SANDBOX_PIDS", "256"), 10) || 256,
|
|
123
|
+
engine: effectiveMode === "seatbelt" ? "seatbelt" : "none",
|
|
116
124
|
network: envStr("ATABEY_SANDBOX_NETWORK", "none"),
|
|
117
125
|
required,
|
|
118
126
|
projectRoot: path.resolve(projectRoot),
|
|
@@ -120,8 +128,8 @@ export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
|
|
|
120
128
|
};
|
|
121
129
|
}
|
|
122
130
|
function isolationLabel(cfg) {
|
|
123
|
-
if (cfg.effectiveMode === "
|
|
124
|
-
return `
|
|
131
|
+
if (cfg.effectiveMode === "seatbelt") {
|
|
132
|
+
return `os/seatbelt network=${cfg.network} root=${cfg.projectRoot}`;
|
|
125
133
|
}
|
|
126
134
|
if (cfg.effectiveMode === "uid") {
|
|
127
135
|
const id = resolveSandboxIdentity();
|
|
@@ -129,36 +137,41 @@ function isolationLabel(cfg) {
|
|
|
129
137
|
}
|
|
130
138
|
return "none (host process)";
|
|
131
139
|
}
|
|
140
|
+
function escapeSbplString(value) {
|
|
141
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
142
|
+
}
|
|
132
143
|
/**
|
|
133
|
-
* Build
|
|
134
|
-
*
|
|
144
|
+
* Build macOS Seatbelt (`/usr/bin/sandbox-exec`) SBPL profile and argv.
|
|
145
|
+
* Confines file writes strictly to `projectRoot` and OS temp directories,
|
|
146
|
+
* and denies network access when `cfg.network === "none"`.
|
|
135
147
|
*/
|
|
136
|
-
export function
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
"
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
148
|
+
export function buildSeatbeltArgs(cfg, command, args) {
|
|
149
|
+
const resolvedRoot = fs.existsSync(cfg.projectRoot)
|
|
150
|
+
? fs.realpathSync(cfg.projectRoot)
|
|
151
|
+
: path.resolve(cfg.projectRoot);
|
|
152
|
+
const lexicalRoot = path.resolve(cfg.projectRoot);
|
|
153
|
+
const allowPaths = new Set([
|
|
154
|
+
resolvedRoot,
|
|
155
|
+
lexicalRoot,
|
|
156
|
+
"/tmp",
|
|
157
|
+
"/private/tmp",
|
|
158
|
+
"/var/folders",
|
|
159
|
+
"/private/var/folders",
|
|
160
|
+
]);
|
|
161
|
+
const subpathRules = [...allowPaths]
|
|
162
|
+
.map((p) => `(subpath "${escapeSbplString(p)}")`)
|
|
163
|
+
.join(" ");
|
|
164
|
+
const netRule = cfg.network === "none" ? "(deny network*)" : "";
|
|
165
|
+
const profile = [
|
|
166
|
+
"(version 1)",
|
|
167
|
+
"(allow default)",
|
|
168
|
+
netRule,
|
|
169
|
+
'(deny file-write* (subpath "/"))',
|
|
170
|
+
`(allow file-write* ${subpathRules} (literal "/dev/null") (literal "/dev/zero") (literal "/dev/tty"))`,
|
|
171
|
+
]
|
|
172
|
+
.filter(Boolean)
|
|
173
|
+
.join("");
|
|
174
|
+
return ["-p", profile, command, ...args];
|
|
162
175
|
}
|
|
163
176
|
function collectOutput(child, stdin) {
|
|
164
177
|
return new Promise((resolve) => {
|
|
@@ -182,14 +195,14 @@ function collectOutput(child, stdin) {
|
|
|
182
195
|
});
|
|
183
196
|
}
|
|
184
197
|
/**
|
|
185
|
-
* Run a command under the configured sandbox runtime.
|
|
198
|
+
* Run a command under the configured local OS sandbox runtime.
|
|
186
199
|
*/
|
|
187
200
|
export async function runInSandbox(req) {
|
|
188
201
|
const cfg = resolveSandboxRuntimeConfig(req.projectRoot, req.timeoutMs);
|
|
189
202
|
const label = isolationLabel(cfg);
|
|
190
203
|
if (cfg.required && cfg.effectiveMode === "none") {
|
|
191
|
-
throw new SandboxRequiredError("[SANDBOX_REQUIRED] ATABEY_SANDBOX_REQUIRED=true but no isolation is available. " +
|
|
192
|
-
"
|
|
204
|
+
throw new SandboxRequiredError("[SANDBOX_REQUIRED] ATABEY_SANDBOX_REQUIRED=true but no OS isolation is available. " +
|
|
205
|
+
"Use macOS seatbelt (ATABEY_SANDBOX_RUNTIME=seatbelt) or configure ATABEY_SANDBOX_UID/USER " +
|
|
193
206
|
"(ATABEY_SANDBOX_RUNTIME=uid), or set ATABEY_SANDBOX_REQUIRED=false for local dev.");
|
|
194
207
|
}
|
|
195
208
|
if (!fs.existsSync(cfg.projectRoot)) {
|
|
@@ -200,30 +213,49 @@ export async function runInSandbox(req) {
|
|
|
200
213
|
"pipe",
|
|
201
214
|
"pipe",
|
|
202
215
|
];
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
216
|
+
const baseEnv = req.env ?? process.env;
|
|
217
|
+
const childEnv = envBool("ATABEY_SANDBOX_PASS_ENV", false)
|
|
218
|
+
? baseEnv
|
|
219
|
+
: scrubEnvForSubprocess(baseEnv);
|
|
220
|
+
if (!envBool("ATABEY_ALLOW_INTERACTIVE", false)) {
|
|
221
|
+
const nonInteractive = {
|
|
222
|
+
CI: "true",
|
|
223
|
+
DEBIAN_FRONTEND: "noninteractive",
|
|
224
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
225
|
+
GIT_ASKPASS: "echo",
|
|
226
|
+
PAGER: "cat",
|
|
227
|
+
TERM: "dumb",
|
|
228
|
+
npm_config_yes: "true",
|
|
229
|
+
PIP_NO_INPUT: "1",
|
|
230
|
+
};
|
|
231
|
+
for (const [k, v] of Object.entries(nonInteractive)) {
|
|
232
|
+
if (childEnv[k] === undefined)
|
|
233
|
+
childEnv[k] = v;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (cfg.effectiveMode === "seatbelt" && cfg.engine === "seatbelt") {
|
|
237
|
+
const seatbeltArgs = buildSeatbeltArgs(cfg, req.command, req.args);
|
|
238
|
+
const child = spawn(SEATBELT_BINARY, seatbeltArgs, {
|
|
206
239
|
cwd: cfg.projectRoot,
|
|
207
240
|
timeout: cfg.timeoutMs,
|
|
208
241
|
shell: false,
|
|
209
242
|
stdio,
|
|
210
|
-
env:
|
|
243
|
+
env: childEnv,
|
|
211
244
|
});
|
|
212
245
|
const result = await collectOutput(child, req.stdin);
|
|
213
246
|
return {
|
|
214
247
|
...result,
|
|
215
|
-
runtime: "
|
|
216
|
-
engine:
|
|
248
|
+
runtime: "seatbelt",
|
|
249
|
+
engine: "seatbelt",
|
|
217
250
|
isolationLabel: label,
|
|
218
251
|
};
|
|
219
252
|
}
|
|
220
|
-
// uid or none — host spawn (uid options applied when available)
|
|
221
253
|
const spawnOpts = {
|
|
222
254
|
cwd: cfg.projectRoot,
|
|
223
255
|
timeout: cfg.timeoutMs,
|
|
224
256
|
shell: false,
|
|
225
257
|
stdio,
|
|
226
|
-
env:
|
|
258
|
+
env: childEnv,
|
|
227
259
|
};
|
|
228
260
|
const child = cfg.effectiveMode === "uid"
|
|
229
261
|
? sandboxSpawn(req.command, req.args, spawnOpts)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../src/sandbox-runtime.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../src/sandbox-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret Management & Leak Guard (Phase 1.5)
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* 1. Encrypted local secret vault (.atabey/secrets.vault.json) using AES-256-GCM
|
|
6
|
+
* with per-secret random salt (HKDF-SHA256) and 96-bit IV.
|
|
7
|
+
* 2. Subprocess environment scrubber (strips sensitive keys before spawning child processes).
|
|
8
|
+
* 3. Secret leak scanner (detects API keys, cloud credentials, private keys, and vault values).
|
|
9
|
+
*/
|
|
10
|
+
export interface VaultEntry {
|
|
11
|
+
/** Base64-encoded 16-byte HKDF salt */
|
|
12
|
+
salt: string;
|
|
13
|
+
/** Base64-encoded 12-byte GCM initialization vector */
|
|
14
|
+
iv: string;
|
|
15
|
+
/** Base64-encoded 16-byte GCM authentication tag */
|
|
16
|
+
tag: string;
|
|
17
|
+
/** Base64-encoded ciphertext */
|
|
18
|
+
ciphertext: string;
|
|
19
|
+
/** ISO-8601 creation timestamp */
|
|
20
|
+
createdAt: string;
|
|
21
|
+
/** ISO-8601 last update timestamp */
|
|
22
|
+
updatedAt: string;
|
|
23
|
+
/** Optional non-sensitive description */
|
|
24
|
+
description?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface VaultFile {
|
|
27
|
+
version: 1;
|
|
28
|
+
entries: Record<string, VaultEntry>;
|
|
29
|
+
}
|
|
30
|
+
export interface SecretMetadata {
|
|
31
|
+
name: string;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
updatedAt: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface SecretFinding {
|
|
37
|
+
ruleId: string;
|
|
38
|
+
description: string;
|
|
39
|
+
matchPreview: string;
|
|
40
|
+
index: number;
|
|
41
|
+
}
|
|
42
|
+
export declare class SecretManager {
|
|
43
|
+
private static resolveVaultDir;
|
|
44
|
+
private static resolveMasterKey;
|
|
45
|
+
private static vaultFilePath;
|
|
46
|
+
private static readVault;
|
|
47
|
+
private static writeVault;
|
|
48
|
+
/**
|
|
49
|
+
* Encrypt and store a secret in the local AES-256-GCM vault.
|
|
50
|
+
*/
|
|
51
|
+
static setSecret(name: string, value: string, options?: {
|
|
52
|
+
description?: string;
|
|
53
|
+
vaultDir?: string;
|
|
54
|
+
}): void;
|
|
55
|
+
/**
|
|
56
|
+
* Retrieve and decrypt a secret by name.
|
|
57
|
+
* Checks process.env[name] fallback only when allowEnvFallback is true.
|
|
58
|
+
*/
|
|
59
|
+
static getSecret(name: string, options?: {
|
|
60
|
+
vaultDir?: string;
|
|
61
|
+
allowEnvFallback?: boolean;
|
|
62
|
+
}): string | null;
|
|
63
|
+
/**
|
|
64
|
+
* Delete a secret from the vault.
|
|
65
|
+
*/
|
|
66
|
+
static deleteSecret(name: string, options?: {
|
|
67
|
+
vaultDir?: string;
|
|
68
|
+
}): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* List stored secret metadata without exposing plaintext values.
|
|
71
|
+
*/
|
|
72
|
+
static listSecrets(options?: {
|
|
73
|
+
vaultDir?: string;
|
|
74
|
+
}): SecretMetadata[];
|
|
75
|
+
/**
|
|
76
|
+
* Re-encrypt all vault entries under a new 32-byte master key.
|
|
77
|
+
*
|
|
78
|
+
* Safe ordering: decrypt everything first, build the new vault in memory,
|
|
79
|
+
* then atomically swap. The previous key is kept as `master.key.bak` for
|
|
80
|
+
* the duration of the swap and restored on failure, so a mid-rotation error
|
|
81
|
+
* cannot make the vault permanently undecryptable.
|
|
82
|
+
*/
|
|
83
|
+
static rotateMasterKey(newKeyMaterial: string | Buffer, options?: {
|
|
84
|
+
vaultDir?: string;
|
|
85
|
+
}): number;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Scrub sensitive credentials from an environment object before passing to a child process.
|
|
89
|
+
*/
|
|
90
|
+
export declare function scrubEnvForSubprocess(env?: NodeJS.ProcessEnv, extraAllowedKeys?: string[]): NodeJS.ProcessEnv;
|
|
91
|
+
/**
|
|
92
|
+
* Scan arbitrary text (command output, file content, tool arguments) for leaked secrets.
|
|
93
|
+
*/
|
|
94
|
+
export declare function scanForSecrets(text: string): SecretFinding[];
|
|
95
|
+
/**
|
|
96
|
+
* Redact leaked secrets from text before it is returned to an AI/LLM.
|
|
97
|
+
* Complements PII masking with cloud-credential/private-key patterns.
|
|
98
|
+
*/
|
|
99
|
+
export declare function redactSecrets(text: string): string;
|