vaspera 2.7.0 → 2.9.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/CHANGELOG.md +72 -0
- package/README.md +111 -7
- package/dist/__tests__/agents/adversary/tactics/api.test.d.ts +5 -0
- package/dist/__tests__/agents/adversary/tactics/api.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/api.test.js +369 -0
- package/dist/__tests__/agents/adversary/tactics/api.test.js.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts +5 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.js +409 -0
- package/dist/__tests__/agents/adversary/tactics/llm.test.js.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts +7 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.js +74 -0
- package/dist/__tests__/agents/adversary/tactics/registry.test.js.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts +7 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.d.ts.map +1 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.js +374 -0
- package/dist/__tests__/agents/adversary/tactics/web-app.test.js.map +1 -0
- package/dist/__tests__/compliance-bundle.test.d.ts +9 -0
- package/dist/__tests__/compliance-bundle.test.d.ts.map +1 -0
- package/dist/__tests__/compliance-bundle.test.js +344 -0
- package/dist/__tests__/compliance-bundle.test.js.map +1 -0
- package/dist/__tests__/healthcare-compliance.test.d.ts +9 -0
- package/dist/__tests__/healthcare-compliance.test.d.ts.map +1 -0
- package/dist/__tests__/healthcare-compliance.test.js +233 -0
- package/dist/__tests__/healthcare-compliance.test.js.map +1 -0
- package/dist/action/diff-mode.d.ts +124 -8
- package/dist/action/diff-mode.d.ts.map +1 -1
- package/dist/action/diff-mode.js +384 -65
- package/dist/action/diff-mode.js.map +1 -1
- package/dist/action/diff-mode.test.js +3 -3
- package/dist/action/diff-mode.test.js.map +1 -1
- package/dist/action/pr-comment.test.js +1 -0
- package/dist/action/pr-comment.test.js.map +1 -1
- package/dist/action/sarif-upload.test.js +1 -0
- package/dist/action/sarif-upload.test.js.map +1 -1
- package/dist/agents/adversary/config.d.ts +113 -0
- package/dist/agents/adversary/config.d.ts.map +1 -0
- package/dist/agents/adversary/config.js +391 -0
- package/dist/agents/adversary/config.js.map +1 -0
- package/dist/agents/adversary/index.d.ts +41 -0
- package/dist/agents/adversary/index.d.ts.map +1 -0
- package/dist/agents/adversary/index.js +838 -0
- package/dist/agents/adversary/index.js.map +1 -0
- package/dist/agents/adversary/reporting/compliance-mapper.d.ts +108 -0
- package/dist/agents/adversary/reporting/compliance-mapper.d.ts.map +1 -0
- package/dist/agents/adversary/reporting/compliance-mapper.js +391 -0
- package/dist/agents/adversary/reporting/compliance-mapper.js.map +1 -0
- package/dist/agents/adversary/reporting/index.d.ts +10 -0
- package/dist/agents/adversary/reporting/index.d.ts.map +1 -0
- package/dist/agents/adversary/reporting/index.js +10 -0
- package/dist/agents/adversary/reporting/index.js.map +1 -0
- package/dist/agents/adversary/reporting/poc-generator.d.ts +44 -0
- package/dist/agents/adversary/reporting/poc-generator.d.ts.map +1 -0
- package/dist/agents/adversary/reporting/poc-generator.js +308 -0
- package/dist/agents/adversary/reporting/poc-generator.js.map +1 -0
- package/dist/agents/adversary/tactics/api.d.ts +13 -0
- package/dist/agents/adversary/tactics/api.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/api.js +815 -0
- package/dist/agents/adversary/tactics/api.js.map +1 -0
- package/dist/agents/adversary/tactics/auth.d.ts +13 -0
- package/dist/agents/adversary/tactics/auth.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/auth.js +676 -0
- package/dist/agents/adversary/tactics/auth.js.map +1 -0
- package/dist/agents/adversary/tactics/index.d.ts +129 -0
- package/dist/agents/adversary/tactics/index.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/index.js +199 -0
- package/dist/agents/adversary/tactics/index.js.map +1 -0
- package/dist/agents/adversary/tactics/infra.d.ts +13 -0
- package/dist/agents/adversary/tactics/infra.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/infra.js +827 -0
- package/dist/agents/adversary/tactics/infra.js.map +1 -0
- package/dist/agents/adversary/tactics/injection.d.ts +12 -0
- package/dist/agents/adversary/tactics/injection.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/injection.js +549 -0
- package/dist/agents/adversary/tactics/injection.js.map +1 -0
- package/dist/agents/adversary/tactics/llm.d.ts +13 -0
- package/dist/agents/adversary/tactics/llm.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/llm.js +767 -0
- package/dist/agents/adversary/tactics/llm.js.map +1 -0
- package/dist/agents/adversary/tactics/web-app.d.ts +13 -0
- package/dist/agents/adversary/tactics/web-app.d.ts.map +1 -0
- package/dist/agents/adversary/tactics/web-app.js +717 -0
- package/dist/agents/adversary/tactics/web-app.js.map +1 -0
- package/dist/agents/adversary/types.d.ts +407 -0
- package/dist/agents/adversary/types.d.ts.map +1 -0
- package/dist/agents/adversary/types.js +12 -0
- package/dist/agents/adversary/types.js.map +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +2 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/zero-day-hunter.d.ts +1 -1
- package/dist/agents/zero-day-hunter.d.ts.map +1 -1
- package/dist/analysis/data-flow.d.ts +154 -0
- package/dist/analysis/data-flow.d.ts.map +1 -0
- package/dist/analysis/data-flow.js +393 -0
- package/dist/analysis/data-flow.js.map +1 -0
- package/dist/analysis/index.d.ts +9 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +9 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/badge-service/index.d.ts +144 -0
- package/dist/badge-service/index.d.ts.map +1 -0
- package/dist/badge-service/index.js +206 -0
- package/dist/badge-service/index.js.map +1 -0
- package/dist/certification/consensus.test.js +2 -0
- package/dist/certification/consensus.test.js.map +1 -1
- package/dist/certification/store.d.ts.map +1 -1
- package/dist/certification/store.js +4 -0
- package/dist/certification/store.js.map +1 -1
- package/dist/certification/types.d.ts +3 -3
- package/dist/certification/types.d.ts.map +1 -1
- package/dist/certification/types.js +2 -0
- package/dist/certification/types.js.map +1 -1
- package/dist/commands/certification/certify.d.ts.map +1 -1
- package/dist/commands/certification/certify.js +18 -4
- package/dist/commands/certification/certify.js.map +1 -1
- package/dist/compliance/attestation.d.ts +39 -0
- package/dist/compliance/attestation.d.ts.map +1 -0
- package/dist/compliance/attestation.js +364 -0
- package/dist/compliance/attestation.js.map +1 -0
- package/dist/compliance/cfr42-part2.d.ts +42 -0
- package/dist/compliance/cfr42-part2.d.ts.map +1 -0
- package/dist/compliance/cfr42-part2.js +408 -0
- package/dist/compliance/cfr42-part2.js.map +1 -0
- package/dist/compliance/compliance-bundle.d.ts +100 -0
- package/dist/compliance/compliance-bundle.d.ts.map +1 -0
- package/dist/compliance/compliance-bundle.js +210 -0
- package/dist/compliance/compliance-bundle.js.map +1 -0
- package/dist/compliance/healthcare-bundle.d.ts +68 -0
- package/dist/compliance/healthcare-bundle.d.ts.map +1 -0
- package/dist/compliance/healthcare-bundle.js +104 -0
- package/dist/compliance/healthcare-bundle.js.map +1 -0
- package/dist/compliance/hipaa.d.ts.map +1 -1
- package/dist/compliance/hipaa.js +14 -11
- package/dist/compliance/hipaa.js.map +1 -1
- package/dist/compliance/index.d.ts +10 -2
- package/dist/compliance/index.d.ts.map +1 -1
- package/dist/compliance/index.js +9 -3
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/mapper.d.ts.map +1 -1
- package/dist/compliance/mapper.js +3 -17
- package/dist/compliance/mapper.js.map +1 -1
- package/dist/compliance/nist-800-53.d.ts +22 -6
- package/dist/compliance/nist-800-53.d.ts.map +1 -1
- package/dist/compliance/nist-800-53.js +264 -272
- package/dist/compliance/nist-800-53.js.map +1 -1
- package/dist/compliance/report.d.ts +31 -2
- package/dist/compliance/report.d.ts.map +1 -1
- package/dist/compliance/report.js +255 -4
- package/dist/compliance/report.js.map +1 -1
- package/dist/compliance/types.d.ts +1 -1
- package/dist/compliance/types.d.ts.map +1 -1
- package/dist/config/flags.d.ts +12 -12
- package/dist/cost/index.d.ts +1 -1
- package/dist/cost/index.d.ts.map +1 -1
- package/dist/cost/index.js +1 -1
- package/dist/cost/index.js.map +1 -1
- package/dist/cost/tracker.d.ts +64 -0
- package/dist/cost/tracker.d.ts.map +1 -1
- package/dist/cost/tracker.js +165 -0
- package/dist/cost/tracker.js.map +1 -1
- package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +28 -0
- package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +1 -0
- package/dist/eval/fixtures/healthcare/audit-gaps.js +90 -0
- package/dist/eval/fixtures/healthcare/audit-gaps.js.map +1 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +31 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +1 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.js +61 -0
- package/dist/eval/fixtures/healthcare/consent-bypass.js.map +1 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +24 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +1 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.js +41 -0
- package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +1 -0
- package/dist/evidence/collector.d.ts +21 -0
- package/dist/evidence/collector.d.ts.map +1 -0
- package/dist/evidence/collector.js +340 -0
- package/dist/evidence/collector.js.map +1 -0
- package/dist/evidence/index.d.ts +11 -0
- package/dist/evidence/index.d.ts.map +1 -0
- package/dist/evidence/index.js +12 -0
- package/dist/evidence/index.js.map +1 -0
- package/dist/evidence/store.d.ts +39 -0
- package/dist/evidence/store.d.ts.map +1 -0
- package/dist/evidence/store.js +173 -0
- package/dist/evidence/store.js.map +1 -0
- package/dist/evidence/types.d.ts +175 -0
- package/dist/evidence/types.d.ts.map +1 -0
- package/dist/evidence/types.js +9 -0
- package/dist/evidence/types.js.map +1 -0
- package/dist/exporters/checkmarx.d.ts +18 -0
- package/dist/exporters/checkmarx.d.ts.map +1 -0
- package/dist/exporters/checkmarx.js +203 -0
- package/dist/exporters/checkmarx.js.map +1 -0
- package/dist/exporters/index.d.ts +22 -0
- package/dist/exporters/index.d.ts.map +1 -0
- package/dist/exporters/index.js +41 -0
- package/dist/exporters/index.js.map +1 -0
- package/dist/exporters/snyk.d.ts +18 -0
- package/dist/exporters/snyk.d.ts.map +1 -0
- package/dist/exporters/snyk.js +119 -0
- package/dist/exporters/snyk.js.map +1 -0
- package/dist/exporters/sonarqube.d.ts +18 -0
- package/dist/exporters/sonarqube.d.ts.map +1 -0
- package/dist/exporters/sonarqube.js +125 -0
- package/dist/exporters/sonarqube.js.map +1 -0
- package/dist/exporters/types.d.ts +190 -0
- package/dist/exporters/types.d.ts.map +1 -0
- package/dist/exporters/types.js +9 -0
- package/dist/exporters/types.js.map +1 -0
- package/dist/frontier/index.d.ts +12 -0
- package/dist/frontier/index.d.ts.map +1 -0
- package/dist/frontier/index.js +12 -0
- package/dist/frontier/index.js.map +1 -0
- package/dist/frontier/orchestrator.d.ts +73 -0
- package/dist/frontier/orchestrator.d.ts.map +1 -0
- package/dist/frontier/orchestrator.js +312 -0
- package/dist/frontier/orchestrator.js.map +1 -0
- package/dist/frontier/providers/stub.d.ts +32 -0
- package/dist/frontier/providers/stub.d.ts.map +1 -0
- package/dist/frontier/providers/stub.js +66 -0
- package/dist/frontier/providers/stub.js.map +1 -0
- package/dist/frontier/types.d.ts +318 -0
- package/dist/frontier/types.d.ts.map +1 -0
- package/dist/frontier/types.js +27 -0
- package/dist/frontier/types.js.map +1 -0
- package/dist/history/index.d.ts +13 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +15 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/store.d.ts +74 -0
- package/dist/history/store.d.ts.map +1 -0
- package/dist/history/store.js +399 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +282 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +41 -0
- package/dist/history/types.js.map +1 -0
- package/dist/history/verify.d.ts +44 -0
- package/dist/history/verify.d.ts.map +1 -0
- package/dist/history/verify.js +230 -0
- package/dist/history/verify.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +431 -18
- package/dist/index.js.map +1 -1
- package/dist/multimodel/index.d.ts +1 -0
- package/dist/multimodel/index.d.ts.map +1 -1
- package/dist/multimodel/index.js +2 -0
- package/dist/multimodel/index.js.map +1 -1
- package/dist/multimodel/leaderboard.d.ts +116 -0
- package/dist/multimodel/leaderboard.d.ts.map +1 -0
- package/dist/multimodel/leaderboard.js +262 -0
- package/dist/multimodel/leaderboard.js.map +1 -0
- package/dist/observability/otel.d.ts.map +1 -1
- package/dist/observability/otel.js +1 -3
- package/dist/observability/otel.js.map +1 -1
- package/dist/plugins/loader.js +1 -1
- package/dist/plugins/loader.js.map +1 -1
- package/dist/sbom/provenance.test.js +2 -2
- package/dist/sbom/provenance.test.js.map +1 -1
- package/dist/scanners/agent/agent-chain-analysis.d.ts +152 -0
- package/dist/scanners/agent/agent-chain-analysis.d.ts.map +1 -0
- package/dist/scanners/agent/agent-chain-analysis.js +438 -0
- package/dist/scanners/agent/agent-chain-analysis.js.map +1 -0
- package/dist/scanners/agent/manifest-audit.d.ts.map +1 -1
- package/dist/scanners/agent/manifest-audit.js +30 -18
- package/dist/scanners/agent/manifest-audit.js.map +1 -1
- package/dist/scanners/agent/payloads/index.d.ts +2 -1
- package/dist/scanners/agent/payloads/index.d.ts.map +1 -1
- package/dist/scanners/agent/payloads/index.js +25 -6
- package/dist/scanners/agent/payloads/index.js.map +1 -1
- package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
- package/dist/scanners/agent/prompt-injection-fuzzer.js +14 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
- package/dist/scanners/agent/types.d.ts +5 -5
- package/dist/scanners/agent/types.d.ts.map +1 -1
- package/dist/scanners/agent/types.js.map +1 -1
- package/dist/scanners/cache.d.ts +156 -0
- package/dist/scanners/cache.d.ts.map +1 -0
- package/dist/scanners/cache.js +462 -0
- package/dist/scanners/cache.js.map +1 -0
- package/dist/scanners/dependencies.d.ts.map +1 -1
- package/dist/scanners/dependencies.js +5 -6
- package/dist/scanners/dependencies.js.map +1 -1
- package/dist/scanners/gosec.d.ts.map +1 -1
- package/dist/scanners/gosec.js +47 -9
- package/dist/scanners/gosec.js.map +1 -1
- package/dist/scanners/healthcare.d.ts +29 -0
- package/dist/scanners/healthcare.d.ts.map +1 -0
- package/dist/scanners/healthcare.js +526 -0
- package/dist/scanners/healthcare.js.map +1 -0
- package/dist/scanners/index.d.ts +1 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +33 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/index.test.js +6 -6
- package/dist/scanners/index.test.js.map +1 -1
- package/dist/scanners/secrets.js +4 -4
- package/dist/scanners/secrets.js.map +1 -1
- package/dist/scanners/semgrep.js +5 -5
- package/dist/scanners/semgrep.js.map +1 -1
- package/dist/scanners/types.d.ts +1 -1
- package/dist/scanners/types.d.ts.map +1 -1
- package/dist/scanners/types.js +1 -0
- package/dist/scanners/types.js.map +1 -1
- package/dist/scanners/typescript.test.js +1 -1
- package/dist/scanners/typescript.test.js.map +1 -1
- package/dist/telemetry/index.d.ts +10 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +10 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/registry.d.ts +178 -0
- package/dist/telemetry/registry.d.ts.map +1 -0
- package/dist/telemetry/registry.js +297 -0
- package/dist/telemetry/registry.js.map +1 -0
- package/dist/telemetry/usage.d.ts +197 -0
- package/dist/telemetry/usage.d.ts.map +1 -0
- package/dist/telemetry/usage.js +244 -0
- package/dist/telemetry/usage.js.map +1 -0
- package/package.json +11 -2
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Chain Analysis
|
|
3
|
+
*
|
|
4
|
+
* Extends exfil-path-graph with multi-agent attack path analysis.
|
|
5
|
+
* Models trust boundaries between agents and MCP servers to identify
|
|
6
|
+
* attack paths that span multiple agent hops.
|
|
7
|
+
*
|
|
8
|
+
* @module scanners/agent/agent-chain-analysis
|
|
9
|
+
*/
|
|
10
|
+
import type { Severity } from "../../certification/types.js";
|
|
11
|
+
import type { MCPManifest } from "./types.js";
|
|
12
|
+
/**
|
|
13
|
+
* Trust level for an agent or tool
|
|
14
|
+
*/
|
|
15
|
+
export type AgentTrustLevel = "high" | "medium" | "low" | "untrusted";
|
|
16
|
+
/**
|
|
17
|
+
* Types of nodes in the agent graph
|
|
18
|
+
*/
|
|
19
|
+
export type AgentNodeType = "mcp-server" | "agent" | "tool" | "external-api" | "user" | "data-store";
|
|
20
|
+
/**
|
|
21
|
+
* A node in the agent capability graph
|
|
22
|
+
*/
|
|
23
|
+
export interface AgentNode {
|
|
24
|
+
/** Unique identifier */
|
|
25
|
+
id: string;
|
|
26
|
+
/** Node type */
|
|
27
|
+
type: AgentNodeType;
|
|
28
|
+
/** Human-readable name */
|
|
29
|
+
name: string;
|
|
30
|
+
/** Trust level */
|
|
31
|
+
trustLevel: AgentTrustLevel;
|
|
32
|
+
/** Capabilities this node has */
|
|
33
|
+
capabilities: string[];
|
|
34
|
+
/** Data types this node can access */
|
|
35
|
+
dataAccess: string[];
|
|
36
|
+
/** Whether this is an entry point (untrusted input) */
|
|
37
|
+
isEntryPoint: boolean;
|
|
38
|
+
/** Whether this accesses sensitive data */
|
|
39
|
+
accessesSensitiveData: boolean;
|
|
40
|
+
/** Risk score (0-100) */
|
|
41
|
+
riskScore: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Connection types between agents
|
|
45
|
+
*/
|
|
46
|
+
export type AgentEdgeType = "calls" | "delegates" | "reads-from" | "writes-to" | "authenticates";
|
|
47
|
+
/**
|
|
48
|
+
* An edge between nodes in the agent graph
|
|
49
|
+
*/
|
|
50
|
+
export interface AgentEdge {
|
|
51
|
+
/** Source node ID */
|
|
52
|
+
from: string;
|
|
53
|
+
/** Target node ID */
|
|
54
|
+
to: string;
|
|
55
|
+
/** Connection type */
|
|
56
|
+
type: AgentEdgeType;
|
|
57
|
+
/** Data types that flow across this edge */
|
|
58
|
+
dataTypes: string[];
|
|
59
|
+
/** Whether authentication is required */
|
|
60
|
+
requiresAuth: boolean;
|
|
61
|
+
/** Trust boundary crossing (trust drops) */
|
|
62
|
+
crossesTrustBoundary: boolean;
|
|
63
|
+
/** Description */
|
|
64
|
+
description?: string;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* The complete agent interaction graph
|
|
68
|
+
*/
|
|
69
|
+
export interface AgentGraph {
|
|
70
|
+
/** All nodes */
|
|
71
|
+
nodes: AgentNode[];
|
|
72
|
+
/** All edges */
|
|
73
|
+
edges: AgentEdge[];
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A multi-hop attack path through the agent graph
|
|
77
|
+
*/
|
|
78
|
+
export interface AttackPath {
|
|
79
|
+
/** Unique path ID */
|
|
80
|
+
id: string;
|
|
81
|
+
/** Human-readable title */
|
|
82
|
+
title: string;
|
|
83
|
+
/** Nodes in the attack path */
|
|
84
|
+
steps: AgentNode[];
|
|
85
|
+
/** Edges traversed */
|
|
86
|
+
edgesTraversed: AgentEdge[];
|
|
87
|
+
/** Number of trust boundaries crossed */
|
|
88
|
+
trustBoundariesCrossed: number;
|
|
89
|
+
/** Sensitive data exposed by this path */
|
|
90
|
+
dataExposed: string[];
|
|
91
|
+
/** Overall severity */
|
|
92
|
+
severity: Severity;
|
|
93
|
+
/** Confidence (0-100) */
|
|
94
|
+
confidence: number;
|
|
95
|
+
/** Attack narrative */
|
|
96
|
+
attackNarrative: string;
|
|
97
|
+
/** Mitigation recommendations */
|
|
98
|
+
mitigation: string[];
|
|
99
|
+
/** MITRE ATT&CK techniques if applicable */
|
|
100
|
+
mitreTechniques?: string[];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Result of agent chain analysis
|
|
104
|
+
*/
|
|
105
|
+
export interface AgentChainAnalysisResult {
|
|
106
|
+
/** The agent graph */
|
|
107
|
+
graph: AgentGraph;
|
|
108
|
+
/** Identified attack paths */
|
|
109
|
+
attackPaths: AttackPath[];
|
|
110
|
+
/** Statistics */
|
|
111
|
+
stats: {
|
|
112
|
+
totalNodes: number;
|
|
113
|
+
totalEdges: number;
|
|
114
|
+
entryPoints: number;
|
|
115
|
+
sensitiveNodes: number;
|
|
116
|
+
trustBoundaries: number;
|
|
117
|
+
attackPaths: number;
|
|
118
|
+
criticalPaths: number;
|
|
119
|
+
highPaths: number;
|
|
120
|
+
};
|
|
121
|
+
/** Mermaid diagram */
|
|
122
|
+
mermaidDiagram: string;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Build agent graph from MCP manifests
|
|
126
|
+
*/
|
|
127
|
+
export declare function buildAgentGraph(manifests: Array<{
|
|
128
|
+
name: string;
|
|
129
|
+
manifest: MCPManifest;
|
|
130
|
+
}>, agentConfigs?: Array<{
|
|
131
|
+
name: string;
|
|
132
|
+
trustLevel: AgentTrustLevel;
|
|
133
|
+
}>): AgentGraph;
|
|
134
|
+
/**
|
|
135
|
+
* Find attack paths from entry points to sensitive data
|
|
136
|
+
*/
|
|
137
|
+
export declare function analyzeAgentChains(graph: AgentGraph): AttackPath[];
|
|
138
|
+
/**
|
|
139
|
+
* Generate Mermaid diagram for agent graph
|
|
140
|
+
*/
|
|
141
|
+
export declare function generateAgentChainDiagram(graph: AgentGraph, attackPaths: AttackPath[]): string;
|
|
142
|
+
/**
|
|
143
|
+
* Run full agent chain analysis
|
|
144
|
+
*/
|
|
145
|
+
export declare function runAgentChainAnalysis(manifests: Array<{
|
|
146
|
+
name: string;
|
|
147
|
+
manifest: MCPManifest;
|
|
148
|
+
}>, agentConfigs?: Array<{
|
|
149
|
+
name: string;
|
|
150
|
+
trustLevel: AgentTrustLevel;
|
|
151
|
+
}>): AgentChainAnalysisResult;
|
|
152
|
+
//# sourceMappingURL=agent-chain-analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-chain-analysis.d.ts","sourceRoot":"","sources":["../../../src/scanners/agent/agent-chain-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Chain Analysis
|
|
3
|
+
*
|
|
4
|
+
* Extends exfil-path-graph with multi-agent attack path analysis.
|
|
5
|
+
* Models trust boundaries between agents and MCP servers to identify
|
|
6
|
+
* attack paths that span multiple agent hops.
|
|
7
|
+
*
|
|
8
|
+
* @module scanners/agent/agent-chain-analysis
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Sensitive Data Patterns
|
|
12
|
+
// ============================================================================
|
|
13
|
+
const SENSITIVE_DATA_PATTERNS = [
|
|
14
|
+
{ pattern: /password/i, type: "credentials" },
|
|
15
|
+
{ pattern: /secret/i, type: "secrets" },
|
|
16
|
+
{ pattern: /api[_\s-]?key/i, type: "api-keys" },
|
|
17
|
+
{ pattern: /token/i, type: "tokens" },
|
|
18
|
+
{ pattern: /credential/i, type: "credentials" },
|
|
19
|
+
{ pattern: /auth/i, type: "auth-data" },
|
|
20
|
+
{ pattern: /private[_\s-]?key/i, type: "private-keys" },
|
|
21
|
+
{ pattern: /ssh/i, type: "ssh-keys" },
|
|
22
|
+
{ pattern: /certificate/i, type: "certificates" },
|
|
23
|
+
{ pattern: /pii/i, type: "pii" },
|
|
24
|
+
{ pattern: /personal/i, type: "pii" },
|
|
25
|
+
{ pattern: /credit[_\s-]?card/i, type: "pci-data" },
|
|
26
|
+
{ pattern: /ssn|social[_\s-]?security/i, type: "pii" },
|
|
27
|
+
{ pattern: /health|medical|hipaa/i, type: "phi" },
|
|
28
|
+
{ pattern: /financial/i, type: "financial-data" },
|
|
29
|
+
{ pattern: /database/i, type: "database-access" },
|
|
30
|
+
{ pattern: /admin/i, type: "admin-access" },
|
|
31
|
+
];
|
|
32
|
+
// ============================================================================
|
|
33
|
+
// Graph Building
|
|
34
|
+
// ============================================================================
|
|
35
|
+
/**
|
|
36
|
+
* Classify trust level for a tool
|
|
37
|
+
*/
|
|
38
|
+
function classifyTrustLevel(tool) {
|
|
39
|
+
// Network-facing tools are less trusted
|
|
40
|
+
if (tool.networkAccess)
|
|
41
|
+
return "low";
|
|
42
|
+
// Code execution is low trust
|
|
43
|
+
if (tool.codeExecution)
|
|
44
|
+
return "low";
|
|
45
|
+
// Destructive tools are medium trust
|
|
46
|
+
if (tool.destructiveHint)
|
|
47
|
+
return "medium";
|
|
48
|
+
// Read-only tools are higher trust
|
|
49
|
+
if (tool.readOnlyHint)
|
|
50
|
+
return "high";
|
|
51
|
+
// Default to medium
|
|
52
|
+
return "medium";
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Extract data types from tool description
|
|
56
|
+
*/
|
|
57
|
+
function extractDataTypes(tool) {
|
|
58
|
+
const text = `${tool.name} ${tool.description || ""}`;
|
|
59
|
+
const types = new Set();
|
|
60
|
+
for (const { pattern, type } of SENSITIVE_DATA_PATTERNS) {
|
|
61
|
+
if (pattern.test(text)) {
|
|
62
|
+
types.add(type);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return Array.from(types);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if a tool accesses sensitive data
|
|
69
|
+
*/
|
|
70
|
+
function accessesSensitiveData(dataTypes) {
|
|
71
|
+
const sensitiveTypes = [
|
|
72
|
+
"credentials",
|
|
73
|
+
"secrets",
|
|
74
|
+
"api-keys",
|
|
75
|
+
"tokens",
|
|
76
|
+
"private-keys",
|
|
77
|
+
"ssh-keys",
|
|
78
|
+
"pii",
|
|
79
|
+
"pci-data",
|
|
80
|
+
"phi",
|
|
81
|
+
];
|
|
82
|
+
return dataTypes.some((t) => sensitiveTypes.includes(t));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Calculate risk score for an agent node
|
|
86
|
+
*/
|
|
87
|
+
function calculateAgentNodeRisk(node) {
|
|
88
|
+
let score = 0;
|
|
89
|
+
// Trust level impact
|
|
90
|
+
if (node.trustLevel === "untrusted")
|
|
91
|
+
score += 40;
|
|
92
|
+
else if (node.trustLevel === "low")
|
|
93
|
+
score += 30;
|
|
94
|
+
else if (node.trustLevel === "medium")
|
|
95
|
+
score += 15;
|
|
96
|
+
// Entry point risk
|
|
97
|
+
if (node.isEntryPoint)
|
|
98
|
+
score += 25;
|
|
99
|
+
// Sensitive data access
|
|
100
|
+
if (node.accessesSensitiveData)
|
|
101
|
+
score += 35;
|
|
102
|
+
// Capabilities
|
|
103
|
+
if (node.capabilities?.includes("network_access"))
|
|
104
|
+
score += 20;
|
|
105
|
+
if (node.capabilities?.includes("code_execution"))
|
|
106
|
+
score += 30;
|
|
107
|
+
if (node.capabilities?.includes("file_write"))
|
|
108
|
+
score += 15;
|
|
109
|
+
return Math.min(100, score);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Build agent graph from MCP manifests
|
|
113
|
+
*/
|
|
114
|
+
export function buildAgentGraph(manifests, agentConfigs) {
|
|
115
|
+
const nodes = [];
|
|
116
|
+
const edges = [];
|
|
117
|
+
// Add user as entry point
|
|
118
|
+
nodes.push({
|
|
119
|
+
id: "user",
|
|
120
|
+
type: "user",
|
|
121
|
+
name: "User Input",
|
|
122
|
+
trustLevel: "untrusted",
|
|
123
|
+
capabilities: ["input"],
|
|
124
|
+
dataAccess: [],
|
|
125
|
+
isEntryPoint: true,
|
|
126
|
+
accessesSensitiveData: false,
|
|
127
|
+
riskScore: 40,
|
|
128
|
+
});
|
|
129
|
+
// Add each MCP server and its tools
|
|
130
|
+
for (const { name: serverName, manifest } of manifests) {
|
|
131
|
+
// Add MCP server node
|
|
132
|
+
const serverId = `mcp-${serverName}`;
|
|
133
|
+
nodes.push({
|
|
134
|
+
id: serverId,
|
|
135
|
+
type: "mcp-server",
|
|
136
|
+
name: serverName,
|
|
137
|
+
trustLevel: "medium",
|
|
138
|
+
capabilities: ["tool-provider"],
|
|
139
|
+
dataAccess: [],
|
|
140
|
+
isEntryPoint: false,
|
|
141
|
+
accessesSensitiveData: false,
|
|
142
|
+
riskScore: 20,
|
|
143
|
+
});
|
|
144
|
+
// Add edge from user to MCP server
|
|
145
|
+
edges.push({
|
|
146
|
+
from: "user",
|
|
147
|
+
to: serverId,
|
|
148
|
+
type: "calls",
|
|
149
|
+
dataTypes: ["user-input"],
|
|
150
|
+
requiresAuth: false,
|
|
151
|
+
crossesTrustBoundary: true,
|
|
152
|
+
});
|
|
153
|
+
// Add tool nodes
|
|
154
|
+
for (const tool of manifest.tools) {
|
|
155
|
+
const toolId = `${serverId}-${tool.name}`;
|
|
156
|
+
const dataTypes = extractDataTypes(tool);
|
|
157
|
+
const trustLevel = classifyTrustLevel(tool);
|
|
158
|
+
const toolNode = {
|
|
159
|
+
id: toolId,
|
|
160
|
+
type: "tool",
|
|
161
|
+
name: tool.name,
|
|
162
|
+
trustLevel,
|
|
163
|
+
capabilities: [],
|
|
164
|
+
dataAccess: dataTypes,
|
|
165
|
+
isEntryPoint: false,
|
|
166
|
+
accessesSensitiveData: accessesSensitiveData(dataTypes),
|
|
167
|
+
riskScore: 0,
|
|
168
|
+
};
|
|
169
|
+
// Add capabilities
|
|
170
|
+
if (tool.networkAccess)
|
|
171
|
+
toolNode.capabilities.push("network_access");
|
|
172
|
+
if (tool.codeExecution)
|
|
173
|
+
toolNode.capabilities.push("code_execution");
|
|
174
|
+
if (tool.destructiveHint)
|
|
175
|
+
toolNode.capabilities.push("write");
|
|
176
|
+
if (tool.readOnlyHint)
|
|
177
|
+
toolNode.capabilities.push("read");
|
|
178
|
+
toolNode.riskScore = calculateAgentNodeRisk(toolNode);
|
|
179
|
+
nodes.push(toolNode);
|
|
180
|
+
// Add edge from server to tool
|
|
181
|
+
edges.push({
|
|
182
|
+
from: serverId,
|
|
183
|
+
to: toolId,
|
|
184
|
+
type: "calls",
|
|
185
|
+
dataTypes,
|
|
186
|
+
requiresAuth: false,
|
|
187
|
+
crossesTrustBoundary: trustLevel !== "medium",
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Add agent nodes if configured
|
|
192
|
+
if (agentConfigs) {
|
|
193
|
+
for (const agent of agentConfigs) {
|
|
194
|
+
const agentId = `agent-${agent.name}`;
|
|
195
|
+
nodes.push({
|
|
196
|
+
id: agentId,
|
|
197
|
+
type: "agent",
|
|
198
|
+
name: agent.name,
|
|
199
|
+
trustLevel: agent.trustLevel,
|
|
200
|
+
capabilities: ["orchestration"],
|
|
201
|
+
dataAccess: [],
|
|
202
|
+
isEntryPoint: agent.trustLevel === "untrusted",
|
|
203
|
+
accessesSensitiveData: false,
|
|
204
|
+
riskScore: calculateAgentNodeRisk({
|
|
205
|
+
trustLevel: agent.trustLevel,
|
|
206
|
+
isEntryPoint: agent.trustLevel === "untrusted",
|
|
207
|
+
}),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return { nodes, edges };
|
|
212
|
+
}
|
|
213
|
+
// ============================================================================
|
|
214
|
+
// Attack Path Analysis
|
|
215
|
+
// ============================================================================
|
|
216
|
+
/**
|
|
217
|
+
* Find attack paths from entry points to sensitive data
|
|
218
|
+
*/
|
|
219
|
+
export function analyzeAgentChains(graph) {
|
|
220
|
+
const paths = [];
|
|
221
|
+
// Find entry points
|
|
222
|
+
const entryPoints = graph.nodes.filter((n) => n.isEntryPoint);
|
|
223
|
+
// Find sensitive data nodes
|
|
224
|
+
const sensitiveNodes = graph.nodes.filter((n) => n.accessesSensitiveData);
|
|
225
|
+
// Build adjacency list
|
|
226
|
+
const adjacency = new Map();
|
|
227
|
+
for (const edge of graph.edges) {
|
|
228
|
+
if (!adjacency.has(edge.from)) {
|
|
229
|
+
adjacency.set(edge.from, []);
|
|
230
|
+
}
|
|
231
|
+
adjacency.get(edge.from).push({ node: edge.to, edge });
|
|
232
|
+
}
|
|
233
|
+
// BFS from each entry point to each sensitive node
|
|
234
|
+
for (const entry of entryPoints) {
|
|
235
|
+
for (const target of sensitiveNodes) {
|
|
236
|
+
const result = findPathBFS(entry.id, target.id, graph.nodes, adjacency);
|
|
237
|
+
if (result) {
|
|
238
|
+
const trustCrossings = result.edges.filter((e) => e.crossesTrustBoundary).length;
|
|
239
|
+
const severity = calculatePathSeverity(trustCrossings, target.dataAccess);
|
|
240
|
+
paths.push({
|
|
241
|
+
id: `path-${paths.length + 1}`,
|
|
242
|
+
title: `${entry.name} → ${target.name}`,
|
|
243
|
+
steps: result.nodes,
|
|
244
|
+
edgesTraversed: result.edges,
|
|
245
|
+
trustBoundariesCrossed: trustCrossings,
|
|
246
|
+
dataExposed: target.dataAccess,
|
|
247
|
+
severity,
|
|
248
|
+
confidence: Math.max(50, 100 - trustCrossings * 10),
|
|
249
|
+
attackNarrative: generateAttackNarrative(entry, target, result.nodes),
|
|
250
|
+
mitigation: generateMitigations(result.nodes, result.edges),
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return paths;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* BFS to find path between nodes
|
|
259
|
+
*/
|
|
260
|
+
function findPathBFS(start, end, nodes, adjacency) {
|
|
261
|
+
const nodeMap = new Map(nodes.map((n) => [n.id, n]));
|
|
262
|
+
const visited = new Set();
|
|
263
|
+
const queue = [
|
|
264
|
+
{ nodeId: start, path: [start], edges: [] },
|
|
265
|
+
];
|
|
266
|
+
while (queue.length > 0) {
|
|
267
|
+
const { nodeId, path, edges } = queue.shift();
|
|
268
|
+
if (nodeId === end) {
|
|
269
|
+
return {
|
|
270
|
+
nodes: path.map((id) => nodeMap.get(id)).filter(Boolean),
|
|
271
|
+
edges,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
if (visited.has(nodeId))
|
|
275
|
+
continue;
|
|
276
|
+
visited.add(nodeId);
|
|
277
|
+
const neighbors = adjacency.get(nodeId) || [];
|
|
278
|
+
for (const { node: neighbor, edge } of neighbors) {
|
|
279
|
+
if (!visited.has(neighbor)) {
|
|
280
|
+
queue.push({
|
|
281
|
+
nodeId: neighbor,
|
|
282
|
+
path: [...path, neighbor],
|
|
283
|
+
edges: [...edges, edge],
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Calculate severity based on trust crossings and data types
|
|
292
|
+
*/
|
|
293
|
+
function calculatePathSeverity(trustCrossings, dataTypes) {
|
|
294
|
+
const criticalData = ["credentials", "private-keys", "ssh-keys", "api-keys"];
|
|
295
|
+
const highData = ["tokens", "pii", "pci-data", "phi"];
|
|
296
|
+
const hasCriticalData = dataTypes.some((t) => criticalData.includes(t));
|
|
297
|
+
const hasHighData = dataTypes.some((t) => highData.includes(t));
|
|
298
|
+
if (hasCriticalData && trustCrossings >= 1)
|
|
299
|
+
return "critical";
|
|
300
|
+
if (hasCriticalData || (hasHighData && trustCrossings >= 2))
|
|
301
|
+
return "high";
|
|
302
|
+
if (hasHighData || trustCrossings >= 2)
|
|
303
|
+
return "medium";
|
|
304
|
+
return "low";
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Generate attack narrative
|
|
308
|
+
*/
|
|
309
|
+
function generateAttackNarrative(entry, target, path) {
|
|
310
|
+
const steps = path.map((n) => n.name).join(" → ");
|
|
311
|
+
return `An attacker could inject malicious input through ${entry.name}, ` +
|
|
312
|
+
`which flows through ${path.length - 2} intermediate step(s) ` +
|
|
313
|
+
`(${steps}) to access ${target.dataAccess.join(", ")} ` +
|
|
314
|
+
`via the ${target.name} tool.`;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Generate mitigations for a path
|
|
318
|
+
*/
|
|
319
|
+
function generateMitigations(nodes, edges) {
|
|
320
|
+
const mitigations = new Set();
|
|
321
|
+
// Trust boundary mitigations
|
|
322
|
+
const trustCrossings = edges.filter((e) => e.crossesTrustBoundary);
|
|
323
|
+
if (trustCrossings.length > 0) {
|
|
324
|
+
mitigations.add("Add authentication at trust boundary crossings");
|
|
325
|
+
mitigations.add("Implement input validation at each trust boundary");
|
|
326
|
+
}
|
|
327
|
+
// Sensitive data mitigations
|
|
328
|
+
const sensitiveNodes = nodes.filter((n) => n.accessesSensitiveData);
|
|
329
|
+
for (const node of sensitiveNodes) {
|
|
330
|
+
mitigations.add(`Apply principle of least privilege to ${node.name}`);
|
|
331
|
+
mitigations.add(`Add audit logging for ${node.name} access`);
|
|
332
|
+
}
|
|
333
|
+
// Entry point mitigations
|
|
334
|
+
const entryPoints = nodes.filter((n) => n.isEntryPoint);
|
|
335
|
+
for (const entry of entryPoints) {
|
|
336
|
+
mitigations.add(`Sanitize and validate all input from ${entry.name}`);
|
|
337
|
+
}
|
|
338
|
+
// Code execution mitigations
|
|
339
|
+
const codeExecNodes = nodes.filter((n) => n.capabilities.includes("code_execution"));
|
|
340
|
+
for (const node of codeExecNodes) {
|
|
341
|
+
mitigations.add(`Sandbox code execution in ${node.name}`);
|
|
342
|
+
mitigations.add(`Restrict network access from ${node.name}`);
|
|
343
|
+
}
|
|
344
|
+
// General mitigations
|
|
345
|
+
mitigations.add("Enable comprehensive audit logging across all agents");
|
|
346
|
+
mitigations.add("Implement rate limiting on sensitive operations");
|
|
347
|
+
mitigations.add("Deploy anomaly detection for unusual data access patterns");
|
|
348
|
+
return Array.from(mitigations);
|
|
349
|
+
}
|
|
350
|
+
// ============================================================================
|
|
351
|
+
// Visualization
|
|
352
|
+
// ============================================================================
|
|
353
|
+
/**
|
|
354
|
+
* Generate Mermaid diagram for agent graph
|
|
355
|
+
*/
|
|
356
|
+
export function generateAgentChainDiagram(graph, attackPaths) {
|
|
357
|
+
const lines = ["graph TD"];
|
|
358
|
+
// Styling
|
|
359
|
+
lines.push(" classDef entryPoint fill:#ff6b6b,stroke:#333,color:#fff");
|
|
360
|
+
lines.push(" classDef sensitive fill:#ffe66d,stroke:#333,color:#000");
|
|
361
|
+
lines.push(" classDef mcpServer fill:#4ecdc4,stroke:#333,color:#fff");
|
|
362
|
+
lines.push(" classDef tool fill:#95e1d3,stroke:#333");
|
|
363
|
+
lines.push(" classDef agent fill:#a8d8ea,stroke:#333");
|
|
364
|
+
lines.push(" classDef attackPath stroke:#f00,stroke-width:3px");
|
|
365
|
+
// Add nodes
|
|
366
|
+
for (const node of graph.nodes) {
|
|
367
|
+
const sanitized = node.id.replace(/[^a-zA-Z0-9]/g, "_");
|
|
368
|
+
const label = node.name.length > 25 ? node.name.slice(0, 22) + "..." : node.name;
|
|
369
|
+
let className = "tool";
|
|
370
|
+
if (node.isEntryPoint)
|
|
371
|
+
className = "entryPoint";
|
|
372
|
+
else if (node.accessesSensitiveData)
|
|
373
|
+
className = "sensitive";
|
|
374
|
+
else if (node.type === "mcp-server")
|
|
375
|
+
className = "mcpServer";
|
|
376
|
+
else if (node.type === "agent")
|
|
377
|
+
className = "agent";
|
|
378
|
+
lines.push(` ${sanitized}["${label}"]:::${className}`);
|
|
379
|
+
}
|
|
380
|
+
// Add edges
|
|
381
|
+
const attackEdges = new Set();
|
|
382
|
+
for (const path of attackPaths) {
|
|
383
|
+
for (const edge of path.edgesTraversed) {
|
|
384
|
+
attackEdges.add(`${edge.from}-${edge.to}`);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
for (const edge of graph.edges) {
|
|
388
|
+
const from = edge.from.replace(/[^a-zA-Z0-9]/g, "_");
|
|
389
|
+
const to = edge.to.replace(/[^a-zA-Z0-9]/g, "_");
|
|
390
|
+
const edgeKey = `${edge.from}-${edge.to}`;
|
|
391
|
+
const arrow = edge.crossesTrustBoundary ? "==>" : "-->";
|
|
392
|
+
const style = attackEdges.has(edgeKey) ? "|ATTACK|" : "";
|
|
393
|
+
lines.push(` ${from} ${arrow}${style} ${to}`);
|
|
394
|
+
}
|
|
395
|
+
// Legend
|
|
396
|
+
lines.push("");
|
|
397
|
+
lines.push(" subgraph Legend");
|
|
398
|
+
lines.push(" entry_leg[Entry Point]:::entryPoint");
|
|
399
|
+
lines.push(" sensitive_leg[Sensitive Data]:::sensitive");
|
|
400
|
+
lines.push(" mcp_leg[MCP Server]:::mcpServer");
|
|
401
|
+
lines.push(" tool_leg[Tool]:::tool");
|
|
402
|
+
lines.push(" end");
|
|
403
|
+
return lines.join("\n");
|
|
404
|
+
}
|
|
405
|
+
// ============================================================================
|
|
406
|
+
// Main Analysis Function
|
|
407
|
+
// ============================================================================
|
|
408
|
+
/**
|
|
409
|
+
* Run full agent chain analysis
|
|
410
|
+
*/
|
|
411
|
+
export function runAgentChainAnalysis(manifests, agentConfigs) {
|
|
412
|
+
// Build the graph
|
|
413
|
+
const graph = buildAgentGraph(manifests, agentConfigs);
|
|
414
|
+
// Find attack paths
|
|
415
|
+
const attackPaths = analyzeAgentChains(graph);
|
|
416
|
+
// Generate diagram
|
|
417
|
+
const mermaidDiagram = generateAgentChainDiagram(graph, attackPaths);
|
|
418
|
+
// Calculate stats
|
|
419
|
+
const criticalPaths = attackPaths.filter((p) => p.severity === "critical").length;
|
|
420
|
+
const highPaths = attackPaths.filter((p) => p.severity === "high").length;
|
|
421
|
+
const trustBoundaries = graph.edges.filter((e) => e.crossesTrustBoundary).length;
|
|
422
|
+
return {
|
|
423
|
+
graph,
|
|
424
|
+
attackPaths,
|
|
425
|
+
stats: {
|
|
426
|
+
totalNodes: graph.nodes.length,
|
|
427
|
+
totalEdges: graph.edges.length,
|
|
428
|
+
entryPoints: graph.nodes.filter((n) => n.isEntryPoint).length,
|
|
429
|
+
sensitiveNodes: graph.nodes.filter((n) => n.accessesSensitiveData).length,
|
|
430
|
+
trustBoundaries,
|
|
431
|
+
attackPaths: attackPaths.length,
|
|
432
|
+
criticalPaths,
|
|
433
|
+
highPaths,
|
|
434
|
+
},
|
|
435
|
+
mermaidDiagram,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=agent-chain-analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-chain-analysis.js","sourceRoot":"","sources":["../../../src/scanners/agent/agent-chain-analysis.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA6JH,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,MAAM,uBAAuB,GAA6C;IACxE,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE;IAC7C,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;IACvC,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,EAAE;IAC/C,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;IACrC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE;IAC/C,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;IACvC,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE;IACvD,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;IACrC,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE;IACjD,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE;IAChC,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE;IACrC,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE;IACnD,EAAE,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,KAAK,EAAE;IACtD,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,KAAK,EAAE;IACjD,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE;IACjD,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACjD,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE;CAC5C,CAAC;AAEF,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAuB;IACjD,wCAAwC;IACxC,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAErC,8BAA8B;IAC9B,IAAI,IAAI,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IAErC,qCAAqC;IACrC,IAAI,IAAI,CAAC,eAAe;QAAE,OAAO,QAAQ,CAAC;IAE1C,mCAAmC;IACnC,IAAI,IAAI,CAAC,YAAY;QAAE,OAAO,MAAM,CAAC;IAErC,oBAAoB;IACpB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAuB;IAC/C,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,uBAAuB,EAAE,CAAC;QACxD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,SAAmB;IAChD,MAAM,cAAc,GAAG;QACrB,aAAa;QACb,SAAS;QACT,UAAU;QACV,QAAQ;QACR,cAAc;QACd,UAAU;QACV,KAAK;QACL,UAAU;QACV,KAAK;KACN,CAAC;IACF,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,IAAwB;IACtD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,qBAAqB;IACrB,IAAI,IAAI,CAAC,UAAU,KAAK,WAAW;QAAE,KAAK,IAAI,EAAE,CAAC;SAC5C,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK;QAAE,KAAK,IAAI,EAAE,CAAC;SAC3C,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ;QAAE,KAAK,IAAI,EAAE,CAAC;IAEnD,mBAAmB;IACnB,IAAI,IAAI,CAAC,YAAY;QAAE,KAAK,IAAI,EAAE,CAAC;IAEnC,wBAAwB;IACxB,IAAI,IAAI,CAAC,qBAAqB;QAAE,KAAK,IAAI,EAAE,CAAC;IAE5C,eAAe;IACf,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,gBAAgB,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAC/D,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,gBAAgB,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAC/D,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,YAAY,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAE3D,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAyD,EACzD,YAAmE;IAEnE,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,YAAY;QAClB,UAAU,EAAE,WAAW;QACvB,YAAY,EAAE,CAAC,OAAO,CAAC;QACvB,UAAU,EAAE,EAAE;QACd,YAAY,EAAE,IAAI;QAClB,qBAAqB,EAAE,KAAK;QAC5B,SAAS,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,oCAAoC;IACpC,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE,CAAC;QACvD,sBAAsB;QACtB,MAAM,QAAQ,GAAG,OAAO,UAAU,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,QAAQ;YACpB,YAAY,EAAE,CAAC,eAAe,CAAC;YAC/B,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,KAAK;YACnB,qBAAqB,EAAE,KAAK;YAC5B,SAAS,EAAE,EAAE;SACd,CAAC,CAAC;QAEH,mCAAmC;QACnC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,QAAQ;YACZ,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,CAAC,YAAY,CAAC;YACzB,YAAY,EAAE,KAAK;YACnB,oBAAoB,EAAE,IAAI;SAC3B,CAAC,CAAC;QAEH,iBAAiB;QACjB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,QAAQ,GAAc;gBAC1B,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU;gBACV,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,SAAS;gBACrB,YAAY,EAAE,KAAK;gBACnB,qBAAqB,EAAE,qBAAqB,CAAC,SAAS,CAAC;gBACvD,SAAS,EAAE,CAAC;aACb,CAAC;YAEF,mBAAmB;YACnB,IAAI,IAAI,CAAC,aAAa;gBAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,aAAa;gBAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,eAAe;gBAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,IAAI,CAAC,YAAY;gBAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE1D,QAAQ,CAAC,SAAS,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAErB,+BAA+B;YAC/B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,QAAQ;gBACd,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,OAAO;gBACb,SAAS;gBACT,YAAY,EAAE,KAAK;gBACnB,oBAAoB,EAAE,UAAU,KAAK,QAAQ;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,OAAO;gBACX,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,YAAY,EAAE,CAAC,eAAe,CAAC;gBAC/B,UAAU,EAAE,EAAE;gBACd,YAAY,EAAE,KAAK,CAAC,UAAU,KAAK,WAAW;gBAC9C,qBAAqB,EAAE,KAAK;gBAC5B,SAAS,EAAE,sBAAsB,CAAC;oBAChC,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,YAAY,EAAE,KAAK,CAAC,UAAU,KAAK,WAAW;iBAC/C,CAAC;aACH,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAClD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,oBAAoB;IACpB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAE9D,4BAA4B;IAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAE1E,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoD,CAAC;IAC9E,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,mDAAmD;IACnD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAExE,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC;gBACjF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;gBAE1E,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,QAAQ,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC9B,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE;oBACvC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,cAAc,EAAE,MAAM,CAAC,KAAK;oBAC5B,sBAAsB,EAAE,cAAc;oBACtC,WAAW,EAAE,MAAM,CAAC,UAAU;oBAC9B,QAAQ;oBACR,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,cAAc,GAAG,EAAE,CAAC;oBACnD,eAAe,EAAE,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;oBACrE,UAAU,EAAE,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;iBAC5D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,KAAa,EACb,GAAW,EACX,KAAkB,EAClB,SAAgE;IAEhE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAkE;QAC3E,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;KAC5C,CAAC;IAEF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAE/C,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBACzD,KAAK;aACN,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QAClC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9C,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC;oBACT,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC;oBACzB,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,cAAsB,EAAE,SAAmB;IACxE,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAEtD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhE,IAAI,eAAe,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC;IAC9D,IAAI,eAAe,IAAI,CAAC,WAAW,IAAI,cAAc,IAAI,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3E,IAAI,WAAW,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,KAAgB,EAChB,MAAiB,EACjB,IAAiB;IAEjB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,oDAAoD,KAAK,CAAC,IAAI,IAAI;QACvE,uBAAuB,IAAI,CAAC,MAAM,GAAG,CAAC,wBAAwB;QAC9D,IAAI,KAAK,eAAe,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QACvD,WAAW,MAAM,CAAC,IAAI,QAAQ,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAkB,EAAE,KAAkB;IACjE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,6BAA6B;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACnE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,WAAW,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAClE,WAAW,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,6BAA6B;IAC7B,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACpE,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,WAAW,CAAC,GAAG,CAAC,yCAAyC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,WAAW,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,0BAA0B;IAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACxD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,WAAW,CAAC,GAAG,CAAC,wCAAwC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,6BAA6B;IAC7B,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAC1C,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,WAAW,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,WAAW,CAAC,GAAG,CAAC,gCAAgC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,sBAAsB;IACtB,WAAW,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACxE,WAAW,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACnE,WAAW,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAE7E,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACjC,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAAiB,EACjB,WAAyB;IAEzB,MAAM,KAAK,GAAa,CAAC,UAAU,CAAC,CAAC;IAErC,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAEjE,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAEjF,IAAI,SAAS,GAAG,MAAM,CAAC;QACvB,IAAI,IAAI,CAAC,YAAY;YAAE,SAAS,GAAG,YAAY,CAAC;aAC3C,IAAI,IAAI,CAAC,qBAAqB;YAAE,SAAS,GAAG,WAAW,CAAC;aACxD,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;YAAE,SAAS,GAAG,WAAW,CAAC;aACxD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS,GAAG,OAAO,CAAC;QAEpD,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,KAAK,QAAQ,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,YAAY;IACZ,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QAE1C,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACxD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,SAAyD,EACzD,YAAmE;IAEnE,kBAAkB;IAClB,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAEvD,oBAAoB;IACpB,MAAM,WAAW,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE9C,mBAAmB;IACnB,MAAM,cAAc,GAAG,yBAAyB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAErE,kBAAkB;IAClB,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAClF,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAC1E,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC;IAEjF,OAAO;QACL,KAAK;QACL,WAAW;QACX,KAAK,EAAE;YACL,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YAC9B,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;YAC9B,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM;YAC7D,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,MAAM;YACzE,eAAe;YACf,WAAW,EAAE,WAAW,CAAC,MAAM;YAC/B,aAAa;YACb,SAAS;SACV;QACD,cAAc;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-audit.d.ts","sourceRoot":"","sources":["../../../src/scanners/agent/manifest-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EAEX,kBAAkB,EAEnB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest-audit.d.ts","sourceRoot":"","sources":["../../../src/scanners/agent/manifest-audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,KAAK,EACV,kBAAkB,EAClB,WAAW,EAEX,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AA2SpB;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE;IACR,2BAA2B;IAC3B,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAClC,+BAA+B;IAC/B,UAAU,CAAC,EAAE,kBAAkB,EAAE,CAAC;CACnC,GACA,OAAO,CAAC,kBAAkB,CAAC,CAsE7B;AAED;;GAEG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC;IAC3D,OAAO,EAAE,gBAAgB,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CAMD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,GAAG;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAkDA"}
|