Complete Data Harvesting Audit
Systematic reverse engineering of Facebook iOS v345.0 across 61 frameworks, cataloging every category of user data collected, the mechanisms used to harvest it, and the infrastructure that routes it to Meta's servers.
The 8 Most Alarming Findings
Shadow permission systems, DEFCON remote control, privacy counter -- the findings that shocked us most
Biometric & Facial Surveillance
FBCameraFramework - 80,212 functions, 316,588 symbols
Face Detection with 4 Embedded ML Models
Proprietary ML models embedded in the binary for on-device face analysis:
face_detector_model.binInitial face detection - finds faces in frame
face_tracker_model.binContinuous face tracking across frames
features_model.binFacial feature extraction for recognition
pdm_multires.binPoint Distribution Model - facial landmark fitting
Binary reference at 0x007159e0:
FUN_007159e0 -> loads face_detector_model.bin, face_tracker_model.bin, features_model.bin, pdm_multires.bin Iris Tracking, Expression & Gesture Recognition
MSQRD engine (acquired 2016) provides real-time face analysis:
msqrd::iris_tracking_module::IrisTrackingModuleTracks iris position via EyeballCenterPositionAction
msqrd::IFacialExpressionFittingFactoryAnalyzes facial expressions, fitting emotional state models
msqrd::capabilities::facialGestureRecognitionRecognizes smiles, nods, blinks, and other gestures
FacialMovementsModuleinitWithTrackerMode:setHighPolyMode:maxDetectionScales:setUseEarTracker:setUseIrisTracker:setUseFacialGestures:
Body Analysis: Hands, Skeleton, Segmentation
Hand Tracking
hand_tracking_v2::HandTrackingConfigRingTryOnDataProviderConfigurationFull hand pose with virtual try-on for retail
Body Skeleton
msqrd::scene::SkeletonCollectorSkeletonJointsTransformCollectorJoint-level body pose tracking
Person/Hair Segmentation
PersonSegmentationDataProviderCreatorHairSegmentationDataProviderCreatorPyTorch-powered pixel segmentation
Location & Environmental Tracking
FBLocationComponentsFramework + main binary
Background Location with Unauthenticated Access
Location API accepts requireBackgroundAccess and requireUnauthenticatedAccess - tracking without a logged-in session.
initWithProductID:privacyID:desiredAccuracy:desiredFreshness:
requireBackgroundAccess:(BOOL)background // persistent tracking
requireUnauthenticatedAccess:(BOOL)noAuth // without login
onLocationUpdate:onError:queue:session: latitude / longitudeDouble-precision GPSspeed / heading / altitudeMovement vectornetwork_ssid / wifiBSSIDWiFi fingerprintingplaceVisits / location_age_msVisit detectionLocation Batch Upload & BLE Beacons
GraphQL Upload
LocationBatchUpload__FBAppJobStartLocationBatchUploadFleet Beacon (BLE Scanning)
FBCLBeaconScan / FBCLBeaconCacheFBFleetBeaconTriggerFactoryFBFleetBeaconLiveQueryAppJobAudio Surveillance Pipeline
FBAudioFramework - 1,797 functions
Real-Time Speech Transcription via Shortwave
wss://shortwave.facebook.com/v2/vp/recognition Pipeline: AudioUnitRender capture -> Opus encoding (FBSpeechHelperEncodingOpusConverter) -> HTTP/2 WebSocket -> Server transcription -> didReceiveTranscription:isFinal:
All 6 Background Execution Modes Declared
audiovoiplocationfetchprocessingremote-notificationKey methods: enableBackgroundAudio, forceUpdateAudioSession, speechRecorder:didCaptureAudioData:
Contact & Social Graph Mining
Continuous Contact Upload (CCU) + PYMK
Continuous Contact Upload (Not One-Time)
Your address book is re-uploaded continuously, not just once:
shared_continuous_contact_uploadCross-session CCU service
schedule_contact_importer_trigger_during_sessionAuto-trigger during active sessions
ContactBatchUploadMutationGraphQL batch upload mutation
ContactUploadSessionCreateAndMaybeBatchUploadMutationSession creation + upload combo
PYMK (People You May Know) - 30+ Symbols
pymk_email PymkCandidatePriorityCache netego_pymk pymk_add / pymk_xout pymk_imp NOTIF_PYMK private.stories.pymk sendFriendRequestToPerson:howFound:reference:pymkLocation: tracks exactly HOW each friend was discovered.
Behavioral Profiling & Tracking
50+ specialized analytics loggers
Dwell Time
DWELL_TIME / AD_DWELL_TIMEdwell_time_threshold / dwell_timer_reachedBOOSTED_B2C_DWELL_TIME_STICKY_CTATime Spent
TIME_SPENT_ON_SCREEN / BACKGROUND_TIME_SPENTACTIVE_TIME_SPENT / INACTIVE_TIME_SPENTios_background_task_time_by_name_spent_per_hourViewport & Impressions
FBSetupViewportImpressionTrackingFBHScrollImpressionLoggingdisplay_pixel_luminance_average15+ Parallel Sessions
app_session_id / lifecycle_session_idsearch_results_session_id / typeahead_session_idwaterfall_session_id / funnel_session_id50+ Analytics Loggers
FBFunnelLogger FBAdTrackingManager FBPayUPLLogger FBUsageTimeLogger FBProfileEngagementLogger FBAnalyticsLoggerForMQTT FBVideoFeedAdsAnalyticsLogger FBSSLKeyMaterialLogger FBAutomatedLoggingHandlerNativeModule FBGraphMessageSendAnalyticsLogger Device Fingerprinting & Cross-App Tracking
Cross-App Family ID
FBAnalyticsFamilyDeviceIDLinks device across Facebook, Instagram, WhatsApp
Global Client ID
ONE_WORLD_CLIENT_IDUniversal identifier across Meta infrastructure
IDFA with ATT Bypass
ios_idfa_access_on_new_plaforms.allowedios_idfa_runtime_checks.enabledRemote flags control IDFA access behavior
Encrypted RTB Cookie Sync
FBEncryptedUIDRtbIDQueryencryptedCookieSyncUidRtbidEncrypted user ID shared with ad exchanges
Clipboard & Device State
Clipboard Access
generalPasteboard (3 call sites)PasteboardKeyImageToFb / VideoToFbPasteboardKeyAppId (source app ID)Device State Collection
Battery (25 refs) / Carrier (25 refs)Locale/Language (60 refs) / Keychain (17 refs)Disk space / Time zoneNetwork & Connectivity Surveillance
Network Metadata Mega-Function (0x100139a88)
One function collects all network parameters in a single pass:
transport_type / network_typeip_address / server_ip_addressproxy_host / proxy_connectDNSResolution / DNSCache / DNSConnectTCPConnect / TLSSetup / FizzConnectQuicConnect / ReplaySafetyInsecure HTTP Exceptions
h.facebook.com- Insecure HTTP allowedod.fbinfra.net (+ all subdomains)- Insecure HTTP allowedData Transport & Exfiltration
5 Hardcoded API Endpoints
api.facebook.comPrimary REST APIb-api.facebook.comBatch APIgraph.facebook.comGraph APIb-graph.facebook.comBatch Graph APIlithium.facebook.comInternal codenameTransport Protocols
MQTT (30+ refs)
Persistent real-time analytics via FBAnalyticsLoggerForMQTT
GraphQL Mutations
Batch: ContactBatchUploadMutation, LocationBatchUpload
WebSocket
Live audio to wss://shortwave.facebook.com
Silent Push & Background Execution
push_notification_silent_push_receiveddefcon_level_updated_silent_pushcancel_logging_when_backgroundAudit trail destructionA/B Testing & Remote Control
30+ Quick Experiment flags remotely control privacy-sensitive behaviors:
_qe_ios_location_access_kit_alert_controllerA/B tests location permission dialog variants
FBBotDetectionModule...signal_collection...on_cold_startSignal collection on every app launch
_qe_ios_video_ads_product_logging_universeVideo ad tracking experiment
_qe_messenger_badge_count_loggingMessenger logging experiment
Privacy Suppression Infrastructure
Permission Dialog Suppression
ama_hide_camera_permissions_dialog_apple_higHides camera permission dialog. Value -1 = always suppress. Bypasses Apple HIG.
skip_privacy_dialog / skip_privacy_dialog_v2Skips privacy dialogs entirely.
should_hide_microtrayHides microphone indicator that alerts users to active recording.
cancel_logging_when_backgroundDisables logging when backgrounded - audit trail destruction.
privacy_settings_screen_variant (8 variants)Privacy settings A/B tested - users see different controls.
Microphone Profiling
enable_microphone_profileenable_kid_requested_microphone_profileMicrophone profiling specifically for children's accounts
Methodology
Static binary analysis of Facebook iOS v345.0 (build 333768490, branch fbobjc/releases/release-fbios-2021.11.18) using Ghidra with deep analysis profiles. All findings from compiled binary.
Binaries Analyzed
Techniques
- - String analysis across all binary segments
- - ObjC class and selector enumeration
- - C++ symbol demangling (MSQRD, Viper, PyTorch)
- - Function decompilation and xref analysis
- - Info.plist and entitlement extraction
- - GraphQL mutation discovery
This is what one app collects.
Every finding comes from symbols, strings, and code in the binary you download from the App Store. No speculation - just engineering.