@dsh-enhanced/assistant-isolation 0.1.65 → 0.1.67
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 +287 -9
- package/lib/audit-archive.d.ts +1 -1
- package/lib/audit-archive.d.ts.map +1 -1
- package/lib/audit-archive.js +31 -13
- package/lib/audit-archive.js.map +1 -1
- package/lib/cli.d.ts +7 -3
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +104 -23
- package/lib/cli.js.map +1 -1
- package/lib/config.d.ts +15 -2
- package/lib/config.d.ts.map +1 -1
- package/lib/config.js +49 -9
- package/lib/config.js.map +1 -1
- package/lib/diagnostics.js +2 -2
- package/lib/diagnostics.js.map +1 -1
- package/lib/index.d.ts +17 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +17 -1
- package/lib/index.js.map +1 -1
- package/lib/ledger.d.ts +19 -2
- package/lib/ledger.d.ts.map +1 -1
- package/lib/ledger.js +371 -44
- package/lib/ledger.js.map +1 -1
- package/lib/linux-cgroups.d.ts +75 -0
- package/lib/linux-cgroups.d.ts.map +1 -0
- package/lib/linux-cgroups.js +517 -0
- package/lib/linux-cgroups.js.map +1 -0
- package/lib/linux-execution-contract.d.ts +123 -0
- package/lib/linux-execution-contract.d.ts.map +1 -0
- package/lib/linux-execution-contract.js +279 -0
- package/lib/linux-execution-contract.js.map +1 -0
- package/lib/linux-execution.d.ts +123 -0
- package/lib/linux-execution.d.ts.map +1 -0
- package/lib/linux-execution.js +1264 -0
- package/lib/linux-execution.js.map +1 -0
- package/lib/linux-job-recovery.d.ts +5 -0
- package/lib/linux-job-recovery.d.ts.map +1 -0
- package/lib/linux-job-recovery.js +63 -0
- package/lib/linux-job-recovery.js.map +1 -0
- package/lib/linux-namespace.d.ts +80 -0
- package/lib/linux-namespace.d.ts.map +1 -0
- package/lib/linux-namespace.js +471 -0
- package/lib/linux-namespace.js.map +1 -0
- package/lib/linux-repository-admission.d.ts +26 -0
- package/lib/linux-repository-admission.d.ts.map +1 -0
- package/lib/linux-repository-admission.js +64 -0
- package/lib/linux-repository-admission.js.map +1 -0
- package/lib/linux-repository-runner.d.ts +54 -0
- package/lib/linux-repository-runner.d.ts.map +1 -0
- package/lib/linux-repository-runner.js +614 -0
- package/lib/linux-repository-runner.js.map +1 -0
- package/lib/linux-runner-state-migration.d.ts +94 -0
- package/lib/linux-runner-state-migration.d.ts.map +1 -0
- package/lib/linux-runner-state-migration.js +463 -0
- package/lib/linux-runner-state-migration.js.map +1 -0
- package/lib/linux-runner-state.d.ts +53 -0
- package/lib/linux-runner-state.d.ts.map +1 -0
- package/lib/linux-runner-state.js +332 -0
- package/lib/linux-runner-state.js.map +1 -0
- package/lib/linux-runtime-source.d.ts +28 -0
- package/lib/linux-runtime-source.d.ts.map +1 -0
- package/lib/linux-runtime-source.js +237 -0
- package/lib/linux-runtime-source.js.map +1 -0
- package/lib/linux-runtime.d.ts +37 -0
- package/lib/linux-runtime.d.ts.map +1 -0
- package/lib/linux-runtime.js +192 -0
- package/lib/linux-runtime.js.map +1 -0
- package/lib/linux-system-snapshot.d.ts +47 -0
- package/lib/linux-system-snapshot.d.ts.map +1 -0
- package/lib/linux-system-snapshot.js +704 -0
- package/lib/linux-system-snapshot.js.map +1 -0
- package/lib/linux-user-namespace.d.ts +79 -0
- package/lib/linux-user-namespace.d.ts.map +1 -0
- package/lib/linux-user-namespace.js +234 -0
- package/lib/linux-user-namespace.js.map +1 -0
- package/lib/linux-verifier-runner.d.ts +27 -0
- package/lib/linux-verifier-runner.d.ts.map +1 -0
- package/lib/linux-verifier-runner.js +346 -0
- package/lib/linux-verifier-runner.js.map +1 -0
- package/lib/native-cgroup-roots.d.ts +20 -0
- package/lib/native-cgroup-roots.d.ts.map +1 -0
- package/lib/native-cgroup-roots.js +121 -0
- package/lib/native-cgroup-roots.js.map +1 -0
- package/lib/native-resources.d.ts +44 -0
- package/lib/native-resources.d.ts.map +1 -0
- package/lib/native-resources.js +354 -0
- package/lib/native-resources.js.map +1 -0
- package/lib/probe.d.ts +10 -0
- package/lib/probe.d.ts.map +1 -1
- package/lib/probe.js +52 -2
- package/lib/probe.js.map +1 -1
- package/lib/service.d.ts +1 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +122 -9
- package/lib/service.js.map +1 -1
- package/lib/storage.d.ts.map +1 -1
- package/lib/storage.js +36 -6
- package/lib/storage.js.map +1 -1
- package/lib/tools.js +1 -1
- package/lib/tools.js.map +1 -1
- package/lib/types.d.ts +5 -1
- package/lib/types.d.ts.map +1 -1
- package/lib/verifier-runner.d.ts +4 -2
- package/lib/verifier-runner.d.ts.map +1 -1
- package/lib/verifier-runner.js +22 -1
- package/lib/verifier-runner.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +15 -10
- package/runtime/linux-candidate-entry.py +82 -0
- package/runtime/linux-namespace-worker.mjs +561 -0
- package/runtime/linux-seccomp-policy.LICENSE +202 -0
- package/runtime/linux-seccomp-policy.json +886 -0
- package/runtime/linux-seccomp.py +106 -0
- package/runtime/linux-userns-launcher.py +149 -0
- package/runtime/linux-userns-proof.py +299 -0
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { readFile, lstat, mkdir, readdir, realpath, rmdir, statfs, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
4
|
+
import { setTimeout as pause } from 'node:timers/promises';
|
|
5
|
+
import { linuxUserNamespaceProof, validateLinuxUserNamespaceWitness } from './linux-user-namespace.js';
|
|
6
|
+
const UUID = /^[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12}$/u;
|
|
7
|
+
const HEX = /^[a-f0-9]{32}$/u;
|
|
8
|
+
const TICKS = /^[1-9][0-9]{0,63}$/u;
|
|
9
|
+
const V1_MAGIC = 0x27e0eb;
|
|
10
|
+
const V2_MAGIC = 0x63677270;
|
|
11
|
+
const CONTROLLERS = ['cpu', 'memory', 'pids', 'freezer'];
|
|
12
|
+
const PERIOD_US = 100_000;
|
|
13
|
+
function fail(message) { throw new Error(`linux cgroup: ${message}`); }
|
|
14
|
+
const uid = () => {
|
|
15
|
+
if (process.platform !== 'linux' || !['x64', 'arm64'].includes(process.arch)
|
|
16
|
+
|| typeof process.getuid !== 'function' || process.getuid() === 0)
|
|
17
|
+
fail('non-root Linux x64/arm64 is required');
|
|
18
|
+
return process.getuid();
|
|
19
|
+
};
|
|
20
|
+
const positive = (value) => Number.isSafeInteger(value) && value > 0;
|
|
21
|
+
const name = (jobId, nonce) => `job-${jobId}-${nonce}`;
|
|
22
|
+
const keys = (value, expected) => Object.keys(value).sort().join() === [...expected].sort().join();
|
|
23
|
+
function validateLimits(value) {
|
|
24
|
+
if (!value || !keys(value, ['memoryMiB', 'pidsLimit', 'cpus']) || !positive(value.memoryMiB)
|
|
25
|
+
|| value.memoryMiB > 65_536 || !positive(value.pidsLimit) || value.pidsLimit > 4096
|
|
26
|
+
|| !Number.isFinite(value.cpus) || value.cpus < 0.1 || value.cpus > 64
|
|
27
|
+
|| !positive(Math.floor(value.cpus * PERIOD_US)))
|
|
28
|
+
fail('invalid resource limits');
|
|
29
|
+
return { ...value };
|
|
30
|
+
}
|
|
31
|
+
function rootEntries(value, owner) {
|
|
32
|
+
if (!value || value.mode !== 'v1' && value.mode !== 'v2')
|
|
33
|
+
fail('invalid cgroup mode');
|
|
34
|
+
if (value.mode === 'v1' && !keys(value, ['mode', ...CONTROLLERS])
|
|
35
|
+
|| value.mode === 'v2' && !keys(value, ['mode', 'unified']))
|
|
36
|
+
fail('invalid controller roots');
|
|
37
|
+
const roots = value.mode === 'v1'
|
|
38
|
+
? CONTROLLERS.map(controller => [controller, value[controller]]) : [['unified', value.unified]];
|
|
39
|
+
if (new Set(roots.map(([, root]) => root)).size !== roots.length)
|
|
40
|
+
fail('duplicate controller root');
|
|
41
|
+
for (const [controller, root] of roots) {
|
|
42
|
+
const expected = value.mode === 'v2' ? `/sys/fs/cgroup/dsh-native/uid-${owner}` : undefined;
|
|
43
|
+
if (typeof root !== 'string' || !isAbsolute(root) || resolve(root) !== root
|
|
44
|
+
|| value.mode === 'v2' && root !== expected
|
|
45
|
+
|| value.mode === 'v1' && !new RegExp(`^/sys/fs/cgroup/[A-Za-z0-9_,]+/dsh-native/uid-${owner}$`, 'u').test(root)
|
|
46
|
+
|| controller.length === 0)
|
|
47
|
+
fail('unexpected delegated root');
|
|
48
|
+
}
|
|
49
|
+
return roots;
|
|
50
|
+
}
|
|
51
|
+
async function bootId() {
|
|
52
|
+
const value = (await readFile('/proc/sys/kernel/random/boot_id', 'utf8')).trim().toLowerCase();
|
|
53
|
+
if (!UUID.test(value))
|
|
54
|
+
fail('boot identity is unavailable');
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
async function root(path, owner, mode, controller) {
|
|
58
|
+
if (await realpath(path) !== path)
|
|
59
|
+
fail('delegated root is not canonical');
|
|
60
|
+
const item = await lstat(path);
|
|
61
|
+
if (!item.isDirectory() || item.isSymbolicLink() || item.uid !== owner || item.mode & 0o022)
|
|
62
|
+
fail('delegated root ownership differs');
|
|
63
|
+
if ((await statfs(path)).type !== (mode === 'v1' ? V1_MAGIC : V2_MAGIC))
|
|
64
|
+
fail('delegated root filesystem differs');
|
|
65
|
+
const mount = mode === 'v1' ? path.split('/').slice(0, 5).join('/') : '/sys/fs/cgroup';
|
|
66
|
+
const lines = (await readFile('/proc/self/mountinfo', 'utf8')).split('\n');
|
|
67
|
+
const matching = lines.filter(line => {
|
|
68
|
+
const [before, after] = line.split(' - ');
|
|
69
|
+
const fields = before?.split(' '), fs = after?.split(' ');
|
|
70
|
+
return fields?.[4] === mount && fs?.[0] === (mode === 'v1' ? 'cgroup' : 'cgroup2')
|
|
71
|
+
&& (mode === 'v2' || fs?.[2]?.split(',').includes(controller));
|
|
72
|
+
});
|
|
73
|
+
if (matching.length !== 1)
|
|
74
|
+
fail('controller mount identity differs');
|
|
75
|
+
}
|
|
76
|
+
async function directory(path, expected, owner, mode) {
|
|
77
|
+
if (expected.path !== path || await realpath(path) !== path)
|
|
78
|
+
fail('job cgroup path changed');
|
|
79
|
+
const item = await lstat(path);
|
|
80
|
+
if (!item.isDirectory() || item.isSymbolicLink() || item.uid !== owner || item.dev !== expected.dev || item.ino !== expected.ino
|
|
81
|
+
|| item.mode & 0o022 || (await statfs(path)).type !== (mode === 'v1' ? V1_MAGIC : V2_MAGIC))
|
|
82
|
+
fail('job cgroup identity changed');
|
|
83
|
+
}
|
|
84
|
+
async function number(path) {
|
|
85
|
+
const raw = (await readFile(path, 'utf8')).trim();
|
|
86
|
+
if (!/^[0-9]{1,18}$/u.test(raw))
|
|
87
|
+
fail('resource limit was not numeric');
|
|
88
|
+
const value = Number(raw);
|
|
89
|
+
if (!Number.isSafeInteger(value))
|
|
90
|
+
fail('resource limit overflow');
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
async function exists(path) {
|
|
94
|
+
try {
|
|
95
|
+
await lstat(path);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error.code === 'ENOENT')
|
|
100
|
+
return false;
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function writeAndVerify(path, expected) {
|
|
105
|
+
await writeFile(path, `${expected}\n`);
|
|
106
|
+
if (await number(path) !== expected)
|
|
107
|
+
fail('resource limit readback differs');
|
|
108
|
+
}
|
|
109
|
+
async function readProcesses(path) {
|
|
110
|
+
// cgroup.procs does not include descendants. A child cgroup would make an
|
|
111
|
+
// apparently empty parent unsafe to settle or delete.
|
|
112
|
+
for (const entry of await readdir(path, { withFileTypes: true })) {
|
|
113
|
+
if (entry.isDirectory() || entry.isSymbolicLink())
|
|
114
|
+
fail('nested or linked cgroup is not supported');
|
|
115
|
+
}
|
|
116
|
+
const content = await readFile(join(path, 'cgroup.procs'), 'utf8');
|
|
117
|
+
const values = content.trim() === '' ? [] : content.trim().split(/\s+/u).map(Number);
|
|
118
|
+
if (values.some(pid => !positive(pid)) || new Set(values).size !== values.length || values.length > 16_384)
|
|
119
|
+
fail('invalid cgroup process inventory');
|
|
120
|
+
return values;
|
|
121
|
+
}
|
|
122
|
+
async function processIdentity(pid) {
|
|
123
|
+
if (!positive(pid))
|
|
124
|
+
return undefined;
|
|
125
|
+
try {
|
|
126
|
+
const [raw, status] = await Promise.all([readFile(`/proc/${pid}/stat`, 'utf8'), readFile(`/proc/${pid}/status`, 'utf8')]);
|
|
127
|
+
const close = raw.lastIndexOf(') ');
|
|
128
|
+
const fields = close < 0 ? [] : raw.slice(close + 2).trim().split(/\s+/u);
|
|
129
|
+
const owner = /^Uid:\s+(\d+)/mu.exec(status);
|
|
130
|
+
const startTicks = fields[19];
|
|
131
|
+
if (!TICKS.test(startTicks ?? '') || !owner)
|
|
132
|
+
return undefined;
|
|
133
|
+
return { startTicks: startTicks, uid: Number(owner[1]), state: fields[0] };
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error.code === 'ENOENT')
|
|
137
|
+
return undefined;
|
|
138
|
+
throw error;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Python's pidfd signal operation targets the opened process, even if a numeric PID is reused.
|
|
142
|
+
// This fixed helper receives only PID/start-time/cgroup identity; no candidate code or shell is executed.
|
|
143
|
+
const PIDFD_KILL = String.raw `import json,os,signal,sys
|
|
144
|
+
data=json.loads(sys.argv[1]); expected=data['cgroup']; uid=data['uid']
|
|
145
|
+
for pid,ticks in data['processes']:
|
|
146
|
+
try:
|
|
147
|
+
fd=os.pidfd_open(pid,0)
|
|
148
|
+
try:
|
|
149
|
+
raw=open('/proc/%d/stat'%pid).read(); fields=raw[raw.rfind(') ')+2:].split()
|
|
150
|
+
status=open('/proc/%d/status'%pid).read(); groups=open('/proc/%d/cgroup'%pid).read().splitlines()
|
|
151
|
+
if fields[19]!=ticks or int(status.split('Uid:')[1].split()[0])!=uid or not any(line.split(':',2)[1:]==expected for line in groups):
|
|
152
|
+
raise RuntimeError('process identity or cgroup differs')
|
|
153
|
+
signal.pidfd_send_signal(fd,signal.SIGKILL,None,0)
|
|
154
|
+
finally: os.close(fd)
|
|
155
|
+
except ProcessLookupError: pass
|
|
156
|
+
`;
|
|
157
|
+
const PIDFD_ADMIT = String.raw `import json,os,sys,time
|
|
158
|
+
data=json.loads(sys.argv[1]); pid=data['pid']; ticks=data['ticks']; uid=data['uid']; boot=data['boot']
|
|
159
|
+
fd=os.pidfd_open(pid,0)
|
|
160
|
+
try:
|
|
161
|
+
def checked():
|
|
162
|
+
if open('/proc/sys/kernel/random/boot_id').read().strip().lower()!=boot: raise RuntimeError('boot changed')
|
|
163
|
+
if time.time()*1000>=data['deadline']: raise RuntimeError('admission deadline passed')
|
|
164
|
+
raw=open('/proc/%d/stat'%pid).read(); fields=raw[raw.rfind(') ')+2:].split()
|
|
165
|
+
status=open('/proc/%d/status'%pid).read()
|
|
166
|
+
if fields[19]!=ticks or fields[0]=='Z' or int(status.split('Uid:')[1].split()[0])!=uid: raise RuntimeError('process changed')
|
|
167
|
+
checked()
|
|
168
|
+
for path,kind,group in data['groups']:
|
|
169
|
+
with open(path+'/cgroup.procs','w') as out: out.write(str(pid)+'\n')
|
|
170
|
+
checked()
|
|
171
|
+
memberships=open('/proc/%d/cgroup'%pid).read().splitlines()
|
|
172
|
+
if not any(line.split(':',2)[1:]==[kind,group] for line in memberships): raise RuntimeError('cgroup admission differs')
|
|
173
|
+
checked()
|
|
174
|
+
finally: os.close(fd)
|
|
175
|
+
`;
|
|
176
|
+
async function fixedPython(source, data) {
|
|
177
|
+
const output = await new Promise((resolvePromise, reject) => {
|
|
178
|
+
const child = spawn('/usr/bin/python3', ['-I', '-S', '-c', source, JSON.stringify(data)], { stdio: ['ignore', 'ignore', 'pipe'], env: { PATH: '/usr/bin:/bin', LANG: 'C', LC_ALL: 'C' }, shell: false });
|
|
179
|
+
let stderr = '';
|
|
180
|
+
const timer = setTimeout(() => child.kill('SIGKILL'), 3_000);
|
|
181
|
+
child.stderr.setEncoding('utf8');
|
|
182
|
+
child.stderr.on('data', (chunk) => { stderr = (stderr + chunk).slice(-4096); });
|
|
183
|
+
child.once('error', reject);
|
|
184
|
+
child.once('close', code => { clearTimeout(timer); resolvePromise({ code, stderr }); });
|
|
185
|
+
});
|
|
186
|
+
if (output.code !== 0)
|
|
187
|
+
fail(`pidfd operation was unproven: ${output.stderr.slice(-160)}`);
|
|
188
|
+
}
|
|
189
|
+
async function killWithPidfds(path, owner, mode, namespaceTermination) {
|
|
190
|
+
const processes = [];
|
|
191
|
+
for (const pid of await readProcesses(path)) {
|
|
192
|
+
const current = await processIdentity(pid);
|
|
193
|
+
if (!current)
|
|
194
|
+
continue;
|
|
195
|
+
if (current.state === 'Z' || !namespaceTermination && current.uid !== owner)
|
|
196
|
+
fail('cgroup contains an unexpected process');
|
|
197
|
+
processes.push([pid, current.startTicks]);
|
|
198
|
+
}
|
|
199
|
+
if (!processes.length)
|
|
200
|
+
return;
|
|
201
|
+
const relative = path.slice('/sys/fs/cgroup/'.length).split('/').slice(mode === 'v1' ? 1 : 0).join('/');
|
|
202
|
+
const membership = mode === 'v1' ? ['freezer', `/${relative}`] : ['', `/${relative}`];
|
|
203
|
+
if (namespaceTermination) {
|
|
204
|
+
if (mode !== 'v1')
|
|
205
|
+
fail('mapped repository termination requires verified v1 freezer');
|
|
206
|
+
await linuxUserNamespaceProof({ operation: 'kill', witness: namespaceTermination.witness,
|
|
207
|
+
outsideGates: namespaceTermination.outsideGate ? [namespaceTermination.outsideGate] : [],
|
|
208
|
+
cgroup: membership, freezerPath: path, processes });
|
|
209
|
+
}
|
|
210
|
+
else
|
|
211
|
+
await fixedPython(PIDFD_KILL, { uid: owner, cgroup: membership, processes });
|
|
212
|
+
}
|
|
213
|
+
/** Existing jobs are recovery-only: dispatch is never inferred from a cgroup directory.
|
|
214
|
+
* The Host must persist jobId/nonce and its dispatch intent before create(), and
|
|
215
|
+
* persist the returned snapshot before releasing a trusted process's start gate.
|
|
216
|
+
* This primitive does not supply that durable journal or discover orphan groups.
|
|
217
|
+
* One Host controller must own each resource set, including recovered leases.
|
|
218
|
+
*/
|
|
219
|
+
export class LinuxCgroupLease {
|
|
220
|
+
snapshot;
|
|
221
|
+
#allowAdmission;
|
|
222
|
+
#closing = false;
|
|
223
|
+
#operation = Promise.resolve();
|
|
224
|
+
#namespaceTermination;
|
|
225
|
+
constructor(snapshot, allowAdmission) {
|
|
226
|
+
this.snapshot = Object.freeze({ ...snapshot, limits: Object.freeze({ ...snapshot.limits }),
|
|
227
|
+
directories: Object.freeze(Object.fromEntries(Object.entries(snapshot.directories).map(([key, value]) => [key, Object.freeze({ ...value })]))) });
|
|
228
|
+
this.#allowAdmission = allowAdmission;
|
|
229
|
+
this.#closing = !allowAdmission;
|
|
230
|
+
}
|
|
231
|
+
static async create(input) {
|
|
232
|
+
const owner = uid(), roots = rootEntries(input.roots, owner), limits = validateLimits(input.limits);
|
|
233
|
+
if (!UUID.test(input.jobId) || !HEX.test(input.nonce) || !positive(input.deadline) || input.deadline <= Date.now())
|
|
234
|
+
fail('invalid job identity or deadline');
|
|
235
|
+
// Root directory ownership alone cannot authorize migration from an
|
|
236
|
+
// unrelated v2 subtree. Do not advertise an unverified placement fallback.
|
|
237
|
+
if (input.roots.mode === 'v2')
|
|
238
|
+
fail('cgroup v2 process placement is not yet verified');
|
|
239
|
+
const initialBoot = await bootId();
|
|
240
|
+
for (const [controller, path] of roots)
|
|
241
|
+
await root(path, owner, input.roots.mode, controller);
|
|
242
|
+
const directories = {};
|
|
243
|
+
try {
|
|
244
|
+
for (const [key, parent] of roots) {
|
|
245
|
+
const path = join(parent, name(input.jobId, input.nonce));
|
|
246
|
+
await mkdir(path, { mode: 0o700 });
|
|
247
|
+
const item = await lstat(path);
|
|
248
|
+
if (!item.isDirectory() || item.uid !== owner)
|
|
249
|
+
fail('job cgroup was not created by owner');
|
|
250
|
+
directories[key] = { path, dev: item.dev, ino: item.ino };
|
|
251
|
+
}
|
|
252
|
+
const path = (key) => directories[key]?.path ?? fail('missing controller');
|
|
253
|
+
if (input.roots.mode === 'v1') {
|
|
254
|
+
await writeAndVerify(join(path('memory'), 'memory.limit_in_bytes'), limits.memoryMiB * 1024 * 1024);
|
|
255
|
+
// Swapping must not evade the memory cap. Kernels without memsw support are refused.
|
|
256
|
+
await writeAndVerify(join(path('memory'), 'memory.memsw.limit_in_bytes'), limits.memoryMiB * 1024 * 1024);
|
|
257
|
+
await writeAndVerify(join(path('pids'), 'pids.max'), limits.pidsLimit);
|
|
258
|
+
await writeAndVerify(join(path('cpu'), 'cpu.cfs_period_us'), PERIOD_US);
|
|
259
|
+
await writeAndVerify(join(path('cpu'), 'cpu.cfs_quota_us'), Math.floor(limits.cpus * PERIOD_US));
|
|
260
|
+
if ((await readFile(join(path('freezer'), 'freezer.state'), 'utf8')).trim() !== 'THAWED')
|
|
261
|
+
fail('freezer is unavailable');
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
await writeAndVerify(join(path('unified'), 'memory.max'), limits.memoryMiB * 1024 * 1024);
|
|
265
|
+
await writeAndVerify(join(path('unified'), 'memory.swap.max'), 0);
|
|
266
|
+
await writeAndVerify(join(path('unified'), 'pids.max'), limits.pidsLimit);
|
|
267
|
+
await writeFile(join(path('unified'), 'cpu.max'), `${Math.floor(limits.cpus * PERIOD_US)} ${PERIOD_US}\n`);
|
|
268
|
+
if ((await readFile(join(path('unified'), 'cpu.max'), 'utf8')).trim() !== `${Math.floor(limits.cpus * PERIOD_US)} ${PERIOD_US}`)
|
|
269
|
+
fail('CPU quota readback differs');
|
|
270
|
+
if ((await readFile(join(path('unified'), 'cgroup.freeze'), 'utf8')).trim() !== '0')
|
|
271
|
+
fail('freezer is unavailable');
|
|
272
|
+
await readFile(join(path('unified'), 'cgroup.kill'), 'utf8').catch(error => { if (error.code !== 'EINVAL')
|
|
273
|
+
throw error; });
|
|
274
|
+
}
|
|
275
|
+
if (await bootId() !== initialBoot)
|
|
276
|
+
fail('boot changed during cgroup creation');
|
|
277
|
+
return new LinuxCgroupLease({ schemaVersion: 1, mode: input.roots.mode, bootId: initialBoot,
|
|
278
|
+
jobId: input.jobId, nonce: input.nonce, uid: owner, deadline: input.deadline, limits, directories }, true);
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
// Only remove provably empty directories created by this invocation. A failed
|
|
282
|
+
// cleanup is part of the error; the caller must retain the unknown reservation.
|
|
283
|
+
const cleanup = [];
|
|
284
|
+
for (const value of Object.values(directories).reverse()) {
|
|
285
|
+
try {
|
|
286
|
+
if ((await readProcesses(value.path)).length !== 0)
|
|
287
|
+
throw new Error('nonempty cgroup');
|
|
288
|
+
await rmdir(value.path);
|
|
289
|
+
}
|
|
290
|
+
catch (failure) {
|
|
291
|
+
cleanup.push(failure);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (cleanup.length)
|
|
295
|
+
throw new AggregateError([error, ...cleanup], 'linux cgroup preparation cleanup unproven');
|
|
296
|
+
throw error;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
static async recover(snapshot, namespaceTermination) {
|
|
300
|
+
if (!snapshot || !keys(snapshot, ['schemaVersion', 'mode', 'bootId', 'jobId', 'nonce', 'uid', 'deadline', 'limits', 'directories'])
|
|
301
|
+
|| snapshot.schemaVersion !== 1 || snapshot.uid !== uid() || !UUID.test(snapshot.bootId)
|
|
302
|
+
|| !UUID.test(snapshot.jobId) || !HEX.test(snapshot.nonce) || !positive(snapshot.deadline))
|
|
303
|
+
fail('invalid recovery snapshot');
|
|
304
|
+
validateLimits(snapshot.limits);
|
|
305
|
+
const roots = snapshot.mode === 'v1'
|
|
306
|
+
? Object.fromEntries(CONTROLLERS.map(key => [key, snapshot.directories[key]?.path.split('/').slice(0, -1).join('/')]))
|
|
307
|
+
: { unified: snapshot.directories.unified?.path.split('/').slice(0, -1).join('/') };
|
|
308
|
+
rootEntries({ mode: snapshot.mode, ...roots }, snapshot.uid);
|
|
309
|
+
const expected = snapshot.mode === 'v1' ? CONTROLLERS : ['unified'];
|
|
310
|
+
if (!keys(snapshot.directories, expected))
|
|
311
|
+
fail('recovery controller inventory differs');
|
|
312
|
+
const lease = new LinuxCgroupLease(snapshot, false);
|
|
313
|
+
if (namespaceTermination)
|
|
314
|
+
lease.bindUserNamespace(namespaceTermination);
|
|
315
|
+
await lease.#verify(true);
|
|
316
|
+
return lease;
|
|
317
|
+
}
|
|
318
|
+
/** Bind a Host-observed immutable anchor before releasing candidate START.
|
|
319
|
+
* Recovery receives the original witness from its versioned private journal. */
|
|
320
|
+
bindUserNamespace(value) {
|
|
321
|
+
if (!value || !keys(value, value.outsideGate ? ['witness', 'outsideGate'] : ['witness']))
|
|
322
|
+
fail('invalid namespace termination binding');
|
|
323
|
+
const witness = validateLinuxUserNamespaceWitness(value.witness);
|
|
324
|
+
if (this.snapshot.mode !== 'v1' || witness.bootId !== this.snapshot.bootId || witness.ownerUid !== this.snapshot.uid)
|
|
325
|
+
fail('namespace termination owner differs');
|
|
326
|
+
const gate = value.outsideGate;
|
|
327
|
+
if (gate && (!keys(gate, ['pid', 'startTicks', 'bootId', 'uid']) || !positive(gate.pid) || !TICKS.test(gate.startTicks)
|
|
328
|
+
|| gate.bootId !== this.snapshot.bootId || gate.uid !== this.snapshot.uid))
|
|
329
|
+
fail('invalid original keeper gate');
|
|
330
|
+
const binding = Object.freeze({ witness, ...(gate ? { outsideGate: Object.freeze({ ...gate }) } : {}) });
|
|
331
|
+
if (this.#namespaceTermination && JSON.stringify(this.#namespaceTermination) !== JSON.stringify(binding))
|
|
332
|
+
fail('namespace termination binding changed');
|
|
333
|
+
this.#namespaceTermination = binding;
|
|
334
|
+
}
|
|
335
|
+
async #verify(allowMissing = false) {
|
|
336
|
+
if (await bootId() !== this.snapshot.bootId)
|
|
337
|
+
fail('job boot identity changed');
|
|
338
|
+
const roots = this.snapshot.mode === 'v1'
|
|
339
|
+
? Object.fromEntries(CONTROLLERS.map(key => [key, this.snapshot.directories[key].path.split('/').slice(0, -1).join('/')]))
|
|
340
|
+
: { unified: this.snapshot.directories.unified.path.split('/').slice(0, -1).join('/') };
|
|
341
|
+
for (const [key, parent] of rootEntries({ mode: this.snapshot.mode, ...roots }, this.snapshot.uid)) {
|
|
342
|
+
await root(parent, this.snapshot.uid, this.snapshot.mode, key);
|
|
343
|
+
try {
|
|
344
|
+
await directory(join(parent, name(this.snapshot.jobId, this.snapshot.nonce)), this.snapshot.directories[key], this.snapshot.uid, this.snapshot.mode);
|
|
345
|
+
}
|
|
346
|
+
catch (error) {
|
|
347
|
+
if (!allowMissing || error.code !== 'ENOENT')
|
|
348
|
+
throw error;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const limits = this.snapshot.limits;
|
|
352
|
+
const path = (key) => this.snapshot.directories[key]?.path ?? fail('missing controller');
|
|
353
|
+
if (this.snapshot.mode === 'v1') {
|
|
354
|
+
if ((!allowMissing || await exists(path('memory'))) && (await number(join(path('memory'), 'memory.limit_in_bytes')) !== limits.memoryMiB * 1024 * 1024
|
|
355
|
+
|| await number(join(path('memory'), 'memory.memsw.limit_in_bytes')) !== limits.memoryMiB * 1024 * 1024)
|
|
356
|
+
|| (!allowMissing || await exists(path('pids'))) && await number(join(path('pids'), 'pids.max')) !== limits.pidsLimit
|
|
357
|
+
|| (!allowMissing || await exists(path('cpu'))) && (await number(join(path('cpu'), 'cpu.cfs_period_us')) !== PERIOD_US
|
|
358
|
+
|| await number(join(path('cpu'), 'cpu.cfs_quota_us')) !== Math.floor(limits.cpus * PERIOD_US)))
|
|
359
|
+
fail('resource limits changed');
|
|
360
|
+
}
|
|
361
|
+
else if ((!allowMissing || await exists(path('unified'))) && (await number(join(path('unified'), 'memory.max')) !== limits.memoryMiB * 1024 * 1024
|
|
362
|
+
|| await number(join(path('unified'), 'memory.swap.max')) !== 0
|
|
363
|
+
|| await number(join(path('unified'), 'pids.max')) !== limits.pidsLimit
|
|
364
|
+
|| (await readFile(join(path('unified'), 'cpu.max'), 'utf8')).trim() !== `${Math.floor(limits.cpus * PERIOD_US)} ${PERIOD_US}`))
|
|
365
|
+
fail('resource limits changed');
|
|
366
|
+
}
|
|
367
|
+
#serialize(operation) {
|
|
368
|
+
const result = this.#operation.then(operation);
|
|
369
|
+
// A failed operation must not strand cleanup behind a rejected queue.
|
|
370
|
+
this.#operation = result.then(() => { }, () => { });
|
|
371
|
+
return result;
|
|
372
|
+
}
|
|
373
|
+
#assertAdmissionOpen() {
|
|
374
|
+
if (this.#closing || Date.now() >= this.snapshot.deadline)
|
|
375
|
+
fail('job no longer admits a process');
|
|
376
|
+
}
|
|
377
|
+
async admit(identity) {
|
|
378
|
+
if (!this.#allowAdmission || this.#closing || Date.now() >= this.snapshot.deadline)
|
|
379
|
+
fail('job no longer admits a process');
|
|
380
|
+
if (!identity || !keys(identity, ['pid', 'startTicks', 'bootId', 'uid']) || !positive(identity.pid)
|
|
381
|
+
|| !TICKS.test(identity.startTicks) || identity.uid !== this.snapshot.uid || identity.bootId !== this.snapshot.bootId)
|
|
382
|
+
fail('invalid process identity');
|
|
383
|
+
// Consume the one attempt synchronously. No second caller can enter while
|
|
384
|
+
// the first awaits identity or controller I/O; failures never reopen it.
|
|
385
|
+
this.#allowAdmission = false;
|
|
386
|
+
return this.#serialize(async () => {
|
|
387
|
+
try {
|
|
388
|
+
this.#assertAdmissionOpen();
|
|
389
|
+
await this.#verify();
|
|
390
|
+
this.#assertAdmissionOpen();
|
|
391
|
+
const current = await processIdentity(identity.pid);
|
|
392
|
+
this.#assertAdmissionOpen();
|
|
393
|
+
if (!current || current.uid !== this.snapshot.uid || current.startTicks !== identity.startTicks || current.state === 'Z')
|
|
394
|
+
fail('process identity differs');
|
|
395
|
+
// The trusted supervisor stays behind its start gate until this promise
|
|
396
|
+
// resolves. pidfd detects death/reuse; cgroup.procs still accepts a PID,
|
|
397
|
+
// so the caller must retain and reap that blocked trusted process.
|
|
398
|
+
const groups = Object.entries(this.snapshot.directories).sort(([left], [right]) => {
|
|
399
|
+
if (left === 'freezer')
|
|
400
|
+
return -1;
|
|
401
|
+
if (right === 'freezer')
|
|
402
|
+
return 1;
|
|
403
|
+
return left.localeCompare(right, 'en');
|
|
404
|
+
}).map(([, value]) => {
|
|
405
|
+
const parts = value.path.slice('/sys/fs/cgroup/'.length).split('/');
|
|
406
|
+
const relative = parts.slice(this.snapshot.mode === 'v1' ? 1 : 0).join('/');
|
|
407
|
+
return [value.path, this.snapshot.mode === 'v1' ? parts[0] : '', `/${relative}`];
|
|
408
|
+
});
|
|
409
|
+
this.#assertAdmissionOpen();
|
|
410
|
+
await fixedPython(PIDFD_ADMIT, { pid: identity.pid, ticks: identity.startTicks, uid: identity.uid,
|
|
411
|
+
boot: identity.bootId, deadline: this.snapshot.deadline, groups });
|
|
412
|
+
this.#assertAdmissionOpen();
|
|
413
|
+
const after = await processIdentity(identity.pid);
|
|
414
|
+
this.#assertAdmissionOpen();
|
|
415
|
+
if (!after || after.uid !== current.uid || after.startTicks !== current.startTicks || after.state === 'Z')
|
|
416
|
+
fail('admitted process changed');
|
|
417
|
+
for (const value of Object.values(this.snapshot.directories)) {
|
|
418
|
+
if (!(await readProcesses(value.path)).includes(identity.pid))
|
|
419
|
+
fail('process escaped cgroup admission');
|
|
420
|
+
this.#assertAdmissionOpen();
|
|
421
|
+
}
|
|
422
|
+
await this.#verify();
|
|
423
|
+
this.#assertAdmissionOpen();
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
this.#closing = true;
|
|
427
|
+
throw error;
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
async observe() {
|
|
432
|
+
return this.#serialize(() => this.#observe());
|
|
433
|
+
}
|
|
434
|
+
async #observe() {
|
|
435
|
+
await this.#verify(this.#closing);
|
|
436
|
+
const processes = {};
|
|
437
|
+
for (const [key, value] of Object.entries(this.snapshot.directories)) {
|
|
438
|
+
processes[key] = this.#closing && !(await exists(value.path)) ? [] : await readProcesses(value.path);
|
|
439
|
+
}
|
|
440
|
+
return { quiescent: Object.values(processes).every(value => value.length === 0), processes };
|
|
441
|
+
}
|
|
442
|
+
async terminateAndProve(timeoutMs) {
|
|
443
|
+
if (!positive(timeoutMs) || timeoutMs > 30_000)
|
|
444
|
+
fail('invalid termination deadline');
|
|
445
|
+
// Fence admission before awaiting either the operation queue or the kernel.
|
|
446
|
+
this.#closing = true;
|
|
447
|
+
this.#allowAdmission = false;
|
|
448
|
+
const deadline = Date.now() + timeoutMs;
|
|
449
|
+
return this.#serialize(() => this.#terminateAndProve(deadline));
|
|
450
|
+
}
|
|
451
|
+
async #terminateAndProve(deadline) {
|
|
452
|
+
await this.#verify(true);
|
|
453
|
+
if ((await this.#observe()).quiescent)
|
|
454
|
+
return true;
|
|
455
|
+
if (Date.now() >= deadline)
|
|
456
|
+
return false;
|
|
457
|
+
if (this.snapshot.mode === 'v2') {
|
|
458
|
+
const path = this.snapshot.directories.unified.path;
|
|
459
|
+
if (!(await exists(path)))
|
|
460
|
+
return false;
|
|
461
|
+
await writeFile(join(path, 'cgroup.freeze'), '1\n');
|
|
462
|
+
while (Date.now() < deadline && !(await readFile(join(path, 'cgroup.events'), 'utf8')).includes('frozen 1'))
|
|
463
|
+
await pause(20);
|
|
464
|
+
if (!(await readFile(join(path, 'cgroup.events'), 'utf8')).includes('frozen 1'))
|
|
465
|
+
return false;
|
|
466
|
+
await writeFile(join(path, 'cgroup.kill'), '1\n');
|
|
467
|
+
await writeFile(join(path, 'cgroup.freeze'), '0\n');
|
|
468
|
+
}
|
|
469
|
+
else {
|
|
470
|
+
const freezer = this.snapshot.directories.freezer.path;
|
|
471
|
+
// A missing freezer with live processes elsewhere is ambiguous. Never
|
|
472
|
+
// turn a partial deletion into permission to signal unrelated processes.
|
|
473
|
+
if (!(await exists(freezer)))
|
|
474
|
+
return false;
|
|
475
|
+
await writeFile(join(freezer, 'freezer.state'), 'FROZEN\n');
|
|
476
|
+
while (Date.now() < deadline && (await readFile(join(freezer, 'freezer.state'), 'utf8')).trim() !== 'FROZEN')
|
|
477
|
+
await pause(20);
|
|
478
|
+
if ((await readFile(join(freezer, 'freezer.state'), 'utf8')).trim() !== 'FROZEN')
|
|
479
|
+
return false;
|
|
480
|
+
try {
|
|
481
|
+
await killWithPidfds(freezer, this.snapshot.uid, 'v1', this.#namespaceTermination);
|
|
482
|
+
}
|
|
483
|
+
finally {
|
|
484
|
+
await writeFile(join(freezer, 'freezer.state'), 'THAWED\n');
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
while (Date.now() < deadline) {
|
|
488
|
+
if ((await this.#observe()).quiescent)
|
|
489
|
+
return true;
|
|
490
|
+
await pause(20);
|
|
491
|
+
}
|
|
492
|
+
return (await this.#observe()).quiescent;
|
|
493
|
+
}
|
|
494
|
+
async removeWhenEmpty() {
|
|
495
|
+
this.#closing = true;
|
|
496
|
+
this.#allowAdmission = false;
|
|
497
|
+
return this.#serialize(() => this.#removeWhenEmpty());
|
|
498
|
+
}
|
|
499
|
+
async #removeWhenEmpty() {
|
|
500
|
+
if (!(await this.#observe()).quiescent)
|
|
501
|
+
return false;
|
|
502
|
+
await pause(20);
|
|
503
|
+
if (!(await this.#observe()).quiescent)
|
|
504
|
+
return false;
|
|
505
|
+
for (const value of Object.values(this.snapshot.directories).reverse()) {
|
|
506
|
+
if (await exists(value.path)) {
|
|
507
|
+
await directory(value.path, value, this.snapshot.uid, this.snapshot.mode);
|
|
508
|
+
await rmdir(value.path);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
for (const value of Object.values(this.snapshot.directories))
|
|
512
|
+
if (await exists(value.path))
|
|
513
|
+
return false;
|
|
514
|
+
return true;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
//# sourceMappingURL=linux-cgroups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linux-cgroups.js","sourceRoot":"","sources":["../src/linux-cgroups.ts"],"names":[],"mappings":"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"}
|