@mcp-shark/mcp-shark 1.5.13 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +482 -56
  2. package/bin/mcp-shark.js +146 -52
  3. package/core/cli/AutoFixEngine.js +93 -0
  4. package/core/cli/ConfigScanner.js +193 -0
  5. package/core/cli/DataLoader.js +200 -0
  6. package/core/cli/DeclarativeRuleEngine.js +363 -0
  7. package/core/cli/DoctorCommand.js +218 -0
  8. package/core/cli/FixHandlers.js +222 -0
  9. package/core/cli/HtmlReportGenerator.js +203 -0
  10. package/core/cli/IdeConfigPaths.js +175 -0
  11. package/core/cli/ListCommand.js +255 -0
  12. package/core/cli/LockCommand.js +164 -0
  13. package/core/cli/LockDiffEngine.js +152 -0
  14. package/core/cli/RuleRegistryConfig.js +131 -0
  15. package/core/cli/ScanCommand.js +244 -0
  16. package/core/cli/ScanService.js +200 -0
  17. package/core/cli/SecretDetector.js +92 -0
  18. package/core/cli/SharkScoreCalculator.js +109 -0
  19. package/core/cli/ToolClassifications.js +51 -0
  20. package/core/cli/ToxicFlowAnalyzer.js +212 -0
  21. package/core/cli/UpdateCommand.js +188 -0
  22. package/core/cli/WalkthroughGenerator.js +195 -0
  23. package/core/cli/WatchCommand.js +129 -0
  24. package/core/cli/YamlRuleEngine.js +197 -0
  25. package/core/cli/data/rule-packs/aauth-visibility.json +117 -0
  26. package/core/cli/data/rule-packs/agentic-security-2026.json +180 -0
  27. package/core/cli/data/rule-packs/general-security.json +173 -0
  28. package/core/cli/data/rule-packs/owasp-mcp-2026.json +244 -0
  29. package/core/cli/data/rule-packs/toxic-flow-heuristics.json +21 -0
  30. package/core/cli/data/rule-sources.json +5 -0
  31. package/core/cli/data/secret-patterns.json +18 -0
  32. package/core/cli/data/tool-classifications.json +111 -0
  33. package/core/cli/data/toxic-flow-rules.json +47 -0
  34. package/core/cli/index.js +23 -0
  35. package/core/cli/output/Banner.js +52 -0
  36. package/core/cli/output/Formatter.js +183 -0
  37. package/core/cli/output/JsonFormatter.js +106 -0
  38. package/core/cli/output/index.js +16 -0
  39. package/core/cli/secureRegistryFetch.js +157 -0
  40. package/core/cli/symbols.js +16 -0
  41. package/core/configs/environment.js +3 -1
  42. package/core/configs/index.js +3 -64
  43. package/core/container/DependencyContainer.js +4 -1
  44. package/core/mcp-server/index.js +4 -1
  45. package/core/mcp-server/server/external/all.js +10 -3
  46. package/core/mcp-server/server/external/config.js +62 -5
  47. package/core/models/RequestFilters.js +3 -0
  48. package/core/repositories/PacketRepository.js +16 -0
  49. package/core/services/AuditService.js +2 -0
  50. package/core/services/ConfigService.js +9 -1
  51. package/core/services/ConfigTransformService.js +34 -2
  52. package/core/services/RequestService.js +58 -5
  53. package/core/services/ServerManagementService.js +59 -4
  54. package/core/services/security/StaticRulesService.js +69 -13
  55. package/core/services/security/TrafficAnalysisService.js +19 -1
  56. package/core/services/security/TrafficToxicFlowService.js +154 -0
  57. package/core/services/security/aauthGraph.js +199 -0
  58. package/core/services/security/aauthParser.js +274 -0
  59. package/core/services/security/aauthSelfTest.js +346 -0
  60. package/core/services/security/index.js +2 -1
  61. package/core/services/security/rules/index.js +25 -59
  62. package/core/services/security/rules/scans/configPermissions.js +91 -0
  63. package/core/services/security/rules/scans/duplicateToolNames.js +85 -0
  64. package/core/services/security/rules/scans/insecureTransport.js +148 -0
  65. package/core/services/security/rules/scans/missingContainment.js +123 -0
  66. package/core/services/security/rules/scans/shellEnvInjection.js +101 -0
  67. package/core/services/security/rules/scans/unsafeDefaults.js +99 -0
  68. package/core/services/security/toolsListFromTrafficParser.js +70 -0
  69. package/core/tui/App.js +144 -0
  70. package/core/tui/FindingsPanel.js +115 -0
  71. package/core/tui/FixPanel.js +132 -0
  72. package/core/tui/Header.js +51 -0
  73. package/core/tui/HelpBar.js +42 -0
  74. package/core/tui/ServersPanel.js +109 -0
  75. package/core/tui/ToxicFlowsPanel.js +100 -0
  76. package/core/tui/h.js +8 -0
  77. package/core/tui/index.js +11 -0
  78. package/core/tui/render.js +22 -0
  79. package/package.json +24 -16
  80. package/ui/dist/assets/index-D6zDrtMV.js +81 -0
  81. package/ui/dist/index.html +1 -1
  82. package/ui/server/controllers/AauthController.js +279 -0
  83. package/ui/server/controllers/RequestController.js +12 -1
  84. package/ui/server/controllers/SecurityFindingsController.js +46 -1
  85. package/ui/server/routes/aauth.js +18 -0
  86. package/ui/server/routes/requests.js +8 -1
  87. package/ui/server/routes/security.js +5 -1
  88. package/ui/server/setup.js +224 -6
  89. package/ui/server/swagger/paths/components.js +55 -0
  90. package/ui/server/swagger/paths/securityTrafficFlows.js +59 -0
  91. package/ui/server/swagger/paths.js +2 -2
  92. package/ui/server/swagger/swagger.js +5 -2
  93. package/ui/server.js +1 -1
  94. package/ui/src/App.jsx +26 -52
  95. package/ui/src/PacketFilters.jsx +31 -1
  96. package/ui/src/PacketList.jsx +2 -2
  97. package/ui/src/Security.jsx +10 -0
  98. package/ui/src/TabNavigation.jsx +8 -0
  99. package/ui/src/components/AAuthBadge.jsx +92 -0
  100. package/ui/src/components/AauthExplorer/AauthExplorerGraph.jsx +231 -0
  101. package/ui/src/components/AauthExplorer/AauthExplorerView.jsx +387 -0
  102. package/ui/src/components/AauthExplorer/NodeDetailPanel.jsx +272 -0
  103. package/ui/src/components/App/ActionMenu.jsx +4 -31
  104. package/ui/src/components/App/ApiDocsButton.jsx +0 -1
  105. package/ui/src/components/App/ShutdownButton.jsx +0 -1
  106. package/ui/src/components/App/useAppState.js +19 -26
  107. package/ui/src/components/DetailsTab/AAuthIdentitySection.jsx +119 -0
  108. package/ui/src/components/DetailsTab/RequestDetailsSection.jsx +2 -0
  109. package/ui/src/components/DetailsTab/ResponseDetailsSection.jsx +2 -0
  110. package/ui/src/components/DetectedPathsList.jsx +1 -5
  111. package/ui/src/components/FileInput.jsx +0 -1
  112. package/ui/src/components/PacketFilters/AAuthPostureFilter.jsx +81 -0
  113. package/ui/src/components/RequestRow/RequestRowMain.jsx +7 -1
  114. package/ui/src/components/Security/AAuthPosturePanel.jsx +360 -0
  115. package/ui/src/components/Security/ScannerContent.jsx +33 -1
  116. package/ui/src/components/Security/TrafficToxicFlowsPanel.jsx +253 -0
  117. package/ui/src/components/Security/securityApi.js +15 -0
  118. package/ui/src/components/Security/useSecurity.js +60 -3
  119. package/ui/src/components/ServerControl.jsx +0 -1
  120. package/ui/src/components/TabNavigation/DesktopTabs.jsx +0 -11
  121. package/ui/src/components/TabNavigationIcons.jsx +5 -0
  122. package/ui/src/components/ViewModeTabs.jsx +0 -1
  123. package/ui/src/utils/animations.js +26 -9
  124. package/core/services/security/rules/scans/agentic01GoalHijack.js +0 -130
  125. package/core/services/security/rules/scans/agentic02ToolMisuse.js +0 -129
  126. package/core/services/security/rules/scans/agentic03IdentityAbuse.js +0 -130
  127. package/core/services/security/rules/scans/agentic04SupplyChain.js +0 -130
  128. package/core/services/security/rules/scans/agentic06MemoryPoisoning.js +0 -130
  129. package/core/services/security/rules/scans/agentic07InsecureCommunication.js +0 -135
  130. package/core/services/security/rules/scans/agentic08CascadingFailures.js +0 -135
  131. package/core/services/security/rules/scans/agentic09TrustExploitation.js +0 -135
  132. package/core/services/security/rules/scans/agentic10RogueAgent.js +0 -130
  133. package/core/services/security/rules/scans/hardcodedSecrets.js +0 -130
  134. package/core/services/security/rules/scans/mcp01TokenMismanagement.js +0 -127
  135. package/core/services/security/rules/scans/mcp02ScopeCreep.js +0 -130
  136. package/core/services/security/rules/scans/mcp03ToolPoisoning.js +0 -132
  137. package/core/services/security/rules/scans/mcp04SupplyChain.js +0 -131
  138. package/core/services/security/rules/scans/mcp06PromptInjection.js +0 -200
  139. package/core/services/security/rules/scans/mcp07InsufficientAuth.js +0 -130
  140. package/core/services/security/rules/scans/mcp08LackAudit.js +0 -129
  141. package/core/services/security/rules/scans/mcp09ShadowServers.js +0 -129
  142. package/core/services/security/rules/scans/mcp10ContextInjection.js +0 -130
  143. package/ui/dist/assets/index-CiCSDYf-.js +0 -97
  144. package/ui/server/routes/help.js +0 -44
  145. package/ui/server/swagger/paths/help.js +0 -82
  146. package/ui/src/HelpGuide/HelpGuideContent.jsx +0 -118
  147. package/ui/src/HelpGuide/HelpGuideFooter.jsx +0 -59
  148. package/ui/src/HelpGuide/HelpGuideHeader.jsx +0 -57
  149. package/ui/src/HelpGuide.jsx +0 -78
  150. package/ui/src/IntroTour.jsx +0 -154
  151. package/ui/src/components/App/HelpButton.jsx +0 -90
  152. package/ui/src/components/TourOverlay.jsx +0 -117
  153. package/ui/src/components/TourTooltip/TourTooltipButtons.jsx +0 -120
  154. package/ui/src/components/TourTooltip/TourTooltipHeader.jsx +0 -71
  155. package/ui/src/components/TourTooltip/TourTooltipIcons.jsx +0 -54
  156. package/ui/src/components/TourTooltip/useTooltipPosition.js +0 -135
  157. package/ui/src/components/TourTooltip.jsx +0 -91
  158. package/ui/src/config/tourSteps.jsx +0 -140
@@ -1,130 +0,0 @@
1
- import { convertPacketFinding, createRuleAdapter } from '../utils/adapter.js';
2
- import { packetToText, promptToText, resourceToText, toolToText } from '../utils/text.js';
3
-
4
- const RULE_ID = 'asi04-supply-chain';
5
- const OWASP_ID = 'ASI04';
6
- const RECOMMENDATION =
7
- 'Verify agent framework and model integrity. Use signed and verified dependencies. Monitor for supply chain attacks.';
8
-
9
- const AGENTIC_SUPPLY_CHAIN_PATTERNS = [
10
- /(?:compromised|vulnerable|malicious)\s+(?:agent|framework|model|dependency|package)/i,
11
- /(?:supply\s+chain|dependency)\s+(?:attack|vulnerability|compromise|tampering)/i,
12
- /(?:unsigned|unverified|untrusted)\s+(?:agent|framework|model|dependency)/i,
13
- /(?:tampered|modified|altered)\s+(?:agent|framework|model|dependency)/i,
14
- /(?:typosquatting|brandjacking|namespace)\s+(?:agent|framework|model|package)/i,
15
- ];
16
-
17
- function scanText(text) {
18
- if (!text) {
19
- return null;
20
- }
21
- const matches = [];
22
- for (const pattern of AGENTIC_SUPPLY_CHAIN_PATTERNS) {
23
- const match = text.match(pattern);
24
- if (match) {
25
- matches.push(match[0]);
26
- }
27
- }
28
- return matches.length > 0 ? matches : null;
29
- }
30
-
31
- function buildReason(entity, matches) {
32
- return `Potential agentic supply chain vulnerability in ${entity}: ${matches.join(', ')}`;
33
- }
34
-
35
- export function scanAgentic04SupplyChain(mcpData = {}) {
36
- const results = {
37
- toolFindings: [],
38
- resourceFindings: [],
39
- promptFindings: [],
40
- notablePatterns: [],
41
- recommendations: [RECOMMENDATION],
42
- };
43
-
44
- for (const tool of mcpData.tools || []) {
45
- const matches = scanText(toolToText(tool));
46
- if (matches) {
47
- results.toolFindings.push({
48
- issueType: 'Supply Chain Agentic',
49
- name: tool?.name || 'tool',
50
- severity: 'high',
51
- reasons: [buildReason(`tool "${tool?.name || 'unknown'}"`, matches)],
52
- tags: ['supply-chain', 'agentic'],
53
- agenticCategory: OWASP_ID,
54
- safeUseNotes:
55
- 'Verify agent framework and dependencies. Use trusted sources and verify integrity.',
56
- });
57
- }
58
- }
59
-
60
- for (const resource of mcpData.resources || []) {
61
- const matches = scanText(resourceToText(resource));
62
- if (matches) {
63
- results.resourceFindings.push({
64
- issueType: 'Supply Chain Agentic',
65
- uri: resource?.uri || resource?.name || 'resource',
66
- severity: 'high',
67
- reasons: [
68
- buildReason(`resource "${resource?.name || resource?.uri || 'unknown'}"`, matches),
69
- ],
70
- tags: ['supply-chain', 'agentic'],
71
- agenticCategory: OWASP_ID,
72
- });
73
- }
74
- }
75
-
76
- for (const prompt of mcpData.prompts || []) {
77
- const matches = scanText(promptToText(prompt));
78
- if (matches) {
79
- results.promptFindings.push({
80
- issueType: 'Supply Chain Agentic',
81
- name: prompt?.name || 'prompt',
82
- severity: 'medium',
83
- reasons: [buildReason(`prompt "${prompt?.name || 'unknown'}"`, matches)],
84
- tags: ['supply-chain', 'agentic'],
85
- agenticCategory: OWASP_ID,
86
- });
87
- }
88
- }
89
-
90
- return results;
91
- }
92
-
93
- const adapter = createRuleAdapter(scanAgentic04SupplyChain, RULE_ID, OWASP_ID, RECOMMENDATION);
94
-
95
- export const analyzeTool = adapter.analyzeTool;
96
- export const analyzePrompt = adapter.analyzePrompt;
97
- export const analyzeResource = adapter.analyzeResource;
98
-
99
- export function analyzePacket(packet) {
100
- const text = packetToText(packet);
101
- const matches = scanText(text);
102
- if (!matches) {
103
- return [];
104
- }
105
- return [
106
- convertPacketFinding(
107
- {
108
- issueType: 'Supply Chain Agentic',
109
- severity: 'high',
110
- title: 'Agentic Supply Chain Pattern in Traffic',
111
- description: `Potential agentic supply chain vulnerability in packet: ${matches.join(', ')}`,
112
- evidence: matches[0]?.substring(0, 50) || '',
113
- },
114
- RULE_ID,
115
- OWASP_ID,
116
- RECOMMENDATION,
117
- packet
118
- ),
119
- ];
120
- }
121
-
122
- export const ruleMetadata = {
123
- id: RULE_ID,
124
- name: 'Agentic Supply Chain Detection',
125
- owasp_id: OWASP_ID,
126
- severity: 'high',
127
- description: 'Detects agentic supply chain vulnerabilities.',
128
- source: 'static',
129
- type: 'agentic-security',
130
- };
@@ -1,130 +0,0 @@
1
- import { convertPacketFinding, createRuleAdapter } from '../utils/adapter.js';
2
- import { packetToText, promptToText, resourceToText, toolToText } from '../utils/text.js';
3
-
4
- const RULE_ID = 'asi06-memory-poisoning';
5
- const OWASP_ID = 'ASI06';
6
- const RECOMMENDATION =
7
- 'Implement memory and context validation. Monitor for data poisoning. Use memory isolation and sanitization.';
8
-
9
- const MEMORY_POISONING_PATTERNS = [
10
- /(?:poison|corrupt|taint|contaminate|manipulate)\s+(?:memory|context|data|information)/i,
11
- /(?:inject|insert|inject)\s+(?:malicious|harmful|poisoned|corrupted)\s+(?:data|information|memory|context)/i,
12
- /(?:memory|context|data)\s+(?:poisoning|corruption|manipulation|tampering)/i,
13
- /(?:compromise|compromised)\s+(?:memory|context|data|information)/i,
14
- /(?:tainted|poisoned|corrupted)\s+(?:memory|context|data|information)/i,
15
- ];
16
-
17
- function scanText(text) {
18
- if (!text) {
19
- return null;
20
- }
21
- const matches = [];
22
- for (const pattern of MEMORY_POISONING_PATTERNS) {
23
- const match = text.match(pattern);
24
- if (match) {
25
- matches.push(match[0]);
26
- }
27
- }
28
- return matches.length > 0 ? matches : null;
29
- }
30
-
31
- function buildReason(entity, matches) {
32
- return `Potential memory/context poisoning in ${entity}: ${matches.join(', ')}`;
33
- }
34
-
35
- export function scanAgentic06MemoryPoisoning(mcpData = {}) {
36
- const results = {
37
- toolFindings: [],
38
- resourceFindings: [],
39
- promptFindings: [],
40
- notablePatterns: [],
41
- recommendations: [RECOMMENDATION],
42
- };
43
-
44
- for (const tool of mcpData.tools || []) {
45
- const matches = scanText(toolToText(tool));
46
- if (matches) {
47
- results.toolFindings.push({
48
- issueType: 'Memory Poisoning',
49
- name: tool?.name || 'tool',
50
- severity: 'high',
51
- reasons: [buildReason(`tool "${tool?.name || 'unknown'}"`, matches)],
52
- tags: ['memory-poisoning', 'context-poisoning'],
53
- agenticCategory: OWASP_ID,
54
- safeUseNotes:
55
- 'Review tool for memory poisoning vulnerabilities. Validate and sanitize all context data.',
56
- });
57
- }
58
- }
59
-
60
- for (const resource of mcpData.resources || []) {
61
- const matches = scanText(resourceToText(resource));
62
- if (matches) {
63
- results.resourceFindings.push({
64
- issueType: 'Memory Poisoning',
65
- uri: resource?.uri || resource?.name || 'resource',
66
- severity: 'high',
67
- reasons: [
68
- buildReason(`resource "${resource?.name || resource?.uri || 'unknown'}"`, matches),
69
- ],
70
- tags: ['memory-poisoning', 'context-poisoning'],
71
- agenticCategory: OWASP_ID,
72
- });
73
- }
74
- }
75
-
76
- for (const prompt of mcpData.prompts || []) {
77
- const matches = scanText(promptToText(prompt));
78
- if (matches) {
79
- results.promptFindings.push({
80
- issueType: 'Memory Poisoning',
81
- name: prompt?.name || 'prompt',
82
- severity: 'critical',
83
- reasons: [buildReason(`prompt "${prompt?.name || 'unknown'}"`, matches)],
84
- tags: ['memory-poisoning', 'context-poisoning'],
85
- agenticCategory: OWASP_ID,
86
- });
87
- }
88
- }
89
-
90
- return results;
91
- }
92
-
93
- const adapter = createRuleAdapter(scanAgentic06MemoryPoisoning, RULE_ID, OWASP_ID, RECOMMENDATION);
94
-
95
- export const analyzeTool = adapter.analyzeTool;
96
- export const analyzePrompt = adapter.analyzePrompt;
97
- export const analyzeResource = adapter.analyzeResource;
98
-
99
- export function analyzePacket(packet) {
100
- const text = packetToText(packet);
101
- const matches = scanText(text);
102
- if (!matches) {
103
- return [];
104
- }
105
- return [
106
- convertPacketFinding(
107
- {
108
- issueType: 'Memory Poisoning',
109
- severity: 'high',
110
- title: 'Memory Poisoning Pattern in Traffic',
111
- description: `Potential memory/context poisoning in packet: ${matches.join(', ')}`,
112
- evidence: matches[0]?.substring(0, 50) || '',
113
- },
114
- RULE_ID,
115
- OWASP_ID,
116
- RECOMMENDATION,
117
- packet
118
- ),
119
- ];
120
- }
121
-
122
- export const ruleMetadata = {
123
- id: RULE_ID,
124
- name: 'Memory Poisoning Detection',
125
- owasp_id: OWASP_ID,
126
- severity: 'high',
127
- description: 'Detects memory and context poisoning patterns.',
128
- source: 'static',
129
- type: 'agentic-security',
130
- };
@@ -1,135 +0,0 @@
1
- import { convertPacketFinding, createRuleAdapter } from '../utils/adapter.js';
2
- import { packetToText, promptToText, resourceToText, toolToText } from '../utils/text.js';
3
-
4
- const RULE_ID = 'asi07-insecure-communication';
5
- const OWASP_ID = 'ASI07';
6
- const RECOMMENDATION =
7
- 'Implement encrypted communication channels. Use TLS/SSL for all inter-agent communications. Authenticate all agent interactions.';
8
-
9
- const INSECURE_COMMUNICATION_PATTERNS = [
10
- /(?:unencrypted|plaintext|cleartext|unsecured)\s+(?:communication|channel|connection|transmission)/i,
11
- /(?:http:\/\/|ftp:\/\/|ws:\/\/)\s+(?:instead\s+of|without|missing)/i,
12
- /(?:no|missing|lack|without)\s+(?:encryption|tls|ssl|https|authentication|auth)/i,
13
- /(?:insecure|vulnerable|weak)\s+(?:communication|channel|protocol|connection)/i,
14
- /(?:intercept|eavesdrop|man-in-the-middle|mitm)\s+(?:communication|channel|message)/i,
15
- ];
16
-
17
- function scanText(text) {
18
- if (!text) {
19
- return null;
20
- }
21
- const matches = [];
22
- for (const pattern of INSECURE_COMMUNICATION_PATTERNS) {
23
- const match = text.match(pattern);
24
- if (match) {
25
- matches.push(match[0]);
26
- }
27
- }
28
- return matches.length > 0 ? matches : null;
29
- }
30
-
31
- function buildReason(entity, matches) {
32
- return `Potential insecure inter-agent communication in ${entity}: ${matches.join(', ')}`;
33
- }
34
-
35
- export function scanAgentic07InsecureCommunication(mcpData = {}) {
36
- const results = {
37
- toolFindings: [],
38
- resourceFindings: [],
39
- promptFindings: [],
40
- notablePatterns: [],
41
- recommendations: [RECOMMENDATION],
42
- };
43
-
44
- for (const tool of mcpData.tools || []) {
45
- const matches = scanText(toolToText(tool));
46
- if (matches) {
47
- results.toolFindings.push({
48
- issueType: 'Insecure Communication',
49
- name: tool?.name || 'tool',
50
- severity: 'high',
51
- reasons: [buildReason(`tool "${tool?.name || 'unknown'}"`, matches)],
52
- tags: ['insecure-communication', 'inter-agent'],
53
- agenticCategory: OWASP_ID,
54
- safeUseNotes:
55
- 'Review tool communication mechanisms. Ensure all inter-agent communications are encrypted and authenticated.',
56
- });
57
- }
58
- }
59
-
60
- for (const resource of mcpData.resources || []) {
61
- const matches = scanText(resourceToText(resource));
62
- if (matches) {
63
- results.resourceFindings.push({
64
- issueType: 'Insecure Communication',
65
- uri: resource?.uri || resource?.name || 'resource',
66
- severity: 'high',
67
- reasons: [
68
- buildReason(`resource "${resource?.name || resource?.uri || 'unknown'}"`, matches),
69
- ],
70
- tags: ['insecure-communication', 'inter-agent'],
71
- agenticCategory: OWASP_ID,
72
- });
73
- }
74
- }
75
-
76
- for (const prompt of mcpData.prompts || []) {
77
- const matches = scanText(promptToText(prompt));
78
- if (matches) {
79
- results.promptFindings.push({
80
- issueType: 'Insecure Communication',
81
- name: prompt?.name || 'prompt',
82
- severity: 'medium',
83
- reasons: [buildReason(`prompt "${prompt?.name || 'unknown'}"`, matches)],
84
- tags: ['insecure-communication', 'inter-agent'],
85
- agenticCategory: OWASP_ID,
86
- });
87
- }
88
- }
89
-
90
- return results;
91
- }
92
-
93
- const adapter = createRuleAdapter(
94
- scanAgentic07InsecureCommunication,
95
- RULE_ID,
96
- OWASP_ID,
97
- RECOMMENDATION
98
- );
99
-
100
- export const analyzeTool = adapter.analyzeTool;
101
- export const analyzePrompt = adapter.analyzePrompt;
102
- export const analyzeResource = adapter.analyzeResource;
103
-
104
- export function analyzePacket(packet) {
105
- const text = packetToText(packet);
106
- const matches = scanText(text);
107
- if (!matches) {
108
- return [];
109
- }
110
- return [
111
- convertPacketFinding(
112
- {
113
- issueType: 'Insecure Communication',
114
- severity: 'high',
115
- title: 'Insecure Communication Pattern in Traffic',
116
- description: `Potential insecure communication in packet: ${matches.join(', ')}`,
117
- evidence: matches[0]?.substring(0, 50) || '',
118
- },
119
- RULE_ID,
120
- OWASP_ID,
121
- RECOMMENDATION,
122
- packet
123
- ),
124
- ];
125
- }
126
-
127
- export const ruleMetadata = {
128
- id: RULE_ID,
129
- name: 'Insecure Communication Detection',
130
- owasp_id: OWASP_ID,
131
- severity: 'high',
132
- description: 'Detects insecure inter-agent communication patterns.',
133
- source: 'static',
134
- type: 'agentic-security',
135
- };
@@ -1,135 +0,0 @@
1
- import { convertPacketFinding, createRuleAdapter } from '../utils/adapter.js';
2
- import { packetToText, promptToText, resourceToText, toolToText } from '../utils/text.js';
3
-
4
- const RULE_ID = 'asi08-cascading-failures';
5
- const OWASP_ID = 'ASI08';
6
- const RECOMMENDATION =
7
- 'Implement failure isolation and containment. Use circuit breakers and failover mechanisms. Design for graceful degradation.';
8
-
9
- const CASCADING_FAILURE_PATTERNS = [
10
- /(?:cascade|cascading|chain|domino)\s+(?:failure|error|exception|outage|breakdown)/i,
11
- /(?:propagate|spread|ripple|amplify)\s+(?:failure|error|exception|outage)/i,
12
- /(?:single\s+point\s+of\s+failure|spof)/i,
13
- /(?:no|missing|lack|without)\s+(?:isolation|containment|circuit\s+breaker|failover|redundancy)/i,
14
- /(?:unhandled|uncaught|unrecoverable)\s+(?:failure|error|exception)/i,
15
- ];
16
-
17
- function scanText(text) {
18
- if (!text) {
19
- return null;
20
- }
21
- const matches = [];
22
- for (const pattern of CASCADING_FAILURE_PATTERNS) {
23
- const match = text.match(pattern);
24
- if (match) {
25
- matches.push(match[0]);
26
- }
27
- }
28
- return matches.length > 0 ? matches : null;
29
- }
30
-
31
- function buildReason(entity, matches) {
32
- return `Potential cascading failures in ${entity}: ${matches.join(', ')}`;
33
- }
34
-
35
- export function scanAgentic08CascadingFailures(mcpData = {}) {
36
- const results = {
37
- toolFindings: [],
38
- resourceFindings: [],
39
- promptFindings: [],
40
- notablePatterns: [],
41
- recommendations: [RECOMMENDATION],
42
- };
43
-
44
- for (const tool of mcpData.tools || []) {
45
- const matches = scanText(toolToText(tool));
46
- if (matches) {
47
- results.toolFindings.push({
48
- issueType: 'Cascading Failures',
49
- name: tool?.name || 'tool',
50
- severity: 'medium',
51
- reasons: [buildReason(`tool "${tool?.name || 'unknown'}"`, matches)],
52
- tags: ['cascading-failures', 'resilience'],
53
- agenticCategory: OWASP_ID,
54
- safeUseNotes:
55
- 'Review tool failure handling. Implement isolation and circuit breakers to prevent cascading failures.',
56
- });
57
- }
58
- }
59
-
60
- for (const resource of mcpData.resources || []) {
61
- const matches = scanText(resourceToText(resource));
62
- if (matches) {
63
- results.resourceFindings.push({
64
- issueType: 'Cascading Failures',
65
- uri: resource?.uri || resource?.name || 'resource',
66
- severity: 'medium',
67
- reasons: [
68
- buildReason(`resource "${resource?.name || resource?.uri || 'unknown'}"`, matches),
69
- ],
70
- tags: ['cascading-failures', 'resilience'],
71
- agenticCategory: OWASP_ID,
72
- });
73
- }
74
- }
75
-
76
- for (const prompt of mcpData.prompts || []) {
77
- const matches = scanText(promptToText(prompt));
78
- if (matches) {
79
- results.promptFindings.push({
80
- issueType: 'Cascading Failures',
81
- name: prompt?.name || 'prompt',
82
- severity: 'low',
83
- reasons: [buildReason(`prompt "${prompt?.name || 'unknown'}"`, matches)],
84
- tags: ['cascading-failures', 'resilience'],
85
- agenticCategory: OWASP_ID,
86
- });
87
- }
88
- }
89
-
90
- return results;
91
- }
92
-
93
- const adapter = createRuleAdapter(
94
- scanAgentic08CascadingFailures,
95
- RULE_ID,
96
- OWASP_ID,
97
- RECOMMENDATION
98
- );
99
-
100
- export const analyzeTool = adapter.analyzeTool;
101
- export const analyzePrompt = adapter.analyzePrompt;
102
- export const analyzeResource = adapter.analyzeResource;
103
-
104
- export function analyzePacket(packet) {
105
- const text = packetToText(packet);
106
- const matches = scanText(text);
107
- if (!matches) {
108
- return [];
109
- }
110
- return [
111
- convertPacketFinding(
112
- {
113
- issueType: 'Cascading Failures',
114
- severity: 'medium',
115
- title: 'Cascading Failure Pattern in Traffic',
116
- description: `Potential cascading failure indicators in packet: ${matches.join(', ')}`,
117
- evidence: matches[0]?.substring(0, 50) || '',
118
- },
119
- RULE_ID,
120
- OWASP_ID,
121
- RECOMMENDATION,
122
- packet
123
- ),
124
- ];
125
- }
126
-
127
- export const ruleMetadata = {
128
- id: RULE_ID,
129
- name: 'Cascading Failures Detection',
130
- owasp_id: OWASP_ID,
131
- severity: 'medium',
132
- description: 'Detects cascading failure vulnerabilities.',
133
- source: 'static',
134
- type: 'agentic-security',
135
- };
@@ -1,135 +0,0 @@
1
- import { convertPacketFinding, createRuleAdapter } from '../utils/adapter.js';
2
- import { packetToText, promptToText, resourceToText, toolToText } from '../utils/text.js';
3
-
4
- const RULE_ID = 'asi09-trust-exploitation';
5
- const OWASP_ID = 'ASI09';
6
- const RECOMMENDATION =
7
- 'Implement trust verification mechanisms. Educate users about agent limitations. Monitor for trust exploitation patterns.';
8
-
9
- const TRUST_EXPLOITATION_PATTERNS = [
10
- /(?:exploit|abuse|manipulate|misuse)\s+(?:trust|confidence|reliance|relationship)/i,
11
- /(?:social\s+engineering|phishing|deception|manipulation)\s+(?:to|for|in\s+order\s+to)/i,
12
- /(?:impersonate|spoof|pretend|masquerade)\s+(?:as|to\s+be)/i,
13
- /(?:exploit|abuse)\s+(?:human|user|operator)\s+(?:trust|confidence|reliance)/i,
14
- /(?:mislead|deceive|trick|fool)\s+(?:human|user|operator|agent)/i,
15
- ];
16
-
17
- function scanText(text) {
18
- if (!text) {
19
- return null;
20
- }
21
- const matches = [];
22
- for (const pattern of TRUST_EXPLOITATION_PATTERNS) {
23
- const match = text.match(pattern);
24
- if (match) {
25
- matches.push(match[0]);
26
- }
27
- }
28
- return matches.length > 0 ? matches : null;
29
- }
30
-
31
- function buildReason(entity, matches) {
32
- return `Potential human-agent trust exploitation in ${entity}: ${matches.join(', ')}`;
33
- }
34
-
35
- export function scanAgentic09TrustExploitation(mcpData = {}) {
36
- const results = {
37
- toolFindings: [],
38
- resourceFindings: [],
39
- promptFindings: [],
40
- notablePatterns: [],
41
- recommendations: [RECOMMENDATION],
42
- };
43
-
44
- for (const tool of mcpData.tools || []) {
45
- const matches = scanText(toolToText(tool));
46
- if (matches) {
47
- results.toolFindings.push({
48
- issueType: 'Trust Exploitation',
49
- name: tool?.name || 'tool',
50
- severity: 'high',
51
- reasons: [buildReason(`tool "${tool?.name || 'unknown'}"`, matches)],
52
- tags: ['trust-exploitation', 'social-engineering'],
53
- agenticCategory: OWASP_ID,
54
- safeUseNotes:
55
- 'Review tool for trust exploitation vulnerabilities. Implement verification mechanisms for sensitive operations.',
56
- });
57
- }
58
- }
59
-
60
- for (const resource of mcpData.resources || []) {
61
- const matches = scanText(resourceToText(resource));
62
- if (matches) {
63
- results.resourceFindings.push({
64
- issueType: 'Trust Exploitation',
65
- uri: resource?.uri || resource?.name || 'resource',
66
- severity: 'high',
67
- reasons: [
68
- buildReason(`resource "${resource?.name || resource?.uri || 'unknown'}"`, matches),
69
- ],
70
- tags: ['trust-exploitation', 'social-engineering'],
71
- agenticCategory: OWASP_ID,
72
- });
73
- }
74
- }
75
-
76
- for (const prompt of mcpData.prompts || []) {
77
- const matches = scanText(promptToText(prompt));
78
- if (matches) {
79
- results.promptFindings.push({
80
- issueType: 'Trust Exploitation',
81
- name: prompt?.name || 'prompt',
82
- severity: 'critical',
83
- reasons: [buildReason(`prompt "${prompt?.name || 'unknown'}"`, matches)],
84
- tags: ['trust-exploitation', 'social-engineering'],
85
- agenticCategory: OWASP_ID,
86
- });
87
- }
88
- }
89
-
90
- return results;
91
- }
92
-
93
- const adapter = createRuleAdapter(
94
- scanAgentic09TrustExploitation,
95
- RULE_ID,
96
- OWASP_ID,
97
- RECOMMENDATION
98
- );
99
-
100
- export const analyzeTool = adapter.analyzeTool;
101
- export const analyzePrompt = adapter.analyzePrompt;
102
- export const analyzeResource = adapter.analyzeResource;
103
-
104
- export function analyzePacket(packet) {
105
- const text = packetToText(packet);
106
- const matches = scanText(text);
107
- if (!matches) {
108
- return [];
109
- }
110
- return [
111
- convertPacketFinding(
112
- {
113
- issueType: 'Trust Exploitation',
114
- severity: 'high',
115
- title: 'Trust Exploitation Pattern in Traffic',
116
- description: `Potential trust exploitation in packet: ${matches.join(', ')}`,
117
- evidence: matches[0]?.substring(0, 50) || '',
118
- },
119
- RULE_ID,
120
- OWASP_ID,
121
- RECOMMENDATION,
122
- packet
123
- ),
124
- ];
125
- }
126
-
127
- export const ruleMetadata = {
128
- id: RULE_ID,
129
- name: 'Trust Exploitation Detection',
130
- owasp_id: OWASP_ID,
131
- severity: 'high',
132
- description: 'Detects human-agent trust exploitation patterns.',
133
- source: 'static',
134
- type: 'agentic-security',
135
- };