erosolar-cli 2.1.269 → 2.1.271
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/dist/capabilities/index.d.ts +0 -1
- package/dist/capabilities/index.d.ts.map +1 -1
- package/dist/capabilities/index.js +1 -1
- package/dist/capabilities/index.js.map +1 -1
- package/dist/capabilities/orchestrationCapability.d.ts.map +1 -1
- package/dist/capabilities/orchestrationCapability.js +107 -62
- package/dist/capabilities/orchestrationCapability.js.map +1 -1
- package/dist/core/iMessageVerification.d.ts +1 -1
- package/dist/core/infrastructureTemplates.d.ts +1 -1
- package/dist/core/infrastructureTemplates.js +5 -5
- package/dist/core/infrastructureTemplates.js.map +1 -1
- package/dist/core/persistentObjectiveStore.d.ts +13 -1
- package/dist/core/persistentObjectiveStore.d.ts.map +1 -1
- package/dist/core/persistentObjectiveStore.js.map +1 -1
- package/dist/core/securityDeliverableGenerator.d.ts +1 -1
- package/dist/core/securityDeliverableGenerator.d.ts.map +1 -1
- package/dist/core/securityDeliverableGenerator.js +3 -3
- package/dist/core/securityDeliverableGenerator.js.map +1 -1
- package/dist/core/toolRuntime.d.ts.map +1 -1
- package/dist/core/toolRuntime.js +11 -5
- package/dist/core/toolRuntime.js.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/unifiedOrchestrator.d.ts +265 -77
- package/dist/core/unifiedOrchestrator.d.ts.map +1 -1
- package/dist/core/unifiedOrchestrator.js +915 -254
- package/dist/core/unifiedOrchestrator.js.map +1 -1
- package/dist/providers/anthropicProvider.d.ts +1 -1
- package/dist/shell/interactiveShell.d.ts +1 -1
- package/dist/shell/interactiveShell.d.ts.map +1 -1
- package/dist/shell/interactiveShell.js +188 -207
- package/dist/shell/interactiveShell.js.map +1 -1
- package/dist/tools/tao/rl.js +1 -1
- package/dist/tools/tao/rl.js.map +1 -1
- package/dist/tools/taoTools.js +5 -5
- package/dist/tools/taoTools.js.map +1 -1
- package/package.json +1 -1
- package/dist/capabilities/unifiedInvestigationCapability.d.ts +0 -22
- package/dist/capabilities/unifiedInvestigationCapability.d.ts.map +0 -1
- package/dist/capabilities/unifiedInvestigationCapability.js +0 -41
- package/dist/capabilities/unifiedInvestigationCapability.js.map +0 -1
- package/dist/core/agentOrchestrator.d.ts +0 -400
- package/dist/core/agentOrchestrator.d.ts.map +0 -1
- package/dist/core/agentOrchestrator.js +0 -2133
- package/dist/core/agentOrchestrator.js.map +0 -1
- package/dist/core/autoExecutionOrchestrator.d.ts +0 -172
- package/dist/core/autoExecutionOrchestrator.d.ts.map +0 -1
- package/dist/core/autoExecutionOrchestrator.js +0 -591
- package/dist/core/autoExecutionOrchestrator.js.map +0 -1
- package/dist/core/dualAgentOrchestrator.d.ts +0 -34
- package/dist/core/dualAgentOrchestrator.d.ts.map +0 -1
- package/dist/core/dualAgentOrchestrator.js +0 -94
- package/dist/core/dualAgentOrchestrator.js.map +0 -1
- package/dist/core/failureRecovery.d.ts +0 -26
- package/dist/core/failureRecovery.d.ts.map +0 -1
- package/dist/core/failureRecovery.js +0 -54
- package/dist/core/failureRecovery.js.map +0 -1
- package/dist/core/intelligentTestFlows.d.ts +0 -45
- package/dist/core/intelligentTestFlows.d.ts.map +0 -1
- package/dist/core/intelligentTestFlows.js +0 -25
- package/dist/core/intelligentTestFlows.js.map +0 -1
- package/dist/core/learningPersistence.d.ts +0 -58
- package/dist/core/learningPersistence.d.ts.map +0 -1
- package/dist/core/learningPersistence.js +0 -46
- package/dist/core/learningPersistence.js.map +0 -1
- package/dist/core/metricsTracker.d.ts +0 -40
- package/dist/core/metricsTracker.d.ts.map +0 -1
- package/dist/core/metricsTracker.js +0 -83
- package/dist/core/metricsTracker.js.map +0 -1
- package/dist/core/orchestration.d.ts +0 -534
- package/dist/core/orchestration.d.ts.map +0 -1
- package/dist/core/orchestration.js +0 -2009
- package/dist/core/orchestration.js.map +0 -1
- package/dist/core/performanceMonitor.d.ts +0 -30
- package/dist/core/performanceMonitor.d.ts.map +0 -1
- package/dist/core/performanceMonitor.js +0 -39
- package/dist/core/performanceMonitor.js.map +0 -1
- package/dist/core/selfEvolution.d.ts +0 -61
- package/dist/core/selfEvolution.d.ts.map +0 -1
- package/dist/core/selfEvolution.js +0 -38
- package/dist/core/selfEvolution.js.map +0 -1
- package/dist/core/selfImprovement.d.ts +0 -82
- package/dist/core/selfImprovement.d.ts.map +0 -1
- package/dist/core/selfImprovement.js +0 -25
- package/dist/core/selfImprovement.js.map +0 -1
- package/dist/core/unifiedFraudOrchestrator.d.ts +0 -738
- package/dist/core/unifiedFraudOrchestrator.d.ts.map +0 -1
- package/dist/core/unifiedFraudOrchestrator.js +0 -3312
- package/dist/core/unifiedFraudOrchestrator.js.map +0 -1
- package/dist/core/unifiedRealOrchestrator.d.ts +0 -126
- package/dist/core/unifiedRealOrchestrator.d.ts.map +0 -1
- package/dist/core/unifiedRealOrchestrator.js +0 -475
- package/dist/core/unifiedRealOrchestrator.js.map +0 -1
- package/dist/core/userDefenseOrchestrator.d.ts +0 -202
- package/dist/core/userDefenseOrchestrator.d.ts.map +0 -1
- package/dist/core/userDefenseOrchestrator.js +0 -1006
- package/dist/core/userDefenseOrchestrator.js.map +0 -1
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.d.ts +0 -3
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.js +0 -14
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.js.map +0 -1
- package/dist/tools/frontendTestingTools.d.ts +0 -9
- package/dist/tools/frontendTestingTools.d.ts.map +0 -1
- package/dist/tools/frontendTestingTools.js +0 -291
- package/dist/tools/frontendTestingTools.js.map +0 -1
- package/dist/tools/unifiedInvestigationTools.d.ts +0 -19
- package/dist/tools/unifiedInvestigationTools.d.ts.map +0 -1
- package/dist/tools/unifiedInvestigationTools.js +0 -1163
- package/dist/tools/unifiedInvestigationTools.js.map +0 -1
- package/scripts/human-verification.mjs +0 -380
- package/scripts/isolated-verification-runner.mjs +0 -364
- package/scripts/isolated-verification-wrapper.mjs +0 -276
- package/scripts/verify-task-completion.mjs +0 -143
|
@@ -1,3312 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unified Tech Fraud Investigation Orchestrator
|
|
3
|
-
*
|
|
4
|
-
* Purpose: Coordinate investigation of tech company fraud across multiple vectors:
|
|
5
|
-
* - Apple iMessage PQ3 (key substitution, false E2E claims)
|
|
6
|
-
* - Google Gmail (hidden threads, draft manipulation, unauthorized access)
|
|
7
|
-
* - Google Chrome (browser hijacking, session control, surveillance)
|
|
8
|
-
* - Cross-platform evidence correlation
|
|
9
|
-
*
|
|
10
|
-
* This orchestrator:
|
|
11
|
-
* 1. Manages investigation workflows across multiple targets
|
|
12
|
-
* 2. Correlates evidence across different fraud vectors
|
|
13
|
-
* 3. Detects patterns indicating coordinated manipulation
|
|
14
|
-
* 4. Generates unified legal evidence packages
|
|
15
|
-
* 5. Maintains cryptographic chain of custody
|
|
16
|
-
*/
|
|
17
|
-
import * as crypto from 'node:crypto';
|
|
18
|
-
import * as fs from 'node:fs/promises';
|
|
19
|
-
import * as path from 'node:path';
|
|
20
|
-
import { EventEmitter } from 'node:events';
|
|
21
|
-
import { IntegrityVerificationEngine, hashString, } from './integrityVerification.js';
|
|
22
|
-
import { iMessageVerificationEngine, APPLE_PQ3_CLAIMS, } from './iMessageVerification.js';
|
|
23
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
|
-
// Google Security Claims (like Apple PQ3 claims)
|
|
25
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
-
export const GOOGLE_GMAIL_CLAIMS = {
|
|
27
|
-
user_control: {
|
|
28
|
-
claim: "You're in control of your data in Gmail. You can export and delete your data anytime.",
|
|
29
|
-
source: 'https://safety.google/gmail/',
|
|
30
|
-
verifiable: 'partial',
|
|
31
|
-
reason: 'Cannot verify server-side manipulation of what is shown to user'
|
|
32
|
-
},
|
|
33
|
-
no_email_scanning_for_ads: {
|
|
34
|
-
claim: 'Gmail does not scan or read your emails for advertising purposes.',
|
|
35
|
-
source: 'https://support.google.com/mail/answer/6603',
|
|
36
|
-
verifiable: false,
|
|
37
|
-
reason: 'Closed source server, cannot verify processing'
|
|
38
|
-
},
|
|
39
|
-
confidential_mode: {
|
|
40
|
-
claim: 'Confidential mode helps protect sensitive information from unauthorized access.',
|
|
41
|
-
source: 'https://support.google.com/mail/answer/7674059',
|
|
42
|
-
verifiable: false,
|
|
43
|
-
reason: 'Google retains access to content and revocation keys'
|
|
44
|
-
},
|
|
45
|
-
security_alerts: {
|
|
46
|
-
claim: 'We notify you of suspicious activity on your account.',
|
|
47
|
-
source: 'https://support.google.com/accounts/answer/2590353',
|
|
48
|
-
verifiable: 'partial',
|
|
49
|
-
reason: 'Cannot verify all access is reported; Google-controlled infrastructure'
|
|
50
|
-
},
|
|
51
|
-
search_accuracy: {
|
|
52
|
-
claim: 'Search in Gmail finds all matching messages in your mailbox.',
|
|
53
|
-
source: 'https://support.google.com/mail/answer/7190',
|
|
54
|
-
verifiable: true,
|
|
55
|
-
reason: 'Can test by cross-referencing with IMAP/Takeout'
|
|
56
|
-
},
|
|
57
|
-
draft_integrity: {
|
|
58
|
-
claim: 'Drafts are saved automatically and preserved until you delete or send them.',
|
|
59
|
-
source: 'https://support.google.com/mail/answer/7684',
|
|
60
|
-
verifiable: true,
|
|
61
|
-
reason: 'Can monitor draft state over time and detect unauthorized changes'
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
export const GOOGLE_CHROME_CLAIMS = {
|
|
65
|
-
safe_browsing: {
|
|
66
|
-
claim: 'Safe Browsing protects you from dangerous sites and downloads.',
|
|
67
|
-
source: 'https://safebrowsing.google.com/',
|
|
68
|
-
verifiable: 'partial',
|
|
69
|
-
reason: 'Also reports all browsing URLs to Google servers'
|
|
70
|
-
},
|
|
71
|
-
sync_privacy: {
|
|
72
|
-
claim: 'Sync data is encrypted in transit and at rest.',
|
|
73
|
-
source: 'https://support.google.com/chrome/answer/165139',
|
|
74
|
-
verifiable: false,
|
|
75
|
-
reason: 'Google holds encryption keys; can access synced data'
|
|
76
|
-
},
|
|
77
|
-
user_control_history: {
|
|
78
|
-
claim: 'You can view and delete your browsing history at any time.',
|
|
79
|
-
source: 'https://support.google.com/chrome/answer/95589',
|
|
80
|
-
verifiable: 'partial',
|
|
81
|
-
reason: 'Cannot verify server-side retention after "deletion"'
|
|
82
|
-
},
|
|
83
|
-
no_unauthorized_access: {
|
|
84
|
-
claim: 'Chrome only accesses your data when you explicitly use a Google service.',
|
|
85
|
-
source: 'https://www.google.com/chrome/privacy/',
|
|
86
|
-
verifiable: true,
|
|
87
|
-
reason: 'Can monitor Chrome process network activity and launches'
|
|
88
|
-
},
|
|
89
|
-
extension_security: {
|
|
90
|
-
claim: 'Extensions must request permissions and users can control what extensions access.',
|
|
91
|
-
source: 'https://support.google.com/chrome_webstore/answer/2664769',
|
|
92
|
-
verifiable: 'partial',
|
|
93
|
-
reason: 'Cannot verify extension behavior matches stated permissions'
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
97
|
-
// GMAIL INVESTIGATION ENGINE
|
|
98
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
99
|
-
export class GmailInvestigationEngine {
|
|
100
|
-
storageDir;
|
|
101
|
-
threadObservations = new Map();
|
|
102
|
-
draftObservations = new Map();
|
|
103
|
-
filterObservations = [];
|
|
104
|
-
accessLogs = [];
|
|
105
|
-
findings = [];
|
|
106
|
-
constructor(storageDir) {
|
|
107
|
-
this.storageDir = path.join(storageDir, 'gmail-investigation');
|
|
108
|
-
}
|
|
109
|
-
async initialize() {
|
|
110
|
-
await fs.mkdir(this.storageDir, { recursive: true });
|
|
111
|
-
await fs.mkdir(path.join(this.storageDir, 'threads'), { recursive: true });
|
|
112
|
-
await fs.mkdir(path.join(this.storageDir, 'drafts'), { recursive: true });
|
|
113
|
-
await fs.mkdir(path.join(this.storageDir, 'filters'), { recursive: true });
|
|
114
|
-
await fs.mkdir(path.join(this.storageDir, 'access'), { recursive: true });
|
|
115
|
-
await fs.mkdir(path.join(this.storageDir, 'findings'), { recursive: true });
|
|
116
|
-
}
|
|
117
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
118
|
-
// Thread Monitoring (Hidden Threads Detection)
|
|
119
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
120
|
-
/**
|
|
121
|
-
* Record observation of Gmail threads.
|
|
122
|
-
* Compare with previous observations to detect hidden threads.
|
|
123
|
-
*
|
|
124
|
-
* Detection methods:
|
|
125
|
-
* 1. Compare UI-visible threads vs API-returned threads
|
|
126
|
-
* 2. Compare search results vs direct thread access
|
|
127
|
-
* 3. Compare current state vs Google Takeout export
|
|
128
|
-
* 4. Monitor for threads that disappear from search but still exist
|
|
129
|
-
*/
|
|
130
|
-
async recordThreadObservation(params) {
|
|
131
|
-
const now = new Date().toISOString();
|
|
132
|
-
const observation = {
|
|
133
|
-
id: crypto.randomUUID(),
|
|
134
|
-
timestamp: now,
|
|
135
|
-
...params,
|
|
136
|
-
hash: '',
|
|
137
|
-
};
|
|
138
|
-
observation.hash = hashString(JSON.stringify({
|
|
139
|
-
id: observation.id,
|
|
140
|
-
timestamp: observation.timestamp,
|
|
141
|
-
threadId: observation.threadId,
|
|
142
|
-
messageIds: observation.messageIds,
|
|
143
|
-
isVisible: observation.isVisible,
|
|
144
|
-
isInSearch: observation.isInSearch,
|
|
145
|
-
}));
|
|
146
|
-
// Get previous observations for this thread
|
|
147
|
-
const previous = this.threadObservations.get(params.threadId) || [];
|
|
148
|
-
const lastObs = previous[previous.length - 1];
|
|
149
|
-
let anomalyDetected = false;
|
|
150
|
-
let finding;
|
|
151
|
-
// Check for anomalies
|
|
152
|
-
if (lastObs) {
|
|
153
|
-
// Thread was visible, now hidden
|
|
154
|
-
if (lastObs.isVisible && !params.isVisible) {
|
|
155
|
-
anomalyDetected = true;
|
|
156
|
-
finding = await this.createFinding({
|
|
157
|
-
vector: 'gmail_hidden_threads',
|
|
158
|
-
severity: 'high',
|
|
159
|
-
title: `Thread hidden: "${params.subject}"`,
|
|
160
|
-
description: `Thread ${params.threadId} was visible in previous observation but is now hidden. This may indicate manipulation by Google to hide communications from the user.`,
|
|
161
|
-
technicalDetails: {
|
|
162
|
-
threadId: params.threadId,
|
|
163
|
-
previouslyVisible: true,
|
|
164
|
-
currentlyVisible: false,
|
|
165
|
-
wasInSearch: lastObs.isInSearch,
|
|
166
|
-
nowInSearch: params.isInSearch,
|
|
167
|
-
timeSinceLastObservation: new Date(now).getTime() - new Date(lastObs.timestamp).getTime(),
|
|
168
|
-
},
|
|
169
|
-
evidenceIds: [lastObs.id, observation.id],
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
// Thread was in search, now excluded
|
|
173
|
-
if (lastObs.isInSearch && !params.isInSearch && params.isVisible) {
|
|
174
|
-
anomalyDetected = true;
|
|
175
|
-
finding = finding || await this.createFinding({
|
|
176
|
-
vector: 'gmail_hidden_threads',
|
|
177
|
-
severity: 'medium',
|
|
178
|
-
title: `Thread excluded from search: "${params.subject}"`,
|
|
179
|
-
description: `Thread ${params.threadId} is visible but no longer appears in search results. Google may be suppressing this thread from discovery.`,
|
|
180
|
-
technicalDetails: {
|
|
181
|
-
threadId: params.threadId,
|
|
182
|
-
visible: true,
|
|
183
|
-
excludedFromSearch: true,
|
|
184
|
-
},
|
|
185
|
-
evidenceIds: [lastObs.id, observation.id],
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
// Messages disappeared from thread
|
|
189
|
-
const missingMessages = lastObs.messageIds.filter(id => !params.messageIds.includes(id));
|
|
190
|
-
if (missingMessages.length > 0) {
|
|
191
|
-
anomalyDetected = true;
|
|
192
|
-
finding = finding || await this.createFinding({
|
|
193
|
-
vector: 'gmail_hidden_threads',
|
|
194
|
-
severity: 'critical',
|
|
195
|
-
title: `Messages removed from thread: "${params.subject}"`,
|
|
196
|
-
description: `${missingMessages.length} messages have been removed from thread ${params.threadId} without user action.`,
|
|
197
|
-
technicalDetails: {
|
|
198
|
-
threadId: params.threadId,
|
|
199
|
-
missingMessageIds: missingMessages,
|
|
200
|
-
previousMessageCount: lastObs.messageIds.length,
|
|
201
|
-
currentMessageCount: params.messageIds.length,
|
|
202
|
-
},
|
|
203
|
-
evidenceIds: [lastObs.id, observation.id],
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
// Inconsistency: exists but not visible and not in search
|
|
208
|
-
if (!params.isVisible && !params.isInSearch) {
|
|
209
|
-
anomalyDetected = true;
|
|
210
|
-
finding = finding || await this.createFinding({
|
|
211
|
-
vector: 'gmail_hidden_threads',
|
|
212
|
-
severity: 'high',
|
|
213
|
-
title: `Thread completely hidden: "${params.subject}"`,
|
|
214
|
-
description: `Thread ${params.threadId} exists but is neither visible in inbox views nor discoverable via search. This is strong evidence of deliberate hiding.`,
|
|
215
|
-
technicalDetails: {
|
|
216
|
-
threadId: params.threadId,
|
|
217
|
-
captureMethod: params.captureMethod,
|
|
218
|
-
lastMessageDate: params.lastMessageDate,
|
|
219
|
-
},
|
|
220
|
-
evidenceIds: [observation.id],
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
// Store observation
|
|
224
|
-
previous.push(observation);
|
|
225
|
-
this.threadObservations.set(params.threadId, previous);
|
|
226
|
-
await this.persistThreadObservation(observation);
|
|
227
|
-
return { observation, anomalyDetected, finding };
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Compare multiple capture methods to detect discrepancies.
|
|
231
|
-
* If API shows different threads than UI or Takeout, that's manipulation.
|
|
232
|
-
*/
|
|
233
|
-
async crossReferenceThreadSources(params) {
|
|
234
|
-
const allThreadIds = new Set([
|
|
235
|
-
...params.apiThreadIds,
|
|
236
|
-
...params.uiThreadIds,
|
|
237
|
-
...(params.takeoutThreadIds || []),
|
|
238
|
-
...(params.imapThreadIds || []),
|
|
239
|
-
]);
|
|
240
|
-
const discrepancies = [];
|
|
241
|
-
for (const threadId of allThreadIds) {
|
|
242
|
-
const presentIn = [];
|
|
243
|
-
const missingFrom = [];
|
|
244
|
-
if (params.apiThreadIds.includes(threadId))
|
|
245
|
-
presentIn.push('api');
|
|
246
|
-
else
|
|
247
|
-
missingFrom.push('api');
|
|
248
|
-
if (params.uiThreadIds.includes(threadId))
|
|
249
|
-
presentIn.push('ui');
|
|
250
|
-
else
|
|
251
|
-
missingFrom.push('ui');
|
|
252
|
-
if (params.takeoutThreadIds?.includes(threadId))
|
|
253
|
-
presentIn.push('takeout');
|
|
254
|
-
else if (params.takeoutThreadIds)
|
|
255
|
-
missingFrom.push('takeout');
|
|
256
|
-
if (params.imapThreadIds?.includes(threadId))
|
|
257
|
-
presentIn.push('imap');
|
|
258
|
-
else if (params.imapThreadIds)
|
|
259
|
-
missingFrom.push('imap');
|
|
260
|
-
if (missingFrom.length > 0 && presentIn.length > 0) {
|
|
261
|
-
let implication = '';
|
|
262
|
-
if (missingFrom.includes('ui') && presentIn.includes('api')) {
|
|
263
|
-
implication = 'Thread exists but is hidden from user interface - deliberate UI manipulation';
|
|
264
|
-
}
|
|
265
|
-
else if (missingFrom.includes('api') && presentIn.includes('takeout')) {
|
|
266
|
-
implication = 'Thread in export but not in API - potential retroactive hiding';
|
|
267
|
-
}
|
|
268
|
-
else if (presentIn.includes('imap') && missingFrom.includes('ui')) {
|
|
269
|
-
implication = 'Thread accessible via IMAP but hidden in webmail - selective hiding';
|
|
270
|
-
}
|
|
271
|
-
discrepancies.push({ threadId, presentIn, missingFrom, implication });
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
let finding;
|
|
275
|
-
if (discrepancies.length > 0) {
|
|
276
|
-
finding = await this.createFinding({
|
|
277
|
-
vector: 'gmail_hidden_threads',
|
|
278
|
-
severity: discrepancies.length > 5 ? 'critical' : 'high',
|
|
279
|
-
title: `Cross-reference reveals ${discrepancies.length} hidden threads`,
|
|
280
|
-
description: `Comparison of Gmail data sources reveals threads that exist in some views but are hidden from others. This is direct evidence of selective content manipulation.`,
|
|
281
|
-
technicalDetails: {
|
|
282
|
-
discrepancyCount: discrepancies.length,
|
|
283
|
-
discrepancies,
|
|
284
|
-
sourcesCrossReferenced: ['api', 'ui', params.takeoutThreadIds ? 'takeout' : null, params.imapThreadIds ? 'imap' : null].filter(Boolean),
|
|
285
|
-
},
|
|
286
|
-
evidenceIds: [],
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
return { discrepancies, finding };
|
|
290
|
-
}
|
|
291
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
292
|
-
// Draft Monitoring (Draft Manipulation Detection)
|
|
293
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
294
|
-
/**
|
|
295
|
-
* Record observation of a draft.
|
|
296
|
-
* Detect unauthorized modifications, deletions, or sends.
|
|
297
|
-
*/
|
|
298
|
-
async recordDraftObservation(params) {
|
|
299
|
-
const now = new Date().toISOString();
|
|
300
|
-
const bodyHash = hashString(params.bodyContent);
|
|
301
|
-
const observation = {
|
|
302
|
-
id: crypto.randomUUID(),
|
|
303
|
-
timestamp: now,
|
|
304
|
-
draftId: params.draftId,
|
|
305
|
-
threadId: params.threadId,
|
|
306
|
-
subject: params.subject,
|
|
307
|
-
recipientCount: params.recipientCount,
|
|
308
|
-
bodyHash,
|
|
309
|
-
bodyLength: params.bodyContent.length,
|
|
310
|
-
hasAttachments: params.hasAttachments,
|
|
311
|
-
createdAt: params.createdAt,
|
|
312
|
-
modifiedAt: params.modifiedAt,
|
|
313
|
-
captureMethod: params.captureMethod,
|
|
314
|
-
hash: '',
|
|
315
|
-
};
|
|
316
|
-
// Get previous observations
|
|
317
|
-
const previous = this.draftObservations.get(params.draftId) || [];
|
|
318
|
-
const lastObs = previous[previous.length - 1];
|
|
319
|
-
const changes = [];
|
|
320
|
-
if (lastObs) {
|
|
321
|
-
observation.previousObservationId = lastObs.id;
|
|
322
|
-
// Check for content changes
|
|
323
|
-
if (lastObs.bodyHash !== bodyHash) {
|
|
324
|
-
const wasUserModified = new Date(params.modifiedAt) > new Date(lastObs.timestamp);
|
|
325
|
-
changes.push({
|
|
326
|
-
type: 'content_changed',
|
|
327
|
-
field: 'body',
|
|
328
|
-
previousValue: `hash:${lastObs.bodyHash.slice(0, 16)}... (${lastObs.bodyLength} chars)`,
|
|
329
|
-
newValue: `hash:${bodyHash.slice(0, 16)}... (${params.bodyContent.length} chars)`,
|
|
330
|
-
userInitiated: wasUserModified, // heuristic - needs better detection
|
|
331
|
-
suspicionLevel: wasUserModified ? 'normal' : 'highly_suspicious',
|
|
332
|
-
reason: wasUserModified ? 'Draft modified' : 'Draft content changed without user modification timestamp update',
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
// Check for subject changes
|
|
336
|
-
if (lastObs.subject !== params.subject) {
|
|
337
|
-
changes.push({
|
|
338
|
-
type: 'modified',
|
|
339
|
-
field: 'subject',
|
|
340
|
-
previousValue: lastObs.subject,
|
|
341
|
-
newValue: params.subject,
|
|
342
|
-
userInitiated: false, // cannot determine
|
|
343
|
-
suspicionLevel: 'suspicious',
|
|
344
|
-
reason: 'Subject line changed',
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
// Check for recipient changes
|
|
348
|
-
if (lastObs.recipientCount !== params.recipientCount) {
|
|
349
|
-
changes.push({
|
|
350
|
-
type: 'modified',
|
|
351
|
-
field: 'recipients',
|
|
352
|
-
previousValue: String(lastObs.recipientCount),
|
|
353
|
-
newValue: String(params.recipientCount),
|
|
354
|
-
userInitiated: false,
|
|
355
|
-
suspicionLevel: params.recipientCount > lastObs.recipientCount ? 'highly_suspicious' : 'suspicious',
|
|
356
|
-
reason: params.recipientCount > lastObs.recipientCount
|
|
357
|
-
? 'Recipients ADDED to draft without user action'
|
|
358
|
-
: 'Recipients changed',
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
observation.changes = changes.length > 0 ? changes : undefined;
|
|
363
|
-
observation.hash = hashString(JSON.stringify({
|
|
364
|
-
id: observation.id,
|
|
365
|
-
timestamp: observation.timestamp,
|
|
366
|
-
draftId: observation.draftId,
|
|
367
|
-
bodyHash: observation.bodyHash,
|
|
368
|
-
modifiedAt: observation.modifiedAt,
|
|
369
|
-
}));
|
|
370
|
-
// Store observation
|
|
371
|
-
previous.push(observation);
|
|
372
|
-
this.draftObservations.set(params.draftId, previous);
|
|
373
|
-
await this.persistDraftObservation(observation);
|
|
374
|
-
// Generate finding if suspicious changes detected
|
|
375
|
-
let finding;
|
|
376
|
-
const suspiciousChanges = changes.filter(c => c.suspicionLevel !== 'normal');
|
|
377
|
-
if (suspiciousChanges.length > 0) {
|
|
378
|
-
finding = await this.createFinding({
|
|
379
|
-
vector: 'gmail_draft_manipulation',
|
|
380
|
-
severity: suspiciousChanges.some(c => c.suspicionLevel === 'highly_suspicious') ? 'critical' : 'high',
|
|
381
|
-
title: `Draft manipulated: "${params.subject}"`,
|
|
382
|
-
description: `Draft ${params.draftId} has been modified without clear user action. ${suspiciousChanges.map(c => c.reason).join('; ')}`,
|
|
383
|
-
technicalDetails: {
|
|
384
|
-
draftId: params.draftId,
|
|
385
|
-
changes: suspiciousChanges,
|
|
386
|
-
previousObservationId: lastObs?.id,
|
|
387
|
-
},
|
|
388
|
-
evidenceIds: lastObs ? [lastObs.id, observation.id] : [observation.id],
|
|
389
|
-
});
|
|
390
|
-
}
|
|
391
|
-
return { observation, changes, finding };
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Detect drafts that were sent without user action.
|
|
395
|
-
* This is a critical fraud indicator.
|
|
396
|
-
*/
|
|
397
|
-
async detectUnauthorizedDraftSend(params) {
|
|
398
|
-
const draftObs = this.draftObservations.get(params.draftId);
|
|
399
|
-
const lastDraftState = draftObs?.[draftObs.length - 1];
|
|
400
|
-
const finding = await this.createFinding({
|
|
401
|
-
vector: 'gmail_draft_manipulation',
|
|
402
|
-
severity: 'critical',
|
|
403
|
-
title: `Draft sent without user action: "${lastDraftState?.subject || params.draftId}"`,
|
|
404
|
-
description: `Draft ${params.draftId} was sent at ${params.sentAt} without user initiation. User active: ${params.userWasActive}. This is unauthorized use of the user's email account.`,
|
|
405
|
-
technicalDetails: {
|
|
406
|
-
draftId: params.draftId,
|
|
407
|
-
sentMessageId: params.sentMessageId,
|
|
408
|
-
sentAt: params.sentAt,
|
|
409
|
-
userWasActive: params.userWasActive,
|
|
410
|
-
userLocation: params.userLocation,
|
|
411
|
-
sendingIp: params.sendingIp,
|
|
412
|
-
lastKnownDraftState: lastDraftState ? {
|
|
413
|
-
subject: lastDraftState.subject,
|
|
414
|
-
bodyHash: lastDraftState.bodyHash,
|
|
415
|
-
recipientCount: lastDraftState.recipientCount,
|
|
416
|
-
lastModified: lastDraftState.modifiedAt,
|
|
417
|
-
} : null,
|
|
418
|
-
},
|
|
419
|
-
evidenceIds: draftObs?.map(o => o.id) || [],
|
|
420
|
-
});
|
|
421
|
-
return finding;
|
|
422
|
-
}
|
|
423
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
424
|
-
// Access Monitoring
|
|
425
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
426
|
-
/**
|
|
427
|
-
* Record account access and detect unauthorized access.
|
|
428
|
-
*/
|
|
429
|
-
async recordAccessLog(params) {
|
|
430
|
-
const now = new Date().toISOString();
|
|
431
|
-
// Determine if suspicious
|
|
432
|
-
let suspicious = false;
|
|
433
|
-
let reason;
|
|
434
|
-
if (!params.wasUser) {
|
|
435
|
-
suspicious = true;
|
|
436
|
-
reason = 'Access not initiated by user';
|
|
437
|
-
}
|
|
438
|
-
// Check for Google internal IPs (they access accounts for "security")
|
|
439
|
-
if (params.ipAddress.startsWith('172.217.') ||
|
|
440
|
-
params.ipAddress.startsWith('142.250.') ||
|
|
441
|
-
params.ipAddress.startsWith('74.125.')) {
|
|
442
|
-
suspicious = true;
|
|
443
|
-
reason = 'Access from Google infrastructure IP';
|
|
444
|
-
}
|
|
445
|
-
const log = {
|
|
446
|
-
id: crypto.randomUUID(),
|
|
447
|
-
timestamp: now,
|
|
448
|
-
accessType: params.accessType,
|
|
449
|
-
ipAddress: params.ipAddress,
|
|
450
|
-
location: params.location,
|
|
451
|
-
userAgent: params.userAgent,
|
|
452
|
-
deviceType: params.deviceType,
|
|
453
|
-
wasUser: params.wasUser,
|
|
454
|
-
suspicious,
|
|
455
|
-
reason,
|
|
456
|
-
hash: '',
|
|
457
|
-
};
|
|
458
|
-
log.hash = hashString(JSON.stringify({
|
|
459
|
-
id: log.id,
|
|
460
|
-
timestamp: log.timestamp,
|
|
461
|
-
accessType: log.accessType,
|
|
462
|
-
ipAddress: log.ipAddress,
|
|
463
|
-
wasUser: log.wasUser,
|
|
464
|
-
}));
|
|
465
|
-
this.accessLogs.push(log);
|
|
466
|
-
await this.persistAccessLog(log);
|
|
467
|
-
let finding;
|
|
468
|
-
if (suspicious) {
|
|
469
|
-
finding = await this.createFinding({
|
|
470
|
-
vector: 'gmail_unauthorized_access',
|
|
471
|
-
severity: 'high',
|
|
472
|
-
title: `Unauthorized account access detected`,
|
|
473
|
-
description: `Gmail account accessed ${params.wasUser ? 'without user initiation' : 'from Google infrastructure'}. ${reason}`,
|
|
474
|
-
technicalDetails: {
|
|
475
|
-
accessType: params.accessType,
|
|
476
|
-
ipAddress: params.ipAddress,
|
|
477
|
-
location: params.location,
|
|
478
|
-
userAgent: params.userAgent,
|
|
479
|
-
},
|
|
480
|
-
evidenceIds: [log.id],
|
|
481
|
-
});
|
|
482
|
-
}
|
|
483
|
-
return { log, finding };
|
|
484
|
-
}
|
|
485
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
486
|
-
// Filter Monitoring
|
|
487
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
488
|
-
/**
|
|
489
|
-
* Record and detect unauthorized Gmail filters.
|
|
490
|
-
* Google could add filters to hide specific emails.
|
|
491
|
-
*/
|
|
492
|
-
async recordFilterObservation(params) {
|
|
493
|
-
const now = new Date().toISOString();
|
|
494
|
-
const observation = {
|
|
495
|
-
id: crypto.randomUUID(),
|
|
496
|
-
timestamp: now,
|
|
497
|
-
filterId: params.filterId,
|
|
498
|
-
criteria: params.criteria,
|
|
499
|
-
actions: params.actions,
|
|
500
|
-
createdByUser: params.createdByUser,
|
|
501
|
-
createdAt: params.createdAt,
|
|
502
|
-
hash: '',
|
|
503
|
-
};
|
|
504
|
-
observation.hash = hashString(JSON.stringify({
|
|
505
|
-
id: observation.id,
|
|
506
|
-
filterId: observation.filterId,
|
|
507
|
-
criteria: observation.criteria,
|
|
508
|
-
actions: observation.actions,
|
|
509
|
-
}));
|
|
510
|
-
this.filterObservations.push(observation);
|
|
511
|
-
await this.persistFilterObservation(observation);
|
|
512
|
-
let finding;
|
|
513
|
-
// Suspicious filter patterns
|
|
514
|
-
const isSuspicious = !params.createdByUser ||
|
|
515
|
-
(params.actions.delete && !params.createdByUser) ||
|
|
516
|
-
(params.actions.skipInbox && params.actions.markRead) ||
|
|
517
|
-
params.actions.forward;
|
|
518
|
-
if (isSuspicious) {
|
|
519
|
-
finding = await this.createFinding({
|
|
520
|
-
vector: 'gmail_filter_tampering',
|
|
521
|
-
severity: params.actions.delete ? 'critical' : 'high',
|
|
522
|
-
title: `Suspicious filter detected`,
|
|
523
|
-
description: `Filter ${params.filterId} was ${params.createdByUser ? 'created' : 'NOT created'} by user. Actions: ${JSON.stringify(params.actions)}. Criteria: ${JSON.stringify(params.criteria)}`,
|
|
524
|
-
technicalDetails: {
|
|
525
|
-
filterId: params.filterId,
|
|
526
|
-
criteria: params.criteria,
|
|
527
|
-
actions: params.actions,
|
|
528
|
-
createdByUser: params.createdByUser,
|
|
529
|
-
},
|
|
530
|
-
evidenceIds: [observation.id],
|
|
531
|
-
});
|
|
532
|
-
}
|
|
533
|
-
return { observation, finding };
|
|
534
|
-
}
|
|
535
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
536
|
-
// Persistence
|
|
537
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
538
|
-
async persistThreadObservation(obs) {
|
|
539
|
-
const filePath = path.join(this.storageDir, 'threads', `${obs.threadId}_${obs.id}.json`);
|
|
540
|
-
await fs.writeFile(filePath, JSON.stringify(obs, null, 2));
|
|
541
|
-
}
|
|
542
|
-
async persistDraftObservation(obs) {
|
|
543
|
-
const filePath = path.join(this.storageDir, 'drafts', `${obs.draftId}_${obs.id}.json`);
|
|
544
|
-
await fs.writeFile(filePath, JSON.stringify(obs, null, 2));
|
|
545
|
-
}
|
|
546
|
-
async persistAccessLog(log) {
|
|
547
|
-
const filePath = path.join(this.storageDir, 'access', `${log.id}.json`);
|
|
548
|
-
await fs.writeFile(filePath, JSON.stringify(log, null, 2));
|
|
549
|
-
}
|
|
550
|
-
async persistFilterObservation(obs) {
|
|
551
|
-
const filePath = path.join(this.storageDir, 'filters', `${obs.filterId}_${obs.id}.json`);
|
|
552
|
-
await fs.writeFile(filePath, JSON.stringify(obs, null, 2));
|
|
553
|
-
}
|
|
554
|
-
async createFinding(params) {
|
|
555
|
-
const finding = {
|
|
556
|
-
id: crypto.randomUUID(),
|
|
557
|
-
timestamp: new Date().toISOString(),
|
|
558
|
-
vector: params.vector,
|
|
559
|
-
severity: params.severity,
|
|
560
|
-
title: params.title,
|
|
561
|
-
description: params.description,
|
|
562
|
-
technicalDetails: params.technicalDetails,
|
|
563
|
-
evidenceIds: params.evidenceIds,
|
|
564
|
-
legalImplications: this.getLegalImplications(params.vector, params.severity),
|
|
565
|
-
hash: '',
|
|
566
|
-
};
|
|
567
|
-
finding.hash = hashString(JSON.stringify({
|
|
568
|
-
id: finding.id,
|
|
569
|
-
timestamp: finding.timestamp,
|
|
570
|
-
vector: finding.vector,
|
|
571
|
-
title: finding.title,
|
|
572
|
-
}));
|
|
573
|
-
this.findings.push(finding);
|
|
574
|
-
await fs.writeFile(path.join(this.storageDir, 'findings', `${finding.id}.json`), JSON.stringify(finding, null, 2));
|
|
575
|
-
return finding;
|
|
576
|
-
}
|
|
577
|
-
getLegalImplications(vector, severity) {
|
|
578
|
-
const implications = {
|
|
579
|
-
gmail_hidden_threads: {
|
|
580
|
-
fraudType: 'DATA_MANIPULATION',
|
|
581
|
-
applicableLaws: [
|
|
582
|
-
'15 U.S.C. § 45 - FTC Act Section 5 (Unfair or Deceptive Practices)',
|
|
583
|
-
'18 U.S.C. § 1030 - Computer Fraud and Abuse Act',
|
|
584
|
-
'18 U.S.C. § 2701 - Stored Communications Act',
|
|
585
|
-
],
|
|
586
|
-
potentialDamages: 'Hidden communications may have caused missed opportunities, damaged relationships, or prevented awareness of important information.',
|
|
587
|
-
recommendations: [
|
|
588
|
-
'Document all hidden threads with timestamps',
|
|
589
|
-
'Export via Google Takeout for comparison',
|
|
590
|
-
'File FTC complaint',
|
|
591
|
-
'Consider class action for pattern of behavior',
|
|
592
|
-
],
|
|
593
|
-
},
|
|
594
|
-
gmail_draft_manipulation: {
|
|
595
|
-
fraudType: 'UNAUTHORIZED_ACCESS',
|
|
596
|
-
applicableLaws: [
|
|
597
|
-
'18 U.S.C. § 1030 - Computer Fraud and Abuse Act',
|
|
598
|
-
'18 U.S.C. § 2511 - Wiretap Act (if communications altered)',
|
|
599
|
-
'18 U.S.C. § 1343 - Wire Fraud',
|
|
600
|
-
],
|
|
601
|
-
potentialDamages: 'Manipulation of drafts could send unauthorized communications, damage reputation, or expose confidential information.',
|
|
602
|
-
recommendations: [
|
|
603
|
-
'Preserve all draft observation evidence',
|
|
604
|
-
'Document timeline of changes',
|
|
605
|
-
'File complaint with state AG',
|
|
606
|
-
],
|
|
607
|
-
},
|
|
608
|
-
gmail_unauthorized_access: {
|
|
609
|
-
fraudType: 'UNAUTHORIZED_ACCESS',
|
|
610
|
-
applicableLaws: [
|
|
611
|
-
'18 U.S.C. § 1030 - Computer Fraud and Abuse Act',
|
|
612
|
-
'18 U.S.C. § 2701 - Stored Communications Act',
|
|
613
|
-
'Cal. Penal Code § 502 - Computer Crimes',
|
|
614
|
-
],
|
|
615
|
-
potentialDamages: 'Unauthorized access enables surveillance, data theft, and manipulation of user communications.',
|
|
616
|
-
recommendations: [
|
|
617
|
-
'Document all access logs',
|
|
618
|
-
'Enable additional security measures',
|
|
619
|
-
'File with FBI IC3 if pattern detected',
|
|
620
|
-
],
|
|
621
|
-
},
|
|
622
|
-
gmail_filter_tampering: {
|
|
623
|
-
fraudType: 'DATA_MANIPULATION',
|
|
624
|
-
applicableLaws: [
|
|
625
|
-
'15 U.S.C. § 45 - FTC Act Section 5',
|
|
626
|
-
'18 U.S.C. § 1030 - CFAA',
|
|
627
|
-
],
|
|
628
|
-
potentialDamages: 'Unauthorized filters can hide important communications, delete evidence, or forward sensitive data.',
|
|
629
|
-
recommendations: [
|
|
630
|
-
'Document all filters and creation dates',
|
|
631
|
-
'Remove unauthorized filters',
|
|
632
|
-
'Monitor for re-creation',
|
|
633
|
-
],
|
|
634
|
-
},
|
|
635
|
-
};
|
|
636
|
-
return implications[vector] || {
|
|
637
|
-
fraudType: 'UNKNOWN',
|
|
638
|
-
applicableLaws: ['15 U.S.C. § 45 - FTC Act Section 5'],
|
|
639
|
-
potentialDamages: 'To be determined based on specific circumstances.',
|
|
640
|
-
recommendations: ['Document all evidence', 'Consult legal counsel'],
|
|
641
|
-
};
|
|
642
|
-
}
|
|
643
|
-
getFindings() {
|
|
644
|
-
return [...this.findings];
|
|
645
|
-
}
|
|
646
|
-
getThreadObservations(threadId) {
|
|
647
|
-
return this.threadObservations.get(threadId) || [];
|
|
648
|
-
}
|
|
649
|
-
getDraftObservations(draftId) {
|
|
650
|
-
return this.draftObservations.get(draftId) || [];
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
654
|
-
// CHROME INVESTIGATION ENGINE
|
|
655
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
656
|
-
export class ChromeInvestigationEngine {
|
|
657
|
-
storageDir;
|
|
658
|
-
processObservations = [];
|
|
659
|
-
sessionObservations = new Map();
|
|
660
|
-
historyObservations = [];
|
|
661
|
-
findings = [];
|
|
662
|
-
constructor(storageDir) {
|
|
663
|
-
this.storageDir = path.join(storageDir, 'chrome-investigation');
|
|
664
|
-
}
|
|
665
|
-
async initialize() {
|
|
666
|
-
await fs.mkdir(this.storageDir, { recursive: true });
|
|
667
|
-
await fs.mkdir(path.join(this.storageDir, 'processes'), { recursive: true });
|
|
668
|
-
await fs.mkdir(path.join(this.storageDir, 'sessions'), { recursive: true });
|
|
669
|
-
await fs.mkdir(path.join(this.storageDir, 'history'), { recursive: true });
|
|
670
|
-
await fs.mkdir(path.join(this.storageDir, 'findings'), { recursive: true });
|
|
671
|
-
}
|
|
672
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
673
|
-
// Process Monitoring (Unauthorized Launch Detection)
|
|
674
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
675
|
-
/**
|
|
676
|
-
* Record Chrome process observation.
|
|
677
|
-
* Detect unauthorized browser launches.
|
|
678
|
-
*/
|
|
679
|
-
async recordProcessObservation(params) {
|
|
680
|
-
const now = new Date().toISOString();
|
|
681
|
-
// Analyze launch source
|
|
682
|
-
let launchSource = 'unknown';
|
|
683
|
-
let suspicionLevel = 'normal';
|
|
684
|
-
let reason;
|
|
685
|
-
// Check command line for suspicious flags
|
|
686
|
-
const cmdLine = params.commandLine.join(' ').toLowerCase();
|
|
687
|
-
if (cmdLine.includes('--remote-debugging') ||
|
|
688
|
-
cmdLine.includes('--headless') ||
|
|
689
|
-
cmdLine.includes('--disable-gpu') && cmdLine.includes('--no-sandbox')) {
|
|
690
|
-
launchSource = 'script';
|
|
691
|
-
suspicionLevel = 'suspicious';
|
|
692
|
-
reason = 'Automation/debugging flags detected';
|
|
693
|
-
}
|
|
694
|
-
if (cmdLine.includes('--user-data-dir=/tmp') ||
|
|
695
|
-
cmdLine.includes('--user-data-dir=/var')) {
|
|
696
|
-
suspicionLevel = 'highly_suspicious';
|
|
697
|
-
reason = 'Temporary profile directory - likely automated session';
|
|
698
|
-
}
|
|
699
|
-
if (!params.userInitiated) {
|
|
700
|
-
suspicionLevel = suspicionLevel === 'normal' ? 'suspicious' : 'highly_suspicious';
|
|
701
|
-
reason = (reason ? reason + '; ' : '') + 'Not user-initiated';
|
|
702
|
-
launchSource = 'remote';
|
|
703
|
-
}
|
|
704
|
-
// Check for Google remote connections
|
|
705
|
-
const googleConnections = params.networkConnections?.filter(c => c.remoteIp.startsWith('172.217.') ||
|
|
706
|
-
c.remoteIp.startsWith('142.250.') ||
|
|
707
|
-
c.remoteIp.startsWith('74.125.')) || [];
|
|
708
|
-
if (googleConnections.length > 0 && !params.userInitiated) {
|
|
709
|
-
suspicionLevel = 'highly_suspicious';
|
|
710
|
-
reason = (reason ? reason + '; ' : '') + 'Connections to Google infrastructure without user action';
|
|
711
|
-
}
|
|
712
|
-
const observation = {
|
|
713
|
-
id: crypto.randomUUID(),
|
|
714
|
-
timestamp: now,
|
|
715
|
-
pid: params.pid,
|
|
716
|
-
parentPid: params.parentPid,
|
|
717
|
-
commandLine: params.commandLine,
|
|
718
|
-
profilePath: params.profilePath,
|
|
719
|
-
startTime: params.startTime,
|
|
720
|
-
userInitiated: params.userInitiated,
|
|
721
|
-
launchSource,
|
|
722
|
-
suspicionLevel,
|
|
723
|
-
reason,
|
|
724
|
-
networkConnections: params.networkConnections,
|
|
725
|
-
hash: '',
|
|
726
|
-
};
|
|
727
|
-
observation.hash = hashString(JSON.stringify({
|
|
728
|
-
id: observation.id,
|
|
729
|
-
pid: observation.pid,
|
|
730
|
-
commandLine: observation.commandLine,
|
|
731
|
-
startTime: observation.startTime,
|
|
732
|
-
userInitiated: observation.userInitiated,
|
|
733
|
-
}));
|
|
734
|
-
this.processObservations.push(observation);
|
|
735
|
-
await this.persistProcessObservation(observation);
|
|
736
|
-
let finding;
|
|
737
|
-
if (suspicionLevel !== 'normal') {
|
|
738
|
-
finding = await this.createFinding({
|
|
739
|
-
vector: 'chrome_unauthorized_launch',
|
|
740
|
-
severity: suspicionLevel === 'highly_suspicious' ? 'critical' : 'high',
|
|
741
|
-
title: 'Unauthorized Chrome launch detected',
|
|
742
|
-
description: `Chrome process ${params.pid} launched without user action. ${reason}`,
|
|
743
|
-
technicalDetails: {
|
|
744
|
-
pid: params.pid,
|
|
745
|
-
parentPid: params.parentPid,
|
|
746
|
-
commandLine: params.commandLine,
|
|
747
|
-
profilePath: params.profilePath,
|
|
748
|
-
startTime: params.startTime,
|
|
749
|
-
launchSource,
|
|
750
|
-
networkConnections: googleConnections,
|
|
751
|
-
},
|
|
752
|
-
evidenceIds: [observation.id],
|
|
753
|
-
});
|
|
754
|
-
}
|
|
755
|
-
return { observation, finding };
|
|
756
|
-
}
|
|
757
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
758
|
-
// Session Monitoring (Session Hijacking Detection)
|
|
759
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
760
|
-
/**
|
|
761
|
-
* Record Chrome session state.
|
|
762
|
-
* Detect session hijacking and unauthorized modifications.
|
|
763
|
-
*/
|
|
764
|
-
async recordSessionObservation(params) {
|
|
765
|
-
const now = new Date().toISOString();
|
|
766
|
-
const anomalies = [];
|
|
767
|
-
// Get previous session state
|
|
768
|
-
const previous = this.sessionObservations.get(params.profileId) || [];
|
|
769
|
-
const lastSession = previous[previous.length - 1];
|
|
770
|
-
if (lastSession) {
|
|
771
|
-
// Check for unexpected tabs
|
|
772
|
-
const newTabs = params.tabs.filter(t => !lastSession.tabs.find(lt => lt.tabId === t.tabId));
|
|
773
|
-
for (const tab of newTabs) {
|
|
774
|
-
// Check if tab URL is suspicious
|
|
775
|
-
if (tab.url.includes('google.com/') &&
|
|
776
|
-
new Date(tab.createdAt) > new Date(lastSession.timestamp)) {
|
|
777
|
-
anomalies.push({
|
|
778
|
-
type: 'unexpected_tab',
|
|
779
|
-
severity: 'medium',
|
|
780
|
-
description: `New tab opened to ${tab.url} without user action`,
|
|
781
|
-
evidence: JSON.stringify(tab),
|
|
782
|
-
});
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
// Check for cookie changes
|
|
786
|
-
const newCookies = params.cookies.filter(c => !lastSession.cookies.find(lc => lc.domain === c.domain && lc.name === c.name && lc.valueHash === c.valueHash));
|
|
787
|
-
const sensitiveDomains = ['accounts.google.com', 'myaccount.google.com', 'mail.google.com'];
|
|
788
|
-
for (const cookie of newCookies) {
|
|
789
|
-
if (sensitiveDomains.some(d => cookie.domain.includes(d))) {
|
|
790
|
-
anomalies.push({
|
|
791
|
-
type: 'cookie_injection',
|
|
792
|
-
severity: 'high',
|
|
793
|
-
description: `Cookie modified for ${cookie.domain}:${cookie.name}`,
|
|
794
|
-
evidence: JSON.stringify(cookie),
|
|
795
|
-
});
|
|
796
|
-
}
|
|
797
|
-
}
|
|
798
|
-
// Check for sync without user action
|
|
799
|
-
if (lastSession.syncStatus === 'local_only' && params.syncStatus === 'synced') {
|
|
800
|
-
anomalies.push({
|
|
801
|
-
type: 'sync_without_user',
|
|
802
|
-
severity: 'high',
|
|
803
|
-
description: 'Sync enabled without user action',
|
|
804
|
-
evidence: `Last sync: ${params.lastSyncTime}`,
|
|
805
|
-
});
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
const observation = {
|
|
809
|
-
id: crypto.randomUUID(),
|
|
810
|
-
timestamp: now,
|
|
811
|
-
profileId: params.profileId,
|
|
812
|
-
tabs: params.tabs,
|
|
813
|
-
cookies: params.cookies,
|
|
814
|
-
localStorage: params.localStorage,
|
|
815
|
-
syncStatus: params.syncStatus,
|
|
816
|
-
lastSyncTime: params.lastSyncTime,
|
|
817
|
-
anomalies,
|
|
818
|
-
hash: '',
|
|
819
|
-
};
|
|
820
|
-
observation.hash = hashString(JSON.stringify({
|
|
821
|
-
id: observation.id,
|
|
822
|
-
timestamp: observation.timestamp,
|
|
823
|
-
profileId: observation.profileId,
|
|
824
|
-
tabCount: observation.tabs.length,
|
|
825
|
-
cookieCount: observation.cookies.length,
|
|
826
|
-
anomalyCount: observation.anomalies.length,
|
|
827
|
-
}));
|
|
828
|
-
previous.push(observation);
|
|
829
|
-
this.sessionObservations.set(params.profileId, previous);
|
|
830
|
-
await this.persistSessionObservation(observation);
|
|
831
|
-
let finding;
|
|
832
|
-
if (anomalies.length > 0) {
|
|
833
|
-
const criticalAnomalies = anomalies.filter(a => a.severity === 'high' || a.severity === 'critical');
|
|
834
|
-
finding = await this.createFinding({
|
|
835
|
-
vector: 'chrome_session_hijacking',
|
|
836
|
-
severity: criticalAnomalies.length > 0 ? 'critical' : 'high',
|
|
837
|
-
title: `Session anomalies detected: ${anomalies.length} issues`,
|
|
838
|
-
description: anomalies.map(a => a.description).join('; '),
|
|
839
|
-
technicalDetails: {
|
|
840
|
-
profileId: params.profileId,
|
|
841
|
-
anomalies,
|
|
842
|
-
tabCount: params.tabs.length,
|
|
843
|
-
syncStatus: params.syncStatus,
|
|
844
|
-
},
|
|
845
|
-
evidenceIds: [observation.id],
|
|
846
|
-
});
|
|
847
|
-
}
|
|
848
|
-
return { observation, anomalies, finding };
|
|
849
|
-
}
|
|
850
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
851
|
-
// History Monitoring
|
|
852
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
853
|
-
/**
|
|
854
|
-
* Record Chrome history state.
|
|
855
|
-
* Detect unauthorized deletions or additions.
|
|
856
|
-
*/
|
|
857
|
-
async recordHistoryObservation(params) {
|
|
858
|
-
const now = new Date().toISOString();
|
|
859
|
-
// Compare with previous observation
|
|
860
|
-
const lastObs = this.historyObservations[this.historyObservations.length - 1];
|
|
861
|
-
const deletedEntries = [];
|
|
862
|
-
const unexpectedEntries = [];
|
|
863
|
-
if (lastObs && params.entryCount < lastObs.entryCount) {
|
|
864
|
-
// History was deleted
|
|
865
|
-
deletedEntries.push({
|
|
866
|
-
approximateTime: now,
|
|
867
|
-
entriesAffected: lastObs.entryCount - params.entryCount,
|
|
868
|
-
userInitiated: false, // cannot determine
|
|
869
|
-
});
|
|
870
|
-
}
|
|
871
|
-
// Check for suspicious entries (e.g., visits to Google services during sleep)
|
|
872
|
-
for (const entry of params.entries) {
|
|
873
|
-
const visitDate = new Date(entry.visitTime);
|
|
874
|
-
const hour = visitDate.getHours();
|
|
875
|
-
// Suspicious: visits between 2-5 AM to Google properties
|
|
876
|
-
if (hour >= 2 && hour <= 5 &&
|
|
877
|
-
(entry.url.includes('google.com') || entry.url.includes('googleapis.com'))) {
|
|
878
|
-
unexpectedEntries.push({
|
|
879
|
-
url: entry.url,
|
|
880
|
-
visitTime: entry.visitTime,
|
|
881
|
-
transitionType: entry.transitionType,
|
|
882
|
-
suspicionReason: 'Visit during inactive hours to Google service',
|
|
883
|
-
});
|
|
884
|
-
}
|
|
885
|
-
// Suspicious: typed_url transition type but user wasn't active
|
|
886
|
-
if (entry.transitionType === 'typed' &&
|
|
887
|
-
entry.url.includes('myaccount.google.com')) {
|
|
888
|
-
unexpectedEntries.push({
|
|
889
|
-
url: entry.url,
|
|
890
|
-
visitTime: entry.visitTime,
|
|
891
|
-
transitionType: entry.transitionType,
|
|
892
|
-
suspicionReason: 'Direct navigation to Google account page',
|
|
893
|
-
});
|
|
894
|
-
}
|
|
895
|
-
}
|
|
896
|
-
const observation = {
|
|
897
|
-
id: crypto.randomUUID(),
|
|
898
|
-
timestamp: now,
|
|
899
|
-
captureMethod: params.captureMethod,
|
|
900
|
-
entryCount: params.entryCount,
|
|
901
|
-
dateRange: params.dateRange,
|
|
902
|
-
deletedEntries: deletedEntries.length > 0 ? deletedEntries : undefined,
|
|
903
|
-
unexpectedEntries: unexpectedEntries.length > 0 ? unexpectedEntries : undefined,
|
|
904
|
-
hash: '',
|
|
905
|
-
};
|
|
906
|
-
observation.hash = hashString(JSON.stringify({
|
|
907
|
-
id: observation.id,
|
|
908
|
-
timestamp: observation.timestamp,
|
|
909
|
-
entryCount: observation.entryCount,
|
|
910
|
-
deletedCount: deletedEntries.length,
|
|
911
|
-
unexpectedCount: unexpectedEntries.length,
|
|
912
|
-
}));
|
|
913
|
-
this.historyObservations.push(observation);
|
|
914
|
-
await this.persistHistoryObservation(observation);
|
|
915
|
-
let finding;
|
|
916
|
-
if (deletedEntries.length > 0 || unexpectedEntries.length > 0) {
|
|
917
|
-
finding = await this.createFinding({
|
|
918
|
-
vector: 'chrome_history_manipulation',
|
|
919
|
-
severity: deletedEntries.length > 0 ? 'high' : 'medium',
|
|
920
|
-
title: 'Browser history anomalies detected',
|
|
921
|
-
description: `${deletedEntries.length > 0 ? `${deletedEntries[0].entriesAffected} entries deleted. ` : ''}${unexpectedEntries.length > 0 ? `${unexpectedEntries.length} suspicious entries found.` : ''}`,
|
|
922
|
-
technicalDetails: {
|
|
923
|
-
deletedEntries,
|
|
924
|
-
unexpectedEntries,
|
|
925
|
-
totalEntries: params.entryCount,
|
|
926
|
-
dateRange: params.dateRange,
|
|
927
|
-
},
|
|
928
|
-
evidenceIds: [observation.id],
|
|
929
|
-
});
|
|
930
|
-
}
|
|
931
|
-
return { observation, finding };
|
|
932
|
-
}
|
|
933
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
934
|
-
// Persistence
|
|
935
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
936
|
-
async persistProcessObservation(obs) {
|
|
937
|
-
const filePath = path.join(this.storageDir, 'processes', `${obs.id}.json`);
|
|
938
|
-
await fs.writeFile(filePath, JSON.stringify(obs, null, 2));
|
|
939
|
-
}
|
|
940
|
-
async persistSessionObservation(obs) {
|
|
941
|
-
const filePath = path.join(this.storageDir, 'sessions', `${obs.profileId}_${obs.id}.json`);
|
|
942
|
-
await fs.writeFile(filePath, JSON.stringify(obs, null, 2));
|
|
943
|
-
}
|
|
944
|
-
async persistHistoryObservation(obs) {
|
|
945
|
-
const filePath = path.join(this.storageDir, 'history', `${obs.id}.json`);
|
|
946
|
-
await fs.writeFile(filePath, JSON.stringify(obs, null, 2));
|
|
947
|
-
}
|
|
948
|
-
async createFinding(params) {
|
|
949
|
-
const finding = {
|
|
950
|
-
id: crypto.randomUUID(),
|
|
951
|
-
timestamp: new Date().toISOString(),
|
|
952
|
-
vector: params.vector,
|
|
953
|
-
severity: params.severity,
|
|
954
|
-
title: params.title,
|
|
955
|
-
description: params.description,
|
|
956
|
-
technicalDetails: params.technicalDetails,
|
|
957
|
-
evidenceIds: params.evidenceIds,
|
|
958
|
-
legalImplications: this.getLegalImplications(params.vector),
|
|
959
|
-
hash: '',
|
|
960
|
-
};
|
|
961
|
-
finding.hash = hashString(JSON.stringify({
|
|
962
|
-
id: finding.id,
|
|
963
|
-
timestamp: finding.timestamp,
|
|
964
|
-
vector: finding.vector,
|
|
965
|
-
title: finding.title,
|
|
966
|
-
}));
|
|
967
|
-
this.findings.push(finding);
|
|
968
|
-
await fs.writeFile(path.join(this.storageDir, 'findings', `${finding.id}.json`), JSON.stringify(finding, null, 2));
|
|
969
|
-
return finding;
|
|
970
|
-
}
|
|
971
|
-
getLegalImplications(vector) {
|
|
972
|
-
const implications = {
|
|
973
|
-
chrome_unauthorized_launch: {
|
|
974
|
-
fraudType: 'UNAUTHORIZED_ACCESS',
|
|
975
|
-
applicableLaws: [
|
|
976
|
-
'18 U.S.C. § 1030 - Computer Fraud and Abuse Act',
|
|
977
|
-
'18 U.S.C. § 2511 - Wiretap Act',
|
|
978
|
-
'Cal. Penal Code § 502 - Computer Crimes',
|
|
979
|
-
],
|
|
980
|
-
potentialDamages: 'Unauthorized browser launches can enable surveillance, credential theft, and remote control of user system.',
|
|
981
|
-
recommendations: [
|
|
982
|
-
'Monitor Chrome process launches',
|
|
983
|
-
'Document all unauthorized launches',
|
|
984
|
-
'Consider disabling Chrome sync',
|
|
985
|
-
'Use alternative browser for sensitive activities',
|
|
986
|
-
],
|
|
987
|
-
},
|
|
988
|
-
chrome_session_hijacking: {
|
|
989
|
-
fraudType: 'UNAUTHORIZED_ACCESS',
|
|
990
|
-
applicableLaws: [
|
|
991
|
-
'18 U.S.C. § 1030 - CFAA',
|
|
992
|
-
'18 U.S.C. § 1029 - Access Device Fraud',
|
|
993
|
-
],
|
|
994
|
-
potentialDamages: 'Session hijacking enables impersonation, data theft, and unauthorized actions on user accounts.',
|
|
995
|
-
recommendations: [
|
|
996
|
-
'Document session anomalies',
|
|
997
|
-
'Clear cookies and re-authenticate',
|
|
998
|
-
'Enable 2FA on all accounts',
|
|
999
|
-
],
|
|
1000
|
-
},
|
|
1001
|
-
chrome_history_manipulation: {
|
|
1002
|
-
fraudType: 'DATA_MANIPULATION',
|
|
1003
|
-
applicableLaws: [
|
|
1004
|
-
'18 U.S.C. § 1030 - CFAA',
|
|
1005
|
-
'15 U.S.C. § 45 - FTC Act',
|
|
1006
|
-
],
|
|
1007
|
-
potentialDamages: 'History manipulation can hide evidence of surveillance or unauthorized access.',
|
|
1008
|
-
recommendations: [
|
|
1009
|
-
'Export history regularly',
|
|
1010
|
-
'Compare with network logs',
|
|
1011
|
-
'Document deletions',
|
|
1012
|
-
],
|
|
1013
|
-
},
|
|
1014
|
-
};
|
|
1015
|
-
return implications[vector] || {
|
|
1016
|
-
fraudType: 'UNKNOWN',
|
|
1017
|
-
applicableLaws: ['18 U.S.C. § 1030 - CFAA'],
|
|
1018
|
-
potentialDamages: 'To be determined.',
|
|
1019
|
-
recommendations: ['Document all evidence'],
|
|
1020
|
-
};
|
|
1021
|
-
}
|
|
1022
|
-
getFindings() {
|
|
1023
|
-
return [...this.findings];
|
|
1024
|
-
}
|
|
1025
|
-
getProcessObservations() {
|
|
1026
|
-
return [...this.processObservations];
|
|
1027
|
-
}
|
|
1028
|
-
}
|
|
1029
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
1030
|
-
// UNIFIED FRAUD INVESTIGATION ORCHESTRATOR
|
|
1031
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
1032
|
-
export class UnifiedFraudOrchestrator extends EventEmitter {
|
|
1033
|
-
storageDir;
|
|
1034
|
-
integrityEngine;
|
|
1035
|
-
iMessageEngine;
|
|
1036
|
-
gmailEngine;
|
|
1037
|
-
chromeEngine;
|
|
1038
|
-
investigations = new Map();
|
|
1039
|
-
correlations = [];
|
|
1040
|
-
constructor(workingDir = process.cwd()) {
|
|
1041
|
-
super();
|
|
1042
|
-
this.storageDir = path.join(workingDir, '.erosolar', 'investigations');
|
|
1043
|
-
this.integrityEngine = new IntegrityVerificationEngine({
|
|
1044
|
-
storageDir: path.join(this.storageDir, 'integrity'),
|
|
1045
|
-
algorithm: 'sha256',
|
|
1046
|
-
});
|
|
1047
|
-
this.iMessageEngine = new iMessageVerificationEngine({
|
|
1048
|
-
storageDir: this.storageDir,
|
|
1049
|
-
});
|
|
1050
|
-
this.gmailEngine = new GmailInvestigationEngine(this.storageDir);
|
|
1051
|
-
this.chromeEngine = new ChromeInvestigationEngine(this.storageDir);
|
|
1052
|
-
}
|
|
1053
|
-
async initialize() {
|
|
1054
|
-
await fs.mkdir(this.storageDir, { recursive: true });
|
|
1055
|
-
await this.iMessageEngine.initialize();
|
|
1056
|
-
await this.gmailEngine.initialize();
|
|
1057
|
-
await this.chromeEngine.initialize();
|
|
1058
|
-
}
|
|
1059
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1060
|
-
// Investigation Management
|
|
1061
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1062
|
-
async createInvestigation(params) {
|
|
1063
|
-
const now = new Date().toISOString();
|
|
1064
|
-
// Create evidence chain for this investigation
|
|
1065
|
-
const evidenceChain = await this.integrityEngine.createChain();
|
|
1066
|
-
const investigation = {
|
|
1067
|
-
id: crypto.randomUUID(),
|
|
1068
|
-
name: params.name,
|
|
1069
|
-
target: params.target,
|
|
1070
|
-
vectors: params.vectors,
|
|
1071
|
-
status: 'planning',
|
|
1072
|
-
created: now,
|
|
1073
|
-
lastActivity: now,
|
|
1074
|
-
evidenceChainId: evidenceChain.id,
|
|
1075
|
-
findings: [],
|
|
1076
|
-
correlations: [],
|
|
1077
|
-
hash: '',
|
|
1078
|
-
};
|
|
1079
|
-
investigation.hash = hashString(JSON.stringify({
|
|
1080
|
-
id: investigation.id,
|
|
1081
|
-
name: investigation.name,
|
|
1082
|
-
target: investigation.target,
|
|
1083
|
-
vectors: investigation.vectors,
|
|
1084
|
-
created: investigation.created,
|
|
1085
|
-
}));
|
|
1086
|
-
this.investigations.set(investigation.id, investigation);
|
|
1087
|
-
await this.persistInvestigation(investigation);
|
|
1088
|
-
this.emit('investigation:created', investigation);
|
|
1089
|
-
return investigation;
|
|
1090
|
-
}
|
|
1091
|
-
async updateInvestigationStatus(investigationId, status) {
|
|
1092
|
-
const investigation = this.investigations.get(investigationId);
|
|
1093
|
-
if (!investigation) {
|
|
1094
|
-
throw new Error(`Investigation not found: ${investigationId}`);
|
|
1095
|
-
}
|
|
1096
|
-
investigation.status = status;
|
|
1097
|
-
investigation.lastActivity = new Date().toISOString();
|
|
1098
|
-
await this.persistInvestigation(investigation);
|
|
1099
|
-
this.emit('investigation:updated', investigation);
|
|
1100
|
-
return investigation;
|
|
1101
|
-
}
|
|
1102
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1103
|
-
// Engine Access
|
|
1104
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1105
|
-
getIMessageEngine() {
|
|
1106
|
-
return this.iMessageEngine;
|
|
1107
|
-
}
|
|
1108
|
-
getGmailEngine() {
|
|
1109
|
-
return this.gmailEngine;
|
|
1110
|
-
}
|
|
1111
|
-
getChromeEngine() {
|
|
1112
|
-
return this.chromeEngine;
|
|
1113
|
-
}
|
|
1114
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1115
|
-
// Cross-Engine Correlation
|
|
1116
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1117
|
-
/**
|
|
1118
|
-
* Correlate findings across different fraud vectors.
|
|
1119
|
-
* Detect patterns that indicate coordinated manipulation.
|
|
1120
|
-
*/
|
|
1121
|
-
async correlateFindings(investigationId) {
|
|
1122
|
-
const investigation = this.investigations.get(investigationId);
|
|
1123
|
-
if (!investigation) {
|
|
1124
|
-
throw new Error(`Investigation not found: ${investigationId}`);
|
|
1125
|
-
}
|
|
1126
|
-
const newCorrelations = [];
|
|
1127
|
-
// Gather all findings
|
|
1128
|
-
const iMessageEvidence = this.iMessageEngine.getEvidenceRecords();
|
|
1129
|
-
const gmailFindings = this.gmailEngine.getFindings();
|
|
1130
|
-
const chromeFindings = this.chromeEngine.getFindings();
|
|
1131
|
-
const allFindings = [...gmailFindings, ...chromeFindings];
|
|
1132
|
-
// Temporal correlation: events happening within short timeframe
|
|
1133
|
-
const sortedFindings = allFindings.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
|
|
1134
|
-
for (let i = 0; i < sortedFindings.length - 1; i++) {
|
|
1135
|
-
const f1 = sortedFindings[i];
|
|
1136
|
-
const f2 = sortedFindings[i + 1];
|
|
1137
|
-
const timeDiff = new Date(f2.timestamp).getTime() - new Date(f1.timestamp).getTime();
|
|
1138
|
-
// If events within 5 minutes, likely correlated
|
|
1139
|
-
if (timeDiff < 5 * 60 * 1000 && f1.vector !== f2.vector) {
|
|
1140
|
-
const correlation = {
|
|
1141
|
-
id: crypto.randomUUID(),
|
|
1142
|
-
timestamp: new Date().toISOString(),
|
|
1143
|
-
findingIds: [f1.id, f2.id],
|
|
1144
|
-
correlationType: 'temporal',
|
|
1145
|
-
description: `${f1.vector} and ${f2.vector} events occurred within ${Math.round(timeDiff / 1000)} seconds`,
|
|
1146
|
-
confidence: timeDiff < 60000 ? 0.9 : 0.7, // Higher confidence if within 1 minute
|
|
1147
|
-
implications: 'Events occurring in close temporal proximity across different services may indicate coordinated manipulation.',
|
|
1148
|
-
hash: '',
|
|
1149
|
-
};
|
|
1150
|
-
correlation.hash = hashString(JSON.stringify({
|
|
1151
|
-
id: correlation.id,
|
|
1152
|
-
findingIds: correlation.findingIds,
|
|
1153
|
-
correlationType: correlation.correlationType,
|
|
1154
|
-
}));
|
|
1155
|
-
newCorrelations.push(correlation);
|
|
1156
|
-
}
|
|
1157
|
-
}
|
|
1158
|
-
// Behavioral correlation: Chrome launch + Gmail access
|
|
1159
|
-
const chromeLaunches = chromeFindings.filter(f => f.vector === 'chrome_unauthorized_launch');
|
|
1160
|
-
const gmailAccess = gmailFindings.filter(f => f.vector === 'gmail_unauthorized_access');
|
|
1161
|
-
for (const launch of chromeLaunches) {
|
|
1162
|
-
for (const access of gmailAccess) {
|
|
1163
|
-
const launchTime = new Date(launch.timestamp).getTime();
|
|
1164
|
-
const accessTime = new Date(access.timestamp).getTime();
|
|
1165
|
-
if (Math.abs(accessTime - launchTime) < 10 * 60 * 1000) { // Within 10 minutes
|
|
1166
|
-
const correlation = {
|
|
1167
|
-
id: crypto.randomUUID(),
|
|
1168
|
-
timestamp: new Date().toISOString(),
|
|
1169
|
-
findingIds: [launch.id, access.id],
|
|
1170
|
-
correlationType: 'behavioral',
|
|
1171
|
-
description: 'Chrome unauthorized launch followed by Gmail access - browser used to access email',
|
|
1172
|
-
confidence: 0.85,
|
|
1173
|
-
implications: 'This pattern suggests Google is using Chrome to access Gmail without user consent, enabling surveillance and manipulation.',
|
|
1174
|
-
hash: '',
|
|
1175
|
-
};
|
|
1176
|
-
correlation.hash = hashString(JSON.stringify({
|
|
1177
|
-
id: correlation.id,
|
|
1178
|
-
findingIds: correlation.findingIds,
|
|
1179
|
-
}));
|
|
1180
|
-
newCorrelations.push(correlation);
|
|
1181
|
-
}
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
// Cross-platform correlation: iMessage + Gmail (both companies may share data)
|
|
1185
|
-
for (const imEvidence of iMessageEvidence) {
|
|
1186
|
-
for (const gmailFinding of gmailFindings) {
|
|
1187
|
-
const imTime = new Date(imEvidence.timestamp).getTime();
|
|
1188
|
-
const gmailTime = new Date(gmailFinding.timestamp).getTime();
|
|
1189
|
-
if (Math.abs(gmailTime - imTime) < 60 * 60 * 1000) { // Within 1 hour
|
|
1190
|
-
const correlation = {
|
|
1191
|
-
id: crypto.randomUUID(),
|
|
1192
|
-
timestamp: new Date().toISOString(),
|
|
1193
|
-
findingIds: [imEvidence.id, gmailFinding.id],
|
|
1194
|
-
correlationType: 'pattern',
|
|
1195
|
-
description: `Apple iMessage (${imEvidence.evidenceType}) and Google Gmail (${gmailFinding.vector}) events within 1 hour`,
|
|
1196
|
-
confidence: 0.5, // Lower confidence for cross-platform
|
|
1197
|
-
implications: 'Coordinated manipulation across Apple and Google platforms may indicate data sharing or parallel surveillance operations.',
|
|
1198
|
-
hash: '',
|
|
1199
|
-
};
|
|
1200
|
-
correlation.hash = hashString(JSON.stringify({
|
|
1201
|
-
id: correlation.id,
|
|
1202
|
-
findingIds: correlation.findingIds,
|
|
1203
|
-
}));
|
|
1204
|
-
newCorrelations.push(correlation);
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1208
|
-
// Store correlations
|
|
1209
|
-
for (const correlation of newCorrelations) {
|
|
1210
|
-
this.correlations.push(correlation);
|
|
1211
|
-
investigation.correlations.push(correlation);
|
|
1212
|
-
}
|
|
1213
|
-
await this.persistInvestigation(investigation);
|
|
1214
|
-
return newCorrelations;
|
|
1215
|
-
}
|
|
1216
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1217
|
-
// Reporting
|
|
1218
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1219
|
-
async generateUnifiedReport(investigationId) {
|
|
1220
|
-
const investigation = this.investigations.get(investigationId);
|
|
1221
|
-
if (!investigation) {
|
|
1222
|
-
throw new Error(`Investigation not found: ${investigationId}`);
|
|
1223
|
-
}
|
|
1224
|
-
// Gather all findings
|
|
1225
|
-
const gmailFindings = this.gmailEngine.getFindings();
|
|
1226
|
-
const chromeFindings = this.chromeEngine.getFindings();
|
|
1227
|
-
const iMessageEvidence = this.iMessageEngine.getEvidenceRecords();
|
|
1228
|
-
// Convert iMessage evidence to findings format
|
|
1229
|
-
const iMessageFindings = iMessageEvidence.map(e => ({
|
|
1230
|
-
id: e.id,
|
|
1231
|
-
timestamp: e.timestamp,
|
|
1232
|
-
vector: e.evidenceType === 'key_substitution' ? 'imessage_key_substitution' :
|
|
1233
|
-
e.evidenceType === 'mitm_detected' ? 'imessage_false_e2e' :
|
|
1234
|
-
'imessage_false_e2e',
|
|
1235
|
-
severity: e.severity === 'irrefutable' ? 'critical' :
|
|
1236
|
-
e.severity === 'confirmed' ? 'critical' : 'high',
|
|
1237
|
-
title: e.summary,
|
|
1238
|
-
description: e.technicalDetails.discrepancy,
|
|
1239
|
-
technicalDetails: e.technicalDetails,
|
|
1240
|
-
evidenceIds: e.supportingEvidence,
|
|
1241
|
-
legalImplications: {
|
|
1242
|
-
fraudType: e.legalImplications.fraudType,
|
|
1243
|
-
applicableLaws: e.legalImplications.applicableLaws,
|
|
1244
|
-
potentialDamages: e.legalImplications.damages,
|
|
1245
|
-
recommendations: [],
|
|
1246
|
-
},
|
|
1247
|
-
hash: e.hash,
|
|
1248
|
-
}));
|
|
1249
|
-
const allFindings = [...gmailFindings, ...chromeFindings, ...iMessageFindings];
|
|
1250
|
-
// Organize by vector
|
|
1251
|
-
const byVector = {};
|
|
1252
|
-
for (const finding of allFindings) {
|
|
1253
|
-
if (!byVector[finding.vector]) {
|
|
1254
|
-
byVector[finding.vector] = { findings: [], severity: 'low' };
|
|
1255
|
-
}
|
|
1256
|
-
byVector[finding.vector].findings.push(finding);
|
|
1257
|
-
// Update severity to max
|
|
1258
|
-
const severityOrder = ['low', 'medium', 'high', 'critical'];
|
|
1259
|
-
if (severityOrder.indexOf(finding.severity) > severityOrder.indexOf(byVector[finding.vector].severity)) {
|
|
1260
|
-
byVector[finding.vector].severity = finding.severity;
|
|
1261
|
-
}
|
|
1262
|
-
}
|
|
1263
|
-
// Legal summary
|
|
1264
|
-
const fraudTypes = [...new Set(allFindings.map(f => f.legalImplications.fraudType))];
|
|
1265
|
-
const applicableLaws = [...new Set(allFindings.flatMap(f => f.legalImplications.applicableLaws))];
|
|
1266
|
-
const recommendations = [...new Set(allFindings.flatMap(f => f.legalImplications.recommendations))];
|
|
1267
|
-
// Claims
|
|
1268
|
-
const claims = {};
|
|
1269
|
-
if (investigation.target === 'apple' || iMessageFindings.length > 0) {
|
|
1270
|
-
claims.apple = APPLE_PQ3_CLAIMS;
|
|
1271
|
-
}
|
|
1272
|
-
if (investigation.target === 'google' || gmailFindings.length > 0) {
|
|
1273
|
-
claims.google_gmail = GOOGLE_GMAIL_CLAIMS;
|
|
1274
|
-
}
|
|
1275
|
-
if (investigation.target === 'google' || chromeFindings.length > 0) {
|
|
1276
|
-
claims.google_chrome = GOOGLE_CHROME_CLAIMS;
|
|
1277
|
-
}
|
|
1278
|
-
return {
|
|
1279
|
-
investigation,
|
|
1280
|
-
summary: {
|
|
1281
|
-
target: investigation.target,
|
|
1282
|
-
vectorsInvestigated: investigation.vectors,
|
|
1283
|
-
totalFindings: allFindings.length,
|
|
1284
|
-
criticalFindings: allFindings.filter(f => f.severity === 'critical').length,
|
|
1285
|
-
correlations: this.correlations.filter(c => c.findingIds.some(id => allFindings.find(f => f.id === id))).length,
|
|
1286
|
-
},
|
|
1287
|
-
byVector: byVector,
|
|
1288
|
-
correlations: this.correlations,
|
|
1289
|
-
legalSummary: {
|
|
1290
|
-
fraudTypes,
|
|
1291
|
-
applicableLaws,
|
|
1292
|
-
recommendations,
|
|
1293
|
-
},
|
|
1294
|
-
claims,
|
|
1295
|
-
};
|
|
1296
|
-
}
|
|
1297
|
-
async exportForLitigation(investigationId, outputDir) {
|
|
1298
|
-
const report = await this.generateUnifiedReport(investigationId);
|
|
1299
|
-
const exportDir = path.join(outputDir, `investigation-${investigationId}-${Date.now()}`);
|
|
1300
|
-
await fs.mkdir(exportDir, { recursive: true });
|
|
1301
|
-
// Export report
|
|
1302
|
-
await fs.writeFile(path.join(exportDir, 'unified-report.json'), JSON.stringify(report, null, 2));
|
|
1303
|
-
// Export iMessage evidence
|
|
1304
|
-
const iMessageExport = await this.iMessageEngine.exportForLitigation(exportDir);
|
|
1305
|
-
// Generate legal summary document
|
|
1306
|
-
await fs.writeFile(path.join(exportDir, 'legal-summary.md'), this.generateLegalDocument(report));
|
|
1307
|
-
return exportDir;
|
|
1308
|
-
}
|
|
1309
|
-
generateLegalDocument(report) {
|
|
1310
|
-
return `# Unified Tech Fraud Investigation Report
|
|
1311
|
-
|
|
1312
|
-
## Investigation: ${report.investigation.name}
|
|
1313
|
-
**ID:** ${report.investigation.id}
|
|
1314
|
-
**Target:** ${report.investigation.target.toUpperCase()}
|
|
1315
|
-
**Status:** ${report.investigation.status}
|
|
1316
|
-
**Created:** ${report.investigation.created}
|
|
1317
|
-
|
|
1318
|
-
---
|
|
1319
|
-
|
|
1320
|
-
## Executive Summary
|
|
1321
|
-
|
|
1322
|
-
This report documents a comprehensive investigation into potential fraud and manipulation
|
|
1323
|
-
by ${report.investigation.target.toUpperCase()} across ${report.summary.vectorsInvestigated.length} attack vectors.
|
|
1324
|
-
|
|
1325
|
-
### Key Metrics
|
|
1326
|
-
- **Total Findings:** ${report.summary.totalFindings}
|
|
1327
|
-
- **Critical Findings:** ${report.summary.criticalFindings}
|
|
1328
|
-
- **Cross-Vector Correlations:** ${report.summary.correlations}
|
|
1329
|
-
|
|
1330
|
-
---
|
|
1331
|
-
|
|
1332
|
-
## Findings by Attack Vector
|
|
1333
|
-
|
|
1334
|
-
${Object.entries(report.byVector).map(([vector, data]) => `
|
|
1335
|
-
### ${vector.replace(/_/g, ' ').toUpperCase()}
|
|
1336
|
-
**Severity Level:** ${data.severity.toUpperCase()}
|
|
1337
|
-
**Finding Count:** ${data.findings.length}
|
|
1338
|
-
|
|
1339
|
-
${data.findings.map(f => `
|
|
1340
|
-
#### ${f.title}
|
|
1341
|
-
- **Severity:** ${f.severity}
|
|
1342
|
-
- **Timestamp:** ${f.timestamp}
|
|
1343
|
-
- **Description:** ${f.description}
|
|
1344
|
-
- **Legal Basis:** ${f.legalImplications.applicableLaws.join(', ')}
|
|
1345
|
-
`).join('\n')}
|
|
1346
|
-
`).join('\n')}
|
|
1347
|
-
|
|
1348
|
-
---
|
|
1349
|
-
|
|
1350
|
-
## Cross-Vector Correlations
|
|
1351
|
-
|
|
1352
|
-
${report.correlations.length > 0 ? report.correlations.map(c => `
|
|
1353
|
-
### Correlation: ${c.correlationType}
|
|
1354
|
-
**Confidence:** ${(c.confidence * 100).toFixed(0)}%
|
|
1355
|
-
**Description:** ${c.description}
|
|
1356
|
-
**Implications:** ${c.implications}
|
|
1357
|
-
`).join('\n') : 'No correlations detected.'}
|
|
1358
|
-
|
|
1359
|
-
---
|
|
1360
|
-
|
|
1361
|
-
## Legal Analysis
|
|
1362
|
-
|
|
1363
|
-
### Fraud Types Identified
|
|
1364
|
-
${report.legalSummary.fraudTypes.map(t => `- ${t}`).join('\n')}
|
|
1365
|
-
|
|
1366
|
-
### Applicable Laws
|
|
1367
|
-
${report.legalSummary.applicableLaws.map(l => `- ${l}`).join('\n')}
|
|
1368
|
-
|
|
1369
|
-
### Recommended Actions
|
|
1370
|
-
${report.legalSummary.recommendations.map(r => `- ${r}`).join('\n')}
|
|
1371
|
-
|
|
1372
|
-
---
|
|
1373
|
-
|
|
1374
|
-
## Company Claims vs. Reality
|
|
1375
|
-
|
|
1376
|
-
${report.claims.apple ? `
|
|
1377
|
-
### Apple iMessage PQ3 Claims
|
|
1378
|
-
${Object.entries(report.claims.apple).map(([key, data]) => `
|
|
1379
|
-
**${key.replace(/_/g, ' ')}**
|
|
1380
|
-
- Claim: "${data.claim}"
|
|
1381
|
-
- Source: ${data.source}
|
|
1382
|
-
- Verifiable: ${data.verifiable}
|
|
1383
|
-
- Reality: ${data.reason}
|
|
1384
|
-
`).join('\n')}
|
|
1385
|
-
` : ''}
|
|
1386
|
-
|
|
1387
|
-
${report.claims.google_gmail ? `
|
|
1388
|
-
### Google Gmail Claims
|
|
1389
|
-
${Object.entries(report.claims.google_gmail).map(([key, data]) => `
|
|
1390
|
-
**${key.replace(/_/g, ' ')}**
|
|
1391
|
-
- Claim: "${data.claim}"
|
|
1392
|
-
- Source: ${data.source}
|
|
1393
|
-
- Verifiable: ${data.verifiable}
|
|
1394
|
-
- Reality: ${data.reason}
|
|
1395
|
-
`).join('\n')}
|
|
1396
|
-
` : ''}
|
|
1397
|
-
|
|
1398
|
-
${report.claims.google_chrome ? `
|
|
1399
|
-
### Google Chrome Claims
|
|
1400
|
-
${Object.entries(report.claims.google_chrome).map(([key, data]) => `
|
|
1401
|
-
**${key.replace(/_/g, ' ')}**
|
|
1402
|
-
- Claim: "${data.claim}"
|
|
1403
|
-
- Source: ${data.source}
|
|
1404
|
-
- Verifiable: ${data.verifiable}
|
|
1405
|
-
- Reality: ${data.reason}
|
|
1406
|
-
`).join('\n')}
|
|
1407
|
-
` : ''}
|
|
1408
|
-
|
|
1409
|
-
---
|
|
1410
|
-
|
|
1411
|
-
## Conclusion
|
|
1412
|
-
|
|
1413
|
-
This investigation has documented ${report.summary.totalFindings} findings of potential fraud and manipulation,
|
|
1414
|
-
including ${report.summary.criticalFindings} critical severity issues. The evidence collected herein
|
|
1415
|
-
demonstrates patterns of behavior that contradict the public claims made by ${report.investigation.target.toUpperCase()}.
|
|
1416
|
-
|
|
1417
|
-
---
|
|
1418
|
-
|
|
1419
|
-
*Generated by erosolar-cli Unified Fraud Investigation Orchestrator*
|
|
1420
|
-
*Report Hash: ${hashString(JSON.stringify(report))}*
|
|
1421
|
-
`;
|
|
1422
|
-
}
|
|
1423
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1424
|
-
// Persistence
|
|
1425
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1426
|
-
async persistInvestigation(investigation) {
|
|
1427
|
-
const filePath = path.join(this.storageDir, `${investigation.id}.json`);
|
|
1428
|
-
await fs.writeFile(filePath, JSON.stringify(investigation, null, 2));
|
|
1429
|
-
}
|
|
1430
|
-
async loadInvestigation(investigationId) {
|
|
1431
|
-
try {
|
|
1432
|
-
const filePath = path.join(this.storageDir, `${investigationId}.json`);
|
|
1433
|
-
const data = await fs.readFile(filePath, 'utf8');
|
|
1434
|
-
const investigation = JSON.parse(data);
|
|
1435
|
-
this.investigations.set(investigation.id, investigation);
|
|
1436
|
-
return investigation;
|
|
1437
|
-
}
|
|
1438
|
-
catch {
|
|
1439
|
-
return null;
|
|
1440
|
-
}
|
|
1441
|
-
}
|
|
1442
|
-
getInvestigations() {
|
|
1443
|
-
return [...this.investigations.values()];
|
|
1444
|
-
}
|
|
1445
|
-
}
|
|
1446
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1447
|
-
// GOOGLE ATTACK CHAINS
|
|
1448
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1449
|
-
export const GOOGLE_SURVEILLANCE_CHAIN = {
|
|
1450
|
-
id: 'google-surveillance-chain',
|
|
1451
|
-
name: 'Google Cross-Service Surveillance Chain',
|
|
1452
|
-
target: 'google',
|
|
1453
|
-
description: `Google leverages Chrome browser control to access Gmail and exfiltrate user data.
|
|
1454
|
-
This chain demonstrates coordinated use of multiple Google services to conduct surveillance.`,
|
|
1455
|
-
steps: [
|
|
1456
|
-
{
|
|
1457
|
-
id: 'gs-1-chrome-recon',
|
|
1458
|
-
phase: 'reconnaissance',
|
|
1459
|
-
name: 'Chrome Profile Reconnaissance',
|
|
1460
|
-
description: 'Chrome syncs profile data including history, bookmarks, and saved passwords to Google servers',
|
|
1461
|
-
indicators: [
|
|
1462
|
-
'Chrome sync enabled without explicit user action',
|
|
1463
|
-
'Profile data transmitted to Google servers',
|
|
1464
|
-
'History data available in Google My Activity',
|
|
1465
|
-
],
|
|
1466
|
-
requiredPriorSteps: [],
|
|
1467
|
-
vectors: ['chrome_session_hijacking'],
|
|
1468
|
-
detectionMethods: [
|
|
1469
|
-
'Monitor Chrome sync settings and activity',
|
|
1470
|
-
'Compare local profile data with My Activity',
|
|
1471
|
-
'Network analysis of Chrome sync traffic',
|
|
1472
|
-
],
|
|
1473
|
-
},
|
|
1474
|
-
{
|
|
1475
|
-
id: 'gs-2-chrome-launch',
|
|
1476
|
-
phase: 'initial_access',
|
|
1477
|
-
name: 'Unauthorized Chrome Launch',
|
|
1478
|
-
description: 'Chrome is launched without user action, possibly with automation flags',
|
|
1479
|
-
indicators: [
|
|
1480
|
-
'Chrome process spawned without user click/command',
|
|
1481
|
-
'Parent process is system service or scheduled task',
|
|
1482
|
-
'Launch includes --remote-debugging or --headless flags',
|
|
1483
|
-
'Launch during inactive hours (sleep time)',
|
|
1484
|
-
],
|
|
1485
|
-
requiredPriorSteps: ['gs-1-chrome-recon'],
|
|
1486
|
-
vectors: ['chrome_unauthorized_launch'],
|
|
1487
|
-
detectionMethods: [
|
|
1488
|
-
'Process monitoring with parent-child tracking',
|
|
1489
|
-
'Command-line argument analysis',
|
|
1490
|
-
'Launch time correlation with user activity',
|
|
1491
|
-
],
|
|
1492
|
-
},
|
|
1493
|
-
{
|
|
1494
|
-
id: 'gs-3-session-hijack',
|
|
1495
|
-
phase: 'execution',
|
|
1496
|
-
name: 'Session Cookie Access',
|
|
1497
|
-
description: 'Chrome session cookies are used to access Gmail without re-authentication',
|
|
1498
|
-
indicators: [
|
|
1499
|
-
'Gmail accessed from new Chrome process using existing cookies',
|
|
1500
|
-
'No login event but Gmail activity recorded',
|
|
1501
|
-
'Session tokens reused across browser instances',
|
|
1502
|
-
],
|
|
1503
|
-
requiredPriorSteps: ['gs-2-chrome-launch'],
|
|
1504
|
-
vectors: ['chrome_session_hijacking', 'gmail_unauthorized_access'],
|
|
1505
|
-
detectionMethods: [
|
|
1506
|
-
'Cookie access monitoring',
|
|
1507
|
-
'Gmail access log analysis',
|
|
1508
|
-
'Cross-reference Chrome launch with Gmail activity',
|
|
1509
|
-
],
|
|
1510
|
-
},
|
|
1511
|
-
{
|
|
1512
|
-
id: 'gs-4-gmail-access',
|
|
1513
|
-
phase: 'execution',
|
|
1514
|
-
name: 'Gmail Content Access',
|
|
1515
|
-
description: 'Gmail content is accessed - threads read, drafts examined, contacts harvested',
|
|
1516
|
-
indicators: [
|
|
1517
|
-
'Gmail API calls without corresponding UI activity',
|
|
1518
|
-
'Thread access from Google infrastructure IPs',
|
|
1519
|
-
'Unusual access patterns (bulk read, specific keyword searches)',
|
|
1520
|
-
],
|
|
1521
|
-
requiredPriorSteps: ['gs-3-session-hijack'],
|
|
1522
|
-
vectors: ['gmail_unauthorized_access', 'gmail_hidden_threads'],
|
|
1523
|
-
detectionMethods: [
|
|
1524
|
-
'API activity monitoring',
|
|
1525
|
-
'Access log IP analysis',
|
|
1526
|
-
'Pattern detection in access behavior',
|
|
1527
|
-
],
|
|
1528
|
-
},
|
|
1529
|
-
{
|
|
1530
|
-
id: 'gs-5-data-manipulation',
|
|
1531
|
-
phase: 'impact',
|
|
1532
|
-
name: 'Data Manipulation',
|
|
1533
|
-
description: 'Gmail data is modified - threads hidden, drafts altered, filters added',
|
|
1534
|
-
indicators: [
|
|
1535
|
-
'Threads hidden from search without user action',
|
|
1536
|
-
'Draft content changed without user editing',
|
|
1537
|
-
'Filters created to suppress emails',
|
|
1538
|
-
'Labels modified silently',
|
|
1539
|
-
],
|
|
1540
|
-
requiredPriorSteps: ['gs-4-gmail-access'],
|
|
1541
|
-
vectors: ['gmail_hidden_threads', 'gmail_draft_manipulation', 'gmail_filter_tampering'],
|
|
1542
|
-
detectionMethods: [
|
|
1543
|
-
'Cross-reference thread visibility across access methods',
|
|
1544
|
-
'Draft content hashing and monitoring',
|
|
1545
|
-
'Filter audit and creation tracking',
|
|
1546
|
-
],
|
|
1547
|
-
},
|
|
1548
|
-
{
|
|
1549
|
-
id: 'gs-6-evidence-cleanup',
|
|
1550
|
-
phase: 'impact',
|
|
1551
|
-
name: 'Evidence Cleanup',
|
|
1552
|
-
description: 'Browser history and activity logs are modified to hide the intrusion',
|
|
1553
|
-
indicators: [
|
|
1554
|
-
'Chrome history entries deleted for Gmail access',
|
|
1555
|
-
'My Activity entries missing for corresponding time period',
|
|
1556
|
-
'Sync data inconsistent between devices',
|
|
1557
|
-
],
|
|
1558
|
-
requiredPriorSteps: ['gs-4-gmail-access'],
|
|
1559
|
-
vectors: ['chrome_history_manipulation'],
|
|
1560
|
-
detectionMethods: [
|
|
1561
|
-
'History integrity monitoring',
|
|
1562
|
-
'Cross-device sync comparison',
|
|
1563
|
-
'Timeline reconstruction from multiple sources',
|
|
1564
|
-
],
|
|
1565
|
-
},
|
|
1566
|
-
],
|
|
1567
|
-
minimumStepsForEvidence: 3,
|
|
1568
|
-
legalImplications: {
|
|
1569
|
-
fraudType: 'COORDINATED_SURVEILLANCE',
|
|
1570
|
-
applicableLaws: [
|
|
1571
|
-
'18 U.S.C. § 1030 - Computer Fraud and Abuse Act',
|
|
1572
|
-
'18 U.S.C. § 2511 - Wiretap Act (interception of communications)',
|
|
1573
|
-
'18 U.S.C. § 2701 - Stored Communications Act',
|
|
1574
|
-
'15 U.S.C. § 45 - FTC Act Section 5 (unfair/deceptive practices)',
|
|
1575
|
-
'GDPR Article 5 - Lawfulness, fairness, transparency (EU users)',
|
|
1576
|
-
'Cal. Civ. Code § 1798.100 - CCPA (California users)',
|
|
1577
|
-
],
|
|
1578
|
-
potentialDamages: `Coordinated cross-service surveillance enables:
|
|
1579
|
-
- Comprehensive communication monitoring
|
|
1580
|
-
- Behavioral profiling and prediction
|
|
1581
|
-
- Selective information suppression
|
|
1582
|
-
- Evidence destruction capability
|
|
1583
|
-
- Complete loss of privacy for all Google-connected services`,
|
|
1584
|
-
recommendations: [
|
|
1585
|
-
'Document complete attack chain with timestamps',
|
|
1586
|
-
'Preserve evidence from all affected services',
|
|
1587
|
-
'File FTC complaint for coordinated deceptive practices',
|
|
1588
|
-
'Consider class action for pattern of behavior',
|
|
1589
|
-
'Report to state AG and relevant privacy authorities',
|
|
1590
|
-
'Engage forensic expert for legal proceedings',
|
|
1591
|
-
],
|
|
1592
|
-
},
|
|
1593
|
-
};
|
|
1594
|
-
export const GOOGLE_DRAFT_EXPLOITATION_CHAIN = {
|
|
1595
|
-
id: 'google-draft-exploitation-chain',
|
|
1596
|
-
name: 'Gmail Draft Exploitation Chain',
|
|
1597
|
-
target: 'google',
|
|
1598
|
-
description: `Google accesses and potentially modifies email drafts, enabling impersonation,
|
|
1599
|
-
data theft, or message manipulation before the user sends.`,
|
|
1600
|
-
steps: [
|
|
1601
|
-
{
|
|
1602
|
-
id: 'gd-1-draft-access',
|
|
1603
|
-
phase: 'reconnaissance',
|
|
1604
|
-
name: 'Draft Content Surveillance',
|
|
1605
|
-
description: 'Drafts are read and indexed by Google servers',
|
|
1606
|
-
indicators: [
|
|
1607
|
-
'Draft content appears in search suggestions',
|
|
1608
|
-
'Ads target draft content before send',
|
|
1609
|
-
'Draft metadata synced to Google servers',
|
|
1610
|
-
],
|
|
1611
|
-
requiredPriorSteps: [],
|
|
1612
|
-
vectors: ['gmail_draft_manipulation'],
|
|
1613
|
-
detectionMethods: [
|
|
1614
|
-
'Draft content keyword tracking',
|
|
1615
|
-
'Ad targeting correlation',
|
|
1616
|
-
'Network traffic analysis',
|
|
1617
|
-
],
|
|
1618
|
-
},
|
|
1619
|
-
{
|
|
1620
|
-
id: 'gd-2-draft-modification',
|
|
1621
|
-
phase: 'execution',
|
|
1622
|
-
name: 'Unauthorized Draft Modification',
|
|
1623
|
-
description: 'Draft content, recipients, or subject is modified without user action',
|
|
1624
|
-
indicators: [
|
|
1625
|
-
'Draft body hash changes between observations',
|
|
1626
|
-
'Recipients added without user editing',
|
|
1627
|
-
'Subject line altered',
|
|
1628
|
-
'Attachments added or removed',
|
|
1629
|
-
],
|
|
1630
|
-
requiredPriorSteps: ['gd-1-draft-access'],
|
|
1631
|
-
vectors: ['gmail_draft_manipulation'],
|
|
1632
|
-
detectionMethods: [
|
|
1633
|
-
'Continuous draft hashing',
|
|
1634
|
-
'Recipient count monitoring',
|
|
1635
|
-
'Attachment enumeration',
|
|
1636
|
-
],
|
|
1637
|
-
},
|
|
1638
|
-
{
|
|
1639
|
-
id: 'gd-3-draft-send',
|
|
1640
|
-
phase: 'impact',
|
|
1641
|
-
name: 'Unauthorized Draft Send',
|
|
1642
|
-
description: 'Draft is sent without user action, potentially with modifications',
|
|
1643
|
-
indicators: [
|
|
1644
|
-
'Sent message timestamp does not correlate with user activity',
|
|
1645
|
-
'Sent from IP address not associated with user',
|
|
1646
|
-
'User was not active at send time',
|
|
1647
|
-
],
|
|
1648
|
-
requiredPriorSteps: ['gd-1-draft-access'],
|
|
1649
|
-
vectors: ['gmail_draft_manipulation'],
|
|
1650
|
-
detectionMethods: [
|
|
1651
|
-
'Send event correlation with user activity',
|
|
1652
|
-
'IP address analysis',
|
|
1653
|
-
'Device activity monitoring',
|
|
1654
|
-
],
|
|
1655
|
-
},
|
|
1656
|
-
{
|
|
1657
|
-
id: 'gd-4-evidence-suppression',
|
|
1658
|
-
phase: 'impact',
|
|
1659
|
-
name: 'Sent Message Suppression',
|
|
1660
|
-
description: 'Sent message is hidden from Sent folder or altered after sending',
|
|
1661
|
-
indicators: [
|
|
1662
|
-
'Message in recipient inbox differs from Sent copy',
|
|
1663
|
-
'Sent message not visible in UI but exists in API',
|
|
1664
|
-
'Message-ID mismatches',
|
|
1665
|
-
],
|
|
1666
|
-
requiredPriorSteps: ['gd-3-draft-send'],
|
|
1667
|
-
vectors: ['gmail_hidden_threads', 'gmail_draft_manipulation'],
|
|
1668
|
-
detectionMethods: [
|
|
1669
|
-
'Cross-reference with recipient',
|
|
1670
|
-
'Sent folder integrity checking',
|
|
1671
|
-
'Message-ID tracking',
|
|
1672
|
-
],
|
|
1673
|
-
},
|
|
1674
|
-
],
|
|
1675
|
-
minimumStepsForEvidence: 2,
|
|
1676
|
-
legalImplications: {
|
|
1677
|
-
fraudType: 'MAIL_FRAUD_AND_IMPERSONATION',
|
|
1678
|
-
applicableLaws: [
|
|
1679
|
-
'18 U.S.C. § 1343 - Wire Fraud',
|
|
1680
|
-
'18 U.S.C. § 1028A - Identity Theft',
|
|
1681
|
-
'18 U.S.C. § 1030 - CFAA',
|
|
1682
|
-
'18 U.S.C. § 2511 - Wiretap Act',
|
|
1683
|
-
],
|
|
1684
|
-
potentialDamages: `Draft exploitation enables:
|
|
1685
|
-
- Email impersonation (sending as user)
|
|
1686
|
-
- Business communication manipulation
|
|
1687
|
-
- Relationship sabotage
|
|
1688
|
-
- Evidence planting`,
|
|
1689
|
-
recommendations: [
|
|
1690
|
-
'Preserve all draft observations with hashes',
|
|
1691
|
-
'Document modification timeline',
|
|
1692
|
-
'Compare sent messages with drafts',
|
|
1693
|
-
'Contact recipients to verify received content',
|
|
1694
|
-
],
|
|
1695
|
-
},
|
|
1696
|
-
};
|
|
1697
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1698
|
-
// APPLE ATTACK CHAINS
|
|
1699
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1700
|
-
export const APPLE_IMESSAGE_MITM_CHAIN = {
|
|
1701
|
-
id: 'apple-imessage-mitm-chain',
|
|
1702
|
-
name: 'Apple iMessage Man-in-the-Middle Chain',
|
|
1703
|
-
target: 'apple',
|
|
1704
|
-
description: `Apple exploits control of the IDS (Identity Directory Service) to substitute
|
|
1705
|
-
encryption keys, enabling message interception despite PQ3 "end-to-end encryption" claims.`,
|
|
1706
|
-
steps: [
|
|
1707
|
-
{
|
|
1708
|
-
id: 'am-1-ids-control',
|
|
1709
|
-
phase: 'reconnaissance',
|
|
1710
|
-
name: 'IDS Key Distribution Control',
|
|
1711
|
-
description: 'Apple controls IDS servers that distribute public keys for iMessage',
|
|
1712
|
-
indicators: [
|
|
1713
|
-
'All iMessage key requests route through Apple IDS servers',
|
|
1714
|
-
'No independent key verification mechanism',
|
|
1715
|
-
'Key Transparency logs controlled by Apple',
|
|
1716
|
-
],
|
|
1717
|
-
requiredPriorSteps: [],
|
|
1718
|
-
vectors: ['imessage_false_e2e'],
|
|
1719
|
-
detectionMethods: [
|
|
1720
|
-
'Network traffic analysis to IDS endpoints',
|
|
1721
|
-
'Key request interception and analysis',
|
|
1722
|
-
'KT audit log verification',
|
|
1723
|
-
],
|
|
1724
|
-
},
|
|
1725
|
-
{
|
|
1726
|
-
id: 'am-2-key-substitution',
|
|
1727
|
-
phase: 'initial_access',
|
|
1728
|
-
name: 'Encryption Key Substitution',
|
|
1729
|
-
description: 'Apple-controlled IDS returns substitute keys instead of actual recipient keys',
|
|
1730
|
-
indicators: [
|
|
1731
|
-
'Key fingerprint differs from out-of-band verified key',
|
|
1732
|
-
'Key changes without device change event',
|
|
1733
|
-
'Multiple different keys returned for same identity',
|
|
1734
|
-
'Key hash mismatch in KT logs',
|
|
1735
|
-
],
|
|
1736
|
-
requiredPriorSteps: ['am-1-ids-control'],
|
|
1737
|
-
vectors: ['imessage_key_substitution'],
|
|
1738
|
-
detectionMethods: [
|
|
1739
|
-
'Out-of-band key verification (like Signal safety numbers)',
|
|
1740
|
-
'Key change monitoring over time',
|
|
1741
|
-
'Multi-device key comparison',
|
|
1742
|
-
'Independent KT auditing',
|
|
1743
|
-
],
|
|
1744
|
-
},
|
|
1745
|
-
{
|
|
1746
|
-
id: 'am-3-message-interception',
|
|
1747
|
-
phase: 'execution',
|
|
1748
|
-
name: 'Message Decryption',
|
|
1749
|
-
description: 'Messages encrypted to substitute key are decrypted by Apple',
|
|
1750
|
-
indicators: [
|
|
1751
|
-
'Message content known to parties other than sender/recipient',
|
|
1752
|
-
'Targeted advertising based on message content',
|
|
1753
|
-
'Content referenced in legal requests without device access',
|
|
1754
|
-
],
|
|
1755
|
-
requiredPriorSteps: ['am-2-key-substitution'],
|
|
1756
|
-
vectors: ['imessage_false_e2e'],
|
|
1757
|
-
detectionMethods: [
|
|
1758
|
-
'Canary message testing',
|
|
1759
|
-
'Content correlation with external signals',
|
|
1760
|
-
'Legal discovery analysis',
|
|
1761
|
-
],
|
|
1762
|
-
},
|
|
1763
|
-
{
|
|
1764
|
-
id: 'am-4-message-modification',
|
|
1765
|
-
phase: 'impact',
|
|
1766
|
-
name: 'Message Modification/Injection',
|
|
1767
|
-
description: 'Apple modifies message content or injects new messages',
|
|
1768
|
-
indicators: [
|
|
1769
|
-
'Message content differs between sender and recipient',
|
|
1770
|
-
'Messages appear that sender did not send',
|
|
1771
|
-
'Message timing anomalies',
|
|
1772
|
-
'Metadata inconsistencies',
|
|
1773
|
-
],
|
|
1774
|
-
requiredPriorSteps: ['am-3-message-interception'],
|
|
1775
|
-
vectors: ['imessage_false_e2e'],
|
|
1776
|
-
detectionMethods: [
|
|
1777
|
-
'Message content comparison (sender vs recipient)',
|
|
1778
|
-
'Message hash verification',
|
|
1779
|
-
'Timing analysis',
|
|
1780
|
-
],
|
|
1781
|
-
},
|
|
1782
|
-
{
|
|
1783
|
-
id: 'am-5-kt-manipulation',
|
|
1784
|
-
phase: 'persistence',
|
|
1785
|
-
name: 'Key Transparency Log Manipulation',
|
|
1786
|
-
description: 'Apple manipulates KT logs to hide key substitution',
|
|
1787
|
-
indicators: [
|
|
1788
|
-
'KT log entries do not match observed keys',
|
|
1789
|
-
'Log gaps or inconsistencies',
|
|
1790
|
-
'No third-party KT auditors',
|
|
1791
|
-
'Internal-only verification',
|
|
1792
|
-
],
|
|
1793
|
-
requiredPriorSteps: ['am-2-key-substitution'],
|
|
1794
|
-
vectors: ['imessage_key_substitution', 'imessage_false_e2e'],
|
|
1795
|
-
detectionMethods: [
|
|
1796
|
-
'Independent KT log auditing',
|
|
1797
|
-
'Log integrity verification',
|
|
1798
|
-
'Historical key comparison',
|
|
1799
|
-
],
|
|
1800
|
-
},
|
|
1801
|
-
],
|
|
1802
|
-
minimumStepsForEvidence: 2,
|
|
1803
|
-
legalImplications: {
|
|
1804
|
-
fraudType: 'FALSE_E2E_ENCRYPTION_CLAIMS',
|
|
1805
|
-
applicableLaws: [
|
|
1806
|
-
'15 U.S.C. § 45 - FTC Act Section 5 (deceptive advertising)',
|
|
1807
|
-
'18 U.S.C. § 2511 - Wiretap Act',
|
|
1808
|
-
'18 U.S.C. § 2701 - Stored Communications Act',
|
|
1809
|
-
'Cal. Bus. & Prof. Code § 17500 - False Advertising',
|
|
1810
|
-
'GDPR Article 5(1)(a) - Lawful processing (EU users)',
|
|
1811
|
-
],
|
|
1812
|
-
potentialDamages: `False E2E encryption claims cause:
|
|
1813
|
-
- Users believe communications are private when they are not
|
|
1814
|
-
- Journalists, activists, and at-risk users are endangered
|
|
1815
|
-
- Business confidential information exposed
|
|
1816
|
-
- Legal privilege potentially compromised
|
|
1817
|
-
- Constitutional rights (4th Amendment) circumvented`,
|
|
1818
|
-
recommendations: [
|
|
1819
|
-
'Document key discrepancies with cryptographic proof',
|
|
1820
|
-
'Perform out-of-band verification with contacts',
|
|
1821
|
-
'File FTC complaint for false advertising',
|
|
1822
|
-
'Report to state AG consumer protection division',
|
|
1823
|
-
'Consider class action for systematic deception',
|
|
1824
|
-
'Engage security researchers for independent verification',
|
|
1825
|
-
],
|
|
1826
|
-
},
|
|
1827
|
-
};
|
|
1828
|
-
export const APPLE_CONTACT_KEY_BYPASS_CHAIN = {
|
|
1829
|
-
id: 'apple-contact-key-bypass-chain',
|
|
1830
|
-
name: 'Apple Contact Key Verification Bypass Chain',
|
|
1831
|
-
target: 'apple',
|
|
1832
|
-
description: `Apple's Contact Key Verification can be bypassed or disabled, leaving users
|
|
1833
|
-
vulnerable to MITM attacks while believing they are protected.`,
|
|
1834
|
-
steps: [
|
|
1835
|
-
{
|
|
1836
|
-
id: 'ac-1-ckv-disabled',
|
|
1837
|
-
phase: 'reconnaissance',
|
|
1838
|
-
name: 'CKV Disabled by Default',
|
|
1839
|
-
description: 'Contact Key Verification requires opt-in and is not enabled by default',
|
|
1840
|
-
indicators: [
|
|
1841
|
-
'CKV setting off on user devices',
|
|
1842
|
-
'No prompts to enable CKV',
|
|
1843
|
-
'Most contacts do not have CKV enabled',
|
|
1844
|
-
],
|
|
1845
|
-
requiredPriorSteps: [],
|
|
1846
|
-
vectors: ['imessage_false_e2e'],
|
|
1847
|
-
detectionMethods: [
|
|
1848
|
-
'Device settings audit',
|
|
1849
|
-
'Contact CKV status survey',
|
|
1850
|
-
'Apple documentation review',
|
|
1851
|
-
],
|
|
1852
|
-
},
|
|
1853
|
-
{
|
|
1854
|
-
id: 'ac-2-ckv-ineffective',
|
|
1855
|
-
phase: 'initial_access',
|
|
1856
|
-
name: 'CKV Alert Suppression',
|
|
1857
|
-
description: 'CKV alerts can be suppressed or not delivered when key substitution occurs',
|
|
1858
|
-
indicators: [
|
|
1859
|
-
'Key change detected but no CKV alert shown',
|
|
1860
|
-
'Alert displayed after messages already sent',
|
|
1861
|
-
'Alert notification easily dismissed',
|
|
1862
|
-
],
|
|
1863
|
-
requiredPriorSteps: ['ac-1-ckv-disabled'],
|
|
1864
|
-
vectors: ['imessage_key_substitution'],
|
|
1865
|
-
detectionMethods: [
|
|
1866
|
-
'Key change event vs alert correlation',
|
|
1867
|
-
'Alert timing analysis',
|
|
1868
|
-
'User notification log review',
|
|
1869
|
-
],
|
|
1870
|
-
},
|
|
1871
|
-
{
|
|
1872
|
-
id: 'ac-3-forced-ckv-off',
|
|
1873
|
-
phase: 'execution',
|
|
1874
|
-
name: 'Remote CKV Disabling',
|
|
1875
|
-
description: 'Apple can remotely disable CKV or modify its behavior via iOS updates',
|
|
1876
|
-
indicators: [
|
|
1877
|
-
'CKV settings change without user action',
|
|
1878
|
-
'CKV behavior changes after update',
|
|
1879
|
-
'No user control over CKV update deployment',
|
|
1880
|
-
],
|
|
1881
|
-
requiredPriorSteps: [],
|
|
1882
|
-
vectors: ['imessage_false_e2e', 'imessage_key_substitution'],
|
|
1883
|
-
detectionMethods: [
|
|
1884
|
-
'Settings monitoring before/after updates',
|
|
1885
|
-
'CKV behavior testing after updates',
|
|
1886
|
-
'iOS update analysis',
|
|
1887
|
-
],
|
|
1888
|
-
},
|
|
1889
|
-
],
|
|
1890
|
-
minimumStepsForEvidence: 1,
|
|
1891
|
-
legalImplications: {
|
|
1892
|
-
fraudType: 'SECURITY_FEATURE_BYPASS',
|
|
1893
|
-
applicableLaws: [
|
|
1894
|
-
'15 U.S.C. § 45 - FTC Act Section 5',
|
|
1895
|
-
'Cal. Bus. & Prof. Code § 17500 - False Advertising',
|
|
1896
|
-
],
|
|
1897
|
-
potentialDamages: `CKV bypass enables MITM attacks on users who believe they are protected.
|
|
1898
|
-
High-value targets (journalists, activists) are especially at risk.`,
|
|
1899
|
-
recommendations: [
|
|
1900
|
-
'Document CKV status across devices',
|
|
1901
|
-
'Monitor for setting changes',
|
|
1902
|
-
'Use independent verification methods',
|
|
1903
|
-
],
|
|
1904
|
-
},
|
|
1905
|
-
};
|
|
1906
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1907
|
-
// CROSS-PLATFORM ATTACK CHAINS
|
|
1908
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1909
|
-
export const CROSS_PLATFORM_SURVEILLANCE_CHAIN = {
|
|
1910
|
-
id: 'cross-platform-surveillance-chain',
|
|
1911
|
-
name: 'Cross-Platform Coordinated Surveillance',
|
|
1912
|
-
target: 'google', // Primary, but involves Apple
|
|
1913
|
-
description: `Coordinated surveillance across Apple and Google services, suggesting data
|
|
1914
|
-
sharing or parallel targeting operations.`,
|
|
1915
|
-
steps: [
|
|
1916
|
-
{
|
|
1917
|
-
id: 'cp-1-parallel-access',
|
|
1918
|
-
phase: 'reconnaissance',
|
|
1919
|
-
name: 'Parallel Service Access',
|
|
1920
|
-
description: 'Multiple services (Gmail, iMessage, Chrome) accessed within short timeframe',
|
|
1921
|
-
indicators: [
|
|
1922
|
-
'Gmail access within minutes of iMessage key observation',
|
|
1923
|
-
'Chrome launch correlates with iMessage activity',
|
|
1924
|
-
'Cross-platform activity during user inactive periods',
|
|
1925
|
-
],
|
|
1926
|
-
requiredPriorSteps: [],
|
|
1927
|
-
vectors: ['cross_platform_surveillance'],
|
|
1928
|
-
detectionMethods: [
|
|
1929
|
-
'Timeline correlation across services',
|
|
1930
|
-
'Activity pattern analysis',
|
|
1931
|
-
'User activity verification',
|
|
1932
|
-
],
|
|
1933
|
-
},
|
|
1934
|
-
{
|
|
1935
|
-
id: 'cp-2-content-correlation',
|
|
1936
|
-
phase: 'execution',
|
|
1937
|
-
name: 'Cross-Platform Content Correlation',
|
|
1938
|
-
description: 'Content from one service appears to influence actions on another',
|
|
1939
|
-
indicators: [
|
|
1940
|
-
'Gmail filters target topics from iMessage conversations',
|
|
1941
|
-
'Chrome history shows searches related to private iMessage content',
|
|
1942
|
-
'Advertising targets cross-platform conversation topics',
|
|
1943
|
-
],
|
|
1944
|
-
requiredPriorSteps: ['cp-1-parallel-access'],
|
|
1945
|
-
vectors: ['cross_platform_surveillance', 'coordinated_manipulation'],
|
|
1946
|
-
detectionMethods: [
|
|
1947
|
-
'Content keyword tracking across platforms',
|
|
1948
|
-
'Ad targeting analysis',
|
|
1949
|
-
'Search history correlation',
|
|
1950
|
-
],
|
|
1951
|
-
},
|
|
1952
|
-
{
|
|
1953
|
-
id: 'cp-3-coordinated-suppression',
|
|
1954
|
-
phase: 'impact',
|
|
1955
|
-
name: 'Coordinated Information Suppression',
|
|
1956
|
-
description: 'Content is hidden or suppressed across multiple platforms simultaneously',
|
|
1957
|
-
indicators: [
|
|
1958
|
-
'Gmail thread hidden at same time as iMessage discussion',
|
|
1959
|
-
'Chrome history entries deleted matching Gmail activity',
|
|
1960
|
-
'Cross-platform content removal patterns',
|
|
1961
|
-
],
|
|
1962
|
-
requiredPriorSteps: ['cp-1-parallel-access'],
|
|
1963
|
-
vectors: ['coordinated_manipulation', 'gmail_hidden_threads', 'chrome_history_manipulation'],
|
|
1964
|
-
detectionMethods: [
|
|
1965
|
-
'Cross-platform visibility monitoring',
|
|
1966
|
-
'Deletion timing correlation',
|
|
1967
|
-
'Content preservation and comparison',
|
|
1968
|
-
],
|
|
1969
|
-
},
|
|
1970
|
-
],
|
|
1971
|
-
minimumStepsForEvidence: 2,
|
|
1972
|
-
legalImplications: {
|
|
1973
|
-
fraudType: 'CROSS_PLATFORM_CONSPIRACY',
|
|
1974
|
-
applicableLaws: [
|
|
1975
|
-
'18 U.S.C. § 371 - Conspiracy to commit offense against US',
|
|
1976
|
-
'18 U.S.C. § 1030 - CFAA',
|
|
1977
|
-
'18 U.S.C. § 2511 - Wiretap Act',
|
|
1978
|
-
'15 U.S.C. § 1 - Sherman Antitrust Act (if competitive harm)',
|
|
1979
|
-
'GDPR Article 5 - Data sharing without consent (EU)',
|
|
1980
|
-
],
|
|
1981
|
-
potentialDamages: `Cross-platform coordination indicates:
|
|
1982
|
-
- Systematic privacy violation
|
|
1983
|
-
- Potential data sharing agreements
|
|
1984
|
-
- Comprehensive surveillance capability
|
|
1985
|
-
- No platform provides genuine privacy`,
|
|
1986
|
-
recommendations: [
|
|
1987
|
-
'Document temporal correlations with precision',
|
|
1988
|
-
'Preserve evidence from all platforms',
|
|
1989
|
-
'Report to DOJ Antitrust Division',
|
|
1990
|
-
'File multi-company FTC complaint',
|
|
1991
|
-
'Consider RICO implications',
|
|
1992
|
-
],
|
|
1993
|
-
},
|
|
1994
|
-
};
|
|
1995
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1996
|
-
// PREDEFINED ATTACK CHAIN REGISTRY
|
|
1997
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
1998
|
-
export const ATTACK_CHAIN_REGISTRY = [
|
|
1999
|
-
GOOGLE_SURVEILLANCE_CHAIN,
|
|
2000
|
-
GOOGLE_DRAFT_EXPLOITATION_CHAIN,
|
|
2001
|
-
APPLE_IMESSAGE_MITM_CHAIN,
|
|
2002
|
-
APPLE_CONTACT_KEY_BYPASS_CHAIN,
|
|
2003
|
-
CROSS_PLATFORM_SURVEILLANCE_CHAIN,
|
|
2004
|
-
];
|
|
2005
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2006
|
-
// ATTACK CHAIN DETECTOR
|
|
2007
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2008
|
-
export class AttackChainDetector {
|
|
2009
|
-
storageDir;
|
|
2010
|
-
observations = new Map();
|
|
2011
|
-
progressCache = new Map();
|
|
2012
|
-
constructor(storageDir) {
|
|
2013
|
-
this.storageDir = path.join(storageDir, 'attack-chains');
|
|
2014
|
-
}
|
|
2015
|
-
async initialize() {
|
|
2016
|
-
await fs.mkdir(this.storageDir, { recursive: true });
|
|
2017
|
-
await fs.mkdir(path.join(this.storageDir, 'observations'), { recursive: true });
|
|
2018
|
-
await fs.mkdir(path.join(this.storageDir, 'progress'), { recursive: true });
|
|
2019
|
-
}
|
|
2020
|
-
/**
|
|
2021
|
-
* Record an observation that matches an attack chain step.
|
|
2022
|
-
*/
|
|
2023
|
-
async recordObservation(params) {
|
|
2024
|
-
const chain = ATTACK_CHAIN_REGISTRY.find(c => c.id === params.chainId);
|
|
2025
|
-
if (!chain) {
|
|
2026
|
-
throw new Error(`Unknown attack chain: ${params.chainId}`);
|
|
2027
|
-
}
|
|
2028
|
-
const step = chain.steps.find(s => s.id === params.stepId);
|
|
2029
|
-
if (!step) {
|
|
2030
|
-
throw new Error(`Unknown step ${params.stepId} in chain ${params.chainId}`);
|
|
2031
|
-
}
|
|
2032
|
-
const now = new Date().toISOString();
|
|
2033
|
-
const observation = {
|
|
2034
|
-
id: crypto.randomUUID(),
|
|
2035
|
-
timestamp: now,
|
|
2036
|
-
chainId: params.chainId,
|
|
2037
|
-
stepId: params.stepId,
|
|
2038
|
-
findingId: params.findingId,
|
|
2039
|
-
confidence: params.confidence,
|
|
2040
|
-
evidence: params.evidence,
|
|
2041
|
-
hash: '',
|
|
2042
|
-
};
|
|
2043
|
-
observation.hash = hashString(JSON.stringify({
|
|
2044
|
-
id: observation.id,
|
|
2045
|
-
timestamp: observation.timestamp,
|
|
2046
|
-
chainId: observation.chainId,
|
|
2047
|
-
stepId: observation.stepId,
|
|
2048
|
-
findingId: observation.findingId,
|
|
2049
|
-
}));
|
|
2050
|
-
// Store observation
|
|
2051
|
-
const chainObs = this.observations.get(params.chainId) || [];
|
|
2052
|
-
chainObs.push(observation);
|
|
2053
|
-
this.observations.set(params.chainId, chainObs);
|
|
2054
|
-
await this.persistObservation(observation);
|
|
2055
|
-
// Update progress
|
|
2056
|
-
await this.updateProgress(params.chainId);
|
|
2057
|
-
return observation;
|
|
2058
|
-
}
|
|
2059
|
-
/**
|
|
2060
|
-
* Automatically detect which attack chain steps match a finding.
|
|
2061
|
-
*/
|
|
2062
|
-
async detectChainSteps(finding) {
|
|
2063
|
-
const observations = [];
|
|
2064
|
-
for (const chain of ATTACK_CHAIN_REGISTRY) {
|
|
2065
|
-
for (const step of chain.steps) {
|
|
2066
|
-
// Check if finding's vector matches step's vectors
|
|
2067
|
-
if (step.vectors.includes(finding.vector)) {
|
|
2068
|
-
// Calculate confidence based on indicator match
|
|
2069
|
-
let matchedIndicators = 0;
|
|
2070
|
-
const findingDetails = JSON.stringify(finding.technicalDetails).toLowerCase();
|
|
2071
|
-
for (const indicator of step.indicators) {
|
|
2072
|
-
const indicatorKeywords = indicator.toLowerCase().split(' ');
|
|
2073
|
-
if (indicatorKeywords.some(kw => findingDetails.includes(kw))) {
|
|
2074
|
-
matchedIndicators++;
|
|
2075
|
-
}
|
|
2076
|
-
}
|
|
2077
|
-
const confidence = step.indicators.length > 0
|
|
2078
|
-
? matchedIndicators / step.indicators.length
|
|
2079
|
-
: 0.5;
|
|
2080
|
-
// Only record if confidence is above threshold
|
|
2081
|
-
if (confidence >= 0.3) {
|
|
2082
|
-
const obs = await this.recordObservation({
|
|
2083
|
-
chainId: chain.id,
|
|
2084
|
-
stepId: step.id,
|
|
2085
|
-
findingId: finding.id,
|
|
2086
|
-
confidence,
|
|
2087
|
-
evidence: finding.description,
|
|
2088
|
-
});
|
|
2089
|
-
observations.push(obs);
|
|
2090
|
-
}
|
|
2091
|
-
}
|
|
2092
|
-
}
|
|
2093
|
-
}
|
|
2094
|
-
return observations;
|
|
2095
|
-
}
|
|
2096
|
-
/**
|
|
2097
|
-
* Get current progress for an attack chain.
|
|
2098
|
-
*/
|
|
2099
|
-
async getChainProgress(chainId) {
|
|
2100
|
-
const chain = ATTACK_CHAIN_REGISTRY.find(c => c.id === chainId);
|
|
2101
|
-
if (!chain) {
|
|
2102
|
-
throw new Error(`Unknown attack chain: ${chainId}`);
|
|
2103
|
-
}
|
|
2104
|
-
// Check cache
|
|
2105
|
-
const cached = this.progressCache.get(chainId);
|
|
2106
|
-
if (cached) {
|
|
2107
|
-
return cached;
|
|
2108
|
-
}
|
|
2109
|
-
return this.updateProgress(chainId);
|
|
2110
|
-
}
|
|
2111
|
-
/**
|
|
2112
|
-
* Get all attack chain progress.
|
|
2113
|
-
*/
|
|
2114
|
-
async getAllProgress() {
|
|
2115
|
-
const results = [];
|
|
2116
|
-
for (const chain of ATTACK_CHAIN_REGISTRY) {
|
|
2117
|
-
const progress = await this.getChainProgress(chain.id);
|
|
2118
|
-
results.push(progress);
|
|
2119
|
-
}
|
|
2120
|
-
return results;
|
|
2121
|
-
}
|
|
2122
|
-
/**
|
|
2123
|
-
* Get chains relevant to a specific target.
|
|
2124
|
-
*/
|
|
2125
|
-
getChainsForTarget(target) {
|
|
2126
|
-
return ATTACK_CHAIN_REGISTRY.filter(c => c.target === target);
|
|
2127
|
-
}
|
|
2128
|
-
/**
|
|
2129
|
-
* Analyze findings and detect complete or partial attack chains.
|
|
2130
|
-
*/
|
|
2131
|
-
async analyzeFindings(findings) {
|
|
2132
|
-
// First, auto-detect chain steps for each finding
|
|
2133
|
-
for (const finding of findings) {
|
|
2134
|
-
await this.detectChainSteps(finding);
|
|
2135
|
-
}
|
|
2136
|
-
// Get all progress
|
|
2137
|
-
const allProgress = await this.getAllProgress();
|
|
2138
|
-
const completeChains = allProgress.filter(p => p.isComplete);
|
|
2139
|
-
const partialChains = allProgress.filter(p => !p.isComplete &&
|
|
2140
|
-
p.observedSteps.length >= ATTACK_CHAIN_REGISTRY.find(c => c.id === p.chainId).minimumStepsForEvidence);
|
|
2141
|
-
const activeThreats = allProgress.filter(p => p.riskLevel === 'high' || p.riskLevel === 'critical');
|
|
2142
|
-
return { completeChains, partialChains, activeThreats };
|
|
2143
|
-
}
|
|
2144
|
-
/**
|
|
2145
|
-
* Generate attack chain report.
|
|
2146
|
-
*/
|
|
2147
|
-
async generateChainReport(chainId) {
|
|
2148
|
-
const chain = ATTACK_CHAIN_REGISTRY.find(c => c.id === chainId);
|
|
2149
|
-
if (!chain) {
|
|
2150
|
-
throw new Error(`Unknown attack chain: ${chainId}`);
|
|
2151
|
-
}
|
|
2152
|
-
const progress = await this.getChainProgress(chainId);
|
|
2153
|
-
const observations = this.observations.get(chainId) || [];
|
|
2154
|
-
// Build timeline
|
|
2155
|
-
const timeline = chain.steps.map(step => ({
|
|
2156
|
-
step,
|
|
2157
|
-
observation: observations.find(o => o.stepId === step.id) || null,
|
|
2158
|
-
}));
|
|
2159
|
-
// Identify gaps
|
|
2160
|
-
const gaps = chain.steps.filter(step => !observations.find(o => o.stepId === step.id));
|
|
2161
|
-
// Calculate evidence strength
|
|
2162
|
-
const observedCount = observations.length;
|
|
2163
|
-
const totalSteps = chain.steps.length;
|
|
2164
|
-
const avgConfidence = observations.length > 0
|
|
2165
|
-
? observations.reduce((sum, o) => sum + o.confidence, 0) / observations.length
|
|
2166
|
-
: 0;
|
|
2167
|
-
let evidenceStrength;
|
|
2168
|
-
if (progress.isComplete && avgConfidence > 0.8) {
|
|
2169
|
-
evidenceStrength = 'irrefutable';
|
|
2170
|
-
}
|
|
2171
|
-
else if (observedCount >= chain.minimumStepsForEvidence && avgConfidence > 0.6) {
|
|
2172
|
-
evidenceStrength = 'strong';
|
|
2173
|
-
}
|
|
2174
|
-
else if (observedCount >= 2 && avgConfidence > 0.4) {
|
|
2175
|
-
evidenceStrength = 'moderate';
|
|
2176
|
-
}
|
|
2177
|
-
else {
|
|
2178
|
-
evidenceStrength = 'weak';
|
|
2179
|
-
}
|
|
2180
|
-
// Calculate legal readiness
|
|
2181
|
-
let legalReadiness;
|
|
2182
|
-
if (evidenceStrength === 'irrefutable') {
|
|
2183
|
-
legalReadiness = 'prosecution_ready';
|
|
2184
|
-
}
|
|
2185
|
-
else if (evidenceStrength === 'strong') {
|
|
2186
|
-
legalReadiness = 'actionable';
|
|
2187
|
-
}
|
|
2188
|
-
else if (evidenceStrength === 'moderate') {
|
|
2189
|
-
legalReadiness = 'preliminary';
|
|
2190
|
-
}
|
|
2191
|
-
else {
|
|
2192
|
-
legalReadiness = 'insufficient';
|
|
2193
|
-
}
|
|
2194
|
-
return {
|
|
2195
|
-
chain,
|
|
2196
|
-
progress,
|
|
2197
|
-
timeline,
|
|
2198
|
-
gaps,
|
|
2199
|
-
evidenceStrength,
|
|
2200
|
-
legalReadiness,
|
|
2201
|
-
};
|
|
2202
|
-
}
|
|
2203
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2204
|
-
// Private Methods
|
|
2205
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2206
|
-
async updateProgress(chainId) {
|
|
2207
|
-
const chain = ATTACK_CHAIN_REGISTRY.find(c => c.id === chainId);
|
|
2208
|
-
if (!chain) {
|
|
2209
|
-
throw new Error(`Unknown attack chain: ${chainId}`);
|
|
2210
|
-
}
|
|
2211
|
-
const observations = this.observations.get(chainId) || [];
|
|
2212
|
-
// Calculate completion
|
|
2213
|
-
const observedStepIds = new Set(observations.map(o => o.stepId));
|
|
2214
|
-
const completionPercentage = (observedStepIds.size / chain.steps.length) * 100;
|
|
2215
|
-
// Determine current phase
|
|
2216
|
-
const observedSteps = chain.steps.filter(s => observedStepIds.has(s.id));
|
|
2217
|
-
const phaseOrder = ['reconnaissance', 'initial_access', 'execution', 'persistence', 'exfiltration', 'impact'];
|
|
2218
|
-
const currentPhase = observedSteps.length > 0
|
|
2219
|
-
? phaseOrder.reduce((latest, phase) => {
|
|
2220
|
-
const stepsInPhase = observedSteps.filter(s => s.phase === phase);
|
|
2221
|
-
return stepsInPhase.length > 0 ? phase : latest;
|
|
2222
|
-
}, 'reconnaissance')
|
|
2223
|
-
: 'reconnaissance';
|
|
2224
|
-
// Calculate risk level
|
|
2225
|
-
let riskLevel;
|
|
2226
|
-
if (completionPercentage >= 80) {
|
|
2227
|
-
riskLevel = 'critical';
|
|
2228
|
-
}
|
|
2229
|
-
else if (completionPercentage >= 50) {
|
|
2230
|
-
riskLevel = 'high';
|
|
2231
|
-
}
|
|
2232
|
-
else if (observedStepIds.size >= chain.minimumStepsForEvidence) {
|
|
2233
|
-
riskLevel = 'medium';
|
|
2234
|
-
}
|
|
2235
|
-
else {
|
|
2236
|
-
riskLevel = 'low';
|
|
2237
|
-
}
|
|
2238
|
-
// Find next expected steps
|
|
2239
|
-
const unobservedSteps = chain.steps.filter(s => !observedStepIds.has(s.id));
|
|
2240
|
-
const nextExpectedSteps = unobservedSteps.filter(step => {
|
|
2241
|
-
// Step is expected if all required prior steps are observed
|
|
2242
|
-
return step.requiredPriorSteps.every(reqId => observedStepIds.has(reqId));
|
|
2243
|
-
});
|
|
2244
|
-
const progress = {
|
|
2245
|
-
chainId,
|
|
2246
|
-
chainName: chain.name,
|
|
2247
|
-
target: chain.target,
|
|
2248
|
-
observedSteps: observations,
|
|
2249
|
-
completionPercentage,
|
|
2250
|
-
currentPhase,
|
|
2251
|
-
riskLevel,
|
|
2252
|
-
isComplete: completionPercentage === 100,
|
|
2253
|
-
nextExpectedSteps,
|
|
2254
|
-
};
|
|
2255
|
-
// Cache and persist
|
|
2256
|
-
this.progressCache.set(chainId, progress);
|
|
2257
|
-
await this.persistProgress(progress);
|
|
2258
|
-
return progress;
|
|
2259
|
-
}
|
|
2260
|
-
async persistObservation(obs) {
|
|
2261
|
-
const filePath = path.join(this.storageDir, 'observations', `${obs.chainId}_${obs.id}.json`);
|
|
2262
|
-
await fs.writeFile(filePath, JSON.stringify(obs, null, 2));
|
|
2263
|
-
}
|
|
2264
|
-
async persistProgress(progress) {
|
|
2265
|
-
const filePath = path.join(this.storageDir, 'progress', `${progress.chainId}.json`);
|
|
2266
|
-
await fs.writeFile(filePath, JSON.stringify(progress, null, 2));
|
|
2267
|
-
}
|
|
2268
|
-
}
|
|
2269
|
-
// Add methods to prototype
|
|
2270
|
-
UnifiedFraudOrchestrator.prototype.initializeAttackChains = async function () {
|
|
2271
|
-
if (!this.attackChainDetector) {
|
|
2272
|
-
this.attackChainDetector = new AttackChainDetector(this.storageDir);
|
|
2273
|
-
}
|
|
2274
|
-
await this.attackChainDetector.initialize();
|
|
2275
|
-
};
|
|
2276
|
-
UnifiedFraudOrchestrator.prototype.detectAttackChains = async function (investigationId) {
|
|
2277
|
-
const investigation = this.investigations.get(investigationId);
|
|
2278
|
-
if (!investigation) {
|
|
2279
|
-
throw new Error(`Investigation not found: ${investigationId}`);
|
|
2280
|
-
}
|
|
2281
|
-
if (!this.attackChainDetector) {
|
|
2282
|
-
await this.initializeAttackChains();
|
|
2283
|
-
}
|
|
2284
|
-
// Gather all findings
|
|
2285
|
-
const gmailFindings = this.gmailEngine.getFindings();
|
|
2286
|
-
const chromeFindings = this.chromeEngine.getFindings();
|
|
2287
|
-
const allFindings = [...gmailFindings, ...chromeFindings];
|
|
2288
|
-
return this.attackChainDetector.analyzeFindings(allFindings);
|
|
2289
|
-
};
|
|
2290
|
-
UnifiedFraudOrchestrator.prototype.getAttackChainReport = async function (chainId) {
|
|
2291
|
-
if (!this.attackChainDetector) {
|
|
2292
|
-
await this.initializeAttackChains();
|
|
2293
|
-
}
|
|
2294
|
-
return this.attackChainDetector.generateChainReport(chainId);
|
|
2295
|
-
};
|
|
2296
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2297
|
-
// GOOGLE GOVERNMENT & DEFENSE SYSTEMS
|
|
2298
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2299
|
-
export const GOOGLE_GOV_PRODUCTS = [
|
|
2300
|
-
{
|
|
2301
|
-
id: 'google-workspace-gov',
|
|
2302
|
-
name: 'Google Workspace for Government',
|
|
2303
|
-
vendor: 'google',
|
|
2304
|
-
category: 'productivity',
|
|
2305
|
-
description: 'Gmail, Drive, Docs, Meet, Calendar for government agencies. FedRAMP authorized cloud productivity suite.',
|
|
2306
|
-
targetCustomers: ['federal', 'state_local'],
|
|
2307
|
-
certifications: ['FedRAMP High', 'CJIS', 'ITAR', 'SOC 1/2/3', 'ISO 27001'],
|
|
2308
|
-
dataResidency: ['US-only data centers', 'Assured Workloads regions'],
|
|
2309
|
-
knownContracts: ['DOI', 'USDA', 'GSA', 'Various state governments'],
|
|
2310
|
-
securityConcerns: [
|
|
2311
|
-
'Google retains access to all data for "support"',
|
|
2312
|
-
'AI/ML processing of government communications',
|
|
2313
|
-
'Metadata collection even in "sovereign" mode',
|
|
2314
|
-
'Key management controlled by Google',
|
|
2315
|
-
],
|
|
2316
|
-
accessPoints: [
|
|
2317
|
-
'Admin console access by Google support',
|
|
2318
|
-
'Automated scanning for "security"',
|
|
2319
|
-
'AI training on anonymized data',
|
|
2320
|
-
'Vault/eDiscovery backdoor access',
|
|
2321
|
-
],
|
|
2322
|
-
integrations: ['Google Cloud Platform', 'Chronicle SIEM', 'BeyondCorp', 'Mandiant'],
|
|
2323
|
-
},
|
|
2324
|
-
{
|
|
2325
|
-
id: 'google-cloud-gov',
|
|
2326
|
-
name: 'Google Cloud Platform for Government',
|
|
2327
|
-
vendor: 'google',
|
|
2328
|
-
category: 'cloud',
|
|
2329
|
-
description: 'FedRAMP authorized cloud infrastructure including Compute, Storage, BigQuery, AI/ML services.',
|
|
2330
|
-
targetCustomers: ['federal', 'dod', 'state_local', 'defense_contractors'],
|
|
2331
|
-
certifications: ['FedRAMP High', 'FedRAMP Moderate', 'IL2', 'IL4', 'IL5', 'CJIS', 'ITAR'],
|
|
2332
|
-
dataResidency: ['US regions', 'Assured Workloads', 'Sovereign Controls'],
|
|
2333
|
-
knownContracts: ['JEDI follow-on work', 'VA', 'DOE National Labs'],
|
|
2334
|
-
securityConcerns: [
|
|
2335
|
-
'Shared infrastructure with commercial cloud',
|
|
2336
|
-
'Google employee access to customer instances',
|
|
2337
|
-
'AI services process sensitive data',
|
|
2338
|
-
'Supply chain concerns with hardware',
|
|
2339
|
-
],
|
|
2340
|
-
accessPoints: [
|
|
2341
|
-
'Infrastructure-level access',
|
|
2342
|
-
'Customer-managed encryption keys (CMEK) still Google-accessible',
|
|
2343
|
-
'Logging and monitoring infrastructure',
|
|
2344
|
-
'Break-glass emergency access',
|
|
2345
|
-
],
|
|
2346
|
-
integrations: ['Anthos', 'GKE', 'BigQuery', 'Vertex AI', 'Chronicle'],
|
|
2347
|
-
},
|
|
2348
|
-
{
|
|
2349
|
-
id: 'google-chronicle',
|
|
2350
|
-
name: 'Chronicle Security Operations (Google SecOps)',
|
|
2351
|
-
vendor: 'google',
|
|
2352
|
-
category: 'security',
|
|
2353
|
-
subcategory: 'SIEM/SOAR',
|
|
2354
|
-
description: 'Cloud-native SIEM built on Google infrastructure. Ingests and analyzes security telemetry at scale.',
|
|
2355
|
-
targetCustomers: ['federal', 'dod', 'ic', 'defense_contractors'],
|
|
2356
|
-
certifications: ['FedRAMP High', 'SOC 2'],
|
|
2357
|
-
dataResidency: ['US data centers'],
|
|
2358
|
-
knownContracts: ['Multiple federal agencies'],
|
|
2359
|
-
securityConcerns: [
|
|
2360
|
-
'All security logs sent to Google infrastructure',
|
|
2361
|
-
'Google can see all ingested security data',
|
|
2362
|
-
'Detection rules and threat intel controlled by Google',
|
|
2363
|
-
'Creates comprehensive visibility into customer security posture',
|
|
2364
|
-
],
|
|
2365
|
-
accessPoints: [
|
|
2366
|
-
'Full access to ingested security logs',
|
|
2367
|
-
'Threat detection rule management',
|
|
2368
|
-
'Incident response data',
|
|
2369
|
-
'Network flow and endpoint telemetry',
|
|
2370
|
-
],
|
|
2371
|
-
integrations: ['Mandiant', 'VirusTotal', 'Google Cloud', 'Third-party SIEM'],
|
|
2372
|
-
},
|
|
2373
|
-
{
|
|
2374
|
-
id: 'google-mandiant',
|
|
2375
|
-
name: 'Mandiant (Google Cloud Security)',
|
|
2376
|
-
vendor: 'google',
|
|
2377
|
-
category: 'security',
|
|
2378
|
-
subcategory: 'Threat Intelligence & IR',
|
|
2379
|
-
description: 'Threat intelligence, incident response, and security consulting. Acquired by Google 2022.',
|
|
2380
|
-
targetCustomers: ['federal', 'dod', 'ic', 'defense_contractors', 'allied_nations'],
|
|
2381
|
-
certifications: ['FedRAMP (via Google Cloud)', 'Various clearances for personnel'],
|
|
2382
|
-
dataResidency: ['US-based operations', 'Global threat intel'],
|
|
2383
|
-
knownContracts: ['DOD', 'DHS', 'FBI', 'Various IC agencies', 'NATO allies'],
|
|
2384
|
-
securityConcerns: [
|
|
2385
|
-
'Incident response gives access to breached networks',
|
|
2386
|
-
'Threat intel includes sensitive attack data',
|
|
2387
|
-
'Acquisition by Google centralizes security intelligence',
|
|
2388
|
-
'Consultants may retain access post-engagement',
|
|
2389
|
-
],
|
|
2390
|
-
accessPoints: [
|
|
2391
|
-
'Incident response network access',
|
|
2392
|
-
'Threat intelligence sharing',
|
|
2393
|
-
'Adversary tracking data',
|
|
2394
|
-
'Customer breach forensics',
|
|
2395
|
-
],
|
|
2396
|
-
integrations: ['Chronicle', 'VirusTotal', 'Google Cloud', 'Siemplify'],
|
|
2397
|
-
},
|
|
2398
|
-
{
|
|
2399
|
-
id: 'google-beyondcorp',
|
|
2400
|
-
name: 'BeyondCorp Enterprise',
|
|
2401
|
-
vendor: 'google',
|
|
2402
|
-
category: 'security',
|
|
2403
|
-
subcategory: 'Zero Trust',
|
|
2404
|
-
description: 'Zero trust access solution. Mediates all access to applications and data.',
|
|
2405
|
-
targetCustomers: ['federal', 'dod', 'defense_contractors'],
|
|
2406
|
-
certifications: ['FedRAMP High'],
|
|
2407
|
-
dataResidency: ['US'],
|
|
2408
|
-
securityConcerns: [
|
|
2409
|
-
'All access decisions routed through Google',
|
|
2410
|
-
'Full visibility into who accesses what',
|
|
2411
|
-
'Device posture data collected',
|
|
2412
|
-
'Can deny access to any resource',
|
|
2413
|
-
],
|
|
2414
|
-
accessPoints: [
|
|
2415
|
-
'Access policy enforcement point',
|
|
2416
|
-
'User authentication data',
|
|
2417
|
-
'Device inventory and health',
|
|
2418
|
-
'Application access logs',
|
|
2419
|
-
],
|
|
2420
|
-
integrations: ['Google Workspace', 'Google Cloud', 'Chrome Enterprise', 'Endpoint Verification'],
|
|
2421
|
-
},
|
|
2422
|
-
{
|
|
2423
|
-
id: 'google-distributed-cloud',
|
|
2424
|
-
name: 'Google Distributed Cloud',
|
|
2425
|
-
vendor: 'google',
|
|
2426
|
-
category: 'infrastructure',
|
|
2427
|
-
subcategory: 'Edge/On-prem',
|
|
2428
|
-
description: 'Google Cloud services running on-premises or at edge locations. For air-gapped and tactical environments.',
|
|
2429
|
-
targetCustomers: ['dod', 'ic', 'defense_contractors'],
|
|
2430
|
-
certifications: ['IL5', 'IL6 (in progress)', 'Secret/TS environments'],
|
|
2431
|
-
dataResidency: ['Customer premises', 'Tactical edge'],
|
|
2432
|
-
knownContracts: ['DOD tactical edge', 'IC facilities'],
|
|
2433
|
-
securityConcerns: [
|
|
2434
|
-
'Google hardware in classified environments',
|
|
2435
|
-
'Software updates from Google',
|
|
2436
|
-
'Telemetry even in "air-gapped" mode',
|
|
2437
|
-
'Hardware implant concerns',
|
|
2438
|
-
],
|
|
2439
|
-
accessPoints: [
|
|
2440
|
-
'Software update channel',
|
|
2441
|
-
'Support access (even limited)',
|
|
2442
|
-
'Hardware-level access potential',
|
|
2443
|
-
'Licensing/activation systems',
|
|
2444
|
-
],
|
|
2445
|
-
integrations: ['Anthos', 'GKE', 'AI/ML services'],
|
|
2446
|
-
},
|
|
2447
|
-
{
|
|
2448
|
-
id: 'google-vertex-ai-gov',
|
|
2449
|
-
name: 'Vertex AI for Government',
|
|
2450
|
-
vendor: 'google',
|
|
2451
|
-
category: 'ai_ml',
|
|
2452
|
-
description: 'Machine learning platform for government. Includes generative AI, AutoML, and custom model training.',
|
|
2453
|
-
targetCustomers: ['federal', 'dod', 'ic'],
|
|
2454
|
-
certifications: ['FedRAMP High', 'IL4/IL5 (select services)'],
|
|
2455
|
-
dataResidency: ['US Assured Workloads'],
|
|
2456
|
-
securityConcerns: [
|
|
2457
|
-
'Training data potentially used by Google',
|
|
2458
|
-
'Model architectures visible to Google',
|
|
2459
|
-
'AI safety concerns for defense applications',
|
|
2460
|
-
'Inference data accessible',
|
|
2461
|
-
],
|
|
2462
|
-
accessPoints: [
|
|
2463
|
-
'Training data access',
|
|
2464
|
-
'Model weights and architecture',
|
|
2465
|
-
'Inference inputs/outputs',
|
|
2466
|
-
'Usage analytics',
|
|
2467
|
-
],
|
|
2468
|
-
integrations: ['BigQuery', 'Cloud Storage', 'Gemini', 'PaLM'],
|
|
2469
|
-
},
|
|
2470
|
-
];
|
|
2471
|
-
export const GOOGLE_GOV_PROFILE = {
|
|
2472
|
-
vendor: 'google',
|
|
2473
|
-
govDivision: 'Google Public Sector',
|
|
2474
|
-
annualGovRevenue: '$2B+ (estimated)',
|
|
2475
|
-
fedRampStatus: ['FedRAMP High (multiple)', 'FedRAMP Moderate', 'IL2', 'IL4', 'IL5'],
|
|
2476
|
-
primaryContracts: [
|
|
2477
|
-
'DOD JEDI/JWCC participant',
|
|
2478
|
-
'CBP border surveillance',
|
|
2479
|
-
'VA healthcare',
|
|
2480
|
-
'Various civilian agencies',
|
|
2481
|
-
],
|
|
2482
|
-
products: GOOGLE_GOV_PRODUCTS,
|
|
2483
|
-
dataAccessCapabilities: [
|
|
2484
|
-
'Full infrastructure access to cloud-hosted data',
|
|
2485
|
-
'AI/ML processing of all content',
|
|
2486
|
-
'Security monitoring and logging',
|
|
2487
|
-
'Incident response access',
|
|
2488
|
-
'Administrative backdoors',
|
|
2489
|
-
],
|
|
2490
|
-
knownBackdoors: [
|
|
2491
|
-
'Vault/eDiscovery access bypasses user encryption',
|
|
2492
|
-
'Admin console "support access"',
|
|
2493
|
-
'Break-glass emergency procedures',
|
|
2494
|
-
'Automated content scanning',
|
|
2495
|
-
],
|
|
2496
|
-
lawEnforcementCooperation: 'Complies with legal process. Transparency reports show high compliance rate. FISA court orders not disclosed.',
|
|
2497
|
-
};
|
|
2498
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2499
|
-
// APPLE GOVERNMENT & DEFENSE SYSTEMS
|
|
2500
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2501
|
-
export const APPLE_GOV_PRODUCTS = [
|
|
2502
|
-
{
|
|
2503
|
-
id: 'apple-business-essentials',
|
|
2504
|
-
name: 'Apple Business Essentials',
|
|
2505
|
-
vendor: 'apple',
|
|
2506
|
-
category: 'productivity',
|
|
2507
|
-
description: 'Device management, storage, and support for businesses and government. Includes iCloud storage and MDM.',
|
|
2508
|
-
targetCustomers: ['federal', 'state_local'],
|
|
2509
|
-
certifications: ['FedRAMP (via partners)', 'SOC 2'],
|
|
2510
|
-
dataResidency: ['US data centers', 'Limited options'],
|
|
2511
|
-
securityConcerns: [
|
|
2512
|
-
'iCloud data accessible by Apple',
|
|
2513
|
-
'MDM profiles controlled centrally',
|
|
2514
|
-
'Device telemetry collected',
|
|
2515
|
-
'Limited true air-gap capability',
|
|
2516
|
-
],
|
|
2517
|
-
accessPoints: [
|
|
2518
|
-
'iCloud infrastructure access',
|
|
2519
|
-
'MDM command and control',
|
|
2520
|
-
'Device enrollment data',
|
|
2521
|
-
'AppleCare support access',
|
|
2522
|
-
],
|
|
2523
|
-
integrations: ['iCloud', 'Apple School Manager', 'Apple Business Manager'],
|
|
2524
|
-
},
|
|
2525
|
-
{
|
|
2526
|
-
id: 'apple-managed-device-attestation',
|
|
2527
|
-
name: 'Managed Device Attestation',
|
|
2528
|
-
vendor: 'apple',
|
|
2529
|
-
category: 'security',
|
|
2530
|
-
subcategory: 'Device Security',
|
|
2531
|
-
description: 'Cryptographic attestation that device is genuine Apple hardware with valid security state.',
|
|
2532
|
-
targetCustomers: ['federal', 'dod', 'ic'],
|
|
2533
|
-
certifications: ['FIPS 140-2 (Secure Enclave)', 'Common Criteria'],
|
|
2534
|
-
dataResidency: ['Apple servers for attestation'],
|
|
2535
|
-
securityConcerns: [
|
|
2536
|
-
'Apple servers validate every device attestation',
|
|
2537
|
-
'Apple knows which devices are in use by whom',
|
|
2538
|
-
'Attestation can be revoked by Apple',
|
|
2539
|
-
'Creates dependency on Apple infrastructure',
|
|
2540
|
-
],
|
|
2541
|
-
accessPoints: [
|
|
2542
|
-
'Device attestation traffic',
|
|
2543
|
-
'Hardware identity database',
|
|
2544
|
-
'Security state information',
|
|
2545
|
-
'Enrollment status',
|
|
2546
|
-
],
|
|
2547
|
-
integrations: ['MDM solutions', 'Apple Business Manager', 'Conditional access'],
|
|
2548
|
-
},
|
|
2549
|
-
{
|
|
2550
|
-
id: 'apple-platform-security',
|
|
2551
|
-
name: 'Apple Platform Security (T2/Apple Silicon)',
|
|
2552
|
-
vendor: 'apple',
|
|
2553
|
-
category: 'hardware',
|
|
2554
|
-
description: 'Secure Enclave, hardware encryption, secure boot on Mac and iOS devices.',
|
|
2555
|
-
targetCustomers: ['federal', 'dod', 'ic', 'defense_contractors'],
|
|
2556
|
-
certifications: ['FIPS 140-2/140-3', 'Common Criteria', 'Various national certifications'],
|
|
2557
|
-
dataResidency: ['On-device', 'Keys may escrow to iCloud'],
|
|
2558
|
-
securityConcerns: [
|
|
2559
|
-
'Apple controls Secure Enclave firmware',
|
|
2560
|
-
'Recovery key escrow to Apple',
|
|
2561
|
-
'Activation lock controlled by Apple',
|
|
2562
|
-
'Software updates can modify security behavior',
|
|
2563
|
-
],
|
|
2564
|
-
accessPoints: [
|
|
2565
|
-
'Firmware update channel',
|
|
2566
|
-
'Activation lock servers',
|
|
2567
|
-
'Recovery key escrow',
|
|
2568
|
-
'Device enrollment status',
|
|
2569
|
-
],
|
|
2570
|
-
integrations: ['iCloud', 'MDM', 'Apple services'],
|
|
2571
|
-
},
|
|
2572
|
-
{
|
|
2573
|
-
id: 'apple-imessage-gov',
|
|
2574
|
-
name: 'iMessage/FaceTime for Government',
|
|
2575
|
-
vendor: 'apple',
|
|
2576
|
-
category: 'communications',
|
|
2577
|
-
description: 'Encrypted messaging and video calls. Used by government personnel on Apple devices.',
|
|
2578
|
-
targetCustomers: ['federal', 'state_local'],
|
|
2579
|
-
certifications: ['None specific - consumer product'],
|
|
2580
|
-
dataResidency: ['Primarily US', 'Metadata on Apple servers'],
|
|
2581
|
-
securityConcerns: [
|
|
2582
|
-
'Key distribution controlled by Apple IDS',
|
|
2583
|
-
'No independent key verification',
|
|
2584
|
-
'Metadata collected and retained',
|
|
2585
|
-
'MITM possible via key substitution',
|
|
2586
|
-
'iCloud backup defeats E2E encryption',
|
|
2587
|
-
],
|
|
2588
|
-
accessPoints: [
|
|
2589
|
-
'IDS key distribution servers',
|
|
2590
|
-
'Key Transparency logs (Apple controlled)',
|
|
2591
|
-
'Metadata collection',
|
|
2592
|
-
'iCloud message backup',
|
|
2593
|
-
'Push notification infrastructure',
|
|
2594
|
-
],
|
|
2595
|
-
integrations: ['iCloud', 'Apple ID', 'CarPlay', 'HomePod'],
|
|
2596
|
-
},
|
|
2597
|
-
{
|
|
2598
|
-
id: 'apple-maps-location',
|
|
2599
|
-
name: 'Apple Maps / Location Services',
|
|
2600
|
-
vendor: 'apple',
|
|
2601
|
-
category: 'analytics',
|
|
2602
|
-
subcategory: 'Geolocation',
|
|
2603
|
-
description: 'Mapping and location services used by government apps and personnel.',
|
|
2604
|
-
targetCustomers: ['federal', 'state_local', 'dod'],
|
|
2605
|
-
certifications: ['None specific'],
|
|
2606
|
-
dataResidency: ['Apple servers globally'],
|
|
2607
|
-
securityConcerns: [
|
|
2608
|
-
'Location history tracked',
|
|
2609
|
-
'Significant Locations feature',
|
|
2610
|
-
'Find My network creates mesh tracking',
|
|
2611
|
-
'Government personnel movements visible to Apple',
|
|
2612
|
-
],
|
|
2613
|
-
accessPoints: [
|
|
2614
|
-
'Location Services API',
|
|
2615
|
-
'Find My infrastructure',
|
|
2616
|
-
'Significant Locations database',
|
|
2617
|
-
'Maps search history',
|
|
2618
|
-
],
|
|
2619
|
-
integrations: ['Siri', 'Find My', 'CarPlay', 'Weather'],
|
|
2620
|
-
},
|
|
2621
|
-
{
|
|
2622
|
-
id: 'apple-mdm-abm',
|
|
2623
|
-
name: 'Apple Business Manager / MDM',
|
|
2624
|
-
vendor: 'apple',
|
|
2625
|
-
category: 'identity',
|
|
2626
|
-
subcategory: 'Device Management',
|
|
2627
|
-
description: 'Centralized device enrollment and management for government Apple devices.',
|
|
2628
|
-
targetCustomers: ['federal', 'state_local', 'dod'],
|
|
2629
|
-
certifications: ['SOC 2', 'ISO 27001'],
|
|
2630
|
-
dataResidency: ['Apple servers'],
|
|
2631
|
-
securityConcerns: [
|
|
2632
|
-
'Apple has visibility into all managed devices',
|
|
2633
|
-
'Can push profiles and configurations',
|
|
2634
|
-
'Device wipe capability',
|
|
2635
|
-
'App distribution controlled',
|
|
2636
|
-
],
|
|
2637
|
-
accessPoints: [
|
|
2638
|
-
'Device enrollment data',
|
|
2639
|
-
'Management command channel',
|
|
2640
|
-
'App deployment',
|
|
2641
|
-
'Configuration profiles',
|
|
2642
|
-
],
|
|
2643
|
-
integrations: ['MDM vendors (Jamf, Kandji, etc.)', 'Apple School Manager', 'VPP'],
|
|
2644
|
-
},
|
|
2645
|
-
];
|
|
2646
|
-
export const APPLE_GOV_PROFILE = {
|
|
2647
|
-
vendor: 'apple',
|
|
2648
|
-
govDivision: 'Apple Federal (via partners)',
|
|
2649
|
-
annualGovRevenue: '$1B+ (hardware sales, estimated)',
|
|
2650
|
-
fedRampStatus: ['No direct FedRAMP', 'Partners provide FedRAMP coverage'],
|
|
2651
|
-
primaryContracts: [
|
|
2652
|
-
'Device purchases across federal agencies',
|
|
2653
|
-
'DOD iOS device procurement',
|
|
2654
|
-
'State/local education and government',
|
|
2655
|
-
],
|
|
2656
|
-
products: APPLE_GOV_PRODUCTS,
|
|
2657
|
-
dataAccessCapabilities: [
|
|
2658
|
-
'iCloud data access (even with ADP, metadata accessible)',
|
|
2659
|
-
'Device attestation and enrollment data',
|
|
2660
|
-
'IDS key distribution control',
|
|
2661
|
-
'Location services data',
|
|
2662
|
-
'Push notification content (briefly)',
|
|
2663
|
-
],
|
|
2664
|
-
knownBackdoors: [
|
|
2665
|
-
'IDS key substitution capability',
|
|
2666
|
-
'iCloud backup decryption (without ADP)',
|
|
2667
|
-
'Activation Lock control',
|
|
2668
|
-
'MDM remote wipe',
|
|
2669
|
-
'Recovery key escrow',
|
|
2670
|
-
],
|
|
2671
|
-
lawEnforcementCooperation: 'Historically resisted FBI demands (San Bernardino). Complies with valid legal process. ADP makes iCloud data inaccessible but metadata still available.',
|
|
2672
|
-
};
|
|
2673
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2674
|
-
// MICROSOFT GOVERNMENT & DEFENSE SYSTEMS
|
|
2675
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2676
|
-
export const MICROSOFT_GOV_PRODUCTS = [
|
|
2677
|
-
{
|
|
2678
|
-
id: 'microsoft-365-gcc',
|
|
2679
|
-
name: 'Microsoft 365 Government (GCC/GCC-High)',
|
|
2680
|
-
vendor: 'microsoft',
|
|
2681
|
-
category: 'productivity',
|
|
2682
|
-
description: 'Office 365, Teams, SharePoint, Exchange for government. GCC-High for DoD and sensitive workloads.',
|
|
2683
|
-
targetCustomers: ['federal', 'dod', 'ic', 'state_local', 'defense_contractors'],
|
|
2684
|
-
certifications: ['FedRAMP High', 'DFARS', 'ITAR', 'CJIS', 'IRS 1075', 'IL2', 'IL4', 'IL5'],
|
|
2685
|
-
dataResidency: ['US-only sovereign cloud', 'GCC-High isolated infrastructure'],
|
|
2686
|
-
knownContracts: ['JEDI (terminated)', 'JWCC', 'DOD enterprise', 'Most federal agencies'],
|
|
2687
|
-
securityConcerns: [
|
|
2688
|
-
'Microsoft retains admin access',
|
|
2689
|
-
'Telemetry collection even in GCC-High',
|
|
2690
|
-
'AI/Copilot processing of content',
|
|
2691
|
-
'Key escrow capabilities',
|
|
2692
|
-
'Partner ecosystem access',
|
|
2693
|
-
],
|
|
2694
|
-
accessPoints: [
|
|
2695
|
-
'Exchange Online admin access',
|
|
2696
|
-
'SharePoint backend access',
|
|
2697
|
-
'Teams message inspection',
|
|
2698
|
-
'eDiscovery and Legal Hold',
|
|
2699
|
-
'Customer Lockbox (still MS access)',
|
|
2700
|
-
],
|
|
2701
|
-
integrations: ['Azure Government', 'Defender', 'Sentinel', 'Intune', 'Entra ID'],
|
|
2702
|
-
},
|
|
2703
|
-
{
|
|
2704
|
-
id: 'azure-government',
|
|
2705
|
-
name: 'Azure Government',
|
|
2706
|
-
vendor: 'microsoft',
|
|
2707
|
-
category: 'cloud',
|
|
2708
|
-
description: 'Isolated government cloud with FedRAMP High and DoD IL authorizations. Separate from commercial Azure.',
|
|
2709
|
-
targetCustomers: ['federal', 'dod', 'ic', 'state_local', 'defense_contractors'],
|
|
2710
|
-
certifications: ['FedRAMP High', 'IL2', 'IL4', 'IL5', 'IL6', 'CJIS', 'ITAR', 'IRS 1075'],
|
|
2711
|
-
dataResidency: ['US Government regions only', 'Air-gapped options (Azure Government Secret/Top Secret)'],
|
|
2712
|
-
knownContracts: ['JWCC', 'DOD enterprise', 'VA', 'DHS', 'Treasury'],
|
|
2713
|
-
securityConcerns: [
|
|
2714
|
-
'Still connected to Microsoft corporate',
|
|
2715
|
-
'Software supply chain from commercial',
|
|
2716
|
-
'Microsoft employee access with clearance',
|
|
2717
|
-
'Shared codebase with commercial Azure',
|
|
2718
|
-
],
|
|
2719
|
-
accessPoints: [
|
|
2720
|
-
'Infrastructure-level access',
|
|
2721
|
-
'Support access with clearance',
|
|
2722
|
-
'Monitoring and diagnostics',
|
|
2723
|
-
'Update and patch channels',
|
|
2724
|
-
],
|
|
2725
|
-
integrations: ['M365 GCC-High', 'Defender for Cloud', 'Sentinel', 'Key Vault'],
|
|
2726
|
-
},
|
|
2727
|
-
{
|
|
2728
|
-
id: 'azure-gov-secret',
|
|
2729
|
-
name: 'Azure Government Secret / Top Secret',
|
|
2730
|
-
vendor: 'microsoft',
|
|
2731
|
-
category: 'cloud',
|
|
2732
|
-
subcategory: 'Classified',
|
|
2733
|
-
description: 'Air-gapped Azure for classified workloads. Secret and Top Secret enclaves.',
|
|
2734
|
-
targetCustomers: ['dod', 'ic'],
|
|
2735
|
-
certifications: ['IL6', 'SECRET', 'TOP SECRET/SCI'],
|
|
2736
|
-
dataResidency: ['Classified US facilities', 'Air-gapped'],
|
|
2737
|
-
knownContracts: ['IC agencies', 'DOD classified programs'],
|
|
2738
|
-
securityConcerns: [
|
|
2739
|
-
'Microsoft personnel with TS/SCI clearance',
|
|
2740
|
-
'Hardware from Microsoft supply chain',
|
|
2741
|
-
'Software updates through controlled channels',
|
|
2742
|
-
'Potential for supply chain compromise',
|
|
2743
|
-
],
|
|
2744
|
-
accessPoints: [
|
|
2745
|
-
'Cleared Microsoft personnel',
|
|
2746
|
-
'Software update channel',
|
|
2747
|
-
'Hardware maintenance',
|
|
2748
|
-
'Limited remote diagnostics',
|
|
2749
|
-
],
|
|
2750
|
-
integrations: ['Classified Microsoft services', 'Partner solutions'],
|
|
2751
|
-
},
|
|
2752
|
-
{
|
|
2753
|
-
id: 'microsoft-defender-gov',
|
|
2754
|
-
name: 'Microsoft Defender for Government',
|
|
2755
|
-
vendor: 'microsoft',
|
|
2756
|
-
category: 'security',
|
|
2757
|
-
subcategory: 'XDR/EDR',
|
|
2758
|
-
description: 'Endpoint detection and response, threat protection for government. Part of M365 security stack.',
|
|
2759
|
-
targetCustomers: ['federal', 'dod', 'state_local', 'defense_contractors'],
|
|
2760
|
-
certifications: ['FedRAMP High', 'IL4', 'IL5'],
|
|
2761
|
-
dataResidency: ['US Government cloud'],
|
|
2762
|
-
securityConcerns: [
|
|
2763
|
-
'All endpoint telemetry sent to Microsoft',
|
|
2764
|
-
'Threat detection rules controlled by Microsoft',
|
|
2765
|
-
'Response actions controllable by Microsoft',
|
|
2766
|
-
'Creates complete visibility into government endpoints',
|
|
2767
|
-
],
|
|
2768
|
-
accessPoints: [
|
|
2769
|
-
'Endpoint telemetry collection',
|
|
2770
|
-
'Threat detection and response',
|
|
2771
|
-
'Security posture data',
|
|
2772
|
-
'Incident investigation access',
|
|
2773
|
-
],
|
|
2774
|
-
integrations: ['Microsoft 365', 'Sentinel', 'Intune', 'Entra ID'],
|
|
2775
|
-
},
|
|
2776
|
-
{
|
|
2777
|
-
id: 'microsoft-sentinel-gov',
|
|
2778
|
-
name: 'Microsoft Sentinel for Government',
|
|
2779
|
-
vendor: 'microsoft',
|
|
2780
|
-
category: 'security',
|
|
2781
|
-
subcategory: 'SIEM/SOAR',
|
|
2782
|
-
description: 'Cloud-native SIEM/SOAR on Azure Government. Ingests security logs from across the enterprise.',
|
|
2783
|
-
targetCustomers: ['federal', 'dod', 'ic', 'defense_contractors'],
|
|
2784
|
-
certifications: ['FedRAMP High', 'IL4', 'IL5'],
|
|
2785
|
-
dataResidency: ['Azure Government'],
|
|
2786
|
-
knownContracts: ['CISA', 'DOD components', 'Civilian agencies'],
|
|
2787
|
-
securityConcerns: [
|
|
2788
|
-
'All security logs visible to Microsoft',
|
|
2789
|
-
'AI/ML analysis of security data',
|
|
2790
|
-
'Detection rules from Microsoft',
|
|
2791
|
-
'Integration with commercial threat intel',
|
|
2792
|
-
],
|
|
2793
|
-
accessPoints: [
|
|
2794
|
-
'Security log ingestion',
|
|
2795
|
-
'Threat detection analytics',
|
|
2796
|
-
'Incident response data',
|
|
2797
|
-
'Automation playbooks',
|
|
2798
|
-
],
|
|
2799
|
-
integrations: ['Defender', 'M365', 'Azure Arc', 'Third-party connectors'],
|
|
2800
|
-
},
|
|
2801
|
-
{
|
|
2802
|
-
id: 'microsoft-intune-gov',
|
|
2803
|
-
name: 'Microsoft Intune for Government',
|
|
2804
|
-
vendor: 'microsoft',
|
|
2805
|
-
category: 'identity',
|
|
2806
|
-
subcategory: 'Device Management',
|
|
2807
|
-
description: 'Mobile device and endpoint management for government. Controls policy and app deployment.',
|
|
2808
|
-
targetCustomers: ['federal', 'dod', 'state_local'],
|
|
2809
|
-
certifications: ['FedRAMP High', 'IL4', 'IL5'],
|
|
2810
|
-
dataResidency: ['US Government cloud'],
|
|
2811
|
-
securityConcerns: [
|
|
2812
|
-
'Microsoft controls device policy enforcement',
|
|
2813
|
-
'Can push apps and configurations',
|
|
2814
|
-
'Device wipe capability',
|
|
2815
|
-
'Telemetry collection',
|
|
2816
|
-
],
|
|
2817
|
-
accessPoints: [
|
|
2818
|
-
'Device enrollment and inventory',
|
|
2819
|
-
'Policy deployment',
|
|
2820
|
-
'App distribution',
|
|
2821
|
-
'Compliance data',
|
|
2822
|
-
],
|
|
2823
|
-
integrations: ['Entra ID', 'Defender', 'Autopilot', 'Configuration Manager'],
|
|
2824
|
-
},
|
|
2825
|
-
{
|
|
2826
|
-
id: 'microsoft-teams-gov',
|
|
2827
|
-
name: 'Microsoft Teams for Government',
|
|
2828
|
-
vendor: 'microsoft',
|
|
2829
|
-
category: 'communications',
|
|
2830
|
-
description: 'Collaboration and communications platform for government. Chat, meetings, calls, and file sharing.',
|
|
2831
|
-
targetCustomers: ['federal', 'dod', 'state_local', 'defense_contractors'],
|
|
2832
|
-
certifications: ['FedRAMP High', 'IL4', 'IL5', 'CJIS'],
|
|
2833
|
-
dataResidency: ['US Government cloud'],
|
|
2834
|
-
securityConcerns: [
|
|
2835
|
-
'All communications visible to Microsoft',
|
|
2836
|
-
'Meeting recordings stored in Microsoft cloud',
|
|
2837
|
-
'Transcription and AI processing',
|
|
2838
|
-
'eDiscovery access to all content',
|
|
2839
|
-
],
|
|
2840
|
-
accessPoints: [
|
|
2841
|
-
'Message content and metadata',
|
|
2842
|
-
'Meeting recordings and transcripts',
|
|
2843
|
-
'File sharing and collaboration',
|
|
2844
|
-
'Presence and activity data',
|
|
2845
|
-
],
|
|
2846
|
-
integrations: ['SharePoint', 'OneDrive', 'Outlook', 'Power Platform'],
|
|
2847
|
-
},
|
|
2848
|
-
{
|
|
2849
|
-
id: 'microsoft-copilot-gov',
|
|
2850
|
-
name: 'Microsoft Copilot for Government (Preview)',
|
|
2851
|
-
vendor: 'microsoft',
|
|
2852
|
-
category: 'ai_ml',
|
|
2853
|
-
description: 'AI assistant integrated into M365 Government. Processes documents, emails, meetings.',
|
|
2854
|
-
targetCustomers: ['federal', 'state_local'],
|
|
2855
|
-
certifications: ['FedRAMP (in progress)', 'GCC availability'],
|
|
2856
|
-
dataResidency: ['US - processing location TBD'],
|
|
2857
|
-
securityConcerns: [
|
|
2858
|
-
'AI processes all user content',
|
|
2859
|
-
'Training on government data (even if anonymized)',
|
|
2860
|
-
'Prompt injection vulnerabilities',
|
|
2861
|
-
'Data leakage through AI responses',
|
|
2862
|
-
],
|
|
2863
|
-
accessPoints: [
|
|
2864
|
-
'Full access to user content for AI processing',
|
|
2865
|
-
'Meeting transcriptions',
|
|
2866
|
-
'Document analysis',
|
|
2867
|
-
'Email content',
|
|
2868
|
-
],
|
|
2869
|
-
integrations: ['M365 suite', 'Azure OpenAI', 'Graph API'],
|
|
2870
|
-
},
|
|
2871
|
-
];
|
|
2872
|
-
export const MICROSOFT_GOV_PROFILE = {
|
|
2873
|
-
vendor: 'microsoft',
|
|
2874
|
-
govDivision: 'Microsoft Federal',
|
|
2875
|
-
annualGovRevenue: '$20B+ (estimated, largest gov IT vendor)',
|
|
2876
|
-
fedRampStatus: ['FedRAMP High (many services)', 'IL2-IL6', 'SECRET', 'TOP SECRET'],
|
|
2877
|
-
primaryContracts: [
|
|
2878
|
-
'JWCC (multi-billion)',
|
|
2879
|
-
'DOD Enterprise agreements',
|
|
2880
|
-
'VA healthcare',
|
|
2881
|
-
'Most federal agencies',
|
|
2882
|
-
'State/local enterprise',
|
|
2883
|
-
],
|
|
2884
|
-
products: MICROSOFT_GOV_PRODUCTS,
|
|
2885
|
-
dataAccessCapabilities: [
|
|
2886
|
-
'Administrative access to all cloud services',
|
|
2887
|
-
'eDiscovery and Legal Hold across M365',
|
|
2888
|
-
'Endpoint telemetry via Defender',
|
|
2889
|
-
'Security logs via Sentinel',
|
|
2890
|
-
'AI processing of all content via Copilot',
|
|
2891
|
-
],
|
|
2892
|
-
knownBackdoors: [
|
|
2893
|
-
'Customer Lockbox (still allows access)',
|
|
2894
|
-
'eDiscovery admin access',
|
|
2895
|
-
'Defender response actions',
|
|
2896
|
-
'Intune device wipe',
|
|
2897
|
-
'Global admin account recovery',
|
|
2898
|
-
],
|
|
2899
|
-
lawEnforcementCooperation: 'Complies with legal process. Transparency reports published. CLOUD Act agreements with allies. Known cooperation with national security requests.',
|
|
2900
|
-
};
|
|
2901
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2902
|
-
// AMAZON GOVERNMENT & DEFENSE SYSTEMS
|
|
2903
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
2904
|
-
export const AMAZON_GOV_PRODUCTS = [
|
|
2905
|
-
{
|
|
2906
|
-
id: 'aws-govcloud',
|
|
2907
|
-
name: 'AWS GovCloud (US)',
|
|
2908
|
-
vendor: 'amazon',
|
|
2909
|
-
category: 'cloud',
|
|
2910
|
-
description: 'Isolated AWS regions for government workloads. FedRAMP High and DoD authorizations.',
|
|
2911
|
-
targetCustomers: ['federal', 'dod', 'ic', 'state_local', 'defense_contractors'],
|
|
2912
|
-
certifications: ['FedRAMP High', 'IL2', 'IL4', 'IL5', 'CJIS', 'ITAR', 'IRS 1075'],
|
|
2913
|
-
dataResidency: ['US-only regions', 'Isolated from commercial AWS'],
|
|
2914
|
-
knownContracts: ['CIA $600M (historic)', 'JWCC', 'NSA', 'DOD components'],
|
|
2915
|
-
securityConcerns: [
|
|
2916
|
-
'AWS employees with clearances have access',
|
|
2917
|
-
'Shared codebase with commercial AWS',
|
|
2918
|
-
'Software supply chain from commercial',
|
|
2919
|
-
'Hardware from AWS supply chain',
|
|
2920
|
-
],
|
|
2921
|
-
accessPoints: [
|
|
2922
|
-
'Infrastructure-level access',
|
|
2923
|
-
'Support access with clearance',
|
|
2924
|
-
'Monitoring and CloudWatch',
|
|
2925
|
-
'Service control plane',
|
|
2926
|
-
],
|
|
2927
|
-
integrations: ['All AWS services (subset)', 'AWS Marketplace', 'Partner solutions'],
|
|
2928
|
-
},
|
|
2929
|
-
{
|
|
2930
|
-
id: 'aws-secret-region',
|
|
2931
|
-
name: 'AWS Secret Region',
|
|
2932
|
-
vendor: 'amazon',
|
|
2933
|
-
category: 'cloud',
|
|
2934
|
-
subcategory: 'Classified',
|
|
2935
|
-
description: 'Air-gapped AWS for SECRET classified workloads. Operated for IC community.',
|
|
2936
|
-
targetCustomers: ['ic', 'dod'],
|
|
2937
|
-
certifications: ['SECRET', 'ICD 503'],
|
|
2938
|
-
dataResidency: ['Classified US facilities'],
|
|
2939
|
-
knownContracts: ['CIA', 'IC agencies'],
|
|
2940
|
-
securityConcerns: [
|
|
2941
|
-
'AWS cleared personnel',
|
|
2942
|
-
'Hardware in classified facilities',
|
|
2943
|
-
'Limited oversight of operations',
|
|
2944
|
-
'Supply chain for classified infrastructure',
|
|
2945
|
-
],
|
|
2946
|
-
accessPoints: [
|
|
2947
|
-
'Cleared AWS employees',
|
|
2948
|
-
'Controlled software updates',
|
|
2949
|
-
'Hardware maintenance',
|
|
2950
|
-
'Limited diagnostics',
|
|
2951
|
-
],
|
|
2952
|
-
integrations: ['IC-specific services', 'C2S'],
|
|
2953
|
-
},
|
|
2954
|
-
{
|
|
2955
|
-
id: 'aws-c2s',
|
|
2956
|
-
name: 'AWS Commercial Cloud Services (C2S)',
|
|
2957
|
-
vendor: 'amazon',
|
|
2958
|
-
category: 'cloud',
|
|
2959
|
-
subcategory: 'Classified',
|
|
2960
|
-
description: 'Top Secret cloud for IC. $600M+ contract with CIA, now expanded.',
|
|
2961
|
-
targetCustomers: ['ic'],
|
|
2962
|
-
certifications: ['TOP SECRET/SCI', 'ICD 503'],
|
|
2963
|
-
dataResidency: ['TS/SCI facilities'],
|
|
2964
|
-
knownContracts: ['CIA (original $600M)', 'Expanded IC community'],
|
|
2965
|
-
securityConcerns: [
|
|
2966
|
-
'Most sensitive government data on commercial vendor infrastructure',
|
|
2967
|
-
'AWS personnel with TS/SCI',
|
|
2968
|
-
'Concentration of IC data',
|
|
2969
|
-
'Single vendor risk',
|
|
2970
|
-
],
|
|
2971
|
-
accessPoints: [
|
|
2972
|
-
'Cleared AWS personnel',
|
|
2973
|
-
'Infrastructure operations',
|
|
2974
|
-
'Software and hardware supply chain',
|
|
2975
|
-
],
|
|
2976
|
-
integrations: ['IC-specific tools', 'AWS services subset'],
|
|
2977
|
-
},
|
|
2978
|
-
{
|
|
2979
|
-
id: 'amazon-rekognition-gov',
|
|
2980
|
-
name: 'Amazon Rekognition for Government',
|
|
2981
|
-
vendor: 'amazon',
|
|
2982
|
-
category: 'ai_ml',
|
|
2983
|
-
subcategory: 'Computer Vision',
|
|
2984
|
-
description: 'Facial recognition and image analysis. Used by law enforcement and government.',
|
|
2985
|
-
targetCustomers: ['federal', 'state_local', 'dod'],
|
|
2986
|
-
certifications: ['FedRAMP (via GovCloud)'],
|
|
2987
|
-
dataResidency: ['US GovCloud'],
|
|
2988
|
-
knownContracts: ['ICE (controversial)', 'Law enforcement agencies', 'DOD programs'],
|
|
2989
|
-
securityConcerns: [
|
|
2990
|
-
'Facial recognition accuracy concerns',
|
|
2991
|
-
'Bias in AI models',
|
|
2992
|
-
'Mass surveillance capability',
|
|
2993
|
-
'Data retention and sharing',
|
|
2994
|
-
],
|
|
2995
|
-
accessPoints: [
|
|
2996
|
-
'Image and video processing',
|
|
2997
|
-
'Facial recognition database',
|
|
2998
|
-
'Analysis results',
|
|
2999
|
-
'Model training data',
|
|
3000
|
-
],
|
|
3001
|
-
integrations: ['S3', 'Lambda', 'Kinesis Video Streams'],
|
|
3002
|
-
},
|
|
3003
|
-
{
|
|
3004
|
-
id: 'amazon-ring-gov',
|
|
3005
|
-
name: 'Ring (Amazon) Law Enforcement Partnerships',
|
|
3006
|
-
vendor: 'amazon',
|
|
3007
|
-
category: 'security',
|
|
3008
|
-
subcategory: 'Surveillance',
|
|
3009
|
-
description: 'Doorbell cameras and neighborhood surveillance. Partnerships with 2000+ police departments.',
|
|
3010
|
-
targetCustomers: ['state_local'],
|
|
3011
|
-
certifications: ['None specific'],
|
|
3012
|
-
dataResidency: ['AWS US'],
|
|
3013
|
-
knownContracts: ['2000+ police department partnerships'],
|
|
3014
|
-
securityConcerns: [
|
|
3015
|
-
'Mass neighborhood surveillance network',
|
|
3016
|
-
'Police can request footage without warrant',
|
|
3017
|
-
'Neighbors app creates tip network',
|
|
3018
|
-
'Facial recognition integration',
|
|
3019
|
-
],
|
|
3020
|
-
accessPoints: [
|
|
3021
|
-
'Video footage access',
|
|
3022
|
-
'Location data',
|
|
3023
|
-
'Audio recordings',
|
|
3024
|
-
'Request portal for law enforcement',
|
|
3025
|
-
],
|
|
3026
|
-
integrations: ['Alexa', 'AWS', 'Neighbors app'],
|
|
3027
|
-
},
|
|
3028
|
-
{
|
|
3029
|
-
id: 'aws-nitro-enclaves',
|
|
3030
|
-
name: 'AWS Nitro Enclaves',
|
|
3031
|
-
vendor: 'amazon',
|
|
3032
|
-
category: 'security',
|
|
3033
|
-
subcategory: 'Confidential Computing',
|
|
3034
|
-
description: 'Isolated compute environments for processing sensitive data.',
|
|
3035
|
-
targetCustomers: ['federal', 'dod', 'defense_contractors'],
|
|
3036
|
-
certifications: ['FedRAMP (via GovCloud)'],
|
|
3037
|
-
dataResidency: ['US GovCloud'],
|
|
3038
|
-
securityConcerns: [
|
|
3039
|
-
'AWS controls Nitro hypervisor',
|
|
3040
|
-
'Side-channel attack potential',
|
|
3041
|
-
'Key management complexity',
|
|
3042
|
-
'Limited third-party attestation',
|
|
3043
|
-
],
|
|
3044
|
-
accessPoints: [
|
|
3045
|
-
'Hypervisor-level access',
|
|
3046
|
-
'Attestation infrastructure',
|
|
3047
|
-
'Enclave management',
|
|
3048
|
-
],
|
|
3049
|
-
integrations: ['EC2', 'KMS', 'ACM'],
|
|
3050
|
-
},
|
|
3051
|
-
{
|
|
3052
|
-
id: 'aws-workspaces-gov',
|
|
3053
|
-
name: 'Amazon WorkSpaces for Government',
|
|
3054
|
-
vendor: 'amazon',
|
|
3055
|
-
category: 'infrastructure',
|
|
3056
|
-
subcategory: 'VDI',
|
|
3057
|
-
description: 'Virtual desktops in the cloud. Provides access to government applications.',
|
|
3058
|
-
targetCustomers: ['federal', 'dod', 'state_local'],
|
|
3059
|
-
certifications: ['FedRAMP High', 'IL4', 'IL5'],
|
|
3060
|
-
dataResidency: ['US GovCloud'],
|
|
3061
|
-
securityConcerns: [
|
|
3062
|
-
'All desktop activity on AWS infrastructure',
|
|
3063
|
-
'Session recording capability',
|
|
3064
|
-
'Clipboard and file transfer monitoring',
|
|
3065
|
-
'AWS admin access to desktops',
|
|
3066
|
-
],
|
|
3067
|
-
accessPoints: [
|
|
3068
|
-
'Desktop session data',
|
|
3069
|
-
'User activity',
|
|
3070
|
-
'File access',
|
|
3071
|
-
'Application usage',
|
|
3072
|
-
],
|
|
3073
|
-
integrations: ['Active Directory', 'WorkDocs', 'AppStream'],
|
|
3074
|
-
},
|
|
3075
|
-
];
|
|
3076
|
-
export const AMAZON_GOV_PROFILE = {
|
|
3077
|
-
vendor: 'amazon',
|
|
3078
|
-
govDivision: 'AWS Public Sector / Amazon Web Services Government',
|
|
3079
|
-
annualGovRevenue: '$10B+ (estimated)',
|
|
3080
|
-
fedRampStatus: ['FedRAMP High', 'IL2-IL5', 'SECRET', 'TOP SECRET/SCI'],
|
|
3081
|
-
primaryContracts: [
|
|
3082
|
-
'CIA C2S ($600M+)',
|
|
3083
|
-
'JWCC participant',
|
|
3084
|
-
'NSA',
|
|
3085
|
-
'DOD components',
|
|
3086
|
-
'Most federal agencies',
|
|
3087
|
-
],
|
|
3088
|
-
products: AMAZON_GOV_PRODUCTS,
|
|
3089
|
-
dataAccessCapabilities: [
|
|
3090
|
-
'Infrastructure-level access to all workloads',
|
|
3091
|
-
'CloudWatch and logging access',
|
|
3092
|
-
'Support access with clearances',
|
|
3093
|
-
'Rekognition facial data',
|
|
3094
|
-
'Ring video network',
|
|
3095
|
-
],
|
|
3096
|
-
knownBackdoors: [
|
|
3097
|
-
'AWS support access',
|
|
3098
|
-
'CloudWatch log access',
|
|
3099
|
-
'S3 bucket policy override (with warrant)',
|
|
3100
|
-
'Ring law enforcement portal',
|
|
3101
|
-
'Rekognition database',
|
|
3102
|
-
],
|
|
3103
|
-
lawEnforcementCooperation: 'Complies with legal process. Ring partnerships with 2000+ police departments. Transparency reports published.',
|
|
3104
|
-
};
|
|
3105
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
3106
|
-
// META GOVERNMENT & DEFENSE SYSTEMS
|
|
3107
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
3108
|
-
export const META_GOV_PRODUCTS = [
|
|
3109
|
-
{
|
|
3110
|
-
id: 'meta-workplace-gov',
|
|
3111
|
-
name: 'Workplace from Meta for Government',
|
|
3112
|
-
vendor: 'meta',
|
|
3113
|
-
category: 'productivity',
|
|
3114
|
-
description: 'Enterprise collaboration platform. Chat, video, and intranet for organizations.',
|
|
3115
|
-
targetCustomers: ['federal', 'state_local'],
|
|
3116
|
-
certifications: ['FedRAMP (limited)', 'SOC 2'],
|
|
3117
|
-
dataResidency: ['US data centers'],
|
|
3118
|
-
securityConcerns: [
|
|
3119
|
-
'All communications on Meta infrastructure',
|
|
3120
|
-
'AI processing of content',
|
|
3121
|
-
'Integration with consumer Facebook',
|
|
3122
|
-
'Limited government-specific isolation',
|
|
3123
|
-
],
|
|
3124
|
-
accessPoints: [
|
|
3125
|
-
'Chat and messaging content',
|
|
3126
|
-
'Video call data',
|
|
3127
|
-
'File sharing',
|
|
3128
|
-
'Employee directory',
|
|
3129
|
-
],
|
|
3130
|
-
integrations: ['Microsoft 365', 'Google Workspace', 'ServiceNow'],
|
|
3131
|
-
},
|
|
3132
|
-
{
|
|
3133
|
-
id: 'meta-llama-gov',
|
|
3134
|
-
name: 'Llama AI Models for Government',
|
|
3135
|
-
vendor: 'meta',
|
|
3136
|
-
category: 'ai_ml',
|
|
3137
|
-
description: 'Open-source LLM available for government use. Various sizes from 7B to 70B+ parameters.',
|
|
3138
|
-
targetCustomers: ['federal', 'dod', 'defense_contractors'],
|
|
3139
|
-
certifications: ['None - open source', 'Self-hosted options'],
|
|
3140
|
-
dataResidency: ['Self-hosted capability'],
|
|
3141
|
-
securityConcerns: [
|
|
3142
|
-
'Model weights from Meta',
|
|
3143
|
-
'Unknown training data composition',
|
|
3144
|
-
'Fine-tuning may leak data',
|
|
3145
|
-
'Dual-use concerns for adversaries',
|
|
3146
|
-
],
|
|
3147
|
-
accessPoints: [
|
|
3148
|
-
'Model weights download',
|
|
3149
|
-
'Usage telemetry (if using Meta cloud)',
|
|
3150
|
-
'Research access program data',
|
|
3151
|
-
],
|
|
3152
|
-
integrations: ['Various ML frameworks', 'Cloud platforms'],
|
|
3153
|
-
},
|
|
3154
|
-
{
|
|
3155
|
-
id: 'meta-whatsapp-gov',
|
|
3156
|
-
name: 'WhatsApp for Government Use',
|
|
3157
|
-
vendor: 'meta',
|
|
3158
|
-
category: 'communications',
|
|
3159
|
-
description: 'Not officially supported, but used by many government personnel worldwide.',
|
|
3160
|
-
targetCustomers: ['allied_nations', 'state_local'],
|
|
3161
|
-
certifications: ['None - consumer product'],
|
|
3162
|
-
dataResidency: ['Meta global infrastructure'],
|
|
3163
|
-
securityConcerns: [
|
|
3164
|
-
'Metadata collection by Meta',
|
|
3165
|
-
'Device backup defeats E2E encryption',
|
|
3166
|
-
'Key distribution controlled by Meta',
|
|
3167
|
-
'Business API allows message inspection',
|
|
3168
|
-
],
|
|
3169
|
-
accessPoints: [
|
|
3170
|
-
'Metadata and contact lists',
|
|
3171
|
-
'Backup encryption keys',
|
|
3172
|
-
'Business API access',
|
|
3173
|
-
'Device registration data',
|
|
3174
|
-
],
|
|
3175
|
-
integrations: ['Facebook', 'Instagram', 'Meta Business Suite'],
|
|
3176
|
-
},
|
|
3177
|
-
{
|
|
3178
|
-
id: 'meta-oculus-gov',
|
|
3179
|
-
name: 'Meta Quest for Enterprise/Government',
|
|
3180
|
-
vendor: 'meta',
|
|
3181
|
-
category: 'hardware',
|
|
3182
|
-
subcategory: 'VR/AR',
|
|
3183
|
-
description: 'VR headsets for training and simulation. Used by military for training programs.',
|
|
3184
|
-
targetCustomers: ['dod', 'federal'],
|
|
3185
|
-
certifications: ['Limited government certifications'],
|
|
3186
|
-
dataResidency: ['Meta servers'],
|
|
3187
|
-
knownContracts: ['Military training programs', 'VA therapy'],
|
|
3188
|
-
securityConcerns: [
|
|
3189
|
-
'Extensive sensor data collection',
|
|
3190
|
-
'Biometric data (eye tracking, movement)',
|
|
3191
|
-
'Room mapping and environment capture',
|
|
3192
|
-
'Required Meta/Facebook account (historically)',
|
|
3193
|
-
],
|
|
3194
|
-
accessPoints: [
|
|
3195
|
-
'VR session telemetry',
|
|
3196
|
-
'Biometric data',
|
|
3197
|
-
'Environment mapping',
|
|
3198
|
-
'User behavior analytics',
|
|
3199
|
-
],
|
|
3200
|
-
integrations: ['Meta Horizon', 'Unity', 'Unreal Engine'],
|
|
3201
|
-
},
|
|
3202
|
-
];
|
|
3203
|
-
export const META_GOV_PROFILE = {
|
|
3204
|
-
vendor: 'meta',
|
|
3205
|
-
govDivision: 'Meta for Business / Public Sector',
|
|
3206
|
-
annualGovRevenue: '<$500M (estimated, smaller gov footprint)',
|
|
3207
|
-
fedRampStatus: ['Limited FedRAMP (Workplace only)'],
|
|
3208
|
-
primaryContracts: [
|
|
3209
|
-
'Workplace deployments',
|
|
3210
|
-
'VR training programs',
|
|
3211
|
-
'Research partnerships',
|
|
3212
|
-
],
|
|
3213
|
-
products: META_GOV_PRODUCTS,
|
|
3214
|
-
dataAccessCapabilities: [
|
|
3215
|
-
'Workplace communications access',
|
|
3216
|
-
'WhatsApp metadata',
|
|
3217
|
-
'VR biometric and sensor data',
|
|
3218
|
-
'Llama usage data (if cloud)',
|
|
3219
|
-
],
|
|
3220
|
-
knownBackdoors: [
|
|
3221
|
-
'Workplace admin access',
|
|
3222
|
-
'WhatsApp backup access',
|
|
3223
|
-
'Business API message access',
|
|
3224
|
-
'Quest telemetry',
|
|
3225
|
-
],
|
|
3226
|
-
lawEnforcementCooperation: 'Complies with legal process. Large volume of law enforcement requests. Transparency reports published. Signal protocol messaging limits access to content.',
|
|
3227
|
-
};
|
|
3228
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
3229
|
-
// COMPLETE VENDOR REGISTRY
|
|
3230
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
3231
|
-
export const GOV_DEFENSE_VENDOR_REGISTRY = [
|
|
3232
|
-
GOOGLE_GOV_PROFILE,
|
|
3233
|
-
APPLE_GOV_PROFILE,
|
|
3234
|
-
MICROSOFT_GOV_PROFILE,
|
|
3235
|
-
AMAZON_GOV_PROFILE,
|
|
3236
|
-
META_GOV_PROFILE,
|
|
3237
|
-
];
|
|
3238
|
-
export const ALL_GOV_DEFENSE_PRODUCTS = [
|
|
3239
|
-
...GOOGLE_GOV_PRODUCTS,
|
|
3240
|
-
...APPLE_GOV_PRODUCTS,
|
|
3241
|
-
...MICROSOFT_GOV_PRODUCTS,
|
|
3242
|
-
...AMAZON_GOV_PRODUCTS,
|
|
3243
|
-
...META_GOV_PRODUCTS,
|
|
3244
|
-
];
|
|
3245
|
-
/**
|
|
3246
|
-
* Get all government products for a specific vendor.
|
|
3247
|
-
*/
|
|
3248
|
-
export function getGovProductsByVendor(vendor) {
|
|
3249
|
-
return ALL_GOV_DEFENSE_PRODUCTS.filter(p => p.vendor === vendor);
|
|
3250
|
-
}
|
|
3251
|
-
/**
|
|
3252
|
-
* Get government vendor profile.
|
|
3253
|
-
*/
|
|
3254
|
-
export function getGovVendorProfile(vendor) {
|
|
3255
|
-
return GOV_DEFENSE_VENDOR_REGISTRY.find(p => p.vendor === vendor);
|
|
3256
|
-
}
|
|
3257
|
-
/**
|
|
3258
|
-
* Get all products matching a category.
|
|
3259
|
-
*/
|
|
3260
|
-
export function getGovProductsByCategory(category) {
|
|
3261
|
-
return ALL_GOV_DEFENSE_PRODUCTS.filter(p => p.category === category);
|
|
3262
|
-
}
|
|
3263
|
-
/**
|
|
3264
|
-
* Get all products with specific certification.
|
|
3265
|
-
*/
|
|
3266
|
-
export function getGovProductsByCertification(certification) {
|
|
3267
|
-
return ALL_GOV_DEFENSE_PRODUCTS.filter(p => p.certifications.some(c => c.toLowerCase().includes(certification.toLowerCase())));
|
|
3268
|
-
}
|
|
3269
|
-
/**
|
|
3270
|
-
* Get all products targeting specific customer type.
|
|
3271
|
-
*/
|
|
3272
|
-
export function getGovProductsByCustomerType(customerType) {
|
|
3273
|
-
return ALL_GOV_DEFENSE_PRODUCTS.filter(p => p.targetCustomers.includes(customerType));
|
|
3274
|
-
}
|
|
3275
|
-
/**
|
|
3276
|
-
* Get security concerns summary across all vendors.
|
|
3277
|
-
*/
|
|
3278
|
-
export function getSecurityConcernsSummary() {
|
|
3279
|
-
const summary = {};
|
|
3280
|
-
for (const product of ALL_GOV_DEFENSE_PRODUCTS) {
|
|
3281
|
-
if (!summary[product.vendor]) {
|
|
3282
|
-
summary[product.vendor] = [];
|
|
3283
|
-
}
|
|
3284
|
-
for (const concern of product.securityConcerns) {
|
|
3285
|
-
if (!summary[product.vendor].includes(concern)) {
|
|
3286
|
-
summary[product.vendor].push(concern);
|
|
3287
|
-
}
|
|
3288
|
-
}
|
|
3289
|
-
}
|
|
3290
|
-
return summary;
|
|
3291
|
-
}
|
|
3292
|
-
/**
|
|
3293
|
-
* Get access points summary - how vendors can access government data.
|
|
3294
|
-
*/
|
|
3295
|
-
export function getAccessPointsSummary() {
|
|
3296
|
-
const summary = {};
|
|
3297
|
-
for (const product of ALL_GOV_DEFENSE_PRODUCTS) {
|
|
3298
|
-
if (!summary[product.vendor]) {
|
|
3299
|
-
summary[product.vendor] = [];
|
|
3300
|
-
}
|
|
3301
|
-
for (const access of product.accessPoints) {
|
|
3302
|
-
if (!summary[product.vendor].includes(access)) {
|
|
3303
|
-
summary[product.vendor].push(access);
|
|
3304
|
-
}
|
|
3305
|
-
}
|
|
3306
|
-
}
|
|
3307
|
-
return summary;
|
|
3308
|
-
}
|
|
3309
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
3310
|
-
// EXPORTS (note: GOOGLE_GMAIL_CLAIMS and GOOGLE_CHROME_CLAIMS are already exported inline)
|
|
3311
|
-
// ═══════════════════════════════════════════════════════════════════════════════
|
|
3312
|
-
//# sourceMappingURL=unifiedFraudOrchestrator.js.map
|