@namzu/sandbox 2.0.1 → 2.0.3
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/CHANGELOG.md +58 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +12 -2
- package/src/index.ts +1 -1
- package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.d.ts +0 -2
- package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.d.ts.map +0 -1
- package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.js +0 -61
- package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.js.map +0 -1
- package/dist/backends/docker/__tests__/hardening.test.d.ts +0 -2
- package/dist/backends/docker/__tests__/hardening.test.d.ts.map +0 -1
- package/dist/backends/docker/__tests__/hardening.test.js +0 -32
- package/dist/backends/docker/__tests__/hardening.test.js.map +0 -1
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts +0 -40
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts.map +0 -1
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js +0 -157
- package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js.map +0 -1
- package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.d.ts +0 -16
- package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.js +0 -37
- package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.js.map +0 -1
- package/dist/backends/firecracker/__tests__/backend.test.d.ts +0 -13
- package/dist/backends/firecracker/__tests__/backend.test.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/backend.test.js +0 -361
- package/dist/backends/firecracker/__tests__/backend.test.js.map +0 -1
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts +0 -19
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js +0 -209
- package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js.map +0 -1
- package/dist/backends/firecracker/__tests__/egress-policy.test.d.ts +0 -2
- package/dist/backends/firecracker/__tests__/egress-policy.test.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/egress-policy.test.js +0 -67
- package/dist/backends/firecracker/__tests__/egress-policy.test.js.map +0 -1
- package/dist/backends/firecracker/__tests__/fixtures/ipc-path.d.ts +0 -21
- package/dist/backends/firecracker/__tests__/fixtures/ipc-path.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/fixtures/ipc-path.js +0 -30
- package/dist/backends/firecracker/__tests__/fixtures/ipc-path.js.map +0 -1
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts +0 -39
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js +0 -149
- package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js.map +0 -1
- package/dist/backends/firecracker/__tests__/protocol.test.d.ts +0 -6
- package/dist/backends/firecracker/__tests__/protocol.test.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/protocol.test.js +0 -67
- package/dist/backends/firecracker/__tests__/protocol.test.js.map +0 -1
- package/dist/backends/firecracker/__tests__/transport.test.d.ts +0 -20
- package/dist/backends/firecracker/__tests__/transport.test.d.ts.map +0 -1
- package/dist/backends/firecracker/__tests__/transport.test.js +0 -457
- package/dist/backends/firecracker/__tests__/transport.test.js.map +0 -1
- package/dist/egress/__tests__/allowlist.test.d.ts +0 -2
- package/dist/egress/__tests__/allowlist.test.d.ts.map +0 -1
- package/dist/egress/__tests__/allowlist.test.js +0 -85
- package/dist/egress/__tests__/allowlist.test.js.map +0 -1
- package/dist/egress/__tests__/proxy.test.d.ts +0 -2
- package/dist/egress/__tests__/proxy.test.d.ts.map +0 -1
- package/dist/egress/__tests__/proxy.test.js +0 -177
- package/dist/egress/__tests__/proxy.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -28
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -649
- package/dist/index.test.js.map +0 -1
- package/src/backends/aci-standby-pool/__tests__/unenforceable-controls.test.ts +0 -69
- package/src/backends/docker/__tests__/hardening.test.ts +0 -43
- package/src/backends/docker/__tests__/leaf-permissions.smoke.test.ts +0 -169
- package/src/backends/firecracker/__tests__/agent-timeout-clamp.test.ts +0 -48
- package/src/backends/firecracker/__tests__/backend.test.ts +0 -429
- package/src/backends/firecracker/__tests__/control-plane-mtls.test.ts +0 -261
- package/src/backends/firecracker/__tests__/egress-policy.test.ts +0 -91
- package/src/backends/firecracker/__tests__/fixtures/ipc-path.ts +0 -31
- package/src/backends/firecracker/__tests__/fixtures/mtls-pki.ts +0 -166
- package/src/backends/firecracker/__tests__/protocol.test.ts +0 -75
- package/src/backends/firecracker/__tests__/transport.test.ts +0 -534
- package/src/egress/__tests__/allowlist.test.ts +0 -103
- package/src/egress/__tests__/proxy.test.ts +0 -212
- package/src/index.test.ts +0 -709
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { createServer, request as nodeRequest } from 'node:http';
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
3
|
-
import { EgressProxy } from '../proxy.js';
|
|
4
|
-
/**
|
|
5
|
-
* Until this existed, an egress policy could be declared and only two of
|
|
6
|
-
* its four shapes could be honoured anywhere: the container backend
|
|
7
|
-
* refused a host allowlist outright because it had no proxy to filter
|
|
8
|
-
* through. `deny-all` and `allow-all` were the whole spectrum — all or
|
|
9
|
-
* nothing.
|
|
10
|
-
*
|
|
11
|
-
* It also settles where credentials live. Any token the agent needed to
|
|
12
|
-
* reach an allowed host had to be INSIDE the sandbox, in the environment,
|
|
13
|
-
* readable by the untrusted code it is meant to be isolated from — via
|
|
14
|
-
* `/proc/self/environ`, or via a prompt injection that exfiltrates it over
|
|
15
|
-
* the very egress the policy permits.
|
|
16
|
-
*/
|
|
17
|
-
/** A stand-in upstream that reports what it was sent. */
|
|
18
|
-
function upstream() {
|
|
19
|
-
const seen = [];
|
|
20
|
-
const server = createServer((req, res) => {
|
|
21
|
-
seen.push(req);
|
|
22
|
-
res.writeHead(200, { 'content-type': 'text/plain' });
|
|
23
|
-
res.end('upstream ok');
|
|
24
|
-
});
|
|
25
|
-
return new Promise((resolve) => {
|
|
26
|
-
server.listen(0, '127.0.0.1', () => {
|
|
27
|
-
const address = server.address();
|
|
28
|
-
const port = typeof address === 'object' && address !== null ? address.port : 0;
|
|
29
|
-
resolve({ server, port, seen });
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Issue a request THROUGH the proxy, the way a proxied client does: the
|
|
35
|
-
* absolute URL goes in the request line.
|
|
36
|
-
*
|
|
37
|
-
* `fetch` cannot express this — it owns the `Host` header and refuses an
|
|
38
|
-
* override, so a request built with it names the proxy as its own target.
|
|
39
|
-
* The first version of this helper did exactly that, and the proxy
|
|
40
|
-
* forwarded to itself and hung. That hang is now a 400, and this helper
|
|
41
|
-
* speaks the protocol properly.
|
|
42
|
-
*/
|
|
43
|
-
function viaProxy(proxy, target, init = {}) {
|
|
44
|
-
const proxyUrl = new URL(proxy.url);
|
|
45
|
-
return new Promise((resolve, reject) => {
|
|
46
|
-
const req = nodeRequest({
|
|
47
|
-
host: proxyUrl.hostname,
|
|
48
|
-
port: Number(proxyUrl.port),
|
|
49
|
-
method: 'GET',
|
|
50
|
-
// Absolute-URI form: what distinguishes a proxied request.
|
|
51
|
-
path: target,
|
|
52
|
-
headers: init.headers ?? {},
|
|
53
|
-
}, (res) => {
|
|
54
|
-
let body = '';
|
|
55
|
-
res.setEncoding('utf-8');
|
|
56
|
-
res.on('data', (chunk) => {
|
|
57
|
-
body += chunk;
|
|
58
|
-
});
|
|
59
|
-
res.on('end', () => resolve({ status: res.statusCode ?? 0, body }));
|
|
60
|
-
});
|
|
61
|
-
req.on('error', reject);
|
|
62
|
-
req.end();
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
describe('the boundary', () => {
|
|
66
|
-
let proxy;
|
|
67
|
-
let allowed;
|
|
68
|
-
let denied;
|
|
69
|
-
let target;
|
|
70
|
-
beforeEach(async () => {
|
|
71
|
-
target = await upstream();
|
|
72
|
-
allowed = ['127.0.0.1'];
|
|
73
|
-
denied = [];
|
|
74
|
-
proxy = await new EgressProxy({
|
|
75
|
-
allowedHosts: async () => allowed,
|
|
76
|
-
// The stand-in upstream speaks plain HTTP.
|
|
77
|
-
upgradeToHttps: false,
|
|
78
|
-
onDenied: (host, reason) => denied.push({ host, reason }),
|
|
79
|
-
}).listen();
|
|
80
|
-
});
|
|
81
|
-
afterEach(async () => {
|
|
82
|
-
await proxy.close();
|
|
83
|
-
await new Promise((resolve) => target.server.close(() => resolve()));
|
|
84
|
-
});
|
|
85
|
-
it('lets an allowed host through', async () => {
|
|
86
|
-
const res = await viaProxy(proxy, `http://127.0.0.1:${target.port}/thing`);
|
|
87
|
-
expect(res.status).toBe(200);
|
|
88
|
-
expect(res.body).toBe('upstream ok');
|
|
89
|
-
});
|
|
90
|
-
it('refuses a host that is not on the list', async () => {
|
|
91
|
-
allowed = ['example.com'];
|
|
92
|
-
const res = await viaProxy(proxy, `http://127.0.0.1:${target.port}/thing`);
|
|
93
|
-
expect(res.status).toBe(403);
|
|
94
|
-
// Never reached the upstream at all — the refusal is the point, not
|
|
95
|
-
// the response code.
|
|
96
|
-
expect(target.seen).toHaveLength(0);
|
|
97
|
-
});
|
|
98
|
-
it('names the host it refused', async () => {
|
|
99
|
-
allowed = [];
|
|
100
|
-
const res = await viaProxy(proxy, `http://127.0.0.1:${target.port}/thing`);
|
|
101
|
-
// An agent that cannot tell "not permitted" from "network down"
|
|
102
|
-
// retries forever, and a human debugging it has nothing to go on.
|
|
103
|
-
expect(res.body).toContain('127.0.0.1');
|
|
104
|
-
expect(denied[0]?.host).toBe('127.0.0.1');
|
|
105
|
-
});
|
|
106
|
-
it('denies when the policy cannot be read', async () => {
|
|
107
|
-
// An allowlist that fails open is not an allowlist.
|
|
108
|
-
const failing = await new EgressProxy({
|
|
109
|
-
allowedHosts: async () => {
|
|
110
|
-
throw new Error('policy service unavailable');
|
|
111
|
-
},
|
|
112
|
-
upgradeToHttps: false,
|
|
113
|
-
}).listen();
|
|
114
|
-
try {
|
|
115
|
-
const res = await viaProxy(failing, `http://127.0.0.1:${target.port}/thing`);
|
|
116
|
-
expect(res.status).toBe(403);
|
|
117
|
-
}
|
|
118
|
-
finally {
|
|
119
|
-
await failing.close();
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
it('re-reads the policy per request, so a rotating allowlist is honoured', async () => {
|
|
123
|
-
allowed = [];
|
|
124
|
-
expect((await viaProxy(proxy, `http://127.0.0.1:${target.port}/a`)).status).toBe(403);
|
|
125
|
-
allowed = ['127.0.0.1'];
|
|
126
|
-
expect((await viaProxy(proxy, `http://127.0.0.1:${target.port}/b`)).status).toBe(200);
|
|
127
|
-
});
|
|
128
|
-
it('can be narrowed on a live proxy', async () => {
|
|
129
|
-
// "Clone with a token, then drop to deny-all before running
|
|
130
|
-
// untrusted build scripts" was not expressible at all: the policy
|
|
131
|
-
// was frozen at provider construction.
|
|
132
|
-
expect((await viaProxy(proxy, `http://127.0.0.1:${target.port}/a`)).status).toBe(200);
|
|
133
|
-
proxy.setAllowedHosts(async () => []);
|
|
134
|
-
expect((await viaProxy(proxy, `http://127.0.0.1:${target.port}/b`)).status).toBe(403);
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
describe('brokering a credential', () => {
|
|
138
|
-
let proxy;
|
|
139
|
-
let target;
|
|
140
|
-
beforeEach(async () => {
|
|
141
|
-
target = await upstream();
|
|
142
|
-
});
|
|
143
|
-
afterEach(async () => {
|
|
144
|
-
await proxy.close();
|
|
145
|
-
await new Promise((resolve) => target.server.close(() => resolve()));
|
|
146
|
-
});
|
|
147
|
-
const withCredentials = async (host) => {
|
|
148
|
-
proxy = await new EgressProxy({
|
|
149
|
-
allowedHosts: async () => ['127.0.0.1'],
|
|
150
|
-
upgradeToHttps: false,
|
|
151
|
-
credentials: [{ host, header: 'authorization', value: 'Bearer real-secret' }],
|
|
152
|
-
}).listen();
|
|
153
|
-
return proxy;
|
|
154
|
-
};
|
|
155
|
-
it('stamps the real value on at the boundary', async () => {
|
|
156
|
-
const p = await withCredentials('127.0.0.1');
|
|
157
|
-
await viaProxy(p, `http://127.0.0.1:${target.port}/thing`);
|
|
158
|
-
// The token never entered the sandbox — a placeholder did, and the
|
|
159
|
-
// value was applied here.
|
|
160
|
-
expect(target.seen[0]?.headers.authorization).toBe('Bearer real-secret');
|
|
161
|
-
});
|
|
162
|
-
it('sends it only to the host it belongs to', async () => {
|
|
163
|
-
// A credential attached to every request is a credential handed to
|
|
164
|
-
// whichever host the agent was talked into contacting.
|
|
165
|
-
const p = await withCredentials('other.example.com');
|
|
166
|
-
await viaProxy(p, `http://127.0.0.1:${target.port}/thing`);
|
|
167
|
-
expect(target.seen[0]?.headers.authorization).toBeUndefined();
|
|
168
|
-
});
|
|
169
|
-
it('does not forward the hop-by-hop proxy header onward', async () => {
|
|
170
|
-
const p = await withCredentials('127.0.0.1');
|
|
171
|
-
await viaProxy(p, `http://127.0.0.1:${target.port}/thing`, {
|
|
172
|
-
headers: { 'proxy-authorization': 'Basic should-not-travel' },
|
|
173
|
-
});
|
|
174
|
-
expect(target.seen[0]?.headers['proxy-authorization']).toBeUndefined();
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
//# sourceMappingURL=proxy.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.test.js","sourceRoot":"","sources":["../../../src/egress/__tests__/proxy.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.test.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Behavioural contract for `createSandboxProvider`, `resolveLayout`,
|
|
3
|
-
* and `renderLayoutMountArgs`:
|
|
4
|
-
*
|
|
5
|
-
* - Builds a `SandboxProvider` for the `container:docker` tier
|
|
6
|
-
* without spawning anything (the container only spawns on
|
|
7
|
-
* `provider.create()`, not at construction time). The provider
|
|
8
|
-
* carries a layout baked in at construction; per-task hosts
|
|
9
|
-
* construct one provider per task.
|
|
10
|
-
* - Throws `SandboxBackendNotImplementedError` for tiers the docker
|
|
11
|
-
* backend has not landed yet, with a label that names the missing
|
|
12
|
-
* tier and concrete service.
|
|
13
|
-
* - Layout validation happens synchronously inside
|
|
14
|
-
* `createSandboxProvider`; `ContainerSandboxLayoutValidationError` exposes
|
|
15
|
-
* a `reasons` array so consumers see every violation in one
|
|
16
|
-
* round-trip.
|
|
17
|
-
* - Every `--volume` source rendered by the docker backend traces
|
|
18
|
-
* back to a layout `hostDir.hostPath` declared by the consumer —
|
|
19
|
-
* pinned here as a regression guard against the old `mkdtemp`-
|
|
20
|
-
* allocated workspace path that hit EACCES in sibling-container
|
|
21
|
-
* deployments.
|
|
22
|
-
*
|
|
23
|
-
* Docker-touching integration tests live under
|
|
24
|
-
* `backends/docker/__tests__/` and skip when `docker` isn't
|
|
25
|
-
* available; this file stays pure-unit.
|
|
26
|
-
*/
|
|
27
|
-
export {};
|
|
28
|
-
//# sourceMappingURL=index.test.d.ts.map
|
package/dist/index.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
|