@getmarrow/mcp 3.9.107 → 3.9.109
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 +22 -1
- package/dist/cli.js +26 -1
- package/dist/cli.js.map +1 -1
- package/dist/codex-plugin-pins.js +12 -12
- package/dist/control-notice.d.ts +13 -0
- package/dist/control-notice.d.ts.map +1 -0
- package/dist/control-notice.js +76 -0
- package/dist/control-notice.js.map +1 -0
- package/dist/control-routes.d.ts +10 -0
- package/dist/control-routes.d.ts.map +1 -0
- package/dist/control-routes.js +81 -0
- package/dist/control-routes.js.map +1 -0
- package/dist/hook-context.d.ts.map +1 -1
- package/dist/hook-context.js +34 -11
- package/dist/hook-context.js.map +1 -1
- package/dist/hook-contract.d.ts +2 -2
- package/dist/hook-contract.js +1 -1
- package/dist/hook-pre-action.d.ts +2 -0
- package/dist/hook-pre-action.d.ts.map +1 -1
- package/dist/hook-pre-action.js +86 -20
- package/dist/hook-pre-action.js.map +1 -1
- package/dist/hook-session.d.ts.map +1 -1
- package/dist/hook-session.js +12 -7
- package/dist/hook-session.js.map +1 -1
- package/dist/hook-tool-policy.d.ts +1 -1
- package/dist/hook-tool-policy.d.ts.map +1 -1
- package/dist/hook.d.ts.map +1 -1
- package/dist/hook.js +19 -14
- package/dist/hook.js.map +1 -1
- package/dist/ipv4-first.d.ts +7 -0
- package/dist/ipv4-first.d.ts.map +1 -0
- package/dist/ipv4-first.js +60 -0
- package/dist/ipv4-first.js.map +1 -0
- package/dist/key-class.d.ts +16 -0
- package/dist/key-class.d.ts.map +1 -0
- package/dist/key-class.js +37 -0
- package/dist/key-class.js.map +1 -0
- package/dist/keyless-notice.d.ts +10 -0
- package/dist/keyless-notice.d.ts.map +1 -0
- package/dist/keyless-notice.js +47 -0
- package/dist/keyless-notice.js.map +1 -0
- package/dist/normalized-action.d.ts +4 -0
- package/dist/normalized-action.d.ts.map +1 -1
- package/dist/normalized-action.js +60 -27
- package/dist/normalized-action.js.map +1 -1
- package/dist/owner-bypass.d.ts +9 -0
- package/dist/owner-bypass.d.ts.map +1 -0
- package/dist/owner-bypass.js +79 -0
- package/dist/owner-bypass.js.map +1 -0
- package/dist/redact.d.ts +5 -0
- package/dist/redact.d.ts.map +1 -1
- package/dist/redact.js +61 -9
- package/dist/redact.js.map +1 -1
- package/dist/seatbelt/hook.d.ts +3 -1
- package/dist/seatbelt/hook.d.ts.map +1 -1
- package/dist/seatbelt/hook.js +7 -3
- package/dist/seatbelt/hook.js.map +1 -1
- package/dist/seatbelt/mapper.d.ts.map +1 -1
- package/dist/seatbelt/mapper.js +849 -12
- package/dist/seatbelt/mapper.js.map +1 -1
- package/dist/seatbelt/patch-text.d.ts +49 -0
- package/dist/seatbelt/patch-text.d.ts.map +1 -0
- package/dist/seatbelt/patch-text.js +376 -0
- package/dist/seatbelt/patch-text.js.map +1 -0
- package/dist/seatbelt/tables.d.ts +66 -0
- package/dist/seatbelt/tables.d.ts.map +1 -1
- package/dist/seatbelt/tables.js +467 -3
- package/dist/seatbelt/tables.js.map +1 -1
- package/dist/seatbelt/win-protected.d.ts +52 -0
- package/dist/seatbelt/win-protected.d.ts.map +1 -0
- package/dist/seatbelt/win-protected.js +1279 -0
- package/dist/seatbelt/win-protected.js.map +1 -0
- package/dist/self-protect.d.ts +18 -0
- package/dist/self-protect.d.ts.map +1 -0
- package/dist/self-protect.js +185 -0
- package/dist/self-protect.js.map +1 -0
- package/dist/session-id.d.ts +2 -0
- package/dist/session-id.d.ts.map +1 -0
- package/dist/session-id.js +32 -0
- package/dist/session-id.js.map +1 -0
- package/dist/session-loop-guard.d.ts +7 -0
- package/dist/session-loop-guard.d.ts.map +1 -1
- package/dist/session-loop-guard.js +168 -1
- package/dist/session-loop-guard.js.map +1 -1
- package/dist/session-marker.d.ts +7 -0
- package/dist/session-marker.d.ts.map +1 -0
- package/dist/session-marker.js +42 -0
- package/dist/session-marker.js.map +1 -0
- package/dist/win-private-state.d.ts +117 -0
- package/dist/win-private-state.d.ts.map +1 -0
- package/dist/win-private-state.js +544 -0
- package/dist/win-private-state.js.map +1 -0
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WIN_ACL_ENCODED = exports.WIN_ACL_SCRIPT = exports.WIN_PROOF_CACHE_MS = exports.WIN_PROOF_MAX_BUFFER = exports.WIN_PROOF_TIMEOUT_MS = exports.WIN_BIRTH_TOLERANCE_MS = void 0;
|
|
4
|
+
exports.realWindowsDeps = realWindowsDeps;
|
|
5
|
+
exports.validWindowsPath = validWindowsPath;
|
|
6
|
+
exports.parseSecurityDescriptor = parseSecurityDescriptor;
|
|
7
|
+
exports.evaluateDescriptor = evaluateDescriptor;
|
|
8
|
+
exports.proveWindowsPrivate = proveWindowsPrivate;
|
|
9
|
+
exports.ensureWindowsPrivateState = ensureWindowsPrivateState;
|
|
10
|
+
exports.verifyWindowsPrivateState = verifyWindowsPrivateState;
|
|
11
|
+
// Windows private-state proof for the local loop guard (3.9.106 spec, parts A1 and A2).
|
|
12
|
+
//
|
|
13
|
+
// POSIX proves "private" with uid and mode bits. Node reports 0o666 for everything on Windows, so
|
|
14
|
+
// the proof here uses the real Windows facts instead: a strict path grammar, no reparse point
|
|
15
|
+
// anywhere in the chain, the canonical long path, and the owner plus DACL read as raw SIDs and
|
|
16
|
+
// masks from the binary security descriptor that Windows PowerShell `Get-Acl` returns, parsed here
|
|
17
|
+
// with a closed grammar. The ACL query runs before the state lock is taken, never while it is held.
|
|
18
|
+
//
|
|
19
|
+
// Fail closed: every error, timeout, parse doubt or unknown value is a refusal with a fixed reason
|
|
20
|
+
// code. A reason never carries a path or a value. Nothing here reads HOME, the PATH, or any Marrow
|
|
21
|
+
// key, and no secret is passed to the child process. All OS access goes through `WinDeps`.
|
|
22
|
+
const node_crypto_1 = require("node:crypto");
|
|
23
|
+
const node_fs_1 = require("node:fs");
|
|
24
|
+
/** A state file born this long before the proof began still counts as created after it (file-system clock granularity). */
|
|
25
|
+
exports.WIN_BIRTH_TOLERANCE_MS = 250;
|
|
26
|
+
// Sized from real cold-start data (a first PowerShell start on a slow runner); on expiry the proof still denies.
|
|
27
|
+
exports.WIN_PROOF_TIMEOUT_MS = 5000;
|
|
28
|
+
exports.WIN_PROOF_MAX_BUFFER = 65536;
|
|
29
|
+
exports.WIN_PROOF_CACHE_MS = 2000;
|
|
30
|
+
const MAX_DESCRIPTOR_BYTES = 12 * 1024;
|
|
31
|
+
const MAX_DESCRIPTOR_LINE = 16 * 1024;
|
|
32
|
+
const processCache = new Map();
|
|
33
|
+
class WinRefusal extends Error {
|
|
34
|
+
reason;
|
|
35
|
+
constructor(reason) {
|
|
36
|
+
super(reason);
|
|
37
|
+
this.reason = reason;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function refuse(reason) { throw new WinRefusal(reason); }
|
|
41
|
+
/** Production dependencies: Node's own fs, child_process and crypto. There is no env switch. */
|
|
42
|
+
function realWindowsDeps() {
|
|
43
|
+
return {
|
|
44
|
+
platform: process.platform,
|
|
45
|
+
env: process.env,
|
|
46
|
+
lstatBig: (path) => (0, node_fs_1.lstatSync)(path, { bigint: true }),
|
|
47
|
+
realpathNative: (path) => node_fs_1.realpathSync.native(path),
|
|
48
|
+
spawnSync: (file, args, options) => require('node:child_process').spawnSync(file, args, options),
|
|
49
|
+
randomHex: (bytes) => (0, node_crypto_1.randomBytes)(bytes).toString('hex'),
|
|
50
|
+
now: () => Date.now(),
|
|
51
|
+
mkdir: (path) => { (0, node_fs_1.mkdirSync)(path); },
|
|
52
|
+
cache: processCache,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// ---- path grammar ------------------------------------------------------------------------
|
|
56
|
+
const DEVICE_NAME = /^(?:CON|PRN|AUX|NUL|CONIN\$|CONOUT\$|(?:COM|LPT)[0-9\u00b9\u00b2\u00b3])$/i;
|
|
57
|
+
/** True only for `X:\a\b` with no alias, device, stream, UNC, relative or forward-slash form. */
|
|
58
|
+
function validWindowsPath(value) {
|
|
59
|
+
if (typeof value !== 'string' || value.length < 4 || value.length > 240)
|
|
60
|
+
return false;
|
|
61
|
+
if (!/^[A-Za-z]:\\/.test(value) || value.includes('/') || value.endsWith('\\'))
|
|
62
|
+
return false;
|
|
63
|
+
for (let index = 0; index < value.length; index += 1)
|
|
64
|
+
if (value.charCodeAt(index) < 0x20)
|
|
65
|
+
return false;
|
|
66
|
+
if (/[<>"|?*]/.test(value))
|
|
67
|
+
return false;
|
|
68
|
+
const rest = value.slice(3);
|
|
69
|
+
if (rest.includes(':'))
|
|
70
|
+
return false;
|
|
71
|
+
for (const part of rest.split('\\')) {
|
|
72
|
+
if (part === '' || part === '.' || part === '..' || part.endsWith('.') || part.endsWith(' '))
|
|
73
|
+
return false;
|
|
74
|
+
if (DEVICE_NAME.test(part.split('.')[0].replace(/ +$/, '')))
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
function componentCount(path) { return path.slice(3).split('\\').length; }
|
|
80
|
+
function sameOrUnder(child, parent) {
|
|
81
|
+
const c = child.toLowerCase();
|
|
82
|
+
const p = parent.toLowerCase();
|
|
83
|
+
return c === p || c.startsWith(`${p}\\`);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Every prefix must be a plain folder (file at the end) and must resolve to itself. lstat alone is not
|
|
87
|
+
* enough on Windows: Node reports only some reparse points as links (a junction whose target is a
|
|
88
|
+
* volume GUID, or a volume mount point, looks like an ordinary folder). So each prefix also has to
|
|
89
|
+
* canonicalise to exactly one more component under the previous prefix's canonical path, with the
|
|
90
|
+
* same name (a different name is allowed only for an 8.3 short name, which contains `~`), on one volume.
|
|
91
|
+
*/
|
|
92
|
+
function chain(path, final, deps) {
|
|
93
|
+
if (!validWindowsPath(path))
|
|
94
|
+
refuse('path');
|
|
95
|
+
const parts = path.slice(3).split('\\');
|
|
96
|
+
let current = path.slice(0, 2);
|
|
97
|
+
let parentReal = current.toLowerCase();
|
|
98
|
+
const out = [];
|
|
99
|
+
for (let index = 0; index < parts.length; index += 1) {
|
|
100
|
+
current = `${current}\\${parts[index]}`;
|
|
101
|
+
let stat;
|
|
102
|
+
try {
|
|
103
|
+
stat = deps.lstatBig(current);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return refuse('chain');
|
|
107
|
+
}
|
|
108
|
+
if (stat.isSymbolicLink())
|
|
109
|
+
refuse('chain');
|
|
110
|
+
if (out.length > 0 && stat.dev !== out[0].stat.dev)
|
|
111
|
+
refuse('chain');
|
|
112
|
+
let real;
|
|
113
|
+
try {
|
|
114
|
+
real = deps.realpathNative(current);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return refuse('canonical');
|
|
118
|
+
}
|
|
119
|
+
if (!validWindowsPath(real) || real.startsWith('\\\\'))
|
|
120
|
+
return refuse('canonical');
|
|
121
|
+
const lowerReal = real.toLowerCase();
|
|
122
|
+
const name = real.slice(real.lastIndexOf('\\') + 1).toLowerCase();
|
|
123
|
+
if (!lowerReal.startsWith(`${parentReal}\\`) || componentCount(real) !== index + 1
|
|
124
|
+
|| (name !== parts[index].toLowerCase() && !/~\d+(?:\.[^.]*)?$/.test(parts[index]) && !(index === 1 && parts[index].toLowerCase() === 'system32' && name === 'syswow64')))
|
|
125
|
+
return refuse('canonical');
|
|
126
|
+
parentReal = lowerReal;
|
|
127
|
+
if (final === 'file' && index === parts.length - 1 ? !stat.isFile() : !stat.isDirectory())
|
|
128
|
+
refuse('chain');
|
|
129
|
+
out.push({ path: current, stat });
|
|
130
|
+
}
|
|
131
|
+
return out;
|
|
132
|
+
}
|
|
133
|
+
function canonicalOf(lexical, deps) {
|
|
134
|
+
let real;
|
|
135
|
+
try {
|
|
136
|
+
real = deps.realpathNative(lexical);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return refuse('canonical');
|
|
140
|
+
}
|
|
141
|
+
if (!validWindowsPath(real) || real.startsWith('\\\\') || componentCount(real) !== componentCount(lexical))
|
|
142
|
+
return refuse('canonical');
|
|
143
|
+
return real;
|
|
144
|
+
}
|
|
145
|
+
// ---- the security descriptor: closed binary grammar ----------------------------------------------
|
|
146
|
+
//
|
|
147
|
+
// PowerShell returns `GetSecurityDescriptorBinaryForm()` as base64. Binary keeps SIDs and masks raw:
|
|
148
|
+
// no SDDL alias table, no locale, no domain-relative alias (`LA`, `DU`, ...). Anything the grammar
|
|
149
|
+
// does not know is a refusal.
|
|
150
|
+
const CONTROL_ALLOWED = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0100 | 0x0200 | 0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000;
|
|
151
|
+
const CONTROL_DACL_PRESENT = 0x0004;
|
|
152
|
+
const CONTROL_SELF_RELATIVE = 0x8000;
|
|
153
|
+
const ACE_ALLOWED = 0;
|
|
154
|
+
const ACE_DENIED = 1;
|
|
155
|
+
const ACE_FLAGS_ALLOWED = 0x1F; // object, container, no-propagate, inherit-only, inherited
|
|
156
|
+
const ACE_INHERIT_ONLY = 0x08;
|
|
157
|
+
// write/add-file, append/add-subdir, write-EA, delete-child, write-attributes, DELETE, WRITE_DAC,
|
|
158
|
+
// WRITE_OWNER, ACCESS_SYSTEM_SECURITY, MAXIMUM_ALLOWED, GENERIC_ALL, GENERIC_WRITE
|
|
159
|
+
const WRITE_CLASS = 0x2 | 0x4 | 0x10 | 0x40 | 0x100 | 0x10000 | 0x40000 | 0x80000 | 0x1000000 | 0x2000000 | 0x10000000 | 0x40000000;
|
|
160
|
+
const CREATOR_OWNER = 'S-1-3-0';
|
|
161
|
+
const CREATOR_GROUP = 'S-1-3-1';
|
|
162
|
+
function sidAt(buffer, offset) {
|
|
163
|
+
if (offset < 0 || offset + 8 > buffer.length || buffer[offset] !== 1)
|
|
164
|
+
return null;
|
|
165
|
+
const count = buffer[offset + 1];
|
|
166
|
+
if (count < 1 || count > 15)
|
|
167
|
+
return null;
|
|
168
|
+
const length = 8 + 4 * count;
|
|
169
|
+
if (offset + length > buffer.length)
|
|
170
|
+
return null;
|
|
171
|
+
const authority = buffer.readUIntBE(offset + 2, 6);
|
|
172
|
+
const parts = [authority > 0xFFFFFFFF ? `0x${authority.toString(16)}` : String(authority)];
|
|
173
|
+
for (let index = 0; index < count; index += 1)
|
|
174
|
+
parts.push(String(buffer.readUInt32LE(offset + 8 + 4 * index)));
|
|
175
|
+
return { sid: `S-1-${parts.join('-')}`, length };
|
|
176
|
+
}
|
|
177
|
+
/** Self-relative SECURITY_DESCRIPTOR to its owner SID and allow/deny ACEs; null for anything outside the grammar. */
|
|
178
|
+
function parseSecurityDescriptor(buffer) {
|
|
179
|
+
if (buffer.length < 20 || buffer.length > MAX_DESCRIPTOR_BYTES || buffer[0] !== 1 || buffer[1] !== 0)
|
|
180
|
+
return null;
|
|
181
|
+
const control = buffer.readUInt16LE(2);
|
|
182
|
+
if ((control & CONTROL_SELF_RELATIVE) === 0 || (control & CONTROL_DACL_PRESENT) === 0 || (control & ~CONTROL_ALLOWED) !== 0)
|
|
183
|
+
return null;
|
|
184
|
+
const ownerOffset = buffer.readUInt32LE(4);
|
|
185
|
+
const groupOffset = buffer.readUInt32LE(8);
|
|
186
|
+
const saclOffset = buffer.readUInt32LE(12);
|
|
187
|
+
const daclOffset = buffer.readUInt32LE(16);
|
|
188
|
+
// The SACL is never read (it grants nothing), but a flag and an offset that disagree are refused.
|
|
189
|
+
const saclPresent = (control & 0x0010) !== 0;
|
|
190
|
+
if ((!saclPresent && saclOffset !== 0) || (saclPresent && saclOffset !== 0 && (saclOffset < 20 || saclOffset >= buffer.length)))
|
|
191
|
+
return null;
|
|
192
|
+
// An owner is required, and a present but null DACL (offset 0) is refused: that grants everyone everything.
|
|
193
|
+
if (ownerOffset < 20 || daclOffset < 20)
|
|
194
|
+
return null;
|
|
195
|
+
const owner = sidAt(buffer, ownerOffset);
|
|
196
|
+
if (!owner)
|
|
197
|
+
return null;
|
|
198
|
+
const regions = [[ownerOffset, ownerOffset + owner.length]];
|
|
199
|
+
// The primary group grants nothing: syntax only, never evaluated.
|
|
200
|
+
if (groupOffset !== 0) {
|
|
201
|
+
const group = groupOffset < 20 ? null : sidAt(buffer, groupOffset);
|
|
202
|
+
if (!group)
|
|
203
|
+
return null;
|
|
204
|
+
regions.push([groupOffset, groupOffset + group.length]);
|
|
205
|
+
}
|
|
206
|
+
if (daclOffset + 8 > buffer.length)
|
|
207
|
+
return null;
|
|
208
|
+
const revision = buffer[daclOffset];
|
|
209
|
+
const aclSize = buffer.readUInt16LE(daclOffset + 2);
|
|
210
|
+
const count = buffer.readUInt16LE(daclOffset + 4);
|
|
211
|
+
if ((revision !== 2 && revision !== 4) || aclSize < 8 || daclOffset + aclSize > buffer.length || count > 1024)
|
|
212
|
+
return null;
|
|
213
|
+
const aclEnd = daclOffset + aclSize;
|
|
214
|
+
const aces = [];
|
|
215
|
+
let at = daclOffset + 8;
|
|
216
|
+
for (let index = 0; index < count; index += 1) {
|
|
217
|
+
if (at + 16 > aclEnd)
|
|
218
|
+
return null;
|
|
219
|
+
const type = buffer[at];
|
|
220
|
+
const flags = buffer[at + 1];
|
|
221
|
+
const size = buffer.readUInt16LE(at + 2);
|
|
222
|
+
if ((type !== ACE_ALLOWED && type !== ACE_DENIED) || (flags & ~ACE_FLAGS_ALLOWED) !== 0 || size < 16 || at + size > aclEnd)
|
|
223
|
+
return null;
|
|
224
|
+
const sid = sidAt(buffer, at + 8);
|
|
225
|
+
if (!sid || 8 + sid.length !== size)
|
|
226
|
+
return null;
|
|
227
|
+
aces.push({ type, flags, mask: buffer.readUInt32LE(at + 4), sid: sid.sid });
|
|
228
|
+
at += size;
|
|
229
|
+
}
|
|
230
|
+
if (at !== aclEnd)
|
|
231
|
+
return null;
|
|
232
|
+
regions.push([daclOffset, aclEnd]);
|
|
233
|
+
// The parts of one descriptor never overlap, and without a SACL (Get-Acl does not read one) the
|
|
234
|
+
// descriptor ends where its last part ends.
|
|
235
|
+
regions.sort((a, b) => a[0] - b[0]);
|
|
236
|
+
for (let index = 1; index < regions.length; index += 1)
|
|
237
|
+
if (regions[index][0] < regions[index - 1][1])
|
|
238
|
+
return null;
|
|
239
|
+
if (!saclPresent && regions[regions.length - 1][1] !== buffer.length)
|
|
240
|
+
return null;
|
|
241
|
+
return { owner: owner.sid, aces };
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Judges one object's descriptor (base64) against `policy`. null: private enough. Otherwise a reason.
|
|
245
|
+
* The owner must be trusted; a deny ACE can only remove access and is skipped; every allow ACE for
|
|
246
|
+
* someone else is judged by its raw mask.
|
|
247
|
+
*/
|
|
248
|
+
function evaluateDescriptor(encoded, trusted, policy) {
|
|
249
|
+
if (typeof encoded !== 'string' || encoded.length === 0 || encoded.length > MAX_DESCRIPTOR_LINE || encoded.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(encoded))
|
|
250
|
+
return 'descriptor';
|
|
251
|
+
const parsed = parseSecurityDescriptor(Buffer.from(encoded, 'base64'));
|
|
252
|
+
if (!parsed)
|
|
253
|
+
return 'descriptor';
|
|
254
|
+
if (!trusted.has(parsed.owner))
|
|
255
|
+
return 'owner';
|
|
256
|
+
for (const ace of parsed.aces) {
|
|
257
|
+
if (ace.type === ACE_DENIED || trusted.has(ace.sid))
|
|
258
|
+
continue;
|
|
259
|
+
if (ace.sid === CREATOR_OWNER && (ace.flags & ACE_INHERIT_ONLY) !== 0)
|
|
260
|
+
continue;
|
|
261
|
+
if (ace.sid === CREATOR_GROUP)
|
|
262
|
+
return 'acl';
|
|
263
|
+
if (policy === 'no_write_by_others' ? (ace.mask & WRITE_CLASS) !== 0 : ace.mask !== 0)
|
|
264
|
+
return 'acl';
|
|
265
|
+
}
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
// ---- the Get-Acl spawn ------------------------------------------------------------------------------
|
|
269
|
+
// A source constant: no path or value is ever interpolated into it. It is passed as -EncodedCommand
|
|
270
|
+
// (base64 of UTF-16LE), so there is no quoting, no standard-input session and no profile. Every ACL
|
|
271
|
+
// line is written by the same expression that calls Get-Acl, so a failed Get-Acl can never leave an
|
|
272
|
+
// earlier object's value to be printed for a later one. One catch turns any error into exit 3.
|
|
273
|
+
// Paths come from MARROW_WINACL_P<i> environment items. The user's SID comes from the process token.
|
|
274
|
+
const SCRIPT = [
|
|
275
|
+
"$ErrorActionPreference='Stop'",
|
|
276
|
+
"$ProgressPreference='SilentlyContinue'",
|
|
277
|
+
'try{',
|
|
278
|
+
"$nonce=[Environment]::GetEnvironmentVariable('MARROW_WINACL_NONCE')",
|
|
279
|
+
"[Console]::Out.WriteLine('BEGIN '+$nonce)",
|
|
280
|
+
"[Console]::Out.WriteLine('SID '+[System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value)",
|
|
281
|
+
"$n=[int][Environment]::GetEnvironmentVariable('MARROW_WINACL_N')",
|
|
282
|
+
"for($i=1;$i -le $n;$i++){[Console]::Out.WriteLine('ACL '+$i+' '+[Convert]::ToBase64String((Microsoft.PowerShell.Security\\Get-Acl -LiteralPath ([Environment]::GetEnvironmentVariable('MARROW_WINACL_P'+$i))).GetSecurityDescriptorBinaryForm()))}",
|
|
283
|
+
"[Console]::Out.WriteLine('END '+$nonce)",
|
|
284
|
+
'exit 0',
|
|
285
|
+
'}catch{exit 3}',
|
|
286
|
+
'',
|
|
287
|
+
].join('\n');
|
|
288
|
+
exports.WIN_ACL_SCRIPT = SCRIPT;
|
|
289
|
+
exports.WIN_ACL_ENCODED = Buffer.from(SCRIPT, 'utf16le').toString('base64');
|
|
290
|
+
const POWERSHELL_ARGS = ['-NoLogo', '-NoProfile', '-NonInteractive', '-EncodedCommand', exports.WIN_ACL_ENCODED];
|
|
291
|
+
function parseOutput(stdout, nonce, count) {
|
|
292
|
+
if (typeof stdout !== 'string' || stdout.length > exports.WIN_PROOF_MAX_BUFFER)
|
|
293
|
+
return refuse('output');
|
|
294
|
+
const lines = stdout.split(/\r?\n/);
|
|
295
|
+
if (lines.length > 0 && lines[lines.length - 1] === '')
|
|
296
|
+
lines.pop();
|
|
297
|
+
if (lines.length !== count + 3)
|
|
298
|
+
return refuse('output');
|
|
299
|
+
if (lines[0] !== `BEGIN ${nonce}` || lines[lines.length - 1] !== `END ${nonce}`)
|
|
300
|
+
return refuse('output');
|
|
301
|
+
const sidLine = /^SID (S-1-\d{1,3}(?:-\d{1,10}){1,14})$/.exec(lines[1]);
|
|
302
|
+
if (!sidLine)
|
|
303
|
+
return refuse('output');
|
|
304
|
+
const descriptors = [];
|
|
305
|
+
for (let index = 1; index <= count; index += 1) {
|
|
306
|
+
const prefix = `ACL ${index} `;
|
|
307
|
+
const line = lines[index + 1];
|
|
308
|
+
if (!line.startsWith(prefix))
|
|
309
|
+
return refuse('output');
|
|
310
|
+
const descriptor = line.slice(prefix.length);
|
|
311
|
+
if (descriptor.length === 0 || descriptor.length > MAX_DESCRIPTOR_LINE)
|
|
312
|
+
return refuse('output');
|
|
313
|
+
descriptors.push(descriptor);
|
|
314
|
+
}
|
|
315
|
+
return { sid: sidLine[1], descriptors };
|
|
316
|
+
}
|
|
317
|
+
function systemRoot(env, canonicalHome) {
|
|
318
|
+
const root = env.SystemRoot;
|
|
319
|
+
if (typeof root !== 'string' || !/^[A-Za-z]:\\[A-Za-z0-9_.-]{1,64}$/.test(root) || !validWindowsPath(root))
|
|
320
|
+
return refuse('sysroot');
|
|
321
|
+
const windir = env.windir;
|
|
322
|
+
if (windir !== undefined && windir.toLowerCase() !== root.toLowerCase())
|
|
323
|
+
return refuse('sysroot');
|
|
324
|
+
if (sameOrUnder(root, canonicalHome))
|
|
325
|
+
return refuse('sysroot');
|
|
326
|
+
return root;
|
|
327
|
+
}
|
|
328
|
+
/** Folder identity: (dev, ino, birthtime) of every directory in the chains. ctime is not used: NTFS bumps it on every entry created inside. */
|
|
329
|
+
function identityOf(stats) {
|
|
330
|
+
return [...stats.entries()].filter(([, stat]) => stat.isDirectory()).sort(([a], [b]) => (a < b ? -1 : 1))
|
|
331
|
+
.map(([path, stat]) => `${path}|${stat.dev}|${stat.ino}|${stat.birthtimeNs}`).join('\n');
|
|
332
|
+
}
|
|
333
|
+
// ---- the whole proof ----------------------------------------------------------------------------------
|
|
334
|
+
function prove(request, deps) {
|
|
335
|
+
if (deps.platform !== 'win32')
|
|
336
|
+
refuse('platform');
|
|
337
|
+
if (request.objects.length === 0 || request.objects.length > 8)
|
|
338
|
+
refuse('internal');
|
|
339
|
+
const startedAt = deps.now();
|
|
340
|
+
const homeChain = chain(request.home, 'dir', deps);
|
|
341
|
+
const home = canonicalOf(request.home, deps);
|
|
342
|
+
const canonical = {};
|
|
343
|
+
const stats = new Map();
|
|
344
|
+
const fileKeys = {};
|
|
345
|
+
for (const entry of homeChain)
|
|
346
|
+
stats.set(entry.path.toLowerCase(), entry.stat);
|
|
347
|
+
const paths = [];
|
|
348
|
+
for (const object of request.objects) {
|
|
349
|
+
const lexical = `${home}\\${object.rel}`;
|
|
350
|
+
const links = chain(lexical, object.kind, deps);
|
|
351
|
+
const real = canonicalOf(lexical, deps);
|
|
352
|
+
if (!sameOrUnder(real, home) || canonical[object.rel] !== undefined)
|
|
353
|
+
refuse('canonical');
|
|
354
|
+
// A state file must not be a hard link.
|
|
355
|
+
if (object.kind === 'file') {
|
|
356
|
+
const last = links[links.length - 1].stat;
|
|
357
|
+
if (last.nlink !== 1n)
|
|
358
|
+
refuse('chain');
|
|
359
|
+
fileKeys[object.rel] = `${last.dev}:${last.ino}`;
|
|
360
|
+
}
|
|
361
|
+
for (const entry of links)
|
|
362
|
+
stats.set(entry.path.toLowerCase(), entry.stat);
|
|
363
|
+
canonical[object.rel] = real;
|
|
364
|
+
paths.push(real);
|
|
365
|
+
}
|
|
366
|
+
const root = systemRoot(deps.env, home);
|
|
367
|
+
const exe = `${root}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`;
|
|
368
|
+
chain(exe, 'file', deps);
|
|
369
|
+
const realExe = canonicalOf(exe, deps);
|
|
370
|
+
if (sameOrUnder(realExe, home))
|
|
371
|
+
refuse('powershell');
|
|
372
|
+
const key = JSON.stringify([root, request.objects.map((object, index) => [object.rel, object.kind, object.policy, paths[index]])]);
|
|
373
|
+
const identity = identityOf(stats);
|
|
374
|
+
// A state file that was replaced is a different object: it is part of what a cached answer covers.
|
|
375
|
+
const signature = `${identity}\n${Object.entries(fileKeys).map(([rel, id]) => `${rel}=${id}`).join('\n')}`;
|
|
376
|
+
const cache = deps.cache;
|
|
377
|
+
const cached = cache?.get(key);
|
|
378
|
+
if (cached && cached.signature === signature && deps.now() - cached.at <= exports.WIN_PROOF_CACHE_MS && deps.now() - cached.at >= 0) {
|
|
379
|
+
return { home, canonical, identity, provedAtMs: cached.at, fileKeys };
|
|
380
|
+
}
|
|
381
|
+
cache?.delete(key);
|
|
382
|
+
let temp = `${root}\\Temp`;
|
|
383
|
+
try {
|
|
384
|
+
const candidate = `${home}\\AppData\\Local\\Temp`;
|
|
385
|
+
chain(candidate, 'dir', deps);
|
|
386
|
+
temp = canonicalOf(candidate, deps);
|
|
387
|
+
}
|
|
388
|
+
catch { /* fall back to the Windows temp folder */ }
|
|
389
|
+
const nonce = deps.randomHex(16);
|
|
390
|
+
if (!/^[0-9a-f]{32}$/.test(nonce))
|
|
391
|
+
refuse('internal');
|
|
392
|
+
const env = {
|
|
393
|
+
SystemRoot: root,
|
|
394
|
+
windir: root,
|
|
395
|
+
PSModulePath: `${root}\\System32\\WindowsPowerShell\\v1.0\\Modules`,
|
|
396
|
+
TEMP: temp,
|
|
397
|
+
TMP: temp,
|
|
398
|
+
MARROW_WINACL_NONCE: nonce,
|
|
399
|
+
MARROW_WINACL_N: String(paths.length),
|
|
400
|
+
};
|
|
401
|
+
paths.forEach((path, index) => { env[`MARROW_WINACL_P${index + 1}`] = path; });
|
|
402
|
+
let result;
|
|
403
|
+
try {
|
|
404
|
+
result = deps.spawnSync(realExe, POWERSHELL_ARGS, {
|
|
405
|
+
stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf8', windowsHide: true, shell: false,
|
|
406
|
+
timeout: exports.WIN_PROOF_TIMEOUT_MS, maxBuffer: exports.WIN_PROOF_MAX_BUFFER, cwd: `${root}\\System32`, env,
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
catch {
|
|
410
|
+
return refuse('spawn');
|
|
411
|
+
}
|
|
412
|
+
if (result && result.error && result.error.code === 'ETIMEDOUT')
|
|
413
|
+
return refuse('timeout');
|
|
414
|
+
if (!result || result.error || result.signal || result.status !== 0)
|
|
415
|
+
return refuse('spawn');
|
|
416
|
+
const parsed = parseOutput(result.stdout, nonce, paths.length);
|
|
417
|
+
const trusted = new Set([parsed.sid, 'S-1-5-18', 'S-1-5-32-544']);
|
|
418
|
+
request.objects.forEach((object, index) => {
|
|
419
|
+
const verdict = evaluateDescriptor(parsed.descriptors[index], trusted, object.policy);
|
|
420
|
+
if (verdict !== null)
|
|
421
|
+
refuse(verdict);
|
|
422
|
+
});
|
|
423
|
+
cache?.set(key, { at: startedAt, signature });
|
|
424
|
+
return { home, canonical, identity, provedAtMs: startedAt, fileKeys };
|
|
425
|
+
}
|
|
426
|
+
/** The proof. Never throws; every failure is `{ ok: false, reason }`. */
|
|
427
|
+
function proveWindowsPrivate(request, deps) {
|
|
428
|
+
try {
|
|
429
|
+
const proven = prove(request, deps);
|
|
430
|
+
return { ok: true, home: proven.home, canonical: proven.canonical, identity: proven.identity, provedAtMs: proven.provedAtMs, fileKeys: proven.fileKeys };
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
return { ok: false, reason: error instanceof WinRefusal ? error.reason : 'internal' };
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
// ---- create the two directories, then prove them -------------------------------------------------------
|
|
437
|
+
const STATE_DIRECTORY = 'session-loop-guard';
|
|
438
|
+
const STATE_FILE = 'state.json';
|
|
439
|
+
function presentNoFollow(path, deps) {
|
|
440
|
+
try {
|
|
441
|
+
deps.lstatBig(path);
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
if (error?.code === 'ENOENT')
|
|
446
|
+
return false;
|
|
447
|
+
return refuse('chain');
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
function makeDirectory(path, deps) {
|
|
451
|
+
if (!presentNoFollow(path, deps)) {
|
|
452
|
+
try {
|
|
453
|
+
deps.mkdir(path);
|
|
454
|
+
}
|
|
455
|
+
catch (error) {
|
|
456
|
+
if (error?.code !== 'EEXIST')
|
|
457
|
+
refuse('mkdir');
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
chain(path, 'dir', deps);
|
|
461
|
+
// The parent is already canonical, so the child must resolve to exactly the path we built.
|
|
462
|
+
const real = canonicalOf(path, deps);
|
|
463
|
+
if (real.toLowerCase() !== path.toLowerCase())
|
|
464
|
+
refuse('canonical');
|
|
465
|
+
return real;
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* `~/.marrow` and `~/.marrow/session-loop-guard` are created when absent (they inherit the profile
|
|
469
|
+
* DACL), checked for reparse points and canonicalised after each creation, and then proven private
|
|
470
|
+
* together with `state.json` when it exists. `home` is the caller's `os.homedir()`; HOME is never read.
|
|
471
|
+
* This spawns PowerShell: call it BEFORE taking the state lock, never while holding it.
|
|
472
|
+
*/
|
|
473
|
+
function ensureWindowsPrivateState(home, deps) {
|
|
474
|
+
try {
|
|
475
|
+
if (deps.platform !== 'win32')
|
|
476
|
+
refuse('platform');
|
|
477
|
+
if (!validWindowsPath(home))
|
|
478
|
+
refuse('path');
|
|
479
|
+
const startedAt = deps.now();
|
|
480
|
+
chain(home, 'dir', deps);
|
|
481
|
+
const canonicalHome = canonicalOf(home, deps);
|
|
482
|
+
const marrow = makeDirectory(`${canonicalHome}\\.marrow`, deps);
|
|
483
|
+
const directory = makeDirectory(`${marrow}\\${STATE_DIRECTORY}`, deps);
|
|
484
|
+
const target = `${directory}\\${STATE_FILE}`;
|
|
485
|
+
const stateProven = presentNoFollow(target, deps);
|
|
486
|
+
const objects = [
|
|
487
|
+
{ rel: '.marrow', kind: 'dir', policy: 'no_write_by_others' },
|
|
488
|
+
{ rel: `.marrow\\${STATE_DIRECTORY}`, kind: 'dir', policy: 'no_access_by_others' },
|
|
489
|
+
];
|
|
490
|
+
if (stateProven)
|
|
491
|
+
objects.push({ rel: `.marrow\\${STATE_DIRECTORY}\\${STATE_FILE}`, kind: 'file', policy: 'no_access_by_others' });
|
|
492
|
+
const proof = proveWindowsPrivate({ home: canonicalHome, objects }, deps);
|
|
493
|
+
if (!proof.ok)
|
|
494
|
+
return proof;
|
|
495
|
+
const stateKey = stateProven ? proof.fileKeys[`.marrow\\${STATE_DIRECTORY}\\${STATE_FILE}`] ?? null : null;
|
|
496
|
+
// Born after this moment means created inside the proven folder, which gave it the proven DACL.
|
|
497
|
+
const provedAtMs = Math.min(startedAt, proof.provedAtMs);
|
|
498
|
+
return { ok: true, marrow: proof.canonical['.marrow'], directory: proof.canonical[`.marrow\\${STATE_DIRECTORY}`], target, stateProven, identity: proof.identity, provedAtMs, stateKey };
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
return { ok: false, reason: error instanceof WinRefusal ? error.reason : 'internal' };
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Called while the state lock is held: the cheap structural half only (path grammar, no reparse
|
|
506
|
+
* point, canonical path, hard-link count) plus the folder identity of the earlier proof. It never
|
|
507
|
+
* spawns anything. A state file that appeared or was replaced after the proof is accepted if it is a
|
|
508
|
+
* plain single-link file in an unchanged, already proven folder: only a trusted principal can create
|
|
509
|
+
* entries there. A changed folder identity is a refusal, with no retry.
|
|
510
|
+
*/
|
|
511
|
+
function verifyWindowsPrivateState(home, proof, deps) {
|
|
512
|
+
try {
|
|
513
|
+
if (deps.platform !== 'win32' || !validWindowsPath(home))
|
|
514
|
+
return false;
|
|
515
|
+
const stats = new Map();
|
|
516
|
+
const note = (entries) => { for (const entry of entries)
|
|
517
|
+
stats.set(entry.path.toLowerCase(), entry.stat); };
|
|
518
|
+
chain(home, 'dir', deps);
|
|
519
|
+
const canonicalHome = canonicalOf(home, deps);
|
|
520
|
+
note(chain(canonicalHome, 'dir', deps));
|
|
521
|
+
for (const [expected, kind] of [[proof.marrow, 'dir'], [proof.directory, 'dir']]) {
|
|
522
|
+
note(chain(expected, kind, deps));
|
|
523
|
+
if (canonicalOf(expected, deps).toLowerCase() !== expected.toLowerCase() || !sameOrUnder(expected, canonicalHome))
|
|
524
|
+
return false;
|
|
525
|
+
}
|
|
526
|
+
if (presentNoFollow(proof.target, deps)) {
|
|
527
|
+
const entries = chain(proof.target, 'file', deps);
|
|
528
|
+
const file = entries[entries.length - 1].stat;
|
|
529
|
+
if (file.nlink !== 1n || canonicalOf(proof.target, deps).toLowerCase() !== proof.target.toLowerCase())
|
|
530
|
+
return false;
|
|
531
|
+
// The file the proof covered is fine. Any other state file (new, or renamed over by a writer) is accepted
|
|
532
|
+
// only if it was BORN after the proof began: a file created inside the proven folder inherited its
|
|
533
|
+
// DACL, while one moved in from elsewhere keeps its old DACL and an older birth time.
|
|
534
|
+
const covered = proof.stateKey !== null && proof.stateKey === `${file.dev}:${file.ino}`;
|
|
535
|
+
if (!covered && file.birthtimeNs < BigInt(Math.max(0, proof.provedAtMs - exports.WIN_BIRTH_TOLERANCE_MS)) * 1000000n)
|
|
536
|
+
return false;
|
|
537
|
+
}
|
|
538
|
+
return identityOf(stats) === proof.identity;
|
|
539
|
+
}
|
|
540
|
+
catch {
|
|
541
|
+
return false;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
//# sourceMappingURL=win-private-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"win-private-state.js","sourceRoot":"","sources":["../src/win-private-state.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/server.json
CHANGED