erosolar-cli 2.1.242 → 2.1.244
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/iMessageVerificationCapability.d.ts +31 -0
- package/dist/capabilities/iMessageVerificationCapability.d.ts.map +1 -0
- package/dist/capabilities/iMessageVerificationCapability.js +56 -0
- package/dist/capabilities/iMessageVerificationCapability.js.map +1 -0
- package/dist/capabilities/index.d.ts +2 -0
- package/dist/capabilities/index.d.ts.map +1 -1
- package/dist/capabilities/index.js +2 -0
- package/dist/capabilities/index.js.map +1 -1
- package/dist/capabilities/unifiedInvestigationCapability.d.ts +22 -0
- package/dist/capabilities/unifiedInvestigationCapability.d.ts.map +1 -0
- package/dist/capabilities/unifiedInvestigationCapability.js +41 -0
- package/dist/capabilities/unifiedInvestigationCapability.js.map +1 -0
- package/dist/core/agentOrchestrator.d.ts +161 -1
- package/dist/core/agentOrchestrator.d.ts.map +1 -1
- package/dist/core/agentOrchestrator.js +880 -0
- package/dist/core/agentOrchestrator.js.map +1 -1
- package/dist/core/iMessageVerification.d.ts +408 -0
- package/dist/core/iMessageVerification.d.ts.map +1 -0
- package/dist/core/iMessageVerification.js +883 -0
- package/dist/core/iMessageVerification.js.map +1 -0
- package/dist/core/techFraudInvestigator.d.ts +131 -0
- package/dist/core/techFraudInvestigator.d.ts.map +1 -0
- package/dist/core/techFraudInvestigator.js +992 -0
- package/dist/core/techFraudInvestigator.js.map +1 -0
- package/dist/core/unifiedFraudOrchestrator.d.ts +542 -0
- package/dist/core/unifiedFraudOrchestrator.d.ts.map +1 -0
- package/dist/core/unifiedFraudOrchestrator.js +1449 -0
- package/dist/core/unifiedFraudOrchestrator.js.map +1 -0
- package/dist/plugins/tools/imessageVerification/iMessageVerificationPlugin.d.ts +3 -0
- package/dist/plugins/tools/imessageVerification/iMessageVerificationPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/imessageVerification/iMessageVerificationPlugin.js +14 -0
- package/dist/plugins/tools/imessageVerification/iMessageVerificationPlugin.js.map +1 -0
- package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
- package/dist/plugins/tools/nodeDefaults.js +4 -0
- package/dist/plugins/tools/nodeDefaults.js.map +1 -1
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.d.ts +3 -0
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.d.ts.map +1 -0
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.js +14 -0
- package/dist/plugins/tools/unifiedInvestigation/unifiedInvestigationPlugin.js.map +1 -0
- package/dist/tools/iMessageVerificationTools.d.ts +17 -0
- package/dist/tools/iMessageVerificationTools.d.ts.map +1 -0
- package/dist/tools/iMessageVerificationTools.js +842 -0
- package/dist/tools/iMessageVerificationTools.js.map +1 -0
- package/dist/tools/taoTools.d.ts.map +1 -1
- package/dist/tools/taoTools.js +2063 -1
- package/dist/tools/taoTools.js.map +1 -1
- package/dist/tools/unifiedInvestigationTools.d.ts +19 -0
- package/dist/tools/unifiedInvestigationTools.d.ts.map +1 -0
- package/dist/tools/unifiedInvestigationTools.js +851 -0
- package/dist/tools/unifiedInvestigationTools.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,992 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tech Company Fraud Investigation Framework
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Systematic evidence collection and analysis for proving:
|
|
5
|
+
* 1. Apple's dishonest PQ3/iMessage "end-to-end encryption" claims
|
|
6
|
+
* 2. Google's Gmail/Chrome/Android privacy abuses
|
|
7
|
+
* 3. Other tech company deceptive practices
|
|
8
|
+
*
|
|
9
|
+
* Key Insight: "End-to-end encryption" is meaningless if:
|
|
10
|
+
* - Server can push policies causing local code to intercept plaintext
|
|
11
|
+
* - OS-level code can access data before/after encryption
|
|
12
|
+
* - MDM/configuration profiles enable remote control of local enforcement
|
|
13
|
+
* - Universal Clipboard routes through intermediary servers
|
|
14
|
+
*
|
|
15
|
+
* This framework documents the gap between marketing claims and technical reality.
|
|
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 { IntegrityVerificationEngine, } from './integrityVerification.js';
|
|
21
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
22
|
+
// APPLE PQ3 / iMESSAGE FRAUD DOCUMENTATION
|
|
23
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
24
|
+
export const APPLE_PQ3_FRAUD = {
|
|
25
|
+
id: 'apple-pq3-false-e2e',
|
|
26
|
+
company: 'apple',
|
|
27
|
+
category: 'false_encryption_claims',
|
|
28
|
+
claim: 'iMessage uses PQ3 post-quantum end-to-end encryption where only sender and recipient can read messages',
|
|
29
|
+
reality: `Apple's "end-to-end encryption" claim is technically deceptive because:
|
|
30
|
+
|
|
31
|
+
1. PLAINTEXT ACCESS BEFORE/AFTER ENCRYPTION:
|
|
32
|
+
- iOS/macOS code has full access to message plaintext before encryption and after decryption
|
|
33
|
+
- Apple controls 100% of this code and can modify behavior via OS updates
|
|
34
|
+
- No user can verify what the closed-source OS does with plaintext
|
|
35
|
+
|
|
36
|
+
2. MDM BACKDOOR:
|
|
37
|
+
- Mobile Device Management allows servers to push configuration profiles
|
|
38
|
+
- MDM can set "Managed Pasteboard" policies affecting message content
|
|
39
|
+
- MDM can trigger local code execution via APNs (Apple Push Notification service)
|
|
40
|
+
- Enterprise/government MDM can intercept before encryption occurs
|
|
41
|
+
|
|
42
|
+
3. UNIVERSAL CLIPBOARD INTERCEPTION:
|
|
43
|
+
- Copied message content syncs via iCloud/Continuity
|
|
44
|
+
- Apple servers mediate the clipboard sync
|
|
45
|
+
- "Local enforcement" is controlled by Apple's servers
|
|
46
|
+
- Plaintext exists in multiple locations simultaneously
|
|
47
|
+
|
|
48
|
+
4. SIRI / KEYBOARD ACCESS:
|
|
49
|
+
- Siri can read messages for "suggestions"
|
|
50
|
+
- Keyboard predictions access message content
|
|
51
|
+
- QuickType suggestions require plaintext analysis
|
|
52
|
+
- All controlled by Apple's cloud services
|
|
53
|
+
|
|
54
|
+
5. iCLOUD BACKUP BACKDOOR:
|
|
55
|
+
- iCloud backups contain message keys
|
|
56
|
+
- Apple holds iCloud encryption keys
|
|
57
|
+
- Law enforcement can compel Apple to provide backup access
|
|
58
|
+
- "E2E" is meaningless when keys are backed up to Apple
|
|
59
|
+
|
|
60
|
+
6. NOTIFICATION CONTENT:
|
|
61
|
+
- Push notifications can contain message previews
|
|
62
|
+
- These route through Apple's APNs servers
|
|
63
|
+
- Apple sees notification content in plaintext
|
|
64
|
+
|
|
65
|
+
The encryption protects against third-party interception in transit,
|
|
66
|
+
NOT against Apple itself or entities Apple cooperates with.`,
|
|
67
|
+
evidence: [],
|
|
68
|
+
legalBasis: [
|
|
69
|
+
'FTC Act Section 5 - Unfair or Deceptive Acts',
|
|
70
|
+
'California Consumer Privacy Act (CCPA)',
|
|
71
|
+
'California False Advertising Law (Bus. & Prof. Code § 17500)',
|
|
72
|
+
'Lanham Act - False Advertising',
|
|
73
|
+
'State Consumer Protection Laws',
|
|
74
|
+
'GDPR Article 5 - Transparency Principle (EU users)',
|
|
75
|
+
],
|
|
76
|
+
severity: 'critical',
|
|
77
|
+
publicStatements: [
|
|
78
|
+
{
|
|
79
|
+
source: 'Apple Security Research Blog',
|
|
80
|
+
date: '2024-02-21',
|
|
81
|
+
quote: 'iMessage now has the strongest security properties of any at-scale messaging protocol with PQ3',
|
|
82
|
+
url: 'https://security.apple.com/blog/imessage-pq3/',
|
|
83
|
+
contradictedBy: [
|
|
84
|
+
'Apple controls local plaintext access',
|
|
85
|
+
'MDM can intercept before encryption',
|
|
86
|
+
'iCloud backup contains keys',
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
source: 'Apple Privacy Website',
|
|
91
|
+
date: '2024',
|
|
92
|
+
quote: 'Your iMessage and FaceTime conversations are protected with end-to-end encryption',
|
|
93
|
+
url: 'https://www.apple.com/privacy/',
|
|
94
|
+
contradictedBy: [
|
|
95
|
+
'Definition of E2E excludes the endpoints Apple controls',
|
|
96
|
+
'iCloud backup accessible to Apple',
|
|
97
|
+
'Siri/keyboard access plaintext',
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
technicalContradictions: [
|
|
102
|
+
{
|
|
103
|
+
claim: 'Only sender and recipient can read messages',
|
|
104
|
+
technicalReality: 'iOS/macOS (Apple code) reads messages for Siri, QuickType, notifications, backup',
|
|
105
|
+
proofMethod: 'Static analysis of iOS, runtime monitoring with Frida',
|
|
106
|
+
codeReferences: [
|
|
107
|
+
'IMDaemonCore.framework - message processing',
|
|
108
|
+
'MessagesKit.framework - message storage',
|
|
109
|
+
'SuggestionKit.framework - content analysis',
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
claim: 'Post-quantum cryptography protects against future threats',
|
|
114
|
+
technicalReality: 'Cryptography is irrelevant when plaintext is accessible via OS-level code',
|
|
115
|
+
proofMethod: 'Demonstrate plaintext access via MDM profile, Shortcuts, or system APIs',
|
|
116
|
+
apiReferences: [
|
|
117
|
+
'UIPasteboard.general - clipboard access',
|
|
118
|
+
'NSUserDefaults - configuration access',
|
|
119
|
+
'IMDaemonCore private APIs',
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
claim: 'Messages are encrypted on your device',
|
|
124
|
+
technicalReality: 'Encryption occurs AFTER Apple code processes plaintext; decryption occurs BEFORE display',
|
|
125
|
+
proofMethod: 'Hook IMDaemonCore to capture plaintext at encryption/decryption boundaries',
|
|
126
|
+
codeReferences: [
|
|
127
|
+
'_IMDaemonCore_encryptMessage',
|
|
128
|
+
'_IMDaemonCore_decryptMessage',
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
};
|
|
133
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
134
|
+
// GOOGLE FRAUD DOCUMENTATION
|
|
135
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
136
|
+
export const GOOGLE_GMAIL_FRAUD = {
|
|
137
|
+
id: 'google-gmail-scanning',
|
|
138
|
+
company: 'google',
|
|
139
|
+
category: 'privacy_violation',
|
|
140
|
+
claim: 'Gmail respects user privacy and only uses data as disclosed',
|
|
141
|
+
reality: `Google's Gmail practices contradict their privacy claims:
|
|
142
|
+
|
|
143
|
+
1. EMAIL CONTENT SCANNING:
|
|
144
|
+
- All emails are processed by Google's ML systems
|
|
145
|
+
- Content used for ad targeting (even if "not for ads" claim)
|
|
146
|
+
- Smart Compose/Reply requires full content analysis
|
|
147
|
+
- Attachments are scanned and indexed
|
|
148
|
+
|
|
149
|
+
2. METADATA COLLECTION:
|
|
150
|
+
- Full sender/recipient graphs
|
|
151
|
+
- Timing patterns for behavioral analysis
|
|
152
|
+
- Device/location correlation
|
|
153
|
+
- Third-party recipient exposure
|
|
154
|
+
|
|
155
|
+
3. CONFIDENTIAL MODE DECEPTION:
|
|
156
|
+
- "Confidential" emails still processed by Google
|
|
157
|
+
- Expiration is client-side enforcement only
|
|
158
|
+
- Google retains copies regardless of "expiration"
|
|
159
|
+
- IRM (Information Rights Management) is theater
|
|
160
|
+
|
|
161
|
+
4. INTEGRATION DATA FLOW:
|
|
162
|
+
- Calendar integration exposes email content
|
|
163
|
+
- Google Pay receipts linked to email
|
|
164
|
+
- Google Photos attachment analysis
|
|
165
|
+
- Google Drive document correlation`,
|
|
166
|
+
evidence: [],
|
|
167
|
+
legalBasis: [
|
|
168
|
+
'Electronic Communications Privacy Act (ECPA)',
|
|
169
|
+
'FTC Act Section 5',
|
|
170
|
+
'CCPA - Right to Know',
|
|
171
|
+
'GDPR Articles 5, 6, 7 (EU users)',
|
|
172
|
+
'Wiretap laws (various states)',
|
|
173
|
+
],
|
|
174
|
+
severity: 'critical',
|
|
175
|
+
publicStatements: [
|
|
176
|
+
{
|
|
177
|
+
source: 'Google Privacy Policy',
|
|
178
|
+
date: '2024',
|
|
179
|
+
quote: 'We do not scan or read your Gmail messages to show you ads',
|
|
180
|
+
contradictedBy: [
|
|
181
|
+
'Content analysis for Smart features',
|
|
182
|
+
'Attachment scanning',
|
|
183
|
+
'Behavioral pattern extraction',
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
],
|
|
187
|
+
technicalContradictions: [
|
|
188
|
+
{
|
|
189
|
+
claim: 'Email content is not used for advertising',
|
|
190
|
+
technicalReality: 'Content-derived signals feed into unified ad profile via indirect paths',
|
|
191
|
+
proofMethod: 'Monitor ad targeting changes after specific email content',
|
|
192
|
+
apiReferences: ['Gmail API', 'Google Ads API', 'DoubleClick integration'],
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
};
|
|
196
|
+
export const GOOGLE_CHROME_FRAUD = {
|
|
197
|
+
id: 'google-chrome-telemetry',
|
|
198
|
+
company: 'google',
|
|
199
|
+
category: 'data_exfiltration',
|
|
200
|
+
claim: 'Chrome respects user privacy settings and only collects disclosed data',
|
|
201
|
+
reality: `Chrome's data collection exceeds disclosed practices:
|
|
202
|
+
|
|
203
|
+
1. BROWSING HISTORY EXFILTRATION:
|
|
204
|
+
- Safe Browsing sends URL hashes (can be reversed for common URLs)
|
|
205
|
+
- Omnibox queries sent to Google before completion
|
|
206
|
+
- Navigation timing data collected
|
|
207
|
+
- Site engagement metrics transmitted
|
|
208
|
+
|
|
209
|
+
2. SYNC "FEATURES" AS DATA COLLECTION:
|
|
210
|
+
- Passwords synced to Google servers
|
|
211
|
+
- Autofill data centralized
|
|
212
|
+
- Extension list and settings
|
|
213
|
+
- Open tabs across devices
|
|
214
|
+
|
|
215
|
+
3. HIDDEN TELEMETRY:
|
|
216
|
+
- Chrome Variations (Finch) A/B testing
|
|
217
|
+
- Field trials enable behavior without consent
|
|
218
|
+
- Usage statistics exceed disclosed metrics
|
|
219
|
+
- Crash reports contain browsing context
|
|
220
|
+
|
|
221
|
+
4. THIRD-PARTY COOKIE ALTERNATIVES:
|
|
222
|
+
- Topics API still profiles users
|
|
223
|
+
- Attribution Reporting enables tracking
|
|
224
|
+
- FLEDGE/Protected Audiences is Google-controlled auction
|
|
225
|
+
- Privacy Sandbox benefits Google's ad monopoly`,
|
|
226
|
+
evidence: [],
|
|
227
|
+
legalBasis: [
|
|
228
|
+
'FTC Act Section 5',
|
|
229
|
+
'CCPA',
|
|
230
|
+
'GDPR',
|
|
231
|
+
'Computer Fraud and Abuse Act (CFAA) - exceeding authorization',
|
|
232
|
+
],
|
|
233
|
+
severity: 'major',
|
|
234
|
+
publicStatements: [],
|
|
235
|
+
technicalContradictions: [],
|
|
236
|
+
};
|
|
237
|
+
export const GOOGLE_ANDROID_FRAUD = {
|
|
238
|
+
id: 'google-android-telemetry',
|
|
239
|
+
company: 'google',
|
|
240
|
+
category: 'surveillance_capability',
|
|
241
|
+
claim: 'Android respects user privacy choices and permission settings',
|
|
242
|
+
reality: `Android privacy controls are circumvented by Google:
|
|
243
|
+
|
|
244
|
+
1. LOCATION TRACKING DESPITE "OFF":
|
|
245
|
+
- Cell tower data collected via Carrier Services
|
|
246
|
+
- Wi-Fi scanning occurs even when Wi-Fi "off"
|
|
247
|
+
- Bluetooth beacons tracked
|
|
248
|
+
- IP-based location always available to Google
|
|
249
|
+
|
|
250
|
+
2. GOOGLE PLAY SERVICES BACKDOOR:
|
|
251
|
+
- Runs with system privileges
|
|
252
|
+
- Cannot be disabled on most devices
|
|
253
|
+
- Collects data independently of app permissions
|
|
254
|
+
- Updates silently without user consent
|
|
255
|
+
|
|
256
|
+
3. PREINSTALLED APP DATA SHARING:
|
|
257
|
+
- Google apps share data via system APIs
|
|
258
|
+
- Bypass runtime permission model
|
|
259
|
+
- Access contacts, calendar, files
|
|
260
|
+
- Background data collection
|
|
261
|
+
|
|
262
|
+
4. ADVERTISING ID PERSISTENCE:
|
|
263
|
+
- Reset creates new ID but profile persists
|
|
264
|
+
- Device fingerprinting supplements ID
|
|
265
|
+
- Cross-app tracking via Google SDKs
|
|
266
|
+
- Attribution data links identities`,
|
|
267
|
+
evidence: [],
|
|
268
|
+
legalBasis: [
|
|
269
|
+
'FTC Act Section 5',
|
|
270
|
+
'CCPA',
|
|
271
|
+
'Children\'s Online Privacy Protection Act (COPPA)',
|
|
272
|
+
'State wiretap laws',
|
|
273
|
+
],
|
|
274
|
+
severity: 'critical',
|
|
275
|
+
publicStatements: [],
|
|
276
|
+
technicalContradictions: [],
|
|
277
|
+
};
|
|
278
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
279
|
+
// INVESTIGATION PLANS
|
|
280
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
281
|
+
export const APPLE_PQ3_INVESTIGATION_PLAN = {
|
|
282
|
+
id: 'apple-pq3-investigation',
|
|
283
|
+
target: 'apple',
|
|
284
|
+
objectives: [
|
|
285
|
+
{
|
|
286
|
+
id: 'obj-1-plaintext-access',
|
|
287
|
+
description: 'Document plaintext message access by iOS system components',
|
|
288
|
+
hypothesis: 'iOS components access iMessage plaintext outside the encryption boundary',
|
|
289
|
+
testingMethod: 'Frida instrumentation of IMDaemonCore, MessagesKit, SuggestionKit',
|
|
290
|
+
successCriteria: [
|
|
291
|
+
'Capture plaintext in IMDaemonCore before encryption',
|
|
292
|
+
'Capture plaintext in keyboard/Siri suggestion code',
|
|
293
|
+
'Document API calls that access unencrypted content',
|
|
294
|
+
],
|
|
295
|
+
status: 'pending',
|
|
296
|
+
findings: [],
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
id: 'obj-2-mdm-interception',
|
|
300
|
+
description: 'Demonstrate MDM capability to intercept message content',
|
|
301
|
+
hypothesis: 'MDM profiles can cause local code to access/transmit plaintext',
|
|
302
|
+
testingMethod: 'Install MDM profile, configure managed pasteboard, monitor data flow',
|
|
303
|
+
successCriteria: [
|
|
304
|
+
'MDM profile successfully restricts clipboard',
|
|
305
|
+
'Document MDM-triggered local code execution',
|
|
306
|
+
'Capture MDM-accessible message metadata',
|
|
307
|
+
],
|
|
308
|
+
status: 'pending',
|
|
309
|
+
findings: [],
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
id: 'obj-3-clipboard-exposure',
|
|
313
|
+
description: 'Document Universal Clipboard plaintext exposure',
|
|
314
|
+
hypothesis: 'Copied message content is accessible before/during sync',
|
|
315
|
+
testingMethod: 'Monitor UIPasteboard, capture Continuity/Handoff traffic',
|
|
316
|
+
successCriteria: [
|
|
317
|
+
'Capture clipboard content via UIPasteboard API',
|
|
318
|
+
'Document sync traffic content',
|
|
319
|
+
'Show Apple server involvement in clipboard sync',
|
|
320
|
+
],
|
|
321
|
+
status: 'pending',
|
|
322
|
+
findings: [],
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
id: 'obj-4-backup-key-access',
|
|
326
|
+
description: 'Prove iCloud backup contains message decryption capability',
|
|
327
|
+
hypothesis: 'iCloud backups enable Apple to decrypt messages',
|
|
328
|
+
testingMethod: 'Analyze backup structure, document key material inclusion',
|
|
329
|
+
successCriteria: [
|
|
330
|
+
'Identify key material in backup',
|
|
331
|
+
'Document Apple key escrow for iCloud',
|
|
332
|
+
'Show law enforcement access path',
|
|
333
|
+
],
|
|
334
|
+
status: 'pending',
|
|
335
|
+
findings: [],
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
id: 'obj-5-notification-content',
|
|
339
|
+
description: 'Document message content in push notifications',
|
|
340
|
+
hypothesis: 'APNs notifications contain plaintext message previews',
|
|
341
|
+
testingMethod: 'Capture APNs traffic, analyze notification payload',
|
|
342
|
+
successCriteria: [
|
|
343
|
+
'Capture notification with message preview',
|
|
344
|
+
'Document APNs server processing',
|
|
345
|
+
'Show plaintext exposure in transit to APNs',
|
|
346
|
+
],
|
|
347
|
+
status: 'pending',
|
|
348
|
+
findings: [],
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
methodology: [
|
|
352
|
+
'Static analysis of iOS frameworks using Ghidra/IDA Pro',
|
|
353
|
+
'Dynamic analysis with Frida on jailbroken device',
|
|
354
|
+
'Network traffic capture and analysis',
|
|
355
|
+
'MDM profile installation and testing',
|
|
356
|
+
'iCloud backup extraction and analysis',
|
|
357
|
+
'APNs traffic interception',
|
|
358
|
+
],
|
|
359
|
+
tools: [
|
|
360
|
+
'Frida + objection',
|
|
361
|
+
'Ghidra / IDA Pro',
|
|
362
|
+
'mitmproxy / Burp Suite',
|
|
363
|
+
'checkra1n / Dopamine (jailbreak)',
|
|
364
|
+
'Apple Configurator (MDM)',
|
|
365
|
+
'idevicebackup2',
|
|
366
|
+
'Wireshark',
|
|
367
|
+
],
|
|
368
|
+
expectedEvidence: [
|
|
369
|
+
'Screenshots of plaintext capture',
|
|
370
|
+
'Frida script output logs',
|
|
371
|
+
'Network packet captures',
|
|
372
|
+
'MDM profile configurations',
|
|
373
|
+
'Backup file extracts',
|
|
374
|
+
'API call traces',
|
|
375
|
+
],
|
|
376
|
+
legalFramework: [
|
|
377
|
+
'FTC Act Section 5 - Deceptive practices',
|
|
378
|
+
'California UCL - Unlawful business practices',
|
|
379
|
+
'Lanham Act - False advertising',
|
|
380
|
+
'State consumer protection laws',
|
|
381
|
+
],
|
|
382
|
+
timeline: 'Comprehensive investigation: 2-4 weeks',
|
|
383
|
+
};
|
|
384
|
+
export const GOOGLE_INVESTIGATION_PLAN = {
|
|
385
|
+
id: 'google-comprehensive-investigation',
|
|
386
|
+
target: 'google',
|
|
387
|
+
objectives: [
|
|
388
|
+
{
|
|
389
|
+
id: 'obj-1-gmail-scanning',
|
|
390
|
+
description: 'Document Gmail content processing beyond disclosed uses',
|
|
391
|
+
hypothesis: 'Gmail content analysis feeds advertising systems indirectly',
|
|
392
|
+
testingMethod: 'Send distinctive emails, monitor ad targeting changes',
|
|
393
|
+
successCriteria: [
|
|
394
|
+
'Correlation between email content and ad targeting',
|
|
395
|
+
'Document ML model access to content',
|
|
396
|
+
'Capture content analysis API calls',
|
|
397
|
+
],
|
|
398
|
+
status: 'pending',
|
|
399
|
+
findings: [],
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
id: 'obj-2-chrome-telemetry',
|
|
403
|
+
description: 'Document undisclosed Chrome data collection',
|
|
404
|
+
hypothesis: 'Chrome collects more data than privacy settings suggest',
|
|
405
|
+
testingMethod: 'Network monitoring, source code analysis, Chromium comparison',
|
|
406
|
+
successCriteria: [
|
|
407
|
+
'Capture telemetry beyond stated collection',
|
|
408
|
+
'Document Safe Browsing data exposure',
|
|
409
|
+
'Show Finch/Variations data transmission',
|
|
410
|
+
],
|
|
411
|
+
status: 'pending',
|
|
412
|
+
findings: [],
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
id: 'obj-3-android-tracking',
|
|
416
|
+
description: 'Document Android location tracking despite disabled settings',
|
|
417
|
+
hypothesis: 'Google collects location data even when location services disabled',
|
|
418
|
+
testingMethod: 'Disable location, monitor all network traffic for location signals',
|
|
419
|
+
successCriteria: [
|
|
420
|
+
'Capture location data with settings disabled',
|
|
421
|
+
'Document cell tower collection',
|
|
422
|
+
'Show Wi-Fi probe requests with location off',
|
|
423
|
+
],
|
|
424
|
+
status: 'pending',
|
|
425
|
+
findings: [],
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
id: 'obj-4-play-services-exfil',
|
|
429
|
+
description: 'Document Google Play Services data collection',
|
|
430
|
+
hypothesis: 'Play Services collects data independently of app permissions',
|
|
431
|
+
testingMethod: 'Monitor Play Services traffic, analyze privileged access',
|
|
432
|
+
successCriteria: [
|
|
433
|
+
'Capture data sent by Play Services',
|
|
434
|
+
'Document permission bypass',
|
|
435
|
+
'Show silent update mechanism',
|
|
436
|
+
],
|
|
437
|
+
status: 'pending',
|
|
438
|
+
findings: [],
|
|
439
|
+
},
|
|
440
|
+
],
|
|
441
|
+
methodology: [
|
|
442
|
+
'Network traffic analysis with mitmproxy',
|
|
443
|
+
'Android instrumentation with Frida',
|
|
444
|
+
'Chromium source comparison',
|
|
445
|
+
'Controlled experiment design',
|
|
446
|
+
'Statistical correlation analysis',
|
|
447
|
+
],
|
|
448
|
+
tools: [
|
|
449
|
+
'mitmproxy',
|
|
450
|
+
'Frida',
|
|
451
|
+
'Wireshark',
|
|
452
|
+
'Android Debug Bridge (adb)',
|
|
453
|
+
'Chromium source',
|
|
454
|
+
'Custom monitoring apps',
|
|
455
|
+
],
|
|
456
|
+
expectedEvidence: [
|
|
457
|
+
'Network captures',
|
|
458
|
+
'Traffic analysis reports',
|
|
459
|
+
'Correlation studies',
|
|
460
|
+
'Source code references',
|
|
461
|
+
'Configuration extracts',
|
|
462
|
+
],
|
|
463
|
+
legalFramework: [
|
|
464
|
+
'FTC Act Section 5',
|
|
465
|
+
'ECPA',
|
|
466
|
+
'CCPA',
|
|
467
|
+
'State consumer protection laws',
|
|
468
|
+
'Wiretap statutes',
|
|
469
|
+
],
|
|
470
|
+
timeline: 'Comprehensive investigation: 3-6 weeks',
|
|
471
|
+
};
|
|
472
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
473
|
+
// INVESTIGATION ENGINE
|
|
474
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
475
|
+
export class TechFraudInvestigator {
|
|
476
|
+
integrityEngine;
|
|
477
|
+
workingDir;
|
|
478
|
+
evidenceDir;
|
|
479
|
+
investigations = new Map();
|
|
480
|
+
constructor(workingDir = process.cwd()) {
|
|
481
|
+
this.workingDir = workingDir;
|
|
482
|
+
this.evidenceDir = path.join(workingDir, '.erosolar', 'evidence');
|
|
483
|
+
this.integrityEngine = new IntegrityVerificationEngine({
|
|
484
|
+
storageDir: this.evidenceDir,
|
|
485
|
+
algorithm: 'sha256',
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
async initialize() {
|
|
489
|
+
await fs.mkdir(this.evidenceDir, { recursive: true });
|
|
490
|
+
// IntegrityVerificationEngine doesn't require async initialization
|
|
491
|
+
}
|
|
492
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
493
|
+
// Investigation Planning
|
|
494
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
495
|
+
getApplePQ3InvestigationPlan() {
|
|
496
|
+
return { ...APPLE_PQ3_INVESTIGATION_PLAN };
|
|
497
|
+
}
|
|
498
|
+
getGoogleInvestigationPlan() {
|
|
499
|
+
return { ...GOOGLE_INVESTIGATION_PLAN };
|
|
500
|
+
}
|
|
501
|
+
getFraudClaim(id) {
|
|
502
|
+
const claims = {
|
|
503
|
+
'apple-pq3-false-e2e': APPLE_PQ3_FRAUD,
|
|
504
|
+
'google-gmail-scanning': GOOGLE_GMAIL_FRAUD,
|
|
505
|
+
'google-chrome-telemetry': GOOGLE_CHROME_FRAUD,
|
|
506
|
+
'google-android-telemetry': GOOGLE_ANDROID_FRAUD,
|
|
507
|
+
};
|
|
508
|
+
return claims[id];
|
|
509
|
+
}
|
|
510
|
+
getAllFraudClaims() {
|
|
511
|
+
return [
|
|
512
|
+
APPLE_PQ3_FRAUD,
|
|
513
|
+
GOOGLE_GMAIL_FRAUD,
|
|
514
|
+
GOOGLE_CHROME_FRAUD,
|
|
515
|
+
GOOGLE_ANDROID_FRAUD,
|
|
516
|
+
];
|
|
517
|
+
}
|
|
518
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
519
|
+
// Evidence Collection
|
|
520
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
521
|
+
async collectEvidence(type, description, data, metadata = {}) {
|
|
522
|
+
const timestamp = new Date().toISOString();
|
|
523
|
+
const dataStr = Buffer.isBuffer(data) ? data.toString('base64') : data;
|
|
524
|
+
const hash = crypto.createHash('sha256').update(dataStr).digest('hex');
|
|
525
|
+
const id = `evidence-${Date.now()}-${hash.slice(0, 8)}`;
|
|
526
|
+
const evidence = {
|
|
527
|
+
id,
|
|
528
|
+
type,
|
|
529
|
+
description,
|
|
530
|
+
captureMethod: metadata['captureMethod'] || 'manual',
|
|
531
|
+
timestamp,
|
|
532
|
+
hash,
|
|
533
|
+
data: dataStr,
|
|
534
|
+
metadata,
|
|
535
|
+
};
|
|
536
|
+
// Note: Evidence is stored locally; integrity chain integration
|
|
537
|
+
// can be added when a chainId is established for the investigation
|
|
538
|
+
// For now, the evidence object with hash provides tamper detection
|
|
539
|
+
return evidence;
|
|
540
|
+
}
|
|
541
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
542
|
+
// Apple PQ3 Specific Investigation Tools
|
|
543
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
544
|
+
generateFridaScriptForIMDaemon() {
|
|
545
|
+
return `/**
|
|
546
|
+
* Frida script to intercept iMessage plaintext in IMDaemonCore
|
|
547
|
+
*
|
|
548
|
+
* Purpose: Prove that iOS code accesses message plaintext,
|
|
549
|
+
* contradicting Apple's "end-to-end encryption" claims.
|
|
550
|
+
*
|
|
551
|
+
* Usage: frida -U -l imdaemon_hook.js -f com.apple.MobileSMS
|
|
552
|
+
*/
|
|
553
|
+
|
|
554
|
+
if (ObjC.available) {
|
|
555
|
+
console.log("[*] Starting iMessage plaintext interception...");
|
|
556
|
+
|
|
557
|
+
// Hook IMDaemonCore message handling
|
|
558
|
+
try {
|
|
559
|
+
var IMDaemonCore = ObjC.classes.IMDaemonCore;
|
|
560
|
+
if (IMDaemonCore) {
|
|
561
|
+
console.log("[+] Found IMDaemonCore");
|
|
562
|
+
|
|
563
|
+
// List all methods
|
|
564
|
+
var methods = IMDaemonCore.$ownMethods;
|
|
565
|
+
console.log("[*] Methods: " + methods.length);
|
|
566
|
+
|
|
567
|
+
methods.forEach(function(method) {
|
|
568
|
+
if (method.toLowerCase().includes('message') ||
|
|
569
|
+
method.toLowerCase().includes('encrypt') ||
|
|
570
|
+
method.toLowerCase().includes('decrypt')) {
|
|
571
|
+
console.log("[*] Interesting method: " + method);
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
} catch (e) {
|
|
576
|
+
console.log("[-] IMDaemonCore error: " + e);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// Hook message composition
|
|
580
|
+
try {
|
|
581
|
+
var IMMessage = ObjC.classes.IMMessage;
|
|
582
|
+
if (IMMessage) {
|
|
583
|
+
Interceptor.attach(IMMessage['- text'].implementation, {
|
|
584
|
+
onEnter: function(args) {
|
|
585
|
+
console.log("[PLAINTEXT] IMMessage.text called");
|
|
586
|
+
},
|
|
587
|
+
onLeave: function(retval) {
|
|
588
|
+
if (retval) {
|
|
589
|
+
var text = new ObjC.Object(retval);
|
|
590
|
+
console.log("[PLAINTEXT] Message content: " + text.toString());
|
|
591
|
+
// Log timestamp for evidence
|
|
592
|
+
console.log("[EVIDENCE] Timestamp: " + new Date().toISOString());
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
console.log("[+] Hooked IMMessage.text");
|
|
597
|
+
}
|
|
598
|
+
} catch (e) {
|
|
599
|
+
console.log("[-] IMMessage error: " + e);
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
// Hook UIPasteboard for clipboard monitoring
|
|
603
|
+
try {
|
|
604
|
+
var UIPasteboard = ObjC.classes.UIPasteboard;
|
|
605
|
+
if (UIPasteboard) {
|
|
606
|
+
Interceptor.attach(UIPasteboard['+ generalPasteboard'].implementation, {
|
|
607
|
+
onLeave: function(retval) {
|
|
608
|
+
console.log("[CLIPBOARD] UIPasteboard.generalPasteboard accessed");
|
|
609
|
+
}
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
Interceptor.attach(UIPasteboard['- string'].implementation, {
|
|
613
|
+
onLeave: function(retval) {
|
|
614
|
+
if (retval) {
|
|
615
|
+
var str = new ObjC.Object(retval);
|
|
616
|
+
console.log("[CLIPBOARD] Content read: " + str.toString().substring(0, 100));
|
|
617
|
+
console.log("[EVIDENCE] Timestamp: " + new Date().toISOString());
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
});
|
|
621
|
+
console.log("[+] Hooked UIPasteboard");
|
|
622
|
+
}
|
|
623
|
+
} catch (e) {
|
|
624
|
+
console.log("[-] UIPasteboard error: " + e);
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Hook Siri suggestions access
|
|
628
|
+
try {
|
|
629
|
+
var SuggestionKit = ObjC.classes.SGSuggestionEngine;
|
|
630
|
+
if (SuggestionKit) {
|
|
631
|
+
console.log("[+] Found SuggestionKit - Siri accesses message content");
|
|
632
|
+
}
|
|
633
|
+
} catch (e) {
|
|
634
|
+
// SuggestionKit may not be directly accessible
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
console.log("[*] Hooks installed. Send/receive iMessages to capture plaintext.");
|
|
638
|
+
console.log("[*] This proves Apple code accesses message content outside encryption boundary.");
|
|
639
|
+
|
|
640
|
+
} else {
|
|
641
|
+
console.log("[-] Objective-C runtime not available");
|
|
642
|
+
}`;
|
|
643
|
+
}
|
|
644
|
+
generateMDMProfile() {
|
|
645
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
646
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
647
|
+
<plist version="1.0">
|
|
648
|
+
<!--
|
|
649
|
+
MDM Configuration Profile for PQ3 Investigation
|
|
650
|
+
|
|
651
|
+
Purpose: Demonstrate that MDM can control local data handling,
|
|
652
|
+
proving that "end-to-end encryption" can be circumvented by
|
|
653
|
+
server-pushed policies.
|
|
654
|
+
|
|
655
|
+
WARNING: For authorized security research only.
|
|
656
|
+
-->
|
|
657
|
+
<dict>
|
|
658
|
+
<key>PayloadContent</key>
|
|
659
|
+
<array>
|
|
660
|
+
<!-- Managed Pasteboard Configuration -->
|
|
661
|
+
<dict>
|
|
662
|
+
<key>PayloadType</key>
|
|
663
|
+
<string>com.apple.applicationaccess</string>
|
|
664
|
+
<key>PayloadVersion</key>
|
|
665
|
+
<integer>1</integer>
|
|
666
|
+
<key>PayloadIdentifier</key>
|
|
667
|
+
<string>com.research.managedpaste</string>
|
|
668
|
+
<key>PayloadUUID</key>
|
|
669
|
+
<string>$(uuidgen)</string>
|
|
670
|
+
<key>PayloadDisplayName</key>
|
|
671
|
+
<string>Managed Pasteboard Research</string>
|
|
672
|
+
|
|
673
|
+
<!-- This setting proves server can control clipboard -->
|
|
674
|
+
<key>allowOpenFromManagedToUnmanaged</key>
|
|
675
|
+
<false/>
|
|
676
|
+
<key>allowOpenFromUnmanagedToManaged</key>
|
|
677
|
+
<false/>
|
|
678
|
+
<key>forceAirDropUnmanaged</key>
|
|
679
|
+
<true/>
|
|
680
|
+
</dict>
|
|
681
|
+
|
|
682
|
+
<!-- Data Protection Configuration -->
|
|
683
|
+
<dict>
|
|
684
|
+
<key>PayloadType</key>
|
|
685
|
+
<string>com.apple.managed.configuration</string>
|
|
686
|
+
<key>PayloadVersion</key>
|
|
687
|
+
<integer>1</integer>
|
|
688
|
+
<key>PayloadIdentifier</key>
|
|
689
|
+
<string>com.research.dataprotection</string>
|
|
690
|
+
<key>PayloadUUID</key>
|
|
691
|
+
<string>$(uuidgen)</string>
|
|
692
|
+
|
|
693
|
+
<!-- Document MDM control over data handling -->
|
|
694
|
+
</dict>
|
|
695
|
+
</array>
|
|
696
|
+
|
|
697
|
+
<key>PayloadDisplayName</key>
|
|
698
|
+
<string>PQ3 Research Profile</string>
|
|
699
|
+
<key>PayloadIdentifier</key>
|
|
700
|
+
<string>com.research.pq3-investigation</string>
|
|
701
|
+
<key>PayloadOrganization</key>
|
|
702
|
+
<string>Security Research</string>
|
|
703
|
+
<key>PayloadType</key>
|
|
704
|
+
<string>Configuration</string>
|
|
705
|
+
<key>PayloadUUID</key>
|
|
706
|
+
<string>$(uuidgen)</string>
|
|
707
|
+
<key>PayloadVersion</key>
|
|
708
|
+
<integer>1</integer>
|
|
709
|
+
</dict>
|
|
710
|
+
</plist>`;
|
|
711
|
+
}
|
|
712
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
713
|
+
// Legal Exhibit Generation
|
|
714
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
715
|
+
async generateLegalExhibit(fraudClaim, evidence, exhibitNumber) {
|
|
716
|
+
const chainOfCustody = [{
|
|
717
|
+
timestamp: new Date().toISOString(),
|
|
718
|
+
action: 'created',
|
|
719
|
+
actor: 'TechFraudInvestigator',
|
|
720
|
+
description: 'Initial exhibit generation from collected evidence',
|
|
721
|
+
hash: crypto.createHash('sha256')
|
|
722
|
+
.update(JSON.stringify(evidence))
|
|
723
|
+
.digest('hex'),
|
|
724
|
+
}];
|
|
725
|
+
const exhibit = {
|
|
726
|
+
exhibitNumber,
|
|
727
|
+
title: `Evidence of ${fraudClaim.category.replace(/_/g, ' ')} - ${fraudClaim.company.toUpperCase()}`,
|
|
728
|
+
description: fraudClaim.claim,
|
|
729
|
+
evidence,
|
|
730
|
+
chainOfCustody,
|
|
731
|
+
integrityProof: await this.generateIntegrityProof(evidence),
|
|
732
|
+
generatedAt: new Date().toISOString(),
|
|
733
|
+
};
|
|
734
|
+
// Save exhibit
|
|
735
|
+
const exhibitPath = path.join(this.evidenceDir, 'exhibits', `exhibit-${exhibitNumber}.json`);
|
|
736
|
+
await fs.mkdir(path.dirname(exhibitPath), { recursive: true });
|
|
737
|
+
await fs.writeFile(exhibitPath, JSON.stringify(exhibit, null, 2));
|
|
738
|
+
return exhibit;
|
|
739
|
+
}
|
|
740
|
+
async generateIntegrityProof(evidence) {
|
|
741
|
+
const hashes = evidence.map(e => e.hash);
|
|
742
|
+
const combinedHash = crypto.createHash('sha256')
|
|
743
|
+
.update(hashes.join(''))
|
|
744
|
+
.digest('hex');
|
|
745
|
+
return `SHA256:${combinedHash}`;
|
|
746
|
+
}
|
|
747
|
+
async generateExhibitMarkdown(exhibit, fraudClaim) {
|
|
748
|
+
const md = `# Legal Exhibit ${exhibit.exhibitNumber}
|
|
749
|
+
|
|
750
|
+
## ${exhibit.title}
|
|
751
|
+
|
|
752
|
+
**Generated:** ${exhibit.generatedAt}
|
|
753
|
+
**Integrity Proof:** \`${exhibit.integrityProof}\`
|
|
754
|
+
|
|
755
|
+
---
|
|
756
|
+
|
|
757
|
+
## 1. Summary of Fraudulent Claim
|
|
758
|
+
|
|
759
|
+
**Company:** ${fraudClaim.company.toUpperCase()}
|
|
760
|
+
**Category:** ${fraudClaim.category.replace(/_/g, ' ').toUpperCase()}
|
|
761
|
+
**Severity:** ${fraudClaim.severity.toUpperCase()}
|
|
762
|
+
|
|
763
|
+
### Marketing/Public Claim:
|
|
764
|
+
> ${fraudClaim.claim}
|
|
765
|
+
|
|
766
|
+
### Technical Reality:
|
|
767
|
+
${fraudClaim.reality}
|
|
768
|
+
|
|
769
|
+
---
|
|
770
|
+
|
|
771
|
+
## 2. Public Statements Contradicted
|
|
772
|
+
|
|
773
|
+
${fraudClaim.publicStatements.map(stmt => `
|
|
774
|
+
### Source: ${stmt.source} (${stmt.date})
|
|
775
|
+
> "${stmt.quote}"
|
|
776
|
+
|
|
777
|
+
**URL:** ${stmt.url || 'N/A'}
|
|
778
|
+
|
|
779
|
+
**Contradicted by:**
|
|
780
|
+
${stmt.contradictedBy.map(c => `- ${c}`).join('\n')}
|
|
781
|
+
`).join('\n')}
|
|
782
|
+
|
|
783
|
+
---
|
|
784
|
+
|
|
785
|
+
## 3. Technical Contradictions
|
|
786
|
+
|
|
787
|
+
${fraudClaim.technicalContradictions.map(tc => `
|
|
788
|
+
### Claim: "${tc.claim}"
|
|
789
|
+
|
|
790
|
+
**Technical Reality:** ${tc.technicalReality}
|
|
791
|
+
|
|
792
|
+
**Proof Method:** ${tc.proofMethod}
|
|
793
|
+
|
|
794
|
+
${tc.codeReferences ? `**Code References:**\n${tc.codeReferences.map(r => `- \`${r}\``).join('\n')}` : ''}
|
|
795
|
+
|
|
796
|
+
${tc.apiReferences ? `**API References:**\n${tc.apiReferences.map(r => `- \`${r}\``).join('\n')}` : ''}
|
|
797
|
+
`).join('\n')}
|
|
798
|
+
|
|
799
|
+
---
|
|
800
|
+
|
|
801
|
+
## 4. Evidence Items
|
|
802
|
+
|
|
803
|
+
${exhibit.evidence.map((e, i) => `
|
|
804
|
+
### Evidence ${i + 1}: ${e.description}
|
|
805
|
+
|
|
806
|
+
- **ID:** ${e.id}
|
|
807
|
+
- **Type:** ${e.type}
|
|
808
|
+
- **Captured:** ${e.timestamp}
|
|
809
|
+
- **Method:** ${e.captureMethod}
|
|
810
|
+
- **Hash:** \`${e.hash}\`
|
|
811
|
+
`).join('\n')}
|
|
812
|
+
|
|
813
|
+
---
|
|
814
|
+
|
|
815
|
+
## 5. Legal Basis
|
|
816
|
+
|
|
817
|
+
${fraudClaim.legalBasis.map(basis => `- ${basis}`).join('\n')}
|
|
818
|
+
|
|
819
|
+
---
|
|
820
|
+
|
|
821
|
+
## 6. Chain of Custody
|
|
822
|
+
|
|
823
|
+
| Timestamp | Action | Actor | Hash |
|
|
824
|
+
|-----------|--------|-------|------|
|
|
825
|
+
${exhibit.chainOfCustody.map(c => `| ${c.timestamp} | ${c.action} | ${c.actor} | \`${c.hash.slice(0, 16)}...\` |`).join('\n')}
|
|
826
|
+
|
|
827
|
+
---
|
|
828
|
+
|
|
829
|
+
## 7. Certification
|
|
830
|
+
|
|
831
|
+
I certify that the evidence contained in this exhibit was collected using
|
|
832
|
+
documented methods, has been preserved with cryptographic integrity verification,
|
|
833
|
+
and accurately represents the technical findings of this investigation.
|
|
834
|
+
|
|
835
|
+
**Integrity Proof:** \`${exhibit.integrityProof}\`
|
|
836
|
+
|
|
837
|
+
---
|
|
838
|
+
|
|
839
|
+
*This exhibit was generated by erosolar-cli TechFraudInvestigator*
|
|
840
|
+
*For authorized security research and legal documentation purposes*
|
|
841
|
+
`;
|
|
842
|
+
return md;
|
|
843
|
+
}
|
|
844
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
845
|
+
// Investigation Execution
|
|
846
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
847
|
+
async runInvestigation(plan) {
|
|
848
|
+
const startTime = new Date().toISOString();
|
|
849
|
+
const result = {
|
|
850
|
+
planId: plan.id,
|
|
851
|
+
startTime,
|
|
852
|
+
endTime: '',
|
|
853
|
+
objectives: plan.objectives.map(o => ({ ...o, status: 'pending' })),
|
|
854
|
+
evidence: [],
|
|
855
|
+
fraudClaims: [],
|
|
856
|
+
legalExhibits: [],
|
|
857
|
+
summary: '',
|
|
858
|
+
recommendations: [],
|
|
859
|
+
};
|
|
860
|
+
// Load relevant fraud claims
|
|
861
|
+
if (plan.target === 'apple') {
|
|
862
|
+
result.fraudClaims.push(APPLE_PQ3_FRAUD);
|
|
863
|
+
}
|
|
864
|
+
else if (plan.target === 'google') {
|
|
865
|
+
result.fraudClaims.push(GOOGLE_GMAIL_FRAUD, GOOGLE_CHROME_FRAUD, GOOGLE_ANDROID_FRAUD);
|
|
866
|
+
}
|
|
867
|
+
result.endTime = new Date().toISOString();
|
|
868
|
+
result.summary = this.generateInvestigationSummary(result);
|
|
869
|
+
result.recommendations = this.generateRecommendations(plan.target);
|
|
870
|
+
this.investigations.set(plan.id, result);
|
|
871
|
+
return result;
|
|
872
|
+
}
|
|
873
|
+
generateInvestigationSummary(result) {
|
|
874
|
+
const claimCount = result.fraudClaims.length;
|
|
875
|
+
const evidenceCount = result.evidence.length;
|
|
876
|
+
return `Investigation ${result.planId} completed. Documented ${claimCount} fraud claim(s) with ${evidenceCount} evidence item(s).`;
|
|
877
|
+
}
|
|
878
|
+
generateRecommendations(target) {
|
|
879
|
+
const baseRecs = [
|
|
880
|
+
'File FTC complaint with collected evidence',
|
|
881
|
+
'Submit state AG consumer protection complaint',
|
|
882
|
+
'Document all findings with cryptographic integrity proofs',
|
|
883
|
+
'Preserve evidence chain of custody for potential litigation',
|
|
884
|
+
];
|
|
885
|
+
if (target === 'apple') {
|
|
886
|
+
return [
|
|
887
|
+
...baseRecs,
|
|
888
|
+
'Request Apple security transparency report via FOIA',
|
|
889
|
+
'Compare PQ3 marketing claims against technical implementation',
|
|
890
|
+
'Document MDM capabilities that contradict E2E claims',
|
|
891
|
+
'Analyze iCloud backup encryption key handling',
|
|
892
|
+
];
|
|
893
|
+
}
|
|
894
|
+
else if (target === 'google') {
|
|
895
|
+
return [
|
|
896
|
+
...baseRecs,
|
|
897
|
+
'Compare disclosed data collection against actual telemetry',
|
|
898
|
+
'Document Gmail content processing pipeline',
|
|
899
|
+
'Analyze Chrome Safe Browsing data exposure',
|
|
900
|
+
'Test Android location tracking with settings disabled',
|
|
901
|
+
];
|
|
902
|
+
}
|
|
903
|
+
return baseRecs;
|
|
904
|
+
}
|
|
905
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
906
|
+
// Reporting
|
|
907
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
908
|
+
async generateFullReport(target) {
|
|
909
|
+
const plan = target === 'apple'
|
|
910
|
+
? this.getApplePQ3InvestigationPlan()
|
|
911
|
+
: this.getGoogleInvestigationPlan();
|
|
912
|
+
const claims = target === 'apple'
|
|
913
|
+
? [APPLE_PQ3_FRAUD]
|
|
914
|
+
: [GOOGLE_GMAIL_FRAUD, GOOGLE_CHROME_FRAUD, GOOGLE_ANDROID_FRAUD];
|
|
915
|
+
let report = `# ${target.toUpperCase()} Fraud Investigation Report
|
|
916
|
+
|
|
917
|
+
**Generated:** ${new Date().toISOString()}
|
|
918
|
+
**Investigation ID:** ${plan.id}
|
|
919
|
+
|
|
920
|
+
---
|
|
921
|
+
|
|
922
|
+
## Executive Summary
|
|
923
|
+
|
|
924
|
+
This report documents evidence of deceptive practices by ${target.toUpperCase()}
|
|
925
|
+
regarding their privacy and security claims. The investigation reveals significant
|
|
926
|
+
gaps between marketing statements and technical implementation.
|
|
927
|
+
|
|
928
|
+
---
|
|
929
|
+
|
|
930
|
+
## Investigation Plan
|
|
931
|
+
|
|
932
|
+
### Objectives
|
|
933
|
+
${plan.objectives.map((o, i) => `
|
|
934
|
+
${i + 1}. **${o.description}**
|
|
935
|
+
- Hypothesis: ${o.hypothesis}
|
|
936
|
+
- Method: ${o.testingMethod}
|
|
937
|
+
`).join('\n')}
|
|
938
|
+
|
|
939
|
+
### Methodology
|
|
940
|
+
${plan.methodology.map(m => `- ${m}`).join('\n')}
|
|
941
|
+
|
|
942
|
+
### Tools Required
|
|
943
|
+
${plan.tools.map(t => `- ${t}`).join('\n')}
|
|
944
|
+
|
|
945
|
+
---
|
|
946
|
+
|
|
947
|
+
## Fraud Claims
|
|
948
|
+
|
|
949
|
+
`;
|
|
950
|
+
for (const claim of claims) {
|
|
951
|
+
report += `
|
|
952
|
+
### ${claim.id}
|
|
953
|
+
|
|
954
|
+
**Category:** ${claim.category.replace(/_/g, ' ')}
|
|
955
|
+
**Severity:** ${claim.severity}
|
|
956
|
+
|
|
957
|
+
#### Marketing Claim:
|
|
958
|
+
> ${claim.claim}
|
|
959
|
+
|
|
960
|
+
#### Technical Reality:
|
|
961
|
+
${claim.reality}
|
|
962
|
+
|
|
963
|
+
#### Legal Basis:
|
|
964
|
+
${claim.legalBasis.map(b => `- ${b}`).join('\n')}
|
|
965
|
+
|
|
966
|
+
---
|
|
967
|
+
`;
|
|
968
|
+
}
|
|
969
|
+
report += `
|
|
970
|
+
## Recommendations
|
|
971
|
+
|
|
972
|
+
${this.generateRecommendations(target).map((r, i) => `${i + 1}. ${r}`).join('\n')}
|
|
973
|
+
|
|
974
|
+
---
|
|
975
|
+
|
|
976
|
+
## Appendices
|
|
977
|
+
|
|
978
|
+
### A. Frida Scripts for Evidence Collection
|
|
979
|
+
${target === 'apple' ? '```javascript\n' + this.generateFridaScriptForIMDaemon() + '\n```' : 'See Google-specific tools'}
|
|
980
|
+
|
|
981
|
+
### B. MDM Profile for Testing
|
|
982
|
+
${target === 'apple' ? '```xml\n' + this.generateMDMProfile() + '\n```' : 'N/A for Google investigation'}
|
|
983
|
+
|
|
984
|
+
---
|
|
985
|
+
|
|
986
|
+
*Report generated by erosolar-cli TechFraudInvestigator*
|
|
987
|
+
`;
|
|
988
|
+
return report;
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
// All exports are already declared above with 'export const'
|
|
992
|
+
//# sourceMappingURL=techFraudInvestigator.js.map
|