@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.
Files changed (75) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/package.json +12 -2
  5. package/src/index.ts +1 -1
  6. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.d.ts +0 -2
  7. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.d.ts.map +0 -1
  8. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.js +0 -61
  9. package/dist/backends/aci-standby-pool/__tests__/unenforceable-controls.test.js.map +0 -1
  10. package/dist/backends/docker/__tests__/hardening.test.d.ts +0 -2
  11. package/dist/backends/docker/__tests__/hardening.test.d.ts.map +0 -1
  12. package/dist/backends/docker/__tests__/hardening.test.js +0 -32
  13. package/dist/backends/docker/__tests__/hardening.test.js.map +0 -1
  14. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts +0 -40
  15. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.d.ts.map +0 -1
  16. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js +0 -157
  17. package/dist/backends/docker/__tests__/leaf-permissions.smoke.test.js.map +0 -1
  18. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.d.ts +0 -16
  19. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.d.ts.map +0 -1
  20. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.js +0 -37
  21. package/dist/backends/firecracker/__tests__/agent-timeout-clamp.test.js.map +0 -1
  22. package/dist/backends/firecracker/__tests__/backend.test.d.ts +0 -13
  23. package/dist/backends/firecracker/__tests__/backend.test.d.ts.map +0 -1
  24. package/dist/backends/firecracker/__tests__/backend.test.js +0 -361
  25. package/dist/backends/firecracker/__tests__/backend.test.js.map +0 -1
  26. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts +0 -19
  27. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.d.ts.map +0 -1
  28. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js +0 -209
  29. package/dist/backends/firecracker/__tests__/control-plane-mtls.test.js.map +0 -1
  30. package/dist/backends/firecracker/__tests__/egress-policy.test.d.ts +0 -2
  31. package/dist/backends/firecracker/__tests__/egress-policy.test.d.ts.map +0 -1
  32. package/dist/backends/firecracker/__tests__/egress-policy.test.js +0 -67
  33. package/dist/backends/firecracker/__tests__/egress-policy.test.js.map +0 -1
  34. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.d.ts +0 -21
  35. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.d.ts.map +0 -1
  36. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.js +0 -30
  37. package/dist/backends/firecracker/__tests__/fixtures/ipc-path.js.map +0 -1
  38. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts +0 -39
  39. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.d.ts.map +0 -1
  40. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js +0 -149
  41. package/dist/backends/firecracker/__tests__/fixtures/mtls-pki.js.map +0 -1
  42. package/dist/backends/firecracker/__tests__/protocol.test.d.ts +0 -6
  43. package/dist/backends/firecracker/__tests__/protocol.test.d.ts.map +0 -1
  44. package/dist/backends/firecracker/__tests__/protocol.test.js +0 -67
  45. package/dist/backends/firecracker/__tests__/protocol.test.js.map +0 -1
  46. package/dist/backends/firecracker/__tests__/transport.test.d.ts +0 -20
  47. package/dist/backends/firecracker/__tests__/transport.test.d.ts.map +0 -1
  48. package/dist/backends/firecracker/__tests__/transport.test.js +0 -457
  49. package/dist/backends/firecracker/__tests__/transport.test.js.map +0 -1
  50. package/dist/egress/__tests__/allowlist.test.d.ts +0 -2
  51. package/dist/egress/__tests__/allowlist.test.d.ts.map +0 -1
  52. package/dist/egress/__tests__/allowlist.test.js +0 -85
  53. package/dist/egress/__tests__/allowlist.test.js.map +0 -1
  54. package/dist/egress/__tests__/proxy.test.d.ts +0 -2
  55. package/dist/egress/__tests__/proxy.test.d.ts.map +0 -1
  56. package/dist/egress/__tests__/proxy.test.js +0 -177
  57. package/dist/egress/__tests__/proxy.test.js.map +0 -1
  58. package/dist/index.test.d.ts +0 -28
  59. package/dist/index.test.d.ts.map +0 -1
  60. package/dist/index.test.js +0 -649
  61. package/dist/index.test.js.map +0 -1
  62. package/src/backends/aci-standby-pool/__tests__/unenforceable-controls.test.ts +0 -69
  63. package/src/backends/docker/__tests__/hardening.test.ts +0 -43
  64. package/src/backends/docker/__tests__/leaf-permissions.smoke.test.ts +0 -169
  65. package/src/backends/firecracker/__tests__/agent-timeout-clamp.test.ts +0 -48
  66. package/src/backends/firecracker/__tests__/backend.test.ts +0 -429
  67. package/src/backends/firecracker/__tests__/control-plane-mtls.test.ts +0 -261
  68. package/src/backends/firecracker/__tests__/egress-policy.test.ts +0 -91
  69. package/src/backends/firecracker/__tests__/fixtures/ipc-path.ts +0 -31
  70. package/src/backends/firecracker/__tests__/fixtures/mtls-pki.ts +0 -166
  71. package/src/backends/firecracker/__tests__/protocol.test.ts +0 -75
  72. package/src/backends/firecracker/__tests__/transport.test.ts +0 -534
  73. package/src/egress/__tests__/allowlist.test.ts +0 -103
  74. package/src/egress/__tests__/proxy.test.ts +0 -212
  75. 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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"}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}