@yiaany/ghostapi 0.1.9 → 0.2.1
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 +21 -0
- package/CONTRIBUTING.md +132 -119
- package/LICENSE +21 -21
- package/PROVENANCE.md +13 -0
- package/README.md +78 -84
- package/SECURITY.md +56 -53
- package/dist/actions/gateway.js +320 -72
- package/dist/actions/gateway.js.map +1 -1
- package/dist/actions/index.d.ts +2 -2
- package/dist/actions/index.js +1 -1
- package/dist/actions/index.js.map +1 -1
- package/dist/agents/agentPrompt.js +7 -5
- package/dist/agents/agentPrompt.js.map +1 -1
- package/dist/ai/aiClient.js +5 -5
- package/dist/ai/aiClient.js.map +1 -1
- package/dist/ai/aiGenerator.js +66 -26
- package/dist/ai/aiGenerator.js.map +1 -1
- package/dist/ai/genericInference.js +151 -36
- package/dist/ai/genericInference.js.map +1 -1
- package/dist/ai/prompts.js +55 -49
- package/dist/ai/prompts.js.map +1 -1
- package/dist/approvals/approvalInbox.js +649 -133
- package/dist/approvals/approvalInbox.js.map +1 -1
- package/dist/approvals/index.d.ts +2 -2
- package/dist/approvals/index.js +1 -1
- package/dist/approvals/index.js.map +1 -1
- package/dist/behavior/behaviorStore.js +34 -14
- package/dist/behavior/behaviorStore.js.map +1 -1
- package/dist/cache/index.js +14 -5
- package/dist/cache/index.js.map +1 -1
- package/dist/cli/index.js +226 -93
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/openUrl.js +17 -3
- package/dist/cli/openUrl.js.map +1 -1
- package/dist/cli/parser.js +79 -18
- package/dist/cli/parser.js.map +1 -1
- package/dist/config/dataPaths.js +4 -2
- package/dist/config/dataPaths.js.map +1 -1
- package/dist/config/localConfig.js +5 -2
- package/dist/config/localConfig.js.map +1 -1
- package/dist/config/serverConfig.js +11 -5
- package/dist/config/serverConfig.js.map +1 -1
- package/dist/contracts/contract.js +311 -83
- package/dist/contracts/contract.js.map +1 -1
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +1 -1
- package/dist/contracts/index.js.map +1 -1
- package/dist/credentials/credentialBroker.js +391 -79
- package/dist/credentials/credentialBroker.js.map +1 -1
- package/dist/credentials/index.d.ts +2 -2
- package/dist/credentials/index.js +1 -1
- package/dist/credentials/index.js.map +1 -1
- package/dist/dashboard/app.js +823 -685
- package/dist/dashboard/dashboard.js.map +1 -1
- package/dist/dashboard/index.html +704 -267
- package/dist/dashboard/styles.css +1040 -349
- package/dist/egress/capabilities.js +55 -25
- package/dist/egress/capabilities.js.map +1 -1
- package/dist/egress/linuxBootstrap.js +47 -11
- package/dist/egress/linuxBootstrap.js.map +1 -1
- package/dist/egress/run.js +170 -31
- package/dist/egress/run.js.map +1 -1
- package/dist/errors/errorEngine.js +15 -3
- package/dist/errors/errorEngine.js.map +1 -1
- package/dist/errors/providerErrors.js.map +1 -1
- package/dist/evals/evals.js +304 -78
- package/dist/evals/evals.js.map +1 -1
- package/dist/evals/index.d.ts +2 -2
- package/dist/evals/index.js +1 -1
- package/dist/evals/index.js.map +1 -1
- package/dist/evidence/index.d.ts +2 -2
- package/dist/evidence/index.js +1 -1
- package/dist/evidence/index.js.map +1 -1
- package/dist/evidence/report.d.ts +1 -1
- package/dist/evidence/report.js +263 -79
- package/dist/evidence/report.js.map +1 -1
- package/dist/fault/faultLab.js +24 -9
- package/dist/fault/faultLab.js.map +1 -1
- package/dist/index.d.ts +42 -42
- package/dist/index.js +21 -21
- package/dist/index.js.map +1 -1
- package/dist/inventory/analysis.d.ts +1 -1
- package/dist/inventory/analysis.js +174 -50
- package/dist/inventory/analysis.js.map +1 -1
- package/dist/inventory/index.d.ts +4 -4
- package/dist/inventory/index.js +3 -3
- package/dist/inventory/index.js.map +1 -1
- package/dist/inventory/inventoryController.js +362 -115
- package/dist/inventory/inventoryController.js.map +1 -1
- package/dist/inventory/types.js +680 -140
- package/dist/inventory/types.js.map +1 -1
- package/dist/ledger/actionLedger.js +355 -78
- package/dist/ledger/actionLedger.js.map +1 -1
- package/dist/ledger/index.d.ts +2 -2
- package/dist/ledger/index.js +1 -1
- package/dist/ledger/index.js.map +1 -1
- package/dist/mcp/server.js +26 -11
- package/dist/mcp/server.js.map +1 -1
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.js +1 -1
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/policy.js +112 -32
- package/dist/policy/policy.js.map +1 -1
- package/dist/productTelemetry/index.js +71 -20
- package/dist/productTelemetry/index.js.map +1 -1
- package/dist/providers/conformance.js +10 -5
- package/dist/providers/conformance.js.map +1 -1
- package/dist/providers/discord.js +2 -2
- package/dist/providers/generic.js +3 -3
- package/dist/providers/github.js +2 -2
- package/dist/providers/index.d.ts +3 -3
- package/dist/providers/index.js +2 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/openai.js +3 -3
- package/dist/providers/packs/resendPack.js +51 -25
- package/dist/providers/packs/resendPack.js.map +1 -1
- package/dist/providers/packs/stripePack.js +590 -121
- package/dist/providers/packs/stripePack.js.map +1 -1
- package/dist/providers/registry.js +4 -4
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/runtime.js +7 -6
- package/dist/providers/runtime.js.map +1 -1
- package/dist/providers/stripeWebhook.js +39 -10
- package/dist/providers/stripeWebhook.js.map +1 -1
- package/dist/providers/twilio.js +2 -2
- package/dist/proxy/cacheKey.js +9 -2
- package/dist/proxy/cacheKey.js.map +1 -1
- package/dist/proxy/providerDetector.js +22 -9
- package/dist/proxy/providerDetector.js.map +1 -1
- package/dist/proxy/proxyHandler.js +57 -22
- package/dist/proxy/proxyHandler.js.map +1 -1
- package/dist/proxy/requestNormalizer.js +4 -2
- package/dist/proxy/requestNormalizer.js.map +1 -1
- package/dist/reliability/costGovernance.js +211 -49
- package/dist/reliability/costGovernance.js.map +1 -1
- package/dist/reliability/index.d.ts +8 -8
- package/dist/reliability/index.js +4 -4
- package/dist/reliability/index.js.map +1 -1
- package/dist/reliability/reconciliation.js +274 -65
- package/dist/reliability/reconciliation.js.map +1 -1
- package/dist/reliability/runtimeHealth.js +127 -35
- package/dist/reliability/runtimeHealth.js.map +1 -1
- package/dist/reliability/slo.js +257 -50
- package/dist/reliability/slo.js.map +1 -1
- package/dist/report/safetyReport.d.ts +6 -0
- package/dist/report/safetyReport.js +56 -12
- package/dist/report/safetyReport.js.map +1 -1
- package/dist/rules/aiRules.js +5 -5
- package/dist/rules/aiRules.js.map +1 -1
- package/dist/safety/index.d.ts +2 -2
- package/dist/safety/index.js +1 -1
- package/dist/safety/index.js.map +1 -1
- package/dist/safety/safetyController.js +675 -165
- package/dist/safety/safetyController.js.map +1 -1
- package/dist/scenarios/scenarioBundle.js +204 -71
- package/dist/scenarios/scenarioBundle.js.map +1 -1
- package/dist/scenarios/scenarioStore.js +88 -29
- package/dist/scenarios/scenarioStore.js.map +1 -1
- package/dist/security/headerSanitizer.js +52 -10
- package/dist/security/headerSanitizer.js.map +1 -1
- package/dist/security/secrets.js +10 -5
- package/dist/security/secrets.js.map +1 -1
- package/dist/server/accessControl.js +37 -10
- package/dist/server/accessControl.js.map +1 -1
- package/dist/server/createServer.js +1 -1
- package/dist/server/createServer.js.map +1 -1
- package/dist/server/eventsStore.js +15 -5
- package/dist/server/eventsStore.js.map +1 -1
- package/dist/server/routes.js +61 -19
- package/dist/server/routes.js.map +1 -1
- package/dist/server/sse.js +1 -1
- package/dist/server/sse.js.map +1 -1
- package/dist/setup/sdkDetector.js +7 -2
- package/dist/setup/sdkDetector.js.map +1 -1
- package/dist/setup/setupGenerator.js +136 -48
- package/dist/setup/setupGenerator.js.map +1 -1
- package/dist/state/stateExtractor.js +3 -1
- package/dist/state/stateExtractor.js.map +1 -1
- package/dist/state/stateResolver.js +10 -7
- package/dist/state/stateResolver.js.map +1 -1
- package/dist/state/stateStore.js +13 -4
- package/dist/state/stateStore.js.map +1 -1
- package/dist/storage/fileStore.js +12 -4
- package/dist/storage/fileStore.js.map +1 -1
- package/dist/teamControl/controlPlane.js +846 -174
- package/dist/teamControl/controlPlane.js.map +1 -1
- package/dist/teamControl/deployment.js +19 -5
- package/dist/teamControl/deployment.js.map +1 -1
- package/dist/teamControl/index.d.ts +4 -4
- package/dist/teamControl/index.js +2 -2
- package/dist/teamControl/index.js.map +1 -1
- package/dist/tests/testGenerator.js +15 -7
- package/dist/tests/testGenerator.js.map +1 -1
- package/dist/trust/index.d.ts +2 -2
- package/dist/trust/index.js +1 -1
- package/dist/trust/index.js.map +1 -1
- package/dist/trust/trustLadder.js +309 -63
- package/dist/trust/trustLadder.js.map +1 -1
- package/dist/worlds/index.d.ts +2 -2
- package/dist/worlds/index.js +1 -1
- package/dist/worlds/index.js.map +1 -1
- package/dist/worlds/worlds.js +364 -65
- package/dist/worlds/worlds.js.map +1 -1
- package/docs/assets/dashboard.png +0 -0
- package/docs/ci.md +49 -49
- package/docs/github-actions.md +84 -84
- package/docs/mcp.md +58 -52
- package/docs/policy.md +63 -61
- package/docs/providers/authoring-packs.md +180 -175
- package/docs/providers/stripe-core-pack.md +84 -82
- package/docs/releases/README.md +13 -0
- package/docs/security/action-gateway-threat-model.md +34 -34
- package/docs/security/action-ledger-incident-replay-threat-model.md +42 -42
- package/docs/security/approval-inbox-threat-model.md +35 -35
- package/docs/security/credential-broker-threat-model.md +52 -52
- package/docs/security/egress-threat-model.md +126 -126
- package/docs/security/inventory-threat-model.md +104 -104
- package/docs/security/kill-switch-budgets-threat-model.md +37 -37
- package/docs/security/reliability-threat-model.md +111 -111
- package/docs/security/trust-ladder-threat-model.md +33 -33
- package/docs/telemetry.md +14 -0
- package/docs/usage.md +680 -571
- package/examples/README.md +10 -10
- package/examples/agent-instructions/README.md +39 -39
- package/examples/ci-smoke/README.md +21 -21
- package/examples/ci-smoke/ghostapi.policy.yaml +22 -22
- package/examples/ci-smoke/package.json +9 -9
- package/examples/ci-smoke/production-egress.mjs +4 -2
- package/examples/ci-smoke/safe.mjs +21 -17
- package/examples/evals/README.md +24 -24
- package/examples/evals/retry-after.eval.json +71 -52
- package/examples/generic-rest/README.md +27 -27
- package/examples/github-fetch/README.md +38 -35
- package/examples/openai-streaming/README.md +16 -16
- package/examples/openai-streaming/streaming-tool-call.mjs +44 -31
- package/examples/policy/ghostapi.policy.yaml +27 -27
- package/examples/record-replay/README.md +19 -19
- package/examples/record-replay/replay-requests.json +22 -22
- package/examples/record-replay/stripe-checkout.har.json +30 -30
- package/examples/resend-node/README.md +22 -22
- package/examples/stripe-node/README.md +35 -35
- package/examples/stripe-node/checkout-flow.mjs +87 -61
- package/examples/twilio-node/README.md +21 -21
- package/examples/worlds/README.md +19 -19
- package/examples/worlds/subscription-recovery.mjs +21 -12
- package/package.json +28 -6
- package/dist/landing/assets/index-BXR41fAD.css +0 -1
- package/dist/landing/assets/index-CxWsopzP.css +0 -1
- package/dist/landing/assets/index-D8_ggMRE.js +0 -55
- package/dist/landing/assets/index-DZlpyhqd.js +0 -55
- package/dist/landing/assets/index-Dk-Xezs3.js +0 -55
- package/dist/landing/index.html +0 -15
- package/dist/landing/landing.d.ts +0 -3
- package/dist/landing/landing.js +0 -12
- package/dist/landing/landing.js.map +0 -1
- package/docs/commercial/README.md +0 -29
- package/docs/commercial/data-inventory.md +0 -36
- package/docs/commercial/manual-invoicing.md +0 -44
- package/docs/commercial/metrics.md +0 -51
- package/docs/commercial/pricing.md +0 -103
- package/docs/commercial/privacy-policy-draft.md +0 -41
- package/docs/commercial/terms-topics-for-counsel.md +0 -51
- package/docs/design-partners/README.md +0 -52
- package/docs/design-partners/demo-narratives.md +0 -33
- package/docs/design-partners/design-partner-offer.md +0 -39
- package/docs/design-partners/discovery-questions.md +0 -28
- package/docs/design-partners/feedback-capture-template.md +0 -48
- package/docs/design-partners/icp-one-pager.md +0 -43
- package/docs/design-partners/onboarding-checklist.md +0 -33
- package/docs/design-partners/pilot-success-criteria.md +0 -27
- package/docs/design-partners/pricing-interview-script.md +0 -18
- package/docs/design-partners/telemetry-plan.md +0 -48
- package/docs/development/baseline.md +0 -114
- package/docs/development/onboarding-smoke.md +0 -37
- package/docs/development/verification-0.1.8.md +0 -25
- package/docs/enterprise-product-roadmap-ru.md +0 -1879
- package/docs/fundraising/README.md +0 -87
- package/docs/fundraising/data-room-checklist.md +0 -72
- package/docs/fundraising/demo-script.md +0 -52
- package/docs/fundraising/design-partners-50.md +0 -74
- package/docs/fundraising/launch-posts.md +0 -37
- package/docs/fundraising/metrics-and-evidence.md +0 -30
- package/docs/fundraising/roadmap-12-month.md +0 -25
- package/docs/fundraising/technical-due-diligence-index.md +0 -37
- package/docs/fundraising/yc-application.md +0 -25
- package/docs/hosted-pilot.md +0 -111
- package/docs/operations/disaster-recovery-runbook.md +0 -81
- package/docs/operations/kill-switch-runbook.md +0 -32
- package/docs/release-checklist.md +0 -83
- package/docs/release-migration-and-rollback.md +0 -63
- package/docs/release-readiness.md +0 -39
- package/docs/team-control-plane.md +0 -72
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
const PROXY_BYPASSES = [
|
|
2
2
|
"A new HTTP client, direct IP address, custom DNS resolver, UDP, QUIC, local-network target, or subprocess can ignore proxy configuration.",
|
|
3
|
-
"A malicious process running as the same user can create its own network path."
|
|
3
|
+
"A malicious process running as the same user can create its own network path.",
|
|
4
4
|
];
|
|
5
5
|
const HOSTILE_BYPASSES = [
|
|
6
6
|
"An administrator/root-equivalent actor and a compromised host are outside this threat model.",
|
|
7
|
-
"A separate process running outside the launched containment boundary remains able to use the host network."
|
|
7
|
+
"A separate process running outside the launched containment boundary remains able to use the host network.",
|
|
8
8
|
];
|
|
9
9
|
export function detectEgressCapabilities(input = {}) {
|
|
10
10
|
const runtime = {
|
|
11
11
|
platform: input.platform ?? process.platform,
|
|
12
12
|
arch: input.arch ?? process.arch,
|
|
13
|
-
nodeVersion: input.nodeVersion ?? process.versions.node
|
|
13
|
+
nodeVersion: input.nodeVersion ?? process.versions.node,
|
|
14
14
|
};
|
|
15
15
|
const capabilities = [
|
|
16
16
|
createProxyGuidanceCapability(),
|
|
17
|
-
createNodePermissionCapability(input.nodeNetworkPermission ??
|
|
18
|
-
|
|
17
|
+
createNodePermissionCapability(input.nodeNetworkPermission ??
|
|
18
|
+
process.allowedNodeEnvironmentFlags.has("--allow-net")),
|
|
19
|
+
...createPlatformCapabilities(runtime.platform),
|
|
19
20
|
];
|
|
20
21
|
return {
|
|
21
22
|
schemaVersion: 1,
|
|
@@ -26,7 +27,7 @@ export function detectEgressCapabilities(input = {}) {
|
|
|
26
27
|
capabilities,
|
|
27
28
|
globalStateChanged: false,
|
|
28
29
|
remainingBypasses: [...PROXY_BYPASSES, ...HOSTILE_BYPASSES],
|
|
29
|
-
nextArchitecture: architectureFor(runtime.platform)
|
|
30
|
+
nextArchitecture: architectureFor(runtime.platform),
|
|
30
31
|
};
|
|
31
32
|
}
|
|
32
33
|
export function formatEgressCapabilityReport(report) {
|
|
@@ -36,7 +37,7 @@ export function formatEgressCapabilityReport(report) {
|
|
|
36
37
|
"Status: NO PROCESS LAUNCHED",
|
|
37
38
|
"Current diagnostic guarantee: HTTP proxy guidance only",
|
|
38
39
|
"",
|
|
39
|
-
"Capabilities:"
|
|
40
|
+
"Capabilities:",
|
|
40
41
|
];
|
|
41
42
|
for (const capability of report.capabilities) {
|
|
42
43
|
lines.push(` ${capability.status.toUpperCase().padEnd(15)} ${capability.title}: ${capability.detail}`);
|
|
@@ -62,7 +63,7 @@ function createProxyGuidanceCapability() {
|
|
|
62
63
|
guarantee: "http-proxy-guidance",
|
|
63
64
|
detail: "GhostAPI can guide supported HTTP clients to a local endpoint, but does not intercept or block other traffic.",
|
|
64
65
|
requiredPrivileges: [],
|
|
65
|
-
remainingBypasses: PROXY_BYPASSES
|
|
66
|
+
remainingBypasses: PROXY_BYPASSES,
|
|
66
67
|
};
|
|
67
68
|
}
|
|
68
69
|
function createNodePermissionCapability(supportsNetworkPermission) {
|
|
@@ -74,10 +75,16 @@ function createNodePermissionCapability(supportsNetworkPermission) {
|
|
|
74
75
|
detail: supportsNetworkPermission
|
|
75
76
|
? "A Node process started with --permission and without --allow-net can deny network access, but the model is a seat belt for trusted code, not hostile-code sandboxing."
|
|
76
77
|
: "This Node.js version does not provide a supported network-deny control suitable for GhostAPI egress enforcement.",
|
|
77
|
-
requiredPrivileges: supportsNetworkPermission
|
|
78
|
+
requiredPrivileges: supportsNetworkPermission
|
|
79
|
+
? ["Launch the target with --permission and do not grant --allow-net."]
|
|
80
|
+
: [],
|
|
78
81
|
remainingBypasses: supportsNetworkPermission
|
|
79
|
-
? [
|
|
80
|
-
|
|
82
|
+
? [
|
|
83
|
+
"It applies only to the launched Node process and does not provide security guarantees against malicious code or other processes.",
|
|
84
|
+
]
|
|
85
|
+
: [
|
|
86
|
+
"Any Node program, child process, or native tool can still create network connections.",
|
|
87
|
+
],
|
|
81
88
|
};
|
|
82
89
|
}
|
|
83
90
|
function createPlatformCapabilities(platform) {
|
|
@@ -90,10 +97,17 @@ function createPlatformCapabilities(platform) {
|
|
|
90
97
|
status: "degraded",
|
|
91
98
|
guarantee: "process-level-enforcement",
|
|
92
99
|
detail: "ghostapi run uses a fresh user, mount, and network namespace with loopback-only GhostAPI. It fails closed unless local unshare and ip preflight succeeds.",
|
|
93
|
-
requiredPrivileges: [
|
|
94
|
-
|
|
100
|
+
requiredPrivileges: [
|
|
101
|
+
"util-linux unshare, iproute2 ip, and host policy allowing the required unprivileged user, mount, and network namespaces.",
|
|
102
|
+
],
|
|
103
|
+
remainingBypasses: [
|
|
104
|
+
"Denied kernel socket attempts are enforced but not individually attributable by this backend.",
|
|
105
|
+
"The target must use GhostAPI loopback configuration; TLS provider-host interception is not implemented.",
|
|
106
|
+
"Filesystem UNIX sockets that the same user can access, such as a mounted container-control socket, are outside this network-namespace boundary.",
|
|
107
|
+
...HOSTILE_BYPASSES,
|
|
108
|
+
],
|
|
95
109
|
},
|
|
96
|
-
createContainerCapability("An OCI runtime configured with a no-network mode")
|
|
110
|
+
createContainerCapability("An OCI runtime configured with a no-network mode"),
|
|
97
111
|
];
|
|
98
112
|
case "darwin":
|
|
99
113
|
return [
|
|
@@ -103,10 +117,15 @@ function createPlatformCapabilities(platform) {
|
|
|
103
117
|
status: "degraded",
|
|
104
118
|
guarantee: "unsupported",
|
|
105
119
|
detail: "App Sandbox network access is entitlement-based for a signed app and is not a generic GhostAPI subprocess launcher.",
|
|
106
|
-
requiredPrivileges: [
|
|
107
|
-
|
|
120
|
+
requiredPrivileges: [
|
|
121
|
+
"A signed sandboxed application and an entitlement configuration designed for the launched helper.",
|
|
122
|
+
],
|
|
123
|
+
remainingBypasses: [
|
|
124
|
+
"An arbitrary command launched outside that app sandbox is not constrained.",
|
|
125
|
+
...HOSTILE_BYPASSES,
|
|
126
|
+
],
|
|
108
127
|
},
|
|
109
|
-
createContainerCapability("A separately configured Linux-container or VM runtime")
|
|
128
|
+
createContainerCapability("A separately configured Linux-container or VM runtime"),
|
|
110
129
|
];
|
|
111
130
|
case "win32":
|
|
112
131
|
return [
|
|
@@ -116,10 +135,15 @@ function createPlatformCapabilities(platform) {
|
|
|
116
135
|
status: "not-implemented",
|
|
117
136
|
guarantee: "process-level-enforcement",
|
|
118
137
|
detail: "AppContainer can deny network capability to a launched process, but GhostAPI does not create profiles or launch AppContainers yet.",
|
|
119
|
-
requiredPrivileges: [
|
|
120
|
-
|
|
138
|
+
requiredPrivileges: [
|
|
139
|
+
"An AppContainer/LPAC launcher, a minimal capability profile, and a writable sandbox directory.",
|
|
140
|
+
],
|
|
141
|
+
remainingBypasses: [
|
|
142
|
+
"A normal Win32 child process is not in an AppContainer.",
|
|
143
|
+
...HOSTILE_BYPASSES,
|
|
144
|
+
],
|
|
121
145
|
},
|
|
122
|
-
createContainerCapability("A separately configured Windows or Linux container/VM runtime")
|
|
146
|
+
createContainerCapability("A separately configured Windows or Linux container/VM runtime"),
|
|
123
147
|
];
|
|
124
148
|
default:
|
|
125
149
|
return [
|
|
@@ -130,9 +154,9 @@ function createPlatformCapabilities(platform) {
|
|
|
130
154
|
guarantee: "unsupported",
|
|
131
155
|
detail: `GhostAPI has no supported native egress-isolation backend for ${platform}.`,
|
|
132
156
|
requiredPrivileges: [],
|
|
133
|
-
remainingBypasses: PROXY_BYPASSES
|
|
157
|
+
remainingBypasses: PROXY_BYPASSES,
|
|
134
158
|
},
|
|
135
|
-
createContainerCapability("A separately configured OCI runtime")
|
|
159
|
+
createContainerCapability("A separately configured OCI runtime"),
|
|
136
160
|
];
|
|
137
161
|
}
|
|
138
162
|
}
|
|
@@ -143,8 +167,14 @@ function createContainerCapability(requirement) {
|
|
|
143
167
|
status: "not-implemented",
|
|
144
168
|
guarantee: "container-network-namespace-enforcement",
|
|
145
169
|
detail: "A no-network container can provide the strongest planned local guarantee, but GhostAPI does not manage containers in this release.",
|
|
146
|
-
requiredPrivileges: [
|
|
147
|
-
|
|
170
|
+
requiredPrivileges: [
|
|
171
|
+
requirement,
|
|
172
|
+
"An image and mount policy that excludes host network-control sockets and credentials.",
|
|
173
|
+
],
|
|
174
|
+
remainingBypasses: [
|
|
175
|
+
"Mounted Docker/Podman sockets, host networking, privileged mode, or inherited credentials would break the boundary.",
|
|
176
|
+
...HOSTILE_BYPASSES,
|
|
177
|
+
],
|
|
148
178
|
};
|
|
149
179
|
}
|
|
150
180
|
function architectureFor(platform) {
|
|
@@ -159,7 +189,7 @@ function architectureFor(platform) {
|
|
|
159
189
|
"Keep policy parsing and evidence collection in an unprivileged GhostAPI parent process.",
|
|
160
190
|
nativeStep,
|
|
161
191
|
"Add an OCI no-network backend that exposes GhostAPI only through a deliberate local transport, never host networking.",
|
|
162
|
-
"Use child-owned namespaces, profiles, and containers so crash cleanup is automatic; do not modify global proxy or firewall state."
|
|
192
|
+
"Use child-owned namespaces, profiles, and containers so crash cleanup is automatic; do not modify global proxy or firewall state.",
|
|
163
193
|
];
|
|
164
194
|
}
|
|
165
195
|
//# sourceMappingURL=capabilities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/egress/capabilities.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/egress/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,11 +12,23 @@ async function main() {
|
|
|
12
12
|
delete process.env.GHOSTAPI_LLM_API_KEY;
|
|
13
13
|
const evidence = await readEvidence(config.evidencePath);
|
|
14
14
|
evidence.status = "running";
|
|
15
|
-
evidence.events.push({
|
|
16
|
-
|
|
15
|
+
evidence.events.push({
|
|
16
|
+
type: "loopback-enabled",
|
|
17
|
+
timestamp: new Date().toISOString(),
|
|
18
|
+
});
|
|
19
|
+
const app = await createServer({
|
|
20
|
+
host: "127.0.0.1",
|
|
21
|
+
port: config.port,
|
|
22
|
+
model: process.env.GHOSTAPI_MODEL ?? "gpt-4o-mini",
|
|
23
|
+
offline: true,
|
|
24
|
+
});
|
|
17
25
|
const server = http.createServer(app);
|
|
18
26
|
await listen(server, config.port);
|
|
19
|
-
evidence.events.push({
|
|
27
|
+
evidence.events.push({
|
|
28
|
+
type: "ghostapi-ready",
|
|
29
|
+
timestamp: new Date().toISOString(),
|
|
30
|
+
detail: `http://127.0.0.1:${config.port}`,
|
|
31
|
+
});
|
|
20
32
|
await atomicWriteJson(config.evidencePath, evidence);
|
|
21
33
|
const targetEnvironment = createTargetEnvironment(process.env);
|
|
22
34
|
delete targetEnvironment.GHOSTAPI_RUN_BOOTSTRAP_CONFIG;
|
|
@@ -31,7 +43,11 @@ async function main() {
|
|
|
31
43
|
let result;
|
|
32
44
|
let interruptedBy;
|
|
33
45
|
try {
|
|
34
|
-
const target = spawn(config.command[0], config.command.slice(1), {
|
|
46
|
+
const target = spawn(config.command[0], config.command.slice(1), {
|
|
47
|
+
env: targetEnvironment,
|
|
48
|
+
stdio: "inherit",
|
|
49
|
+
detached: true,
|
|
50
|
+
});
|
|
35
51
|
const forward = (signal) => {
|
|
36
52
|
interruptedBy = signal;
|
|
37
53
|
if (target.pid !== undefined)
|
|
@@ -45,13 +61,22 @@ async function main() {
|
|
|
45
61
|
}
|
|
46
62
|
catch (error) {
|
|
47
63
|
evidence.status = "failed-to-start";
|
|
48
|
-
evidence.events.push({
|
|
64
|
+
evidence.events.push({
|
|
65
|
+
type: "target-failed-to-start",
|
|
66
|
+
timestamp: new Date().toISOString(),
|
|
67
|
+
detail: safeErrorMessage(error),
|
|
68
|
+
});
|
|
49
69
|
process.exitCode = 1;
|
|
50
70
|
}
|
|
51
71
|
finally {
|
|
52
72
|
if (result !== undefined) {
|
|
53
73
|
evidence.status = "finished";
|
|
54
|
-
evidence.events.push({
|
|
74
|
+
evidence.events.push({
|
|
75
|
+
type: "target-exited",
|
|
76
|
+
timestamp: new Date().toISOString(),
|
|
77
|
+
exitCode: result.exitCode,
|
|
78
|
+
detail: interruptedBy ?? result.signal ?? undefined,
|
|
79
|
+
});
|
|
55
80
|
}
|
|
56
81
|
await atomicWriteJson(config.evidencePath, evidence);
|
|
57
82
|
await close(server);
|
|
@@ -60,7 +85,8 @@ async function main() {
|
|
|
60
85
|
function createTargetEnvironment(environment) {
|
|
61
86
|
const targetEnvironment = { ...environment };
|
|
62
87
|
for (const [key, value] of Object.entries(targetEnvironment)) {
|
|
63
|
-
if (isSensitiveEnvironmentKey(key) ||
|
|
88
|
+
if (isSensitiveEnvironmentKey(key) ||
|
|
89
|
+
(value !== undefined && sanitizeSecretString(value) !== value))
|
|
64
90
|
delete targetEnvironment[key];
|
|
65
91
|
}
|
|
66
92
|
return targetEnvironment;
|
|
@@ -77,7 +103,13 @@ function parseConfig() {
|
|
|
77
103
|
if (!raw)
|
|
78
104
|
throw new Error("Missing GhostAPI run bootstrap configuration.");
|
|
79
105
|
const parsed = JSON.parse(raw);
|
|
80
|
-
if (!Array.isArray(parsed.command) ||
|
|
106
|
+
if (!Array.isArray(parsed.command) ||
|
|
107
|
+
parsed.command.length === 0 ||
|
|
108
|
+
typeof parsed.port !== "number" ||
|
|
109
|
+
typeof parsed.evidencePath !== "string" ||
|
|
110
|
+
typeof parsed.runtimeDataDir !== "string" ||
|
|
111
|
+
typeof parsed.runId !== "string" ||
|
|
112
|
+
!Array.isArray(parsed.allowedHosts)) {
|
|
81
113
|
throw new Error("Invalid GhostAPI run bootstrap configuration.");
|
|
82
114
|
}
|
|
83
115
|
return parsed;
|
|
@@ -90,9 +122,13 @@ function runIp(args) {
|
|
|
90
122
|
return new Promise((resolve, reject) => {
|
|
91
123
|
const child = spawn("ip", args, { stdio: ["ignore", "ignore", "pipe"] });
|
|
92
124
|
let stderr = "";
|
|
93
|
-
child.stderr.on("data", (chunk) => {
|
|
125
|
+
child.stderr.on("data", (chunk) => {
|
|
126
|
+
stderr += String(chunk);
|
|
127
|
+
});
|
|
94
128
|
child.once("error", reject);
|
|
95
|
-
child.once("exit", (code) => code === 0
|
|
129
|
+
child.once("exit", (code) => code === 0
|
|
130
|
+
? resolve()
|
|
131
|
+
: reject(new Error(`Unable to configure loopback: ${stderr || `ip exited ${code}`}`)));
|
|
96
132
|
});
|
|
97
133
|
}
|
|
98
134
|
function listen(server, port) {
|
|
@@ -105,7 +141,7 @@ function listen(server, port) {
|
|
|
105
141
|
});
|
|
106
142
|
}
|
|
107
143
|
function close(server) {
|
|
108
|
-
return new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
|
|
144
|
+
return new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve())));
|
|
109
145
|
}
|
|
110
146
|
function waitForTarget(target) {
|
|
111
147
|
return new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linuxBootstrap.js","sourceRoot":"","sources":["../../src/egress/linuxBootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"linuxBootstrap.js","sourceRoot":"","sources":["../../src/egress/linuxBootstrap.ts"],"names":[],"mappings":"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"}
|