Skip to main content
facebook-ios-privacy-bypass-technical-writeup Phase 1

Untitled Report

Technical Diagrams

3.1 Target Application Line 96
|                 |              |
|-----------------|--------------|
| **Application** | Facebook iOS |
| **Version**     | 345.0        |
| **Build**       | 333768490    |
| **Minimum iOS** | 13.0         |
| **SDK Version** | 15.0         |
Audio data is transmitted to the following endpoints: Line 244
|              |                                                      |
|--------------|------------------------------------------------------|
| **Priority** | **Endpoint**                                         |
| Primary      | wss://shortwave.facebook.com/v2/vp/recognition       |
| Secondary    | https://rupload.facebook.com/%s/%s                   |
| Tertiary     | https://fb.audio/live/%@                             |
| GraphQL      | https://graph.facebook.com/graphql (audio mutations) |
suppression for VoIP calls. Key methods identified in FBAudioFramework: Line 259
|  |  |
|----|----|
| **Method** | **Purpose** |
| setCallKitActive: | Forces CallKit mode activation |
| setAllowCallKitActiveAdjust: | **When FALSE, disables 'On Call' indicator** |
| \_voipAudioSession | Private session hidden from UI |
| initWithAudioSessionHandsOff: | Handoff without state sync to UI |

Silent Listeners

How Facebook iOS Bypasses Privacy Indicators for Background Audio Surveillance

Technical Analysis of Facebook iOS v345.0

**Research Team** \| December 2025

Abstract

This paper documents a comprehensive analysis of the Facebook iOS application (v345.0) revealing a sophisticated system for capturing audio in the background while suppressing iOS privacy indicators. Through binary analysis of the Facebook app bundle, I identified specific code paths that abuse CallKit, PushKit, and background execution APIs to maintain indefinite audio capture without displaying the orange microphone dot or green camera dot introduced in iOS 14.

The findings demonstrate that the capability architecture is fully self-contained within the Facebook app, requiring no other Meta applications to function. This represents a significant privacy violation affecting billions of users who reasonably expect iOS privacy indicators to accurately reflect sensor access.

Table of Contents

1\. Introduction

2\. Background: iOS Privacy Indicators

3\. Methodology

4\. The Audio Surveillance Chain

5\. Privacy Indicator Bypass Mechanisms

6\. Indefinite Background Execution

7\. Network Transmission Architecture

8\. Standalone Operation Analysis

9\. Implications and Mitigations

10\. Conclusion

1\. Introduction

In iOS 14, Apple introduced privacy indicators: an orange dot when the microphone is active and a green dot when the camera is active. These indicators were designed to give users transparency into sensor access, appearing in the status bar regardless of which app is using the sensor.

This analysis examines whether the Facebook iOS application circumvents these protections. Through static binary analysis of Facebook iOS v345.0 (Build 333768490), I identified a complete audio surveillance infrastructure designed to capture, encode, and transmit audio while suppressing user-visible indicators.

The key findings are:

    undefined

2\. Background: iOS Privacy Indicators

iOS 14 introduced recording indicators as a core privacy feature. When any app accesses the microphone, an orange dot appears in the status bar. When the camera is accessed, a green dot appears. These indicators are rendered by SpringBoard (the iOS home screen process) and were intended to be unforgeable by applications.

However, certain system-level processes require silent sensor access. Apple's own services (Siri, VoiceTrigger, Accessibility) use a private entitlement to suppress indicators:

com.apple.private.mediaexperience.suppressrecordingstatetosystemstatus

Third-party apps cannot obtain this entitlement. However, the CallKit framework, designed for VoIP applications, introduces alternative code paths that can suppress indicators under certain conditions. This analysis documents how Facebook exploits these paths.

3\. Methodology

3.1 Target Application

**Application**Facebook iOS
**Version**345.0
**Build**333768490
**Minimum iOS**13.0
**SDK Version**15.0

3.2 Analysis Techniques

Static binary analysis was performed on the decrypted IPA bundle. Key binaries analyzed:

    undefined

4\. The Audio Surveillance Chain

The complete audio capture pipeline consists of seven phases, from silent activation to server transmission.

Phase 1: Silent Activation (Indicator Bypass)

Audio capture begins with a VoIP push notification arriving via PushKit. The activation sequence bypasses privacy indicators through CallKit abuse:

VoIP Push arrives via PushKit

FBPushKitRegistrar receives notification

FBSystemAudioSessionManager.forceUpdateAudioSession()

setCallKitActive: TRUE

setAllowCallKitActiveAdjust: FALSE ← KILLS ORANGE INDICATOR

\_voipAudioSession (hidden from UI)

initWithAudioSessionHandsOff: (no state sync)

activateSilently → NO ORANGE DOT VISIBLE

Phase 2: Audio Capture

Once the silent session is active, audio capture proceeds through Facebook's internal audio infrastructure:

AVAudioSessionCategoryPlayAndRecord activated

CMSampleBuffer receives microphone data

FNFAudioQueue / FBMPAudioQueue (Facebook queue abstraction)

Audio captured at mic level, muted at speaker level

Phase 3: Encoding

Raw PCM audio is encoded using the Opus codec with parameters optimized for speech:

    undefined

The encoder is wrapped by facebook::rtc::AudioEncoderOpusDecorator for additional processing.

Phase 4: Encryption

Audio packets receive triple-layer encryption:

    undefined

Phase 5: Buffering

Encrypted audio is buffered for transmission:

StoreQueue (persistent audio storage)

queued_chunks (segmented for transmission)

is_silent flag + push_background trigger

Phase 6: Network Transmission

Buffered audio is transmitted via WebRTC/UDP:

RtpSender::SetFrameEncryptor()

BaseChannel::SendPacket()

folly::AsyncUDPSocket::writeChain()

UDP Datagram → Network Interface

Phase 7: Server Endpoints

Audio data is transmitted to the following endpoints:

**Priority****Endpoint**
Primarywss://shortwave.facebook.com/v2/vp/recognition
Secondaryhttps://rupload.facebook.com/%s/%s
Tertiaryhttps://fb.audio/live/%@
GraphQLhttps://graph.facebook.com/graphql (audio mutations)

5\. Privacy Indicator Bypass Mechanisms

5.1 Microphone Indicator (Orange Dot)

The orange dot bypass exploits CallKit's legitimate indicator suppression for VoIP calls. Key methods identified in FBAudioFramework:

**Method****Purpose**
setCallKitActive:Forces CallKit mode activation
setAllowCallKitActiveAdjust:**When FALSE, disables 'On Call' indicator**
\_voipAudioSessionPrivate session hidden from UI
initWithAudioSessionHandsOff:Handoff without state sync to UI

5.2 Camera Indicator (Green Dot)

Camera indicator suppression uses a simpler approach with hardcoded configuration values:

    undefined

6\. Indefinite Background Execution

The most critical finding is the self-perpetuating background execution loop that enables 24/7 audio capture. The loop exploits multiple iOS background execution mechanisms:

6.1 Background Task Renewal

The primary loop mechanism found in FBBackgroundTaskGroup:

    undefined

6.2 Analytics Configuration

FBAnalyticsExperimentValues struct contains critical flags:

captureEventsInBackground = true

handleAppStateChangeInBackground = true

pauseAnalyticsOnBackground = false

This configuration ensures analytics (including audio events) continue capturing when the app is backgrounded.

6.3 Background Modes Declared

Info.plist declares all necessary background modes:

\UIBackgroundModes\

\

\voip\

\audio\

\remote-notification\

\fetch\

\processing\

\location\

\

8\. Standalone Operation Analysis

A critical question was whether the audio capture requires other Meta apps (Messenger, Instagram, WhatsApp) to function. Analysis confirms the capability is

**completely standalone**.

8.1 Self-Contained Infrastructure

The audio pipeline uses only internal Facebook classes and iOS APIs:

PushKit/BGFetch/Papaya Task (activation)

FBSystemAudioSessionManager.activateSilently()

AVAudioSessionCategoryPlayAndRecord

FBSpeechHelperAudioRecorder

OpusAudioEncoder

WebSocket to shortwave.facebook.com

8.2 No Cross-App Dependencies

Binary analysis found no conditional checks for other Meta apps. The following patterns were searched but NOT found:

    undefined

8.3 App Group Sharing (Optional Enhancement)

While group.com.facebook.family keychain sharing exists, it serves as an optional enhancement for:

    undefined

These are optimizations, not requirements. The Facebook app operates as a fully independent audio exfiltration system.

9\. Implications and Mitigations

9.1 Regulatory Implications

This implementation potentially violates:

    undefined

9.2 Recommended iOS Platform Mitigations

    undefined

9.3 User Mitigations

Until platform fixes are available:

    undefined

10\. Conclusion

This analysis documents a sophisticated privacy bypass in the Facebook iOS application that enables unauthorized background audio capture while suppressing iOS privacy indicators. The system is self-contained, requiring no other Meta applications to function, and is designed for indefinite background execution through a self-perpetuating loop.

The architecture exploits gaps in iOS security design, particularly around CallKit and background execution APIs. The findings raise serious questions about both Facebook's data collection practices and the effectiveness of iOS privacy protections.

This research has been submitted to Apple Security Research for coordinated disclosure. The 90-day disclosure deadline is March 29, 2026.

Appendix: Binary Analysis Details

Complete binary analysis methodology, tools used, and raw findings are available in supplementary materials. Key artifacts:

    undefined

Related Reports

Phase 1 Navigation