@yiaany/ghostapi 0.1.7 → 0.1.8
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 +42 -2
- package/CONTRIBUTING.md +119 -117
- package/LICENSE +21 -21
- package/README.md +208 -185
- package/SECURITY.md +53 -37
- package/dist/actions/gateway.d.ts +179 -0
- package/dist/actions/gateway.js +514 -0
- package/dist/actions/gateway.js.map +1 -0
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.js +2 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/ai/aiClient.js +4 -4
- package/dist/ai/aiClient.js.map +1 -1
- package/dist/ai/aiGenerator.d.ts +2 -2
- package/dist/ai/aiGenerator.js +21 -72
- package/dist/ai/aiGenerator.js.map +1 -1
- package/dist/ai/prompts.js +51 -51
- package/dist/ai/prompts.js.map +1 -1
- package/dist/approvals/approvalInbox.d.ts +150 -0
- package/dist/approvals/approvalInbox.js +412 -0
- package/dist/approvals/approvalInbox.js.map +1 -0
- package/dist/approvals/index.d.ts +2 -0
- package/dist/approvals/index.js +2 -0
- package/dist/approvals/index.js.map +1 -0
- package/dist/behavior/behaviorStore.d.ts +2 -0
- package/dist/behavior/behaviorStore.js +50 -46
- package/dist/behavior/behaviorStore.js.map +1 -1
- package/dist/cache/index.d.ts +2 -0
- package/dist/cache/index.js +58 -14
- package/dist/cache/index.js.map +1 -1
- package/dist/cli/index.js +438 -58
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/openUrl.d.ts +10 -0
- package/dist/cli/openUrl.js +31 -0
- package/dist/cli/openUrl.js.map +1 -0
- package/dist/cli/parser.d.ts +155 -0
- package/dist/cli/parser.js +504 -2
- package/dist/cli/parser.js.map +1 -1
- package/dist/config/dataPaths.d.ts +31 -0
- package/dist/config/dataPaths.js +45 -0
- package/dist/config/dataPaths.js.map +1 -0
- package/dist/config/localConfig.d.ts +1 -2
- package/dist/config/localConfig.js +27 -21
- package/dist/config/localConfig.js.map +1 -1
- package/dist/config/serverConfig.d.ts +2 -0
- package/dist/config/serverConfig.js +8 -1
- package/dist/config/serverConfig.js.map +1 -1
- package/dist/contracts/contract.d.ts +76 -0
- package/dist/contracts/contract.js +603 -0
- package/dist/contracts/contract.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/credentials/credentialBroker.d.ts +207 -0
- package/dist/credentials/credentialBroker.js +588 -0
- package/dist/credentials/credentialBroker.js.map +1 -0
- package/dist/credentials/index.d.ts +2 -0
- package/dist/credentials/index.js +2 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/dashboard/app.js +685 -615
- package/dist/dashboard/index.html +13 -7
- package/dist/dashboard/styles.css +349 -349
- package/dist/egress/capabilities.d.ts +32 -0
- package/dist/egress/capabilities.js +165 -0
- package/dist/egress/capabilities.js.map +1 -0
- package/dist/egress/linuxBootstrap.d.ts +1 -0
- package/dist/egress/linuxBootstrap.js +121 -0
- package/dist/egress/linuxBootstrap.js.map +1 -0
- package/dist/egress/run.d.ts +18 -0
- package/dist/egress/run.js +305 -0
- package/dist/egress/run.js.map +1 -0
- package/dist/errors/errorEngine.d.ts +2 -2
- package/dist/errors/errorEngine.js +3 -40
- package/dist/errors/errorEngine.js.map +1 -1
- package/dist/evals/evals.d.ts +126 -0
- package/dist/evals/evals.js +466 -0
- package/dist/evals/evals.js.map +1 -0
- package/dist/evals/index.d.ts +2 -0
- package/dist/evals/index.js +2 -0
- package/dist/evals/index.js.map +1 -0
- package/dist/evidence/index.d.ts +2 -0
- package/dist/evidence/index.js +2 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/report.d.ts +143 -0
- package/dist/evidence/report.js +556 -0
- package/dist/evidence/report.js.map +1 -0
- package/dist/fault/faultLab.d.ts +5 -4
- package/dist/fault/faultLab.js +66 -24
- package/dist/fault/faultLab.js.map +1 -1
- package/dist/index.d.ts +46 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -1
- package/dist/inventory/analysis.d.ts +12 -0
- package/dist/inventory/analysis.js +457 -0
- package/dist/inventory/analysis.js.map +1 -0
- package/dist/inventory/index.d.ts +5 -0
- package/dist/inventory/index.js +4 -0
- package/dist/inventory/index.js.map +1 -0
- package/dist/inventory/inventoryController.d.ts +53 -0
- package/dist/inventory/inventoryController.js +1044 -0
- package/dist/inventory/inventoryController.js.map +1 -0
- package/dist/inventory/types.d.ts +579 -0
- package/dist/inventory/types.js +787 -0
- package/dist/inventory/types.js.map +1 -0
- package/dist/landing/assets/index-CxWsopzP.css +1 -0
- package/dist/landing/assets/index-DZlpyhqd.js +55 -0
- package/dist/landing/assets/index-Dk-Xezs3.js +55 -0
- package/dist/landing/index.html +15 -15
- package/dist/ledger/actionLedger.d.ts +125 -0
- package/dist/ledger/actionLedger.js +594 -0
- package/dist/ledger/actionLedger.js.map +1 -0
- package/dist/ledger/index.d.ts +2 -0
- package/dist/ledger/index.js +2 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/mcp/server.js +4 -3
- package/dist/mcp/server.js.map +1 -1
- package/dist/policy/index.d.ts +3 -0
- package/dist/policy/index.js +2 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policy.d.ts +14 -0
- package/dist/policy/policy.js +282 -0
- package/dist/policy/policy.js.map +1 -0
- package/dist/policy/types.d.ts +52 -0
- package/dist/policy/types.js +2 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/productTelemetry/index.d.ts +16 -0
- package/dist/productTelemetry/index.js +142 -0
- package/dist/productTelemetry/index.js.map +1 -0
- package/dist/providers/conformance.d.ts +7 -0
- package/dist/providers/conformance.js +48 -0
- package/dist/providers/conformance.js.map +1 -0
- package/dist/providers/index.d.ts +4 -2
- package/dist/providers/index.js +3 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/packs/resendPack.d.ts +2 -0
- package/dist/providers/packs/resendPack.js +147 -0
- package/dist/providers/packs/resendPack.js.map +1 -0
- package/dist/providers/packs/stripePack.d.ts +2 -0
- package/dist/providers/packs/stripePack.js +852 -0
- package/dist/providers/packs/stripePack.js.map +1 -0
- package/dist/providers/registry.d.ts +7 -3
- package/dist/providers/registry.js +55 -4
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/resend.js +2 -11
- package/dist/providers/resend.js.map +1 -1
- package/dist/providers/runtime.d.ts +8 -0
- package/dist/providers/runtime.js +48 -0
- package/dist/providers/runtime.js.map +1 -0
- package/dist/providers/stripeWebhook.d.ts +13 -0
- package/dist/providers/stripeWebhook.js +50 -0
- package/dist/providers/stripeWebhook.js.map +1 -0
- package/dist/providers/types.d.ts +153 -0
- package/dist/proxy/cacheKey.js +3 -3
- package/dist/proxy/cacheKey.js.map +1 -1
- package/dist/proxy/providerDetector.d.ts +2 -7
- package/dist/proxy/providerDetector.js +4 -4
- package/dist/proxy/providerDetector.js.map +1 -1
- package/dist/proxy/proxyHandler.js +116 -12
- package/dist/proxy/proxyHandler.js.map +1 -1
- package/dist/proxy/requestNormalizer.d.ts +0 -1
- package/dist/proxy/requestNormalizer.js +2 -5
- package/dist/proxy/requestNormalizer.js.map +1 -1
- package/dist/reliability/costGovernance.d.ts +175 -0
- package/dist/reliability/costGovernance.js +515 -0
- package/dist/reliability/costGovernance.js.map +1 -0
- package/dist/reliability/index.d.ts +8 -0
- package/dist/reliability/index.js +5 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/reconciliation.d.ts +157 -0
- package/dist/reliability/reconciliation.js +522 -0
- package/dist/reliability/reconciliation.js.map +1 -0
- package/dist/reliability/runtimeHealth.d.ts +60 -0
- package/dist/reliability/runtimeHealth.js +356 -0
- package/dist/reliability/runtimeHealth.js.map +1 -0
- package/dist/reliability/slo.d.ts +131 -0
- package/dist/reliability/slo.js +375 -0
- package/dist/reliability/slo.js.map +1 -0
- package/dist/report/safetyReport.js +7 -3
- package/dist/report/safetyReport.js.map +1 -1
- package/dist/safety/index.d.ts +2 -0
- package/dist/safety/index.js +2 -0
- package/dist/safety/index.js.map +1 -0
- package/dist/safety/safetyController.d.ts +187 -0
- package/dist/safety/safetyController.js +477 -0
- package/dist/safety/safetyController.js.map +1 -0
- package/dist/scenarios/scenarioBundle.d.ts +75 -0
- package/dist/scenarios/scenarioBundle.js +750 -0
- package/dist/scenarios/scenarioBundle.js.map +1 -0
- package/dist/scenarios/scenarioStore.d.ts +1 -0
- package/dist/scenarios/scenarioStore.js +47 -32
- package/dist/scenarios/scenarioStore.js.map +1 -1
- package/dist/security/headerSanitizer.d.ts +2 -0
- package/dist/security/headerSanitizer.js +36 -1
- package/dist/security/headerSanitizer.js.map +1 -1
- package/dist/security/secrets.js +24 -4
- package/dist/security/secrets.js.map +1 -1
- package/dist/server/accessControl.d.ts +5 -0
- package/dist/server/accessControl.js +100 -0
- package/dist/server/accessControl.js.map +1 -0
- package/dist/server/createServer.d.ts +0 -5
- package/dist/server/createServer.js +9 -29
- package/dist/server/createServer.js.map +1 -1
- package/dist/server/eventsStore.d.ts +6 -1
- package/dist/server/eventsStore.js +83 -15
- package/dist/server/eventsStore.js.map +1 -1
- package/dist/server/routes.js +36 -10
- package/dist/server/routes.js.map +1 -1
- package/dist/server/sse.d.ts +2 -1
- package/dist/server/sse.js +15 -3
- package/dist/server/sse.js.map +1 -1
- package/dist/setup/setupGenerator.js +53 -6
- package/dist/setup/setupGenerator.js.map +1 -1
- package/dist/state/stateStore.d.ts +5 -0
- package/dist/state/stateStore.js +48 -62
- package/dist/state/stateStore.js.map +1 -1
- package/dist/storage/fileStore.d.ts +10 -0
- package/dist/storage/fileStore.js +131 -0
- package/dist/storage/fileStore.js.map +1 -0
- package/dist/teamControl/controlPlane.d.ts +255 -0
- package/dist/teamControl/controlPlane.js +918 -0
- package/dist/teamControl/controlPlane.js.map +1 -0
- package/dist/teamControl/deployment.d.ts +33 -0
- package/dist/teamControl/deployment.js +67 -0
- package/dist/teamControl/deployment.js.map +1 -0
- package/dist/teamControl/index.d.ts +4 -0
- package/dist/teamControl/index.js +3 -0
- package/dist/teamControl/index.js.map +1 -0
- package/dist/tests/testGenerator.js +4 -1
- package/dist/tests/testGenerator.js.map +1 -1
- package/dist/trust/index.d.ts +2 -0
- package/dist/trust/index.js +2 -0
- package/dist/trust/index.js.map +1 -0
- package/dist/trust/trustLadder.d.ts +182 -0
- package/dist/trust/trustLadder.js +560 -0
- package/dist/trust/trustLadder.js.map +1 -0
- package/dist/worlds/index.d.ts +2 -0
- package/dist/worlds/index.js +2 -0
- package/dist/worlds/index.js.map +1 -0
- package/dist/worlds/worlds.d.ts +160 -0
- package/dist/worlds/worlds.js +491 -0
- package/dist/worlds/worlds.js.map +1 -0
- package/docs/assets/dashboard.png +0 -0
- package/docs/ci.md +49 -0
- package/docs/commercial/README.md +29 -0
- package/docs/commercial/data-inventory.md +36 -0
- package/docs/commercial/manual-invoicing.md +44 -0
- package/docs/commercial/metrics.md +51 -0
- package/docs/commercial/pricing.md +103 -0
- package/docs/commercial/privacy-policy-draft.md +41 -0
- package/docs/commercial/terms-topics-for-counsel.md +51 -0
- package/docs/design-partners/README.md +52 -0
- package/docs/design-partners/demo-narratives.md +33 -0
- package/docs/design-partners/design-partner-offer.md +39 -0
- package/docs/design-partners/discovery-questions.md +28 -0
- package/docs/design-partners/feedback-capture-template.md +48 -0
- package/docs/design-partners/icp-one-pager.md +43 -0
- package/docs/design-partners/onboarding-checklist.md +33 -0
- package/docs/design-partners/pilot-success-criteria.md +27 -0
- package/docs/design-partners/pricing-interview-script.md +18 -0
- package/docs/design-partners/telemetry-plan.md +48 -0
- package/docs/development/baseline.md +114 -0
- package/docs/development/onboarding-smoke.md +37 -0
- package/docs/development/verification-0.1.8.md +25 -0
- package/docs/enterprise-product-roadmap-ru.md +1879 -0
- package/docs/fundraising/README.md +87 -0
- package/docs/fundraising/data-room-checklist.md +72 -0
- package/docs/fundraising/demo-script.md +52 -0
- package/docs/fundraising/design-partners-50.md +74 -0
- package/docs/fundraising/launch-posts.md +37 -0
- package/docs/fundraising/metrics-and-evidence.md +30 -0
- package/docs/fundraising/roadmap-12-month.md +25 -0
- package/docs/fundraising/technical-due-diligence-index.md +37 -0
- package/docs/fundraising/yc-application.md +25 -0
- package/docs/github-actions.md +84 -0
- package/docs/hosted-pilot.md +111 -0
- package/docs/mcp.md +52 -50
- package/docs/operations/disaster-recovery-runbook.md +81 -0
- package/docs/operations/kill-switch-runbook.md +32 -0
- package/docs/policy.md +61 -0
- package/docs/providers/authoring-packs.md +175 -0
- package/docs/providers/stripe-core-pack.md +82 -0
- package/docs/release-checklist.md +83 -71
- package/docs/release-migration-and-rollback.md +63 -0
- package/docs/release-readiness.md +39 -0
- package/docs/security/action-gateway-threat-model.md +34 -0
- package/docs/security/action-ledger-incident-replay-threat-model.md +42 -0
- package/docs/security/approval-inbox-threat-model.md +35 -0
- package/docs/security/credential-broker-threat-model.md +52 -0
- package/docs/security/egress-threat-model.md +126 -0
- package/docs/security/inventory-threat-model.md +104 -0
- package/docs/security/kill-switch-budgets-threat-model.md +37 -0
- package/docs/security/reliability-threat-model.md +111 -0
- package/docs/security/trust-ladder-threat-model.md +33 -0
- package/docs/team-control-plane.md +72 -0
- package/docs/usage.md +571 -57
- package/examples/README.md +10 -0
- package/examples/agent-instructions/README.md +39 -39
- package/examples/ci-smoke/README.md +21 -0
- package/examples/ci-smoke/ghostapi.policy.yaml +22 -0
- package/examples/ci-smoke/package.json +9 -0
- package/examples/ci-smoke/production-egress.mjs +2 -0
- package/examples/ci-smoke/safe.mjs +17 -0
- package/examples/evals/README.md +24 -0
- package/examples/evals/retry-after.eval.json +52 -0
- package/examples/generic-rest/README.md +27 -27
- package/examples/github-fetch/README.md +35 -35
- package/examples/openai-streaming/README.md +16 -0
- package/examples/openai-streaming/streaming-tool-call.mjs +31 -0
- package/examples/policy/ghostapi.policy.yaml +27 -0
- package/examples/record-replay/README.md +19 -0
- package/examples/record-replay/replay-requests.json +22 -0
- package/examples/record-replay/stripe-checkout.har.json +30 -0
- package/examples/resend-node/README.md +22 -22
- package/examples/stripe-node/README.md +35 -29
- package/examples/stripe-node/checkout-flow.mjs +61 -0
- package/examples/twilio-node/README.md +21 -21
- package/examples/worlds/README.md +19 -0
- package/examples/worlds/subscription-recovery.mjs +12 -0
- package/package.json +27 -12
- package/dist/providers/stripe.d.ts +0 -2
- package/dist/providers/stripe.js +0 -15
- package/dist/providers/stripe.js.map +0 -1
- package/docs/assets/ghostapi-avatar.png +0 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type EgressGuaranteeLevel = "unsupported" | "http-proxy-guidance" | "process-level-enforcement" | "container-network-namespace-enforcement";
|
|
2
|
+
export type EgressCapabilityStatus = "available" | "degraded" | "not-implemented" | "unsupported";
|
|
3
|
+
export type EgressCapability = {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
status: EgressCapabilityStatus;
|
|
7
|
+
guarantee: EgressGuaranteeLevel;
|
|
8
|
+
detail: string;
|
|
9
|
+
requiredPrivileges: string[];
|
|
10
|
+
remainingBypasses: string[];
|
|
11
|
+
};
|
|
12
|
+
export type EgressRuntimeInfo = {
|
|
13
|
+
platform: NodeJS.Platform;
|
|
14
|
+
arch: string;
|
|
15
|
+
nodeVersion: string;
|
|
16
|
+
};
|
|
17
|
+
export type EgressCapabilityReport = {
|
|
18
|
+
schemaVersion: 1;
|
|
19
|
+
runtime: EgressRuntimeInfo;
|
|
20
|
+
isolated: false;
|
|
21
|
+
currentGuarantee: "http-proxy-guidance";
|
|
22
|
+
summary: string;
|
|
23
|
+
capabilities: EgressCapability[];
|
|
24
|
+
globalStateChanged: false;
|
|
25
|
+
remainingBypasses: string[];
|
|
26
|
+
nextArchitecture: string[];
|
|
27
|
+
};
|
|
28
|
+
export type EgressRuntimeInput = Partial<EgressRuntimeInfo> & {
|
|
29
|
+
nodeNetworkPermission?: boolean;
|
|
30
|
+
};
|
|
31
|
+
export declare function detectEgressCapabilities(input?: EgressRuntimeInput): EgressCapabilityReport;
|
|
32
|
+
export declare function formatEgressCapabilityReport(report: EgressCapabilityReport): string;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const PROXY_BYPASSES = [
|
|
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."
|
|
4
|
+
];
|
|
5
|
+
const HOSTILE_BYPASSES = [
|
|
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."
|
|
8
|
+
];
|
|
9
|
+
export function detectEgressCapabilities(input = {}) {
|
|
10
|
+
const runtime = {
|
|
11
|
+
platform: input.platform ?? process.platform,
|
|
12
|
+
arch: input.arch ?? process.arch,
|
|
13
|
+
nodeVersion: input.nodeVersion ?? process.versions.node
|
|
14
|
+
};
|
|
15
|
+
const capabilities = [
|
|
16
|
+
createProxyGuidanceCapability(),
|
|
17
|
+
createNodePermissionCapability(input.nodeNetworkPermission ?? process.allowedNodeEnvironmentFlags.has("--allow-net")),
|
|
18
|
+
...createPlatformCapabilities(runtime.platform)
|
|
19
|
+
];
|
|
20
|
+
return {
|
|
21
|
+
schemaVersion: 1,
|
|
22
|
+
runtime,
|
|
23
|
+
isolated: false,
|
|
24
|
+
currentGuarantee: "http-proxy-guidance",
|
|
25
|
+
summary: "This diagnostic has not launched an isolated process. Linux ghostapi run can provide loopback-only namespace enforcement after successful local preflight.",
|
|
26
|
+
capabilities,
|
|
27
|
+
globalStateChanged: false,
|
|
28
|
+
remainingBypasses: [...PROXY_BYPASSES, ...HOSTILE_BYPASSES],
|
|
29
|
+
nextArchitecture: architectureFor(runtime.platform)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function formatEgressCapabilityReport(report) {
|
|
33
|
+
const lines = [
|
|
34
|
+
"GhostAPI egress diagnosis",
|
|
35
|
+
`Runtime: ${report.runtime.platform}/${report.runtime.arch}, Node.js ${report.runtime.nodeVersion}`,
|
|
36
|
+
"Status: NO PROCESS LAUNCHED",
|
|
37
|
+
"Current diagnostic guarantee: HTTP proxy guidance only",
|
|
38
|
+
"",
|
|
39
|
+
"Capabilities:"
|
|
40
|
+
];
|
|
41
|
+
for (const capability of report.capabilities) {
|
|
42
|
+
lines.push(` ${capability.status.toUpperCase().padEnd(15)} ${capability.title}: ${capability.detail}`);
|
|
43
|
+
if (capability.requiredPrivileges.length > 0)
|
|
44
|
+
lines.push(` Privileges/setup: ${capability.requiredPrivileges.join("; ")}`);
|
|
45
|
+
if (capability.remainingBypasses.length > 0)
|
|
46
|
+
lines.push(` Bypasses: ${capability.remainingBypasses.join(" ")}`);
|
|
47
|
+
}
|
|
48
|
+
lines.push("", "Remaining bypasses:");
|
|
49
|
+
for (const bypass of report.remainingBypasses)
|
|
50
|
+
lines.push(` - ${bypass}`);
|
|
51
|
+
lines.push("", "Next architecture:");
|
|
52
|
+
for (const step of report.nextArchitecture)
|
|
53
|
+
lines.push(` - ${step}`);
|
|
54
|
+
lines.push("", "No system-wide proxy or firewall rules were inspected or changed.");
|
|
55
|
+
return lines.join("\n");
|
|
56
|
+
}
|
|
57
|
+
function createProxyGuidanceCapability() {
|
|
58
|
+
return {
|
|
59
|
+
id: "http-proxy-guidance",
|
|
60
|
+
title: "HTTP proxy guidance",
|
|
61
|
+
status: "available",
|
|
62
|
+
guarantee: "http-proxy-guidance",
|
|
63
|
+
detail: "GhostAPI can guide supported HTTP clients to a local endpoint, but does not intercept or block other traffic.",
|
|
64
|
+
requiredPrivileges: [],
|
|
65
|
+
remainingBypasses: PROXY_BYPASSES
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function createNodePermissionCapability(supportsNetworkPermission) {
|
|
69
|
+
return {
|
|
70
|
+
id: "node-permission-model",
|
|
71
|
+
title: "Node.js Permission Model",
|
|
72
|
+
status: supportsNetworkPermission ? "degraded" : "unsupported",
|
|
73
|
+
guarantee: "process-level-enforcement",
|
|
74
|
+
detail: supportsNetworkPermission
|
|
75
|
+
? "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
|
+
: "This Node.js version does not provide a supported network-deny control suitable for GhostAPI egress enforcement.",
|
|
77
|
+
requiredPrivileges: supportsNetworkPermission ? ["Launch the target with --permission and do not grant --allow-net."] : [],
|
|
78
|
+
remainingBypasses: supportsNetworkPermission
|
|
79
|
+
? ["It applies only to the launched Node process and does not provide security guarantees against malicious code or other processes."]
|
|
80
|
+
: ["Any Node program, child process, or native tool can still create network connections."]
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function createPlatformCapabilities(platform) {
|
|
84
|
+
switch (platform) {
|
|
85
|
+
case "linux":
|
|
86
|
+
return [
|
|
87
|
+
{
|
|
88
|
+
id: "linux-network-namespace",
|
|
89
|
+
title: "Linux network namespace",
|
|
90
|
+
status: "degraded",
|
|
91
|
+
guarantee: "process-level-enforcement",
|
|
92
|
+
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: ["util-linux unshare, iproute2 ip, and host policy allowing the required unprivileged user, mount, and network namespaces."],
|
|
94
|
+
remainingBypasses: ["Denied kernel socket attempts are enforced but not individually attributable by this backend.", "The target must use GhostAPI loopback configuration; TLS provider-host interception is not implemented.", "Filesystem UNIX sockets that the same user can access, such as a mounted container-control socket, are outside this network-namespace boundary.", ...HOSTILE_BYPASSES]
|
|
95
|
+
},
|
|
96
|
+
createContainerCapability("An OCI runtime configured with a no-network mode")
|
|
97
|
+
];
|
|
98
|
+
case "darwin":
|
|
99
|
+
return [
|
|
100
|
+
{
|
|
101
|
+
id: "macos-app-sandbox",
|
|
102
|
+
title: "macOS App Sandbox",
|
|
103
|
+
status: "degraded",
|
|
104
|
+
guarantee: "unsupported",
|
|
105
|
+
detail: "App Sandbox network access is entitlement-based for a signed app and is not a generic GhostAPI subprocess launcher.",
|
|
106
|
+
requiredPrivileges: ["A signed sandboxed application and an entitlement configuration designed for the launched helper."],
|
|
107
|
+
remainingBypasses: ["An arbitrary command launched outside that app sandbox is not constrained.", ...HOSTILE_BYPASSES]
|
|
108
|
+
},
|
|
109
|
+
createContainerCapability("A separately configured Linux-container or VM runtime")
|
|
110
|
+
];
|
|
111
|
+
case "win32":
|
|
112
|
+
return [
|
|
113
|
+
{
|
|
114
|
+
id: "windows-appcontainer",
|
|
115
|
+
title: "Windows AppContainer",
|
|
116
|
+
status: "not-implemented",
|
|
117
|
+
guarantee: "process-level-enforcement",
|
|
118
|
+
detail: "AppContainer can deny network capability to a launched process, but GhostAPI does not create profiles or launch AppContainers yet.",
|
|
119
|
+
requiredPrivileges: ["An AppContainer/LPAC launcher, a minimal capability profile, and a writable sandbox directory."],
|
|
120
|
+
remainingBypasses: ["A normal Win32 child process is not in an AppContainer.", ...HOSTILE_BYPASSES]
|
|
121
|
+
},
|
|
122
|
+
createContainerCapability("A separately configured Windows or Linux container/VM runtime")
|
|
123
|
+
];
|
|
124
|
+
default:
|
|
125
|
+
return [
|
|
126
|
+
{
|
|
127
|
+
id: "native-egress-isolation",
|
|
128
|
+
title: "Native egress isolation",
|
|
129
|
+
status: "unsupported",
|
|
130
|
+
guarantee: "unsupported",
|
|
131
|
+
detail: `GhostAPI has no supported native egress-isolation backend for ${platform}.`,
|
|
132
|
+
requiredPrivileges: [],
|
|
133
|
+
remainingBypasses: PROXY_BYPASSES
|
|
134
|
+
},
|
|
135
|
+
createContainerCapability("A separately configured OCI runtime")
|
|
136
|
+
];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function createContainerCapability(requirement) {
|
|
140
|
+
return {
|
|
141
|
+
id: "container-network-namespace",
|
|
142
|
+
title: "Container or network-namespace enforcement",
|
|
143
|
+
status: "not-implemented",
|
|
144
|
+
guarantee: "container-network-namespace-enforcement",
|
|
145
|
+
detail: "A no-network container can provide the strongest planned local guarantee, but GhostAPI does not manage containers in this release.",
|
|
146
|
+
requiredPrivileges: [requirement, "An image and mount policy that excludes host network-control sockets and credentials."],
|
|
147
|
+
remainingBypasses: ["Mounted Docker/Podman sockets, host networking, privileged mode, or inherited credentials would break the boundary.", ...HOSTILE_BYPASSES]
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function architectureFor(platform) {
|
|
151
|
+
const nativeStep = platform === "linux"
|
|
152
|
+
? "Linux launcher is available with user, mount, and network namespaces plus loopback-only GhostAPI; add a reviewed policy gateway before supporting external allowlist routes or transparent provider-host TLS interception."
|
|
153
|
+
: platform === "win32"
|
|
154
|
+
? "Implement a Windows AppContainer/LPAC launcher with no network capabilities, a per-run profile, and deterministic profile cleanup."
|
|
155
|
+
: platform === "darwin"
|
|
156
|
+
? "Use an explicit container or VM backend first; do not claim arbitrary-child App Sandbox enforcement."
|
|
157
|
+
: "Use an explicit container or VM backend; keep this platform unsupported until a reviewed backend exists.";
|
|
158
|
+
return [
|
|
159
|
+
"Keep policy parsing and evidence collection in an unprivileged GhostAPI parent process.",
|
|
160
|
+
nativeStep,
|
|
161
|
+
"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."
|
|
163
|
+
];
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/egress/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import http from "node:http";
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { createServer } from "../server/createServer.js";
|
|
4
|
+
import { sanitizeSecretString } from "../security/secrets.js";
|
|
5
|
+
import { atomicWriteJson } from "../storage/fileStore.js";
|
|
6
|
+
async function main() {
|
|
7
|
+
const config = parseConfig();
|
|
8
|
+
await runIp(["link", "set", "lo", "up"]);
|
|
9
|
+
process.env.GHOSTAPI_DATA_DIR = config.runtimeDataDir;
|
|
10
|
+
process.env.GHOSTAPI_OFFLINE = "true";
|
|
11
|
+
delete process.env.GHOSTAPI_ALLOW_EXTERNAL_LLM;
|
|
12
|
+
delete process.env.GHOSTAPI_LLM_API_KEY;
|
|
13
|
+
const evidence = await readEvidence(config.evidencePath);
|
|
14
|
+
evidence.status = "running";
|
|
15
|
+
evidence.events.push({ type: "loopback-enabled", timestamp: new Date().toISOString() });
|
|
16
|
+
const app = await createServer({ host: "127.0.0.1", port: config.port, model: process.env.GHOSTAPI_MODEL ?? "gpt-4o-mini", offline: true });
|
|
17
|
+
const server = http.createServer(app);
|
|
18
|
+
await listen(server, config.port);
|
|
19
|
+
evidence.events.push({ type: "ghostapi-ready", timestamp: new Date().toISOString(), detail: `http://127.0.0.1:${config.port}` });
|
|
20
|
+
await atomicWriteJson(config.evidencePath, evidence);
|
|
21
|
+
const targetEnvironment = createTargetEnvironment(process.env);
|
|
22
|
+
delete targetEnvironment.GHOSTAPI_RUN_BOOTSTRAP_CONFIG;
|
|
23
|
+
delete targetEnvironment.GHOSTAPI_LLM_API_KEY;
|
|
24
|
+
delete targetEnvironment.GHOSTAPI_AUTH_TOKEN;
|
|
25
|
+
targetEnvironment.GHOSTAPI_RUN_ID = config.runId;
|
|
26
|
+
targetEnvironment.GHOSTAPI_BASE_URL = `http://127.0.0.1:${config.port}`;
|
|
27
|
+
targetEnvironment.GHOSTAPI_HOST = "127.0.0.1";
|
|
28
|
+
targetEnvironment.GHOSTAPI_PORT = String(config.port);
|
|
29
|
+
targetEnvironment.GHOSTAPI_PROTOCOL = "http";
|
|
30
|
+
targetEnvironment.GHOSTAPI_OPENAI_BASE_URL = `http://127.0.0.1:${config.port}/v1`;
|
|
31
|
+
let result;
|
|
32
|
+
let interruptedBy;
|
|
33
|
+
try {
|
|
34
|
+
const target = spawn(config.command[0], config.command.slice(1), { env: targetEnvironment, stdio: "inherit", detached: true });
|
|
35
|
+
const forward = (signal) => {
|
|
36
|
+
interruptedBy = signal;
|
|
37
|
+
if (target.pid !== undefined)
|
|
38
|
+
process.kill(-target.pid, signal);
|
|
39
|
+
};
|
|
40
|
+
process.once("SIGINT", () => forward("SIGINT"));
|
|
41
|
+
process.once("SIGTERM", () => forward("SIGTERM"));
|
|
42
|
+
process.once("SIGHUP", () => forward("SIGHUP"));
|
|
43
|
+
result = await waitForTarget(target);
|
|
44
|
+
process.exitCode = result.exitCode;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
evidence.status = "failed-to-start";
|
|
48
|
+
evidence.events.push({ type: "target-failed-to-start", timestamp: new Date().toISOString(), detail: safeErrorMessage(error) });
|
|
49
|
+
process.exitCode = 1;
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
if (result !== undefined) {
|
|
53
|
+
evidence.status = "finished";
|
|
54
|
+
evidence.events.push({ type: "target-exited", timestamp: new Date().toISOString(), exitCode: result.exitCode, detail: interruptedBy ?? result.signal ?? undefined });
|
|
55
|
+
}
|
|
56
|
+
await atomicWriteJson(config.evidencePath, evidence);
|
|
57
|
+
await close(server);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function createTargetEnvironment(environment) {
|
|
61
|
+
const targetEnvironment = { ...environment };
|
|
62
|
+
for (const [key, value] of Object.entries(targetEnvironment)) {
|
|
63
|
+
if (isSensitiveEnvironmentKey(key) || (value !== undefined && sanitizeSecretString(value) !== value))
|
|
64
|
+
delete targetEnvironment[key];
|
|
65
|
+
}
|
|
66
|
+
return targetEnvironment;
|
|
67
|
+
}
|
|
68
|
+
function isSensitiveEnvironmentKey(key) {
|
|
69
|
+
return /(?:api[_-]?key|token|secret|password|credential|authorization|cookie)/i.test(key);
|
|
70
|
+
}
|
|
71
|
+
function safeErrorMessage(error) {
|
|
72
|
+
const message = error instanceof Error ? error.message : "Unknown target error";
|
|
73
|
+
return sanitizeSecretString(message).replace(/(?:Bearer\s+)?\S*(?:token|secret|key)\S*/gi, "***");
|
|
74
|
+
}
|
|
75
|
+
function parseConfig() {
|
|
76
|
+
const raw = process.env.GHOSTAPI_RUN_BOOTSTRAP_CONFIG;
|
|
77
|
+
if (!raw)
|
|
78
|
+
throw new Error("Missing GhostAPI run bootstrap configuration.");
|
|
79
|
+
const parsed = JSON.parse(raw);
|
|
80
|
+
if (!Array.isArray(parsed.command) || parsed.command.length === 0 || typeof parsed.port !== "number" || typeof parsed.evidencePath !== "string" || typeof parsed.runtimeDataDir !== "string" || typeof parsed.runId !== "string" || !Array.isArray(parsed.allowedHosts)) {
|
|
81
|
+
throw new Error("Invalid GhostAPI run bootstrap configuration.");
|
|
82
|
+
}
|
|
83
|
+
return parsed;
|
|
84
|
+
}
|
|
85
|
+
async function readEvidence(path) {
|
|
86
|
+
const { readFile } = await import("node:fs/promises");
|
|
87
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
88
|
+
}
|
|
89
|
+
function runIp(args) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
const child = spawn("ip", args, { stdio: ["ignore", "ignore", "pipe"] });
|
|
92
|
+
let stderr = "";
|
|
93
|
+
child.stderr.on("data", (chunk) => { stderr += String(chunk); });
|
|
94
|
+
child.once("error", reject);
|
|
95
|
+
child.once("exit", (code) => code === 0 ? resolve() : reject(new Error(`Unable to configure loopback: ${stderr || `ip exited ${code}`}`)));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function listen(server, port) {
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
server.once("error", reject);
|
|
101
|
+
server.listen(port, "127.0.0.1", () => {
|
|
102
|
+
server.off("error", reject);
|
|
103
|
+
resolve();
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
function close(server) {
|
|
108
|
+
return new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
|
|
109
|
+
}
|
|
110
|
+
function waitForTarget(target) {
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
target.once("error", reject);
|
|
113
|
+
target.once("exit", (code, signal) => resolve({ exitCode: code ?? 128 + 1, signal }));
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
main().catch((error) => {
|
|
117
|
+
const message = error instanceof Error ? error.message : "Unknown bootstrap error";
|
|
118
|
+
console.error(`GhostAPI run setup failed: ${message}`);
|
|
119
|
+
process.exitCode = 1;
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=linuxBootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linuxBootstrap.js","sourceRoot":"","sources":["../../src/egress/linuxBootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type EgressRunOptions = {
|
|
2
|
+
port?: number;
|
|
3
|
+
allowHosts: string[];
|
|
4
|
+
policyPath?: string;
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
maxOutputBytes?: number;
|
|
7
|
+
command: string[];
|
|
8
|
+
};
|
|
9
|
+
export type EgressRunResult = {
|
|
10
|
+
exitCode: number;
|
|
11
|
+
runId: string;
|
|
12
|
+
evidencePath: string;
|
|
13
|
+
};
|
|
14
|
+
export declare class EgressRunError extends Error {
|
|
15
|
+
readonly hint: string;
|
|
16
|
+
constructor(message: string, hint: string);
|
|
17
|
+
}
|
|
18
|
+
export declare function runEgressCommand(options: EgressRunOptions): Promise<EgressRunResult>;
|