@descryy/runtime-controller 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/attach-discovery.d.ts +94 -0
  2. package/dist/attach-discovery.d.ts.map +1 -0
  3. package/dist/attach-discovery.js +238 -0
  4. package/dist/attach-discovery.js.map +1 -0
  5. package/dist/attach-fencing.d.ts +109 -0
  6. package/dist/attach-fencing.d.ts.map +1 -0
  7. package/dist/attach-fencing.js +215 -0
  8. package/dist/attach-fencing.js.map +1 -0
  9. package/dist/capability-registry.d.ts +9 -0
  10. package/dist/capability-registry.d.ts.map +1 -0
  11. package/dist/capability-registry.js +32 -0
  12. package/dist/capability-registry.js.map +1 -0
  13. package/dist/collector-version.d.ts +3 -0
  14. package/dist/collector-version.d.ts.map +1 -0
  15. package/dist/collector-version.js +5 -0
  16. package/dist/collector-version.js.map +1 -0
  17. package/dist/container-sandbox.d.ts +104 -0
  18. package/dist/container-sandbox.d.ts.map +1 -0
  19. package/dist/container-sandbox.js +152 -0
  20. package/dist/container-sandbox.js.map +1 -0
  21. package/dist/controller.d.ts +152 -0
  22. package/dist/controller.d.ts.map +1 -0
  23. package/dist/controller.js +464 -0
  24. package/dist/controller.js.map +1 -0
  25. package/dist/dependency-version-check.d.ts +36 -0
  26. package/dist/dependency-version-check.d.ts.map +1 -0
  27. package/dist/dependency-version-check.js +72 -0
  28. package/dist/dependency-version-check.js.map +1 -0
  29. package/dist/env.d.ts +10 -0
  30. package/dist/env.d.ts.map +1 -0
  31. package/dist/env.js +12 -0
  32. package/dist/env.js.map +1 -0
  33. package/dist/environment-metadata.d.ts +15 -0
  34. package/dist/environment-metadata.d.ts.map +1 -0
  35. package/dist/environment-metadata.js +63 -0
  36. package/dist/environment-metadata.js.map +1 -0
  37. package/dist/environment-version-check.d.ts +40 -0
  38. package/dist/environment-version-check.d.ts.map +1 -0
  39. package/dist/environment-version-check.js +176 -0
  40. package/dist/environment-version-check.js.map +1 -0
  41. package/dist/execution-safety.d.ts +96 -0
  42. package/dist/execution-safety.d.ts.map +1 -0
  43. package/dist/execution-safety.js +140 -0
  44. package/dist/execution-safety.js.map +1 -0
  45. package/dist/index.d.ts +33 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +18 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/orchestration.d.ts +55 -0
  50. package/dist/orchestration.d.ts.map +1 -0
  51. package/dist/orchestration.js +219 -0
  52. package/dist/orchestration.js.map +1 -0
  53. package/dist/preflight.d.ts +122 -0
  54. package/dist/preflight.d.ts.map +1 -0
  55. package/dist/preflight.js +177 -0
  56. package/dist/preflight.js.map +1 -0
  57. package/dist/process-collector.d.ts +20 -0
  58. package/dist/process-collector.d.ts.map +1 -0
  59. package/dist/process-collector.js +116 -0
  60. package/dist/process-collector.js.map +1 -0
  61. package/dist/process-identity.d.ts +46 -0
  62. package/dist/process-identity.d.ts.map +1 -0
  63. package/dist/process-identity.js +186 -0
  64. package/dist/process-identity.js.map +1 -0
  65. package/dist/process-manager.d.ts +137 -0
  66. package/dist/process-manager.d.ts.map +1 -0
  67. package/dist/process-manager.js +382 -0
  68. package/dist/process-manager.js.map +1 -0
  69. package/dist/readiness.d.ts +122 -0
  70. package/dist/readiness.d.ts.map +1 -0
  71. package/dist/readiness.js +214 -0
  72. package/dist/readiness.js.map +1 -0
  73. package/dist/sandbox.d.ts +94 -0
  74. package/dist/sandbox.d.ts.map +1 -0
  75. package/dist/sandbox.js +228 -0
  76. package/dist/sandbox.js.map +1 -0
  77. package/package.json +2 -2
@@ -0,0 +1,228 @@
1
+ /**
2
+ * §21's execution boundary, real isolation half. RT-070/RT-193 gave this runtime a
3
+ * *named* boundary (trusted-local, resource limits, privilege reporting) but not an
4
+ * *isolating* one -- nothing stopped a spawned process from reading any file, or
5
+ * reaching any host, the invoking user could. This module closes that gap for real,
6
+ * on Linux, for processes this runtime SPAWNS.
7
+ *
8
+ * **Architectural constraint this module cannot solve around:** isolation can only
9
+ * wrap a process Descry itself launches. Attach-mode reaches a process already
10
+ * running, unconfined, before Descry touched it -- there is no honest way to
11
+ * retroactively contain it (ptrace-based interception was investigated and rejected
12
+ * elsewhere as not honestly generalizable). Attach-mode stays permanently and
13
+ * explicitly unsandboxed -- `SANDBOX_BOUNDARY_DISCLOSURE` in `execution-safety.ts`
14
+ * discloses this in-product; this module does not and structurally cannot change it.
15
+ *
16
+ * **Mechanism: bubblewrap (bwrap), not raw `unshare`/`clone`.** bwrap is the
17
+ * unprivileged sandboxing helper behind Flatpak -- small, auditable, actively
18
+ * maintained, not a bespoke native module this repo builds per-platform. Runs
19
+ * setuid-free on any kernel with unprivileged user namespaces enabled (checked
20
+ * below, never assumed) and gives one process a new mount namespace (real
21
+ * filesystem visibility control) and network namespace (real network denial) in one
22
+ * exec. Composes with `applyResourceLimits`'s `prlimit` wrap and with
23
+ * `process-manager.ts`'s process-group kill -- verified directly: bwrap does not
24
+ * create a new process group unless asked, so the existing group-kill reaches it
25
+ * unchanged. The one dependency this buys: `bwrap` must be on PATH, reported as a
26
+ * capability exactly like `prlimit` -- refused, never silently unconstrained, when
27
+ * requested and absent.
28
+ *
29
+ * **NOT attempted, deliberately: a native macOS or Windows sandbox.** `sandbox-exec`/
30
+ * Seatbelt is deprecated with no public API replacement; the Endpoint Security
31
+ * Framework needs an Apple entitlement this project doesn't have; Windows Job
32
+ * Objects + AppContainer + WFP would be a second and third bespoke native sandbox.
33
+ * This is an explicit decision not to build native sandboxes for those platforms at
34
+ * all -- `../container-sandbox.ts` closes the gap instead, routing macOS/Windows
35
+ * through a real Docker container that reuses this module's proven Linux mechanism
36
+ * (see that module's doc for what's real-tested there vs unverified on real
37
+ * hardware). `filesystemIsolationCapability`/`networkIsolationCapability` below
38
+ * still report `unavailable` with a reason on non-Linux -- never silently claimed
39
+ * as covered.
40
+ */
41
+ import { execFileSync } from "node:child_process";
42
+ import { accessSync, constants as fsConstants, readFileSync, realpathSync } from "node:fs";
43
+ import { dirname, isAbsolute, join, relative } from "node:path";
44
+ /**
45
+ * Whether unprivileged user namespaces -- the kernel feature bwrap needs to build a
46
+ * mount/network namespace without running setuid-root -- are actually enabled on
47
+ * this host, never merely assumed from "the kernel supports namespaces in general."
48
+ * Two independent sysctls can each disable it. IMPORTANT: a sysctl file not existing
49
+ * is NOT evidence it's unrestricted -- only Debian/Ubuntu-derived kernels gate it
50
+ * through `unprivileged_userns_clone` at all, so a missing file proves nothing
51
+ * either way. We can't tell from absence, so we don't read it as a positive signal:
52
+ * `ok: true` here means "neither sysctl was found to explicitly disable it," not
53
+ * "isolation is confirmed available" -- it only rules out these two specific,
54
+ * explicit-disable signals.
55
+ */
56
+ function unprivilegedUserNamespaceStatus() {
57
+ try {
58
+ const clone = readFileSync("/proc/sys/kernel/unprivileged_userns_clone", "utf8").trim();
59
+ if (clone === "0") {
60
+ return { ok: false, reason: "kernel.unprivileged_userns_clone=0 -- unprivileged user namespaces are disabled on this host" };
61
+ }
62
+ }
63
+ catch {
64
+ // Sysctl absent -- not evidence either way, not just non-Debian kernels.
65
+ }
66
+ try {
67
+ const max = readFileSync("/proc/sys/user/max_user_namespaces", "utf8").trim();
68
+ if (max === "0") {
69
+ return { ok: false, reason: "user.max_user_namespaces=0 -- unprivileged user namespaces are disabled on this host" };
70
+ }
71
+ }
72
+ catch {
73
+ // Same reasoning: absent is not evidence of a restriction.
74
+ }
75
+ return { ok: true, reason: null };
76
+ }
77
+ /** Real capability check, same shape as `resourceLimitCapability`: PATH existence first, then the Linux-specific precondition existence alone doesn't prove -- unprivileged user namespaces actually usable, not just bwrap installed. */
78
+ export function filesystemIsolationCapability(env = process.env, platform = process.platform) {
79
+ if (platform !== "linux") {
80
+ return {
81
+ availability: "unavailable",
82
+ reason: `no filesystem isolation mechanism is wired up on "${platform}" for bwrap -- by design, not by omission (native sandbox-exec/Seatbelt and Job Objects/AppContainer were researched and rejected); see container-sandbox.ts, which routes "${platform}" through a real Docker container instead`,
83
+ };
84
+ }
85
+ try {
86
+ execFileSync("bwrap", ["--version"], { env, stdio: "ignore" });
87
+ }
88
+ catch {
89
+ return {
90
+ availability: "unavailable",
91
+ reason: "bubblewrap (bwrap) is not on PATH -- filesystem isolation cannot be enforced without it",
92
+ };
93
+ }
94
+ const userns = unprivilegedUserNamespaceStatus();
95
+ if (!userns.ok) {
96
+ return { availability: "unavailable", reason: `bubblewrap is installed but unprivileged user namespaces are unavailable: ${userns.reason}` };
97
+ }
98
+ return { availability: "available", reason: null };
99
+ }
100
+ /** Same underlying mechanism as `filesystemIsolationCapability` (one bwrap namespace set covers both) -- delegates rather than duplicating. Kept as its own function because the two policies are declared and reasoned about independently. */
101
+ export function networkIsolationCapability(env = process.env, platform = process.platform) {
102
+ return filesystemIsolationCapability(env, platform);
103
+ }
104
+ /**
105
+ * `NetworkPolicy`'s general shape (arbitrary allow/deny host lists) is not what
106
+ * this mechanism enforces -- only full denial. Returns the reason a policy can't be
107
+ * applied, or `null` if it's the one shape that can. Checked independently of
108
+ * `networkIsolationCapability`: "nothing here can enforce any policy" and "this
109
+ * specific policy asks for something not built yet" are different claims.
110
+ */
111
+ export function unsupportedNetworkPolicyReason(policy) {
112
+ if (policy.mode === "allow" && policy.hosts.length === 0)
113
+ return null;
114
+ return ('only full network denial ({ mode: "allow", hosts: [] }) is enforced -- selective allow- or deny-listing of ' +
115
+ "specific hosts needs DNS interception and IP filtering inside the sandbox's network namespace (a veth pair, " +
116
+ "NAT, iptables/nftables rules), not built in this iteration");
117
+ }
118
+ function isWithin(root, target) {
119
+ const rel = relative(root, target);
120
+ return rel === "" || (!rel.startsWith("..") && !isAbsolute(rel));
121
+ }
122
+ /**
123
+ * Resolves the real, symlink-followed directory containing the executable
124
+ * `command` would run as -- the one extra host path a sandboxed process needs
125
+ * beyond standard OS dirs and whatever the caller declared. Computed generically,
126
+ * not per-language: an interpreter installed outside `/usr` (nvm, rbenv, pyenv,
127
+ * sdkman) would otherwise be invisible inside the sandbox regardless of language.
128
+ * Returns `null` when unresolvable -- the caller proceeds without an extra bind;
129
+ * the exec fails inside the sandbox the same honest way it would outside one.
130
+ */
131
+ export function resolveExecutableDirectory(command, cwd, env) {
132
+ let candidate = null;
133
+ if (command.includes("/")) {
134
+ candidate = isAbsolute(command) ? command : join(cwd, command);
135
+ }
136
+ else {
137
+ const pathVar = env.PATH ?? "";
138
+ for (const dir of pathVar.split(":")) {
139
+ if (dir === "")
140
+ continue;
141
+ const full = join(dir, command);
142
+ try {
143
+ accessSync(full, fsConstants.X_OK);
144
+ candidate = full;
145
+ break;
146
+ }
147
+ catch {
148
+ continue;
149
+ }
150
+ }
151
+ }
152
+ if (candidate === null)
153
+ return null;
154
+ try {
155
+ return dirname(realpathSync(candidate));
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }
161
+ /**
162
+ * Wraps `command`/`args` with `bwrap` so the OS enforces `filesystemPolicy`/
163
+ * `networkPolicy`. Neither declared returns them unchanged -- same non-regression
164
+ * contract as `applyResourceLimits`.
165
+ *
166
+ * **Throws rather than silently spawning unconstrained** when a policy is
167
+ * requested and the real mechanism can't back it -- no mechanism on this platform,
168
+ * or a declared shape this mechanism doesn't implement.
169
+ *
170
+ * Composes with `applyResourceLimits` by wrapping *outside* it (`bwrap … --
171
+ * prlimit … -- realCommand`) -- the mount namespace must exist before `prlimit` or
172
+ * the real command run inside it; `prlimit` (in `/usr/bin`) is reachable through
173
+ * the same base OS binding every sandboxed process gets.
174
+ */
175
+ export function applySandbox(options) {
176
+ const { filesystemPolicy, networkPolicy } = options;
177
+ if (filesystemPolicy === undefined && networkPolicy === undefined) {
178
+ return { command: options.command, args: options.args };
179
+ }
180
+ const env = options.env ?? process.env;
181
+ const platform = options.platform ?? process.platform;
182
+ if (networkPolicy !== undefined) {
183
+ const shapeReason = unsupportedNetworkPolicyReason(networkPolicy);
184
+ if (shapeReason !== null) {
185
+ throw new Error(`networkPolicy was configured but cannot be enforced: ${shapeReason}`);
186
+ }
187
+ const capability = networkIsolationCapability(env, platform);
188
+ if (capability.availability !== "available") {
189
+ throw new Error(`networkPolicy was configured but cannot be enforced on this platform: ${capability.reason}`);
190
+ }
191
+ }
192
+ if (filesystemPolicy !== undefined) {
193
+ const capability = filesystemIsolationCapability(env, platform);
194
+ if (capability.availability !== "available") {
195
+ throw new Error(`filesystemPolicy was configured but cannot be enforced on this platform: ${capability.reason}`);
196
+ }
197
+ }
198
+ const bwrapArgs = [];
199
+ if (filesystemPolicy !== undefined) {
200
+ bwrapArgs.push("--ro-bind", "/usr", "/usr", "--symlink", "/usr/bin", "/bin", "--symlink", "/usr/lib", "/lib", "--symlink", "/usr/lib64", "/lib64", "--proc", "/proc", "--dev", "/dev", "--tmpfs", "/tmp", "--bind", options.cwd, options.cwd);
201
+ const boundRoots = ["/usr", options.cwd, ...filesystemPolicy.allowedRoots];
202
+ for (const root of filesystemPolicy.allowedRoots) {
203
+ bwrapArgs.push("--bind", root, root);
204
+ }
205
+ const interpreterDir = resolveExecutableDirectory(options.interpreterCommand, options.cwd, env);
206
+ if (interpreterDir !== null && !boundRoots.some((root) => isWithin(root, interpreterDir))) {
207
+ bwrapArgs.push("--ro-bind", interpreterDir, interpreterDir);
208
+ }
209
+ }
210
+ else {
211
+ // No filesystem restriction declared -- mirror the host root exactly (matches
212
+ // FilesystemPolicy's "absent means unconstrained" default). A mount namespace
213
+ // is still created (bwrap always builds one; --unshare-net below needs it), so
214
+ // /proc, /dev, /tmp are remounted explicitly -- a plain `--bind / /` is not
215
+ // recursive and would leave them looking empty inside otherwise.
216
+ bwrapArgs.push("--bind", "/", "/", "--dev", "/dev", "--proc", "/proc", "--bind", "/tmp", "/tmp");
217
+ }
218
+ bwrapArgs.push("--chdir", options.cwd);
219
+ if (networkPolicy !== undefined) {
220
+ bwrapArgs.push("--unshare-net");
221
+ }
222
+ // Kills the sandboxed tree if bwrap's parent (this Node process) dies
223
+ // unexpectedly -- a second, independent backstop alongside process-manager.ts's
224
+ // group-kill, not a replacement for it.
225
+ bwrapArgs.push("--die-with-parent", "--", options.command, ...options.args);
226
+ return { command: "bwrap", args: bwrapArgs };
227
+ }
228
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@descryy/runtime-controller",
3
- "version": "0.3.8",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Runtime controller: process manager, readiness, timeout/cancellation, execution IDs, cleanup. Deliverable 2 of the runtime phase — depends on @descryy/runtime-contracts, builds no collectors.",
6
6
  "license": "UNLICENSED",
@@ -26,7 +26,7 @@
26
26
  "access": "public"
27
27
  },
28
28
  "dependencies": {
29
- "@descryy/runtime-contracts": "0.3.3"
29
+ "@descryy/runtime-contracts": "0.4.0"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsc -b"