cloison-runtime 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +313 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +47 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +57 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +27 -0
- package/dist/config/index.js.map +1 -0
- package/dist/credentials/index.d.ts +4 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +3 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/credentials/proxy.d.ts +3 -0
- package/dist/credentials/proxy.d.ts.map +1 -0
- package/dist/credentials/proxy.js +11 -0
- package/dist/credentials/proxy.js.map +1 -0
- package/dist/credentials/store.d.ts +7 -0
- package/dist/credentials/store.d.ts.map +1 -0
- package/dist/credentials/store.js +115 -0
- package/dist/credentials/store.js.map +1 -0
- package/dist/credentials/types.d.ts +14 -0
- package/dist/credentials/types.d.ts.map +1 -0
- package/dist/credentials/types.js +2 -0
- package/dist/credentials/types.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/runner.d.ts +7 -0
- package/dist/hooks/runner.d.ts.map +1 -0
- package/dist/hooks/runner.js +20 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/hooks/types.d.ts +39 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/env.d.ts +2 -0
- package/dist/infra/env.d.ts.map +1 -0
- package/dist/infra/env.js +6 -0
- package/dist/infra/env.js.map +1 -0
- package/dist/infra/warning-filter.d.ts +8 -0
- package/dist/infra/warning-filter.d.ts.map +1 -0
- package/dist/infra/warning-filter.js +66 -0
- package/dist/infra/warning-filter.js.map +1 -0
- package/dist/logging/subsystem.d.ts +29 -0
- package/dist/logging/subsystem.d.ts.map +1 -0
- package/dist/logging/subsystem.js +322 -0
- package/dist/logging/subsystem.js.map +1 -0
- package/dist/memory/embedding-batch.d.ts +38 -0
- package/dist/memory/embedding-batch.d.ts.map +1 -0
- package/dist/memory/embedding-batch.js +253 -0
- package/dist/memory/embedding-batch.js.map +1 -0
- package/dist/memory/embedding-cache.d.ts +16 -0
- package/dist/memory/embedding-cache.d.ts.map +1 -0
- package/dist/memory/embedding-cache.js +113 -0
- package/dist/memory/embedding-cache.js.map +1 -0
- package/dist/memory/embeddings-debug.d.ts +2 -0
- package/dist/memory/embeddings-debug.d.ts.map +1 -0
- package/dist/memory/embeddings-debug.js +12 -0
- package/dist/memory/embeddings-debug.js.map +1 -0
- package/dist/memory/embeddings.d.ts +17 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +203 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/file-indexer.d.ts +26 -0
- package/dist/memory/file-indexer.d.ts.map +1 -0
- package/dist/memory/file-indexer.js +260 -0
- package/dist/memory/file-indexer.js.map +1 -0
- package/dist/memory/fs-utils.d.ts +12 -0
- package/dist/memory/fs-utils.d.ts.map +1 -0
- package/dist/memory/fs-utils.js +24 -0
- package/dist/memory/fs-utils.js.map +1 -0
- package/dist/memory/hybrid.d.ts +46 -0
- package/dist/memory/hybrid.d.ts.map +1 -0
- package/dist/memory/hybrid.js +85 -0
- package/dist/memory/hybrid.js.map +1 -0
- package/dist/memory/index.d.ts +17 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +15 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/internal.d.ts +39 -0
- package/dist/memory/internal.d.ts.map +1 -0
- package/dist/memory/internal.js +292 -0
- package/dist/memory/internal.js.map +1 -0
- package/dist/memory/manager-search.d.ts +61 -0
- package/dist/memory/manager-search.d.ts.map +1 -0
- package/dist/memory/manager-search.js +102 -0
- package/dist/memory/manager-search.js.map +1 -0
- package/dist/memory/mmr.d.ts +63 -0
- package/dist/memory/mmr.d.ts.map +1 -0
- package/dist/memory/mmr.js +165 -0
- package/dist/memory/mmr.js.map +1 -0
- package/dist/memory/query-expansion.d.ts +42 -0
- package/dist/memory/query-expansion.d.ts.map +1 -0
- package/dist/memory/query-expansion.js +776 -0
- package/dist/memory/query-expansion.js.map +1 -0
- package/dist/memory/session-indexer.d.ts +41 -0
- package/dist/memory/session-indexer.d.ts.map +1 -0
- package/dist/memory/session-indexer.js +367 -0
- package/dist/memory/session-indexer.js.map +1 -0
- package/dist/memory/simple-manager.d.ts +29 -0
- package/dist/memory/simple-manager.d.ts.map +1 -0
- package/dist/memory/simple-manager.js +216 -0
- package/dist/memory/simple-manager.js.map +1 -0
- package/dist/memory/sqlite.d.ts +2 -0
- package/dist/memory/sqlite.d.ts.map +1 -0
- package/dist/memory/sqlite.js +16 -0
- package/dist/memory/sqlite.js.map +1 -0
- package/dist/memory/ssrf.d.ts +18 -0
- package/dist/memory/ssrf.d.ts.map +1 -0
- package/dist/memory/ssrf.js +396 -0
- package/dist/memory/ssrf.js.map +1 -0
- package/dist/memory/temporal-decay.d.ts +26 -0
- package/dist/memory/temporal-decay.d.ts.map +1 -0
- package/dist/memory/temporal-decay.js +120 -0
- package/dist/memory/temporal-decay.js.map +1 -0
- package/dist/memory/types.d.ts +95 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/package.json +68 -0
- package/dist/platform/index.d.ts +3 -0
- package/dist/platform/index.d.ts.map +1 -0
- package/dist/platform/index.js +2 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/platform/platform.d.ts +3 -0
- package/dist/platform/platform.d.ts.map +1 -0
- package/dist/platform/platform.js +91 -0
- package/dist/platform/platform.js.map +1 -0
- package/dist/platform/types.d.ts +18 -0
- package/dist/platform/types.d.ts.map +1 -0
- package/dist/platform/types.js +2 -0
- package/dist/platform/types.js.map +1 -0
- package/dist/runtime/agent.d.ts +36 -0
- package/dist/runtime/agent.d.ts.map +1 -0
- package/dist/runtime/agent.js +250 -0
- package/dist/runtime/agent.js.map +1 -0
- package/dist/runtime/api-key-rotation.d.ts +26 -0
- package/dist/runtime/api-key-rotation.d.ts.map +1 -0
- package/dist/runtime/api-key-rotation.js +174 -0
- package/dist/runtime/api-key-rotation.js.map +1 -0
- package/dist/runtime/context-guard.d.ts +32 -0
- package/dist/runtime/context-guard.d.ts.map +1 -0
- package/dist/runtime/context-guard.js +61 -0
- package/dist/runtime/context-guard.js.map +1 -0
- package/dist/runtime/failover-error.d.ts +62 -0
- package/dist/runtime/failover-error.d.ts.map +1 -0
- package/dist/runtime/failover-error.js +733 -0
- package/dist/runtime/failover-error.js.map +1 -0
- package/dist/runtime/failover-policy.d.ts +5 -0
- package/dist/runtime/failover-policy.d.ts.map +1 -0
- package/dist/runtime/failover-policy.js +18 -0
- package/dist/runtime/failover-policy.js.map +1 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +13 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/memory-flush.d.ts +24 -0
- package/dist/runtime/memory-flush.d.ts.map +1 -0
- package/dist/runtime/memory-flush.js +64 -0
- package/dist/runtime/memory-flush.js.map +1 -0
- package/dist/runtime/memory-tools.d.ts +14 -0
- package/dist/runtime/memory-tools.d.ts.map +1 -0
- package/dist/runtime/memory-tools.js +58 -0
- package/dist/runtime/memory-tools.js.map +1 -0
- package/dist/runtime/model-fallback.d.ts +56 -0
- package/dist/runtime/model-fallback.d.ts.map +1 -0
- package/dist/runtime/model-fallback.js +301 -0
- package/dist/runtime/model-fallback.js.map +1 -0
- package/dist/runtime/model-fallback.types.d.ts +14 -0
- package/dist/runtime/model-fallback.types.d.ts.map +1 -0
- package/dist/runtime/model-fallback.types.js +3 -0
- package/dist/runtime/model-fallback.types.js.map +1 -0
- package/dist/runtime/retry.d.ts +24 -0
- package/dist/runtime/retry.d.ts.map +1 -0
- package/dist/runtime/retry.js +100 -0
- package/dist/runtime/retry.js.map +1 -0
- package/dist/runtime/session-pruning.d.ts +22 -0
- package/dist/runtime/session-pruning.d.ts.map +1 -0
- package/dist/runtime/session-pruning.js +118 -0
- package/dist/runtime/session-pruning.js.map +1 -0
- package/dist/runtime/stream-adapters.d.ts +11 -0
- package/dist/runtime/stream-adapters.d.ts.map +1 -0
- package/dist/runtime/stream-adapters.js +46 -0
- package/dist/runtime/stream-adapters.js.map +1 -0
- package/dist/runtime/subagent.d.ts +83 -0
- package/dist/runtime/subagent.d.ts.map +1 -0
- package/dist/runtime/subagent.js +190 -0
- package/dist/runtime/subagent.js.map +1 -0
- package/dist/runtime/tool-result-truncation.d.ts +25 -0
- package/dist/runtime/tool-result-truncation.d.ts.map +1 -0
- package/dist/runtime/tool-result-truncation.js +115 -0
- package/dist/runtime/tool-result-truncation.js.map +1 -0
- package/dist/sandbox/cgroup.d.ts +20 -0
- package/dist/sandbox/cgroup.d.ts.map +1 -0
- package/dist/sandbox/cgroup.js +82 -0
- package/dist/sandbox/cgroup.js.map +1 -0
- package/dist/sandbox/index.d.ts +12 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +10 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/sandbox/ipc.d.ts +26 -0
- package/dist/sandbox/ipc.d.ts.map +1 -0
- package/dist/sandbox/ipc.js +154 -0
- package/dist/sandbox/ipc.js.map +1 -0
- package/dist/sandbox/manager.d.ts +4 -0
- package/dist/sandbox/manager.d.ts.map +1 -0
- package/dist/sandbox/manager.js +251 -0
- package/dist/sandbox/manager.js.map +1 -0
- package/dist/sandbox/namespace.d.ts +12 -0
- package/dist/sandbox/namespace.d.ts.map +1 -0
- package/dist/sandbox/namespace.js +119 -0
- package/dist/sandbox/namespace.js.map +1 -0
- package/dist/sandbox/proxy-tools.d.ts +14 -0
- package/dist/sandbox/proxy-tools.d.ts.map +1 -0
- package/dist/sandbox/proxy-tools.js +63 -0
- package/dist/sandbox/proxy-tools.js.map +1 -0
- package/dist/sandbox/rootfs.d.ts +20 -0
- package/dist/sandbox/rootfs.d.ts.map +1 -0
- package/dist/sandbox/rootfs.js +247 -0
- package/dist/sandbox/rootfs.js.map +1 -0
- package/dist/sandbox/seccomp-apply.d.ts +9 -0
- package/dist/sandbox/seccomp-apply.d.ts.map +1 -0
- package/dist/sandbox/seccomp-apply.js +227 -0
- package/dist/sandbox/seccomp-apply.js.map +1 -0
- package/dist/sandbox/seccomp.d.ts +13 -0
- package/dist/sandbox/seccomp.d.ts.map +1 -0
- package/dist/sandbox/seccomp.js +120 -0
- package/dist/sandbox/seccomp.js.map +1 -0
- package/dist/sandbox/types.d.ts +66 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +8 -0
- package/dist/sandbox/types.js.map +1 -0
- package/dist/sandbox/worker.d.ts +15 -0
- package/dist/sandbox/worker.d.ts.map +1 -0
- package/dist/sandbox/worker.js +151 -0
- package/dist/sandbox/worker.js.map +1 -0
- package/dist/sessions/index.d.ts +3 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +3 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/store.d.ts +17 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +70 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/transcript-events.d.ts +11 -0
- package/dist/sessions/transcript-events.d.ts.map +1 -0
- package/dist/sessions/transcript-events.js +40 -0
- package/dist/sessions/transcript-events.js.map +1 -0
- package/dist/shared/agent-session.d.ts +10 -0
- package/dist/shared/agent-session.d.ts.map +1 -0
- package/dist/shared/agent-session.js +33 -0
- package/dist/shared/agent-session.js.map +1 -0
- package/dist/shared/constants.d.ts +6 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +17 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/fs.d.ts +7 -0
- package/dist/shared/fs.d.ts.map +1 -0
- package/dist/shared/fs.js +14 -0
- package/dist/shared/fs.js.map +1 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +4 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/skills/enablement.d.ts +10 -0
- package/dist/skills/enablement.d.ts.map +1 -0
- package/dist/skills/enablement.js +52 -0
- package/dist/skills/enablement.js.map +1 -0
- package/dist/skills/index.d.ts +4 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +4 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/loader.d.ts +8 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +8 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/skills/registry.d.ts +19 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +106 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/utils/boolean.d.ts +6 -0
- package/dist/utils/boolean.d.ts.map +1 -0
- package/dist/utils/boolean.js +28 -0
- package/dist/utils/boolean.js.map +1 -0
- package/dist/utils/run-with-concurrency.d.ts +12 -0
- package/dist/utils/run-with-concurrency.d.ts.map +1 -0
- package/dist/utils/run-with-concurrency.js +40 -0
- package/dist/utils/run-with-concurrency.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +38 -0
- package/dist/utils.js.map +1 -0
- package/dist/workspace/index.d.ts +3 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +2 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/runner.d.ts +19 -0
- package/dist/workspace/runner.d.ts.map +1 -0
- package/dist/workspace/runner.js +491 -0
- package/dist/workspace/runner.js.map +1 -0
- package/dist/workspace/types.d.ts +37 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +2 -0
- package/dist/workspace/types.js.map +1 -0
- package/dist/workspace/workspace.d.ts +12 -0
- package/dist/workspace/workspace.d.ts.map +1 -0
- package/dist/workspace/workspace.js +85 -0
- package/dist/workspace/workspace.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export function createProxyTools(peer) {
|
|
2
|
+
return [
|
|
3
|
+
{
|
|
4
|
+
name: "memory_search",
|
|
5
|
+
label: "Memory Search",
|
|
6
|
+
description: "Search your memory for relevant information. Returns matching memories ranked by relevance.",
|
|
7
|
+
parameters: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
query: { type: "string" },
|
|
11
|
+
maxResults: { type: "number" },
|
|
12
|
+
},
|
|
13
|
+
required: ["query"],
|
|
14
|
+
},
|
|
15
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
16
|
+
const results = await peer.call("memory.search", {
|
|
17
|
+
query: params.query,
|
|
18
|
+
maxResults: params.maxResults ?? 5,
|
|
19
|
+
});
|
|
20
|
+
return { resultForAssistant: JSON.stringify(results, null, 2) };
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "memory_store",
|
|
25
|
+
label: "Memory Store",
|
|
26
|
+
description: "Store information in your memory for future reference. Use this to remember important facts.",
|
|
27
|
+
parameters: {
|
|
28
|
+
type: "object",
|
|
29
|
+
properties: {
|
|
30
|
+
content: { type: "string" },
|
|
31
|
+
},
|
|
32
|
+
required: ["content"],
|
|
33
|
+
},
|
|
34
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
35
|
+
const result = await peer.call("memory.store", {
|
|
36
|
+
content: params.content,
|
|
37
|
+
});
|
|
38
|
+
return { resultForAssistant: JSON.stringify(result) };
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "skill_execute",
|
|
43
|
+
label: "Execute Skill",
|
|
44
|
+
description: "Execute an enabled skill. Credentials are injected automatically by the platform.",
|
|
45
|
+
parameters: {
|
|
46
|
+
type: "object",
|
|
47
|
+
properties: {
|
|
48
|
+
skillId: { type: "string" },
|
|
49
|
+
params: { type: "object" },
|
|
50
|
+
},
|
|
51
|
+
required: ["skillId"],
|
|
52
|
+
},
|
|
53
|
+
async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
|
|
54
|
+
const result = await peer.call("skill.execute", {
|
|
55
|
+
skillId: params.skillId,
|
|
56
|
+
params: params.params,
|
|
57
|
+
});
|
|
58
|
+
return { resultForAssistant: JSON.stringify(result) };
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=proxy-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-tools.js","sourceRoot":"","sources":["../../src/sandbox/proxy-tools.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,OAAO;QACL;YACE,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,eAAe;YACtB,WAAW,EACT,6FAA6F;YAC/F,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC/B;gBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;aACpB;YACD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI;gBACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBAC/C,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;iBACnC,CAAC,CAAC;gBACH,OAAO,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAClE,CAAC;SACF;QACD;YACE,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,cAAc;YACrB,WAAW,EACT,8FAA8F;YAChG,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC5B;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;YACD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI;gBACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;oBAC7C,OAAO,EAAE,MAAM,CAAC,OAAO;iBACxB,CAAC,CAAC;gBACH,OAAO,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,CAAC;SACF;QACD;YACE,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,eAAe;YACtB,WAAW,EACT,mFAAmF;YACrF,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC3B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC3B;gBACD,QAAQ,EAAE,CAAC,SAAS,CAAC;aACtB;YACD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI;gBACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;oBAC9C,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAC;gBACH,OAAO,EAAE,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { MountBind } from "./types.js";
|
|
2
|
+
export interface RootfsOptions {
|
|
3
|
+
sandboxId: string;
|
|
4
|
+
workspaceDir: string;
|
|
5
|
+
nodeExecutable?: string;
|
|
6
|
+
/** Directory containing the worker script (src/ or dist/) */
|
|
7
|
+
projectDir?: string;
|
|
8
|
+
additionalBinds?: MountBind[];
|
|
9
|
+
}
|
|
10
|
+
export interface PreparedRootfs {
|
|
11
|
+
rootDir: string;
|
|
12
|
+
mounts: MountBind[];
|
|
13
|
+
cleanup(): void;
|
|
14
|
+
}
|
|
15
|
+
export declare function prepareRootfs(options: RootfsOptions): PreparedRootfs;
|
|
16
|
+
export interface MountScriptOptions {
|
|
17
|
+
hasPidNamespace?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function buildMountScript(rootDir: string, mounts: MountBind[], options?: MountScriptOptions): string;
|
|
20
|
+
//# sourceMappingURL=rootfs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rootfs.d.ts","sourceRoot":"","sources":["../../src/sandbox/rootfs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,IAAI,IAAI,CAAC;CACjB;AAkBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc,CA2IpE;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,SAAS,EAAE,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,MAAM,CAoDR"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as url from "node:url";
|
|
5
|
+
import { escapeShellArg } from "../shared/index.js";
|
|
6
|
+
const SYSTEM_READONLY_PATHS = [
|
|
7
|
+
"/usr",
|
|
8
|
+
"/lib",
|
|
9
|
+
"/lib64",
|
|
10
|
+
"/bin",
|
|
11
|
+
"/sbin",
|
|
12
|
+
"/etc/alternatives",
|
|
13
|
+
"/etc/ssl",
|
|
14
|
+
"/etc/ca-certificates",
|
|
15
|
+
"/etc/resolv.conf",
|
|
16
|
+
"/etc/hosts",
|
|
17
|
+
"/etc/nsswitch.conf",
|
|
18
|
+
"/etc/passwd",
|
|
19
|
+
"/etc/group",
|
|
20
|
+
];
|
|
21
|
+
export function prepareRootfs(options) {
|
|
22
|
+
const resolvedWorkspace = path.resolve(options.workspaceDir);
|
|
23
|
+
if (isSensitiveHostPath(resolvedWorkspace)) {
|
|
24
|
+
throw new Error(`workspaceDir "${options.workspaceDir}" references a sensitive host path`);
|
|
25
|
+
}
|
|
26
|
+
const rootDir = path.join(os.tmpdir(), "cloison-runtime-rootfs", options.sandboxId);
|
|
27
|
+
fs.mkdirSync(rootDir, { recursive: true });
|
|
28
|
+
const mounts = [];
|
|
29
|
+
for (const sysPath of SYSTEM_READONLY_PATHS) {
|
|
30
|
+
const stat = safeStat(sysPath);
|
|
31
|
+
if (!stat)
|
|
32
|
+
continue;
|
|
33
|
+
const targetInRoot = path.join(rootDir, sysPath);
|
|
34
|
+
if (stat?.isDirectory()) {
|
|
35
|
+
fs.mkdirSync(targetInRoot, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
fs.mkdirSync(path.dirname(targetInRoot), { recursive: true });
|
|
39
|
+
safeTouch(targetInRoot);
|
|
40
|
+
}
|
|
41
|
+
mounts.push({ source: sysPath, target: targetInRoot, readonly: true });
|
|
42
|
+
}
|
|
43
|
+
const nodeExec = options.nodeExecutable ?? process.execPath;
|
|
44
|
+
const nodeDir = path.dirname(nodeExec);
|
|
45
|
+
const resolvedNodeDir = path.resolve(nodeDir);
|
|
46
|
+
if (isSensitiveHostPath(resolvedNodeDir)) {
|
|
47
|
+
throw new Error(`nodeExecutable directory "${nodeDir}" references a sensitive host path`);
|
|
48
|
+
}
|
|
49
|
+
const nodeDirInRoot = path.join(rootDir, nodeDir);
|
|
50
|
+
fs.mkdirSync(nodeDirInRoot, { recursive: true });
|
|
51
|
+
mounts.push({ source: nodeDir, target: nodeDirInRoot, readonly: true });
|
|
52
|
+
const nodeModulesPath = findNodeModules();
|
|
53
|
+
if (nodeModulesPath) {
|
|
54
|
+
const nmInRoot = path.join(rootDir, nodeModulesPath);
|
|
55
|
+
fs.mkdirSync(nmInRoot, { recursive: true });
|
|
56
|
+
mounts.push({ source: nodeModulesPath, target: nmInRoot, readonly: true });
|
|
57
|
+
}
|
|
58
|
+
if (options.projectDir) {
|
|
59
|
+
const resolvedProjectDir = path.resolve(options.projectDir);
|
|
60
|
+
if (isSensitiveHostPath(resolvedProjectDir)) {
|
|
61
|
+
throw new Error(`projectDir "${options.projectDir}" references a sensitive host path`);
|
|
62
|
+
}
|
|
63
|
+
const projInRoot = path.join(rootDir, options.projectDir);
|
|
64
|
+
fs.mkdirSync(projInRoot, { recursive: true });
|
|
65
|
+
mounts.push({ source: options.projectDir, target: projInRoot, readonly: true });
|
|
66
|
+
}
|
|
67
|
+
const wsInRoot = path.join(rootDir, options.workspaceDir);
|
|
68
|
+
fs.mkdirSync(wsInRoot, { recursive: true });
|
|
69
|
+
mounts.push({
|
|
70
|
+
source: options.workspaceDir,
|
|
71
|
+
target: wsInRoot,
|
|
72
|
+
readonly: false,
|
|
73
|
+
});
|
|
74
|
+
const tmpInRoot = path.join(rootDir, "tmp");
|
|
75
|
+
fs.mkdirSync(tmpInRoot, { recursive: true });
|
|
76
|
+
const devDir = path.join(rootDir, "dev");
|
|
77
|
+
fs.mkdirSync(devDir, { recursive: true });
|
|
78
|
+
for (const dev of ["null", "zero", "urandom", "random"]) {
|
|
79
|
+
const devPath = `/dev/${dev}`;
|
|
80
|
+
if (fs.existsSync(devPath)) {
|
|
81
|
+
const devInRoot = path.join(rootDir, "dev", dev);
|
|
82
|
+
safeTouch(devInRoot);
|
|
83
|
+
mounts.push({ source: devPath, target: devInRoot, readonly: true });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const procDir = path.join(rootDir, "proc");
|
|
87
|
+
fs.mkdirSync(procDir, { recursive: true });
|
|
88
|
+
const oldRootDir = path.join(rootDir, ".old-root");
|
|
89
|
+
fs.mkdirSync(oldRootDir, { recursive: true });
|
|
90
|
+
if (options.additionalBinds) {
|
|
91
|
+
const resolvedRoot = path.resolve(rootDir);
|
|
92
|
+
for (const bind of options.additionalBinds) {
|
|
93
|
+
const resolvedSource = path.resolve(bind.source);
|
|
94
|
+
if (isSensitiveHostPath(resolvedSource)) {
|
|
95
|
+
throw new Error(`additionalBind source "${bind.source}" references a sensitive host path`);
|
|
96
|
+
}
|
|
97
|
+
const targetInRoot = path.join(rootDir, bind.target);
|
|
98
|
+
const resolvedTarget = path.resolve(targetInRoot);
|
|
99
|
+
if (!resolvedTarget.startsWith(resolvedRoot + path.sep) && resolvedTarget !== resolvedRoot) {
|
|
100
|
+
throw new Error(`additionalBind target "${bind.target}" resolves outside rootDir`);
|
|
101
|
+
}
|
|
102
|
+
const srcStat2 = safeStat(resolvedSource);
|
|
103
|
+
if (!srcStat2) {
|
|
104
|
+
throw new Error(`additionalBind source "${bind.source}" does not exist`);
|
|
105
|
+
}
|
|
106
|
+
if (srcStat2.isSymbolicLink()) {
|
|
107
|
+
throw new Error(`additionalBind source "${bind.source}" is a symbolic link (not allowed)`);
|
|
108
|
+
}
|
|
109
|
+
if (srcStat2.isDirectory()) {
|
|
110
|
+
fs.mkdirSync(targetInRoot, { recursive: true });
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
fs.mkdirSync(path.dirname(targetInRoot), { recursive: true });
|
|
114
|
+
safeTouch(targetInRoot);
|
|
115
|
+
}
|
|
116
|
+
mounts.push({ source: resolvedSource, target: targetInRoot, readonly: bind.readonly });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
rootDir,
|
|
121
|
+
mounts,
|
|
122
|
+
cleanup() {
|
|
123
|
+
try {
|
|
124
|
+
fs.rmSync(rootDir, { recursive: true, force: true });
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// best effort
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
export function buildMountScript(rootDir, mounts, options) {
|
|
133
|
+
const esc = escapeShellArg;
|
|
134
|
+
const lines = [
|
|
135
|
+
"#!/bin/sh",
|
|
136
|
+
"set -e",
|
|
137
|
+
"",
|
|
138
|
+
`ROOTDIR=${esc(rootDir)}`,
|
|
139
|
+
"",
|
|
140
|
+
"# Make rootDir a mount point for pivot_root",
|
|
141
|
+
'mount --bind "$ROOTDIR" "$ROOTDIR"',
|
|
142
|
+
"",
|
|
143
|
+
];
|
|
144
|
+
for (const mount of mounts) {
|
|
145
|
+
if (mount.readonly) {
|
|
146
|
+
lines.push(`mount --bind ${esc(mount.source)} ${esc(mount.target)}`);
|
|
147
|
+
lines.push(`mount -o remount,ro,bind ${esc(mount.target)}`);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
lines.push(`mount --bind ${esc(mount.source)} ${esc(mount.target)}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
lines.push("");
|
|
154
|
+
if (options?.hasPidNamespace) {
|
|
155
|
+
lines.push("# Mount proc (PID namespace active)");
|
|
156
|
+
lines.push('mount -t proc proc "$ROOTDIR/proc" || { echo "WARNING: proc mount failed" >&2; }');
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
lines.push("# No PID namespace: skip proc mount to prevent host process exposure");
|
|
160
|
+
}
|
|
161
|
+
lines.push("");
|
|
162
|
+
lines.push("# pivot_root: swap root filesystem");
|
|
163
|
+
lines.push('cd "$ROOTDIR"');
|
|
164
|
+
lines.push("pivot_root . .old-root");
|
|
165
|
+
lines.push("");
|
|
166
|
+
lines.push("# Unmount old root - fail-closed: abort if either unmount fails");
|
|
167
|
+
lines.push("umount /.old-root 2>/dev/null || umount -l /.old-root || { echo 'FATAL: cannot unmount old root' >&2; exit 1; }");
|
|
168
|
+
lines.push("# Verify old root is no longer a mount point");
|
|
169
|
+
lines.push('if mountpoint -q /.old-root 2>/dev/null; then');
|
|
170
|
+
lines.push(' echo "FATAL: old root still mounted after unmount" >&2');
|
|
171
|
+
lines.push(" exit 1");
|
|
172
|
+
lines.push("fi");
|
|
173
|
+
lines.push("# Verify old root directory is empty (fail-closed: ls errors also trigger abort)");
|
|
174
|
+
lines.push('if [ -d "/.old-root" ] && [ -n "$(ls -A /.old-root 2>&1)" ]; then');
|
|
175
|
+
lines.push(' echo "FATAL: old root still accessible after unmount" >&2');
|
|
176
|
+
lines.push(" exit 1");
|
|
177
|
+
lines.push("fi");
|
|
178
|
+
lines.push("rmdir /.old-root 2>/dev/null || true");
|
|
179
|
+
lines.push("");
|
|
180
|
+
return lines.join("\n");
|
|
181
|
+
}
|
|
182
|
+
function findNodeModules() {
|
|
183
|
+
const searchRoots = [
|
|
184
|
+
path.dirname(url.fileURLToPath(import.meta.url)),
|
|
185
|
+
process.cwd(),
|
|
186
|
+
];
|
|
187
|
+
for (const start of searchRoots) {
|
|
188
|
+
let dir = start;
|
|
189
|
+
for (let i = 0; i < 10; i++) {
|
|
190
|
+
const nmPath = path.join(dir, "node_modules");
|
|
191
|
+
const stat = safeStat(nmPath);
|
|
192
|
+
if (stat && stat.isDirectory() && !stat.isSymbolicLink())
|
|
193
|
+
return nmPath;
|
|
194
|
+
const parent = path.dirname(dir);
|
|
195
|
+
if (parent === dir)
|
|
196
|
+
break;
|
|
197
|
+
dir = parent;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
const SENSITIVE_HOST_PATHS = new Set([
|
|
203
|
+
"/",
|
|
204
|
+
"/root",
|
|
205
|
+
"/proc",
|
|
206
|
+
"/sys",
|
|
207
|
+
"/dev",
|
|
208
|
+
"/boot",
|
|
209
|
+
"/run",
|
|
210
|
+
"/var/run/docker.sock",
|
|
211
|
+
"/run/docker.sock",
|
|
212
|
+
]);
|
|
213
|
+
const SENSITIVE_HOST_PREFIXES = [
|
|
214
|
+
"/root/",
|
|
215
|
+
"/proc/",
|
|
216
|
+
"/sys/",
|
|
217
|
+
"/home/",
|
|
218
|
+
"/run/",
|
|
219
|
+
"/etc/shadow",
|
|
220
|
+
"/etc/sudoers",
|
|
221
|
+
"/etc/gshadow",
|
|
222
|
+
"/etc/master.passwd",
|
|
223
|
+
"/var/run/docker.sock",
|
|
224
|
+
"/run/docker.sock",
|
|
225
|
+
];
|
|
226
|
+
function isSensitiveHostPath(resolved) {
|
|
227
|
+
if (SENSITIVE_HOST_PATHS.has(resolved))
|
|
228
|
+
return true;
|
|
229
|
+
return SENSITIVE_HOST_PREFIXES.some((prefix) => resolved.startsWith(prefix));
|
|
230
|
+
}
|
|
231
|
+
function safeStat(p) {
|
|
232
|
+
try {
|
|
233
|
+
return fs.lstatSync(p);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function safeTouch(p) {
|
|
240
|
+
try {
|
|
241
|
+
fs.writeFileSync(p, "", { flag: "a" });
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
// best effort
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=rootfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rootfs.js","sourceRoot":"","sources":["../../src/sandbox/rootfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type SeccompProfile } from "./seccomp.js";
|
|
2
|
+
export declare function ensureSeccompLoader(): string | null;
|
|
3
|
+
export declare function buildSeccompWrapperArgs(profile: SeccompProfile, sandboxId: string, command: string, args: string[]): {
|
|
4
|
+
command: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
profilePath: string;
|
|
7
|
+
} | null;
|
|
8
|
+
export declare function isSeccompAvailable(): boolean;
|
|
9
|
+
//# sourceMappingURL=seccomp-apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seccomp-apply.d.ts","sourceRoot":"","sources":["../../src/sandbox/seccomp-apply.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AA6MxE,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAMnD;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,GACb;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUjE;AAED,wBAAgB,kBAAkB,IAAI,OAAO,CAG5C"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import { execSync } from "node:child_process";
|
|
5
|
+
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
6
|
+
import { writeSeccompProfile } from "./seccomp.js";
|
|
7
|
+
const log = createSubsystemLogger("seccomp-apply");
|
|
8
|
+
// Real seccomp-BPF loader: applies PR_SET_NO_NEW_PRIVS + a BPF filter
|
|
9
|
+
// that blocks dangerous syscalls (ptrace, mount, unshare, bpf, etc.)
|
|
10
|
+
// with EPERM. Falls back to no-new-privs only if seccomp() syscall fails.
|
|
11
|
+
const SECCOMP_LOADER_SOURCE = `
|
|
12
|
+
#include <stdio.h>
|
|
13
|
+
#include <stdlib.h>
|
|
14
|
+
#include <string.h>
|
|
15
|
+
#include <unistd.h>
|
|
16
|
+
#include <errno.h>
|
|
17
|
+
#include <stddef.h>
|
|
18
|
+
#include <sys/prctl.h>
|
|
19
|
+
#include <sys/syscall.h>
|
|
20
|
+
#include <linux/seccomp.h>
|
|
21
|
+
#include <linux/filter.h>
|
|
22
|
+
#include <linux/audit.h>
|
|
23
|
+
|
|
24
|
+
#ifndef SECCOMP_SET_MODE_FILTER
|
|
25
|
+
#define SECCOMP_SET_MODE_FILTER 1
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
#if defined(__x86_64__)
|
|
29
|
+
#define AUDIT_ARCH_CURRENT AUDIT_ARCH_X86_64
|
|
30
|
+
#elif defined(__aarch64__)
|
|
31
|
+
#define AUDIT_ARCH_CURRENT AUDIT_ARCH_AARCH64
|
|
32
|
+
#else
|
|
33
|
+
#error "Unsupported architecture for seccomp-BPF"
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
/* Blocked syscalls matching BLOCKED_SYSCALLS in seccomp.ts */
|
|
37
|
+
static const int BLOCKED[] = {
|
|
38
|
+
#ifdef __NR_ptrace
|
|
39
|
+
__NR_ptrace,
|
|
40
|
+
#endif
|
|
41
|
+
#ifdef __NR_mount
|
|
42
|
+
__NR_mount,
|
|
43
|
+
#endif
|
|
44
|
+
#ifdef __NR_umount2
|
|
45
|
+
__NR_umount2,
|
|
46
|
+
#endif
|
|
47
|
+
#ifdef __NR_pivot_root
|
|
48
|
+
__NR_pivot_root,
|
|
49
|
+
#endif
|
|
50
|
+
#ifdef __NR_chroot
|
|
51
|
+
__NR_chroot,
|
|
52
|
+
#endif
|
|
53
|
+
#ifdef __NR_reboot
|
|
54
|
+
__NR_reboot,
|
|
55
|
+
#endif
|
|
56
|
+
#ifdef __NR_kexec_load
|
|
57
|
+
__NR_kexec_load,
|
|
58
|
+
#endif
|
|
59
|
+
#ifdef __NR_init_module
|
|
60
|
+
__NR_init_module,
|
|
61
|
+
#endif
|
|
62
|
+
#ifdef __NR_finit_module
|
|
63
|
+
__NR_finit_module,
|
|
64
|
+
#endif
|
|
65
|
+
#ifdef __NR_delete_module
|
|
66
|
+
__NR_delete_module,
|
|
67
|
+
#endif
|
|
68
|
+
#ifdef __NR_acct
|
|
69
|
+
__NR_acct,
|
|
70
|
+
#endif
|
|
71
|
+
#ifdef __NR_swapon
|
|
72
|
+
__NR_swapon,
|
|
73
|
+
#endif
|
|
74
|
+
#ifdef __NR_swapoff
|
|
75
|
+
__NR_swapoff,
|
|
76
|
+
#endif
|
|
77
|
+
#ifdef __NR_bpf
|
|
78
|
+
__NR_bpf,
|
|
79
|
+
#endif
|
|
80
|
+
#ifdef __NR_userfaultfd
|
|
81
|
+
__NR_userfaultfd,
|
|
82
|
+
#endif
|
|
83
|
+
#ifdef __NR_perf_event_open
|
|
84
|
+
__NR_perf_event_open,
|
|
85
|
+
#endif
|
|
86
|
+
#ifdef __NR_unshare
|
|
87
|
+
__NR_unshare,
|
|
88
|
+
#endif
|
|
89
|
+
#ifdef __NR_setns
|
|
90
|
+
__NR_setns,
|
|
91
|
+
#endif
|
|
92
|
+
#ifdef __NR_keyctl
|
|
93
|
+
__NR_keyctl,
|
|
94
|
+
#endif
|
|
95
|
+
#ifdef __NR_request_key
|
|
96
|
+
__NR_request_key,
|
|
97
|
+
#endif
|
|
98
|
+
#ifdef __NR_add_key
|
|
99
|
+
__NR_add_key,
|
|
100
|
+
#endif
|
|
101
|
+
#ifdef __NR_process_vm_readv
|
|
102
|
+
__NR_process_vm_readv,
|
|
103
|
+
#endif
|
|
104
|
+
#ifdef __NR_process_vm_writev
|
|
105
|
+
__NR_process_vm_writev,
|
|
106
|
+
#endif
|
|
107
|
+
#ifdef __NR_personality
|
|
108
|
+
__NR_personality,
|
|
109
|
+
#endif
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
#define N (sizeof(BLOCKED)/sizeof(BLOCKED[0]))
|
|
113
|
+
|
|
114
|
+
static int apply_filter(void) {
|
|
115
|
+
/* BPF program: check arch, load nr, for each blocked: jeq->errno, default allow */
|
|
116
|
+
unsigned int len = 4 + N + 2;
|
|
117
|
+
struct sock_filter *f = calloc(len, sizeof(struct sock_filter));
|
|
118
|
+
if (!f) return -1;
|
|
119
|
+
unsigned int i = 0;
|
|
120
|
+
/* [0] load arch */
|
|
121
|
+
f[i++] = (struct sock_filter)BPF_STMT(BPF_LD|BPF_W|BPF_ABS, offsetof(struct seccomp_data, arch));
|
|
122
|
+
/* [1] check arch */
|
|
123
|
+
f[i++] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, AUDIT_ARCH_CURRENT, 1, 0);
|
|
124
|
+
/* [2] kill on wrong arch */
|
|
125
|
+
f[i++] = (struct sock_filter)BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_KILL_PROCESS);
|
|
126
|
+
/* [3] load syscall nr */
|
|
127
|
+
f[i++] = (struct sock_filter)BPF_STMT(BPF_LD|BPF_W|BPF_ABS, offsetof(struct seccomp_data, nr));
|
|
128
|
+
/* [4..4+N-1] check each blocked: jt jumps to errno return at [4+N+1] */
|
|
129
|
+
for (unsigned int j = 0; j < N; j++) {
|
|
130
|
+
unsigned int jt = (unsigned int)(N - j); /* distance to errno instr */
|
|
131
|
+
f[i++] = (struct sock_filter)BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, (unsigned int)BLOCKED[j], jt, 0);
|
|
132
|
+
}
|
|
133
|
+
/* [4+N] allow */
|
|
134
|
+
f[i++] = (struct sock_filter)BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ALLOW);
|
|
135
|
+
/* [4+N+1] errno EPERM */
|
|
136
|
+
f[i++] = (struct sock_filter)BPF_STMT(BPF_RET|BPF_K, SECCOMP_RET_ERRNO|(EPERM & SECCOMP_RET_DATA));
|
|
137
|
+
|
|
138
|
+
struct sock_fprog prog = { .len = (unsigned short)i, .filter = f };
|
|
139
|
+
int ret = (int)syscall(__NR_seccomp, SECCOMP_SET_MODE_FILTER, 0, &prog);
|
|
140
|
+
free(f);
|
|
141
|
+
return ret;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
int main(int argc, char *argv[]) {
|
|
145
|
+
if (argc < 3) {
|
|
146
|
+
fprintf(stderr, "Usage: seccomp-loader <profile.json> <command> [args...]\\n");
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
|
|
150
|
+
perror("prctl(PR_SET_NO_NEW_PRIVS)");
|
|
151
|
+
return 1;
|
|
152
|
+
}
|
|
153
|
+
if (apply_filter() < 0) {
|
|
154
|
+
fprintf(stderr, "seccomp-loader: BPF filter failed (errno=%d); continuing with no-new-privs only\\n", errno);
|
|
155
|
+
}
|
|
156
|
+
execvp(argv[2], &argv[2]);
|
|
157
|
+
perror("execvp");
|
|
158
|
+
return 1;
|
|
159
|
+
}
|
|
160
|
+
`;
|
|
161
|
+
let loaderBinaryPath = null;
|
|
162
|
+
function getLoaderDir() {
|
|
163
|
+
return path.join(os.tmpdir(), "cloison-runtime-seccomp");
|
|
164
|
+
}
|
|
165
|
+
function compileLoader() {
|
|
166
|
+
const dir = getLoaderDir();
|
|
167
|
+
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
168
|
+
const binaryPath = path.join(dir, "seccomp-loader");
|
|
169
|
+
const sourcePath = path.join(dir, "seccomp-loader.c");
|
|
170
|
+
if (fs.existsSync(binaryPath)) {
|
|
171
|
+
try {
|
|
172
|
+
const stat = fs.statSync(binaryPath);
|
|
173
|
+
if (stat.isFile() && (stat.mode & 0o100)) {
|
|
174
|
+
return binaryPath;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// recompile
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
fs.writeFileSync(sourcePath, SECCOMP_LOADER_SOURCE, { mode: 0o600 });
|
|
182
|
+
try {
|
|
183
|
+
execSync(`cc -o ${binaryPath} ${sourcePath} -static 2>/dev/null || cc -o ${binaryPath} ${sourcePath}`, {
|
|
184
|
+
timeout: 30_000,
|
|
185
|
+
stdio: "pipe",
|
|
186
|
+
});
|
|
187
|
+
fs.chmodSync(binaryPath, 0o700);
|
|
188
|
+
log.info("seccomp-loader compiled successfully (BPF filter enabled)");
|
|
189
|
+
return binaryPath;
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
log.warn("failed to compile seccomp-loader (cc not available?)", {
|
|
193
|
+
error: String(err),
|
|
194
|
+
});
|
|
195
|
+
try {
|
|
196
|
+
fs.unlinkSync(sourcePath);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// best effort
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export function ensureSeccompLoader() {
|
|
205
|
+
if (loaderBinaryPath && fs.existsSync(loaderBinaryPath)) {
|
|
206
|
+
return loaderBinaryPath;
|
|
207
|
+
}
|
|
208
|
+
loaderBinaryPath = compileLoader();
|
|
209
|
+
return loaderBinaryPath;
|
|
210
|
+
}
|
|
211
|
+
export function buildSeccompWrapperArgs(profile, sandboxId, command, args) {
|
|
212
|
+
const loader = ensureSeccompLoader();
|
|
213
|
+
if (!loader)
|
|
214
|
+
return null;
|
|
215
|
+
const profilePath = writeSeccompProfile(profile, sandboxId);
|
|
216
|
+
return {
|
|
217
|
+
command: loader,
|
|
218
|
+
args: [profilePath, command, ...args],
|
|
219
|
+
profilePath,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export function isSeccompAvailable() {
|
|
223
|
+
if (process.platform !== "linux")
|
|
224
|
+
return false;
|
|
225
|
+
return ensureSeccompLoader() !== null;
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=seccomp-apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seccomp-apply.js","sourceRoot":"","sources":["../../src/sandbox/seccomp-apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SeccompProfile {
|
|
2
|
+
defaultAction: "SCMP_ACT_ALLOW" | "SCMP_ACT_ERRNO" | "SCMP_ACT_KILL";
|
|
3
|
+
syscalls: SeccompRule[];
|
|
4
|
+
}
|
|
5
|
+
export interface SeccompRule {
|
|
6
|
+
names: string[];
|
|
7
|
+
action: "SCMP_ACT_ALLOW" | "SCMP_ACT_ERRNO" | "SCMP_ACT_KILL";
|
|
8
|
+
}
|
|
9
|
+
export declare function buildDefaultProfile(): SeccompProfile;
|
|
10
|
+
export declare function buildRestrictedProfile(additionalAllowed?: string[]): SeccompProfile;
|
|
11
|
+
export declare function writeSeccompProfile(profile: SeccompProfile, sandboxId: string): string;
|
|
12
|
+
export declare function cleanupSeccompProfile(profilePath: string): void;
|
|
13
|
+
//# sourceMappingURL=seccomp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seccomp.d.ts","sourceRoot":"","sources":["../../src/sandbox/seccomp.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,eAAe,CAAC;IACrE,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,GAAG,eAAe,CAAC;CAC/D;AA8ED,wBAAgB,mBAAmB,IAAI,cAAc,CAcpD;AAED,wBAAgB,sBAAsB,CACpC,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAC3B,cAAc,CAWhB;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,MAAM,CAMR;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAM/D"}
|