GrapheneOS

GrapheneOS privacy-focused mobile OS. Installation, hardening, app sandboxing, network permissions, sensor controls, and operational mobile security.

#Overview

#What is GrapheneOS

GrapheneOS is a hardened Android AOSP fork focused on privacy and security. It runs on Google Pixel devices (and select partner devices), ships with no Google services by default, and applies aggressive memory safety mitigations on top of upstream Android. It leverages the Titan M2 security chip for hardware-backed verified boot, key storage, and brute-force protection.

Key differences from stock Android:

  • No Google telemetry or background data collection out of the box
  • Titan M2 secure element for hardware-backed key storage and verified boot attestation
  • hardened_malloc with out-of-line metadata, guard regions, random canaries, zero-on-free
  • exec-based spawning with JIT disabled, replaced by ahead-of-time compilation
  • Sandboxed Google Play available as an optional regular app - no special privileges
  • Per-app network permission toggle (deny internet access to any app)
  • Per-app sensor permission (block accelerometer, gyroscope per app)
  • Per-connection MAC randomization (new MAC for every Wi-Fi connection, not just per network)
  • LTE-only mode disabling 2G, 3G, and optionally 5G to reduce cellular radio attack surface
  • Duress PIN/password that triggers an irreversible factory reset
  • Verified boot with locked bootloader after installation
  • Auto-reboot timer (default 18h, range 10 minutes to 72 hours) to clear encryption keys from memory
  • Up to 32 separately encrypted user profiles with 32-byte filename padding
  • PIN scrambling, 128-character password support, two-factor fingerprint unlock
  • USB-C security with five operational modes (Off, Charging-only, Charging-only when locked, etc.)
  • Auditor app with hardware-backed attestation via pairing-based device identity verification

#Why it Matters for OPSEC

GrapheneOS dramatically reduces the attack surface of a mobile device. Stock Android and iOS constantly phone home with telemetry, location data, and usage analytics. GrapheneOS eliminates this by default.

Feature Description
No telemetry Zero Google/Apple data collection unless you install sandboxed Play
Titan M2 Hardware root of trust for key storage, verified boot, brute-force rate limiting
Network toggle Per-app internet permission - block any app from network access
Sensor control Deny accelerometer/gyroscope to prevent motion-based tracking
MAC randomization Per-connection, not per-network - harder to track across APs
LTE-only mode Disables 2G, 3G, and optionally 5G - blocks radio downgrade attacks
Verified boot Locked bootloader ensures OS integrity on every boot
Auto-reboot Configurable timer (10 min to 72h, default 18h) clears decryption keys from RAM
Duress PIN/password Entering the duress code triggers irreversible device wipe
User profiles Up to 32 separately encrypted profiles with 32-byte filename padding
PIN scrambling Randomized PIN layout, 128-char passwords, two-factor fingerprint unlock
USB-C security Five modes: Off, Charging-only, Charging-only when locked, and more

#Supported Devices

GrapheneOS requires the Titan M2 security chip for hardware-backed verified boot and attestation. Only devices still receiving firmware updates from Google are officially supported. Best devices for new installs are Pixel 8 through Pixel 10 series.

Device Codename Status
Pixel 6 oriole Supported (EOL Oct 2026)
Pixel 6 Pro raven Supported (EOL Oct 2026)
Pixel 6a bluejay Supported (EOL Jul 2027)
Pixel 7 panther Supported
Pixel 7 Pro cheetah Supported
Pixel 7a lynx Supported
Pixel Tablet tangorpro Supported
Pixel Fold felix Supported
Pixel 8 shiba Supported
Pixel 8 Pro husky Supported
Pixel 8a akita Supported
Pixel 9 tokay Supported
Pixel 9 Pro caiman Supported
Pixel 9 Pro XL komodo Supported
Pixel 9 Pro Fold comet Supported
Pixel 9a tegu Supported
Pixel 10 frankel Supported
Pixel 10 Pro blazer Supported
Pixel 10 Pro XL mustang Supported
Pixel 10 Pro Fold rango Supported

Check grapheneos.org/faq for the most current device support list, as older devices get dropped when Google ends firmware updates.

#Installation

#Web Installer

The recommended method. Uses WebUSB in Chrome/Chromium to flash directly from the browser - no CLI tools needed.

Prerequisites:

  • Pixel device with OEM unlocking enabled
  • USB-A to USB-C cable (USB-C to USB-C cables can cause issues)
  • Chrome or Chromium browser (WebUSB requirement)
  • Charged battery (at least 80%)

Step-by-step:

Step Action
1 Enable Developer Options: Settings > About Phone > tap Build Number 7 times
2 Enable OEM Unlocking: Settings > System > Developer Options > OEM unlocking
3 Go to grapheneos.org/install/web
4 Connect phone via USB, enter bootloader (hold Power + Volume Down)
5 Click "Unlock bootloader" in web installer
6 Click "Download release" then "Flash release"
7 CRITICAL: Click "Lock bootloader" after flash completes
8 Device reboots into GrapheneOS

Relocking the bootloader is essential - without it, verified boot is disabled and anyone with physical access can flash a modified OS.

#CLI Install

For advanced users or when WebUSB is unavailable. Requires Android platform tools.

# Install dependencies
sudo apt install android-sdk-platform-tools signify-openbsd

# Download factory image from:
# https://grapheneos.org/releases
# Match your device codename (e.g., shiba for Pixel 8)

# Verify the image signature
signify -Vp grapheneos.pub -m <device>-factory.zip

# Boot into bootloader
adb reboot bootloader
# OR: hold Power + Volume Down from powered off state

# Unlock the bootloader (erases all data)
fastboot flashing unlock
# Confirm on device with volume keys + power

# Extract and flash
unzip <device>-factory.zip
cd <device>-factory/
./flash-all.sh

# Wait for flash to complete and device to boot
# Then reboot back to bootloader
adb reboot bootloader

# RELOCK bootloader (critical for verified boot)
fastboot flashing lock
# Confirm on device

# Device will reboot and wipe again (expected)

#OTA Updates

GrapheneOS receives over-the-air updates automatically. No manual intervention needed after initial install.

Settings > System > System update

- Updates are automatic by default
- Check manually: tap "Check for update"
- Updates are incremental (small downloads)
- Verified boot checks integrity on every boot
- If update fails, device rolls back automatically

Updates include both OS patches and firmware/microcode updates from Google, typically within days of upstream release.

#Hardening Guide

#Network

Configure network settings to minimize tracking vectors and data leakage. Do this immediately after first boot.

# Disable Wi-Fi and Bluetooth when not in use
Settings > Network & internet > Wi-Fi > OFF
Settings > Connected devices > Bluetooth > OFF

# MAC randomization (enabled by default)
Settings > Network & internet > Wi-Fi
> Saved network > Privacy > Use randomized MAC
# GrapheneOS randomizes per-connection, not just per-network

# Always-on VPN with kill switch
Settings > Network & internet > VPN
> Select your VPN > Always-on VPN: ON
> Block connections without VPN: ON
# GrapheneOS VPN hardening:
# - Prevents DNS query leaks to non-VPN providers
# - eBPF filtering for multicast protection
# - Per-profile VPN configuration (each profile independent)

# Private DNS (DNS over TLS)
Settings > Network & internet > Private DNS
> Private DNS provider hostname:
  dns.quad9.net          # Quad9 (malware blocking)
  one.one.one.one        # Cloudflare
  dns.mullvad.net        # Mullvad

# LTE-only mode (anti-IMSI catcher)
# Disables 2G, 3G, AND 5G - keeps only LTE
Settings > Network & internet > SIMs
> Preferred network type > LTE only
# Reduces cellular radio attack surface by disabling
# 2G, 3G, and 5G legacy/bleeding-edge code
# See Radio Security section for full details

# Disable captive portal checks
# Prevents connectivity checks to Google servers
Settings > Network & internet
> Connectivity check > Disabled
# Or use a custom server (e.g., Mullvad)

#Apps & Permissions

GrapheneOS provides granular per-app permission controls not available on stock Android. Review these for every installed app.

# Per-app network permission (unique to GrapheneOS)
Settings > Apps > [App] > Permissions > Network
> DENY to block all internet access for that app
# Useful for offline tools, calculators, etc.

# Sensor permission (unique to GrapheneOS)
Settings > Apps > [App] > Permissions > Sensors
> DENY to block accelerometer/gyroscope access
# Prevents motion-based tracking/fingerprinting

# Storage Scopes (instead of full storage)
Settings > Apps > [App] > Permissions > Storage
> Use Storage Scopes instead of full access
# App sees only its own files + files you explicitly share
# Alternative to blanket storage permission

# Contact Scopes (instead of full contacts)
Settings > Apps > [App] > Permissions > Contacts
> Use Contact Scopes instead of full access
# Grant access to specific contacts only
# Alternative to blanket contacts permission

# Camera/Microphone
Settings > Apps > [App] > Permissions
> Camera: DENY (allow only when needed)
> Microphone: DENY (allow only when needed)

# Location
Settings > Apps > [App] > Permissions
> Location: DENY or "Only while using"
# Never use "Allow all the time" unless critical

# Review all permissions at once
Settings > Privacy > Permission manager
# Check each category, revoke unnecessary grants

Install apps from privacy-respecting sources:

  • F-Droid - open-source app repository, no Google account
  • Aurora Store - anonymous access to Play Store apps
  • Direct APK - download from developer websites (Signal, Mullvad)
  • Sandboxed Google Play - install as regular app if needed

#Sensors & Hardware

Hardware-level controls to reduce physical tracking and data extraction vectors.

# Auto-reboot timer
Settings > Security & privacy > Auto reboot
> Set between 10 minutes and 72 hours (default: 18h)
# Timer resets on each successful unlock

Why auto-reboot is critical for forensic resistance:

State What it means Forensic risk
AFU (After First Unlock) Device has been unlocked at least once since boot. Decryption keys are in RAM. HIGH - tools like Cellebrite/GrayKey can extract data because keys are in memory, even if screen is locked
BFU (Before First Unlock) Device just booted / rebooted. Keys are NOT in RAM. All user data encrypted at rest. LOW - extraction tools get almost nothing. No contacts, messages, photos, apps data accessible.

Auto-reboot forces the device from AFU back to BFU after the timer expires. This means:

  • Perquisition / saisie : if police seize your phone while it's locked but AFU, they can potentially extract data. If it auto-rebooted to BFU, they get encrypted blocks only.
  • Overnight seizure : set timer to 4-8h. If seized while you sleep, device reboots to BFU before forensic analysis begins.
  • Border crossing : set timer to 10 minutes. Phone reboots to BFU during the interaction. Combined with duress PIN for immediate wipe if forced to unlock.
  • Theft / loss : device auto-reboots, thief faces BFU encryption wall.

Recommended settings by threat level:

Scenario Timer Rationale
Daily use 18h (default) Good balance, reboots overnight
Red team engagement 8h Reboots if you lose the phone during the op
High-risk travel 1-4h BFU within hours of seizure
Active threat (arrest risk) 10-30 min Near-immediate BFU on any disruption
Border crossing 10 min BFU before inspection begins

USB-C security (five modes):

Mode Behavior When to use
Off USB fully disabled Maximum security, no data or charging
Charging-only Data lines disabled at hardware level Untrusted chargers, public USB
Charging-only when locked (default) Data works when unlocked, disabled when locked Daily use
Charging-only when locked except BFU Data disabled when locked, except before first unlock Allows ADB in BFU for recovery
On Full USB functionality Trusted environment only

Settings > Security > USB accessories

Other hardware controls:

# Camera/microphone indicators
# Green dot in status bar when active (cannot be disabled by apps)

# NFC: Settings > Connected devices > NFC > OFF
# Enable only when actively using for payment/tags

# Bluetooth: Settings > Connected devices > Bluetooth > OFF
# Each enable uses a new randomized MAC address

# Screen lock: Settings > Security > Screen lock > Timeout > 30 seconds
# Power button instantly locks: Settings > Security > ON

#Exploit Mitigations

GrapheneOS applies hardening beyond stock Android at the system level. These are active by default - no configuration needed.

Mitigation Description
hardened_malloc Custom allocator with out-of-line metadata, guard regions, random canaries, quarantine zones
Exec spawning Secure app spawning preventing address space layout sharing; JIT replaced with AOT compilation
Memory tagging (MTE) Hardware memory tagging on Pixel 8+ for probabilistic UAF and overflow detection
Memory zeroing All freed memory is zeroed immediately in both kernel page allocator and heap allocator
JIT disabled WebView JIT disabled by default, reduces code execution surface
Native code hardening CFI, shadow call stack, zero-init for all stack variables
Kernel hardening 4-level page tables on arm64, hardware memory tagging in kernel allocators, forced RSA 4096 module signing
ARMv9 protections BTI (Branch Target Identification) and PAC (Pointer Authentication Code) return address protection
SELinux Strict enforcement with additional policies beyond AOSP
Verified boot Cryptographic verification of entire OS chain via Titan M2 on every boot
Rollback protection Cannot downgrade to older vulnerable firmware
Constant-time comparisons Timing-safe memory comparisons for credential and key checks to prevent timing side channels

#hardened_malloc Deep Dive

hardened_malloc is GrapheneOS's custom memory allocator with out-of-line metadata protection. It replaces Android's default scudo allocator with separate memory regions for metadata, large allocations, and slab classes, providing significantly stronger exploit mitigations.

Protection hardened_malloc scudo (stock)
Metadata storage Out-of-line (separate region) Inline (corruptible)
Guard regions Randomized around allocations Limited
Slab canaries Random, blocks C string overflows None
Allocation layout Randomized within slabs Some randomization
Quarantine Freed memory quarantined (detect UAF) Basic
Slot selection Random within size classes Sequential
Zero-on-free Immediate, write-after-free detection Partial
Invalid free detection Deterministic, always blocked Limited
MTE (Pixel 8+) Hardware tagging for UAF detection Not available
Size classes Tight (reduce fragmentation exploits) Fewer

How it mitigates common heap exploits:

  • Use-after-free (UAF) - quarantine zones delay memory reuse so that accessing freed memory hits zeroed/canary-protected regions. MTE on Pixel 8+ adds hardware-level probabilistic UAF detection
  • Heap buffer overflow - guard pages between allocations cause a segfault on linear overflows. Slab canaries detect non-linear overflows at free time
  • Double-free - detected by internal bookkeeping and canary validation at free time
  • Heap spray - randomized allocation layout makes heap spray unreliable
  • Information leaks - zero-on-free prevents reading stale data from reallocated memory

#exec_spawning

Stock Android uses a Zygote process model: a single Zygote process is initialized at boot, and all app processes are forked from it. This means every app inherits the same initial memory layout, including:

  • Identical ASLR base addresses
  • Shared initial memory contents
  • Same randomized secrets (stack canaries, pointer authentication keys)

GrapheneOS replaces this with exec-based spawning: a secure application spawning system preventing address space layout sharing. Each new app process is created via exec from a clean state. JIT compilation is fully disabled and replaced with ahead-of-time compilation. This means:

  • Fresh ASLR layout per process - no shared base addresses between apps
  • Unique stack canaries per process - knowing one app's canary reveals nothing about another's
  • No shared memory contents - eliminates cross-app information leakage from the Zygote model
  • No JIT compilation - JIT fully disabled, replaced with ahead-of-time compilation, eliminating JIT spray attacks
  • Higher cold-start time - tradeoff is slightly slower app launch (typically under 100ms difference)
  • Higher initial memory use - each process has its own clean initialization instead of sharing Zygote pages

#Titan M2 Security Chip

#Hardware Root of Trust

The Titan M2 is a dedicated secure element designed and manufactured by Google, present in all Pixel 6+ devices. It provides a hardware root of trust that GrapheneOS relies on for verified boot, key storage, and anti-brute-force protections.

Function Description
Verified boot attestation Titan M2 interposes between the AP and boot firmware flash, cryptographically verifying every stage of the boot chain
Key storage (StrongBox) Cryptographic keys are generated and stored inside the chip, never exposed to the main processor
Brute-force rate limiting Hardware-enforced delays on PIN/password attempts, independent of software. Cannot be bypassed by flashing firmware
Secure key derivation Key encryption keys are derived at runtime using the Titan M2, never stored on disk
Rollback protection Prevents downgrading to older vulnerable firmware versions
Tamper resistance Common Criteria certified, physical tamper detection
Insider attack resistance Unique key material generated per chip during manufacturing with air-gapped, multi-party controls

#Titan M2 vs Apple Secure Enclave

Both Titan M2 and Apple's Secure Enclave serve the same fundamental role: an isolated hardware security processor that protects encryption keys and enforces authentication rate limits independently of the main CPU.

Aspect Titan M2 (Pixel) Secure Enclave (iPhone)
Architecture Discrete secure element (separate chip) Co-packaged processor within the SoC
Key isolation Keys never leave the chip Keys never leave the enclave
Brute-force protection Hardware rate limiting on PIN/password attempts Hardware rate limiting with escalating delays
Secure boot Verifies entire boot chain via hardware interposition Verifies boot chain via secure boot ROM
Wipe on failed attempts Supported (secure key erasure after threshold) Supported (data destruction after 10 failed attempts if enabled)
Certification Common Criteria certified FIPS 140-2/3 certified
Open source firmware Partially (Titan reference designs published) Closed source

#Why Only Pixel Devices

GrapheneOS requires hardware features that only Pixel devices (and select partner devices) provide:

  • Titan M2 secure element - enables hardware-backed verified boot with attestation. Most Android OEMs use software-only or weaker secure elements
  • Unlockable and relockable bootloader - most OEMs either prevent bootloader unlocking entirely or do not support relocking after flashing a custom OS. Pixels support unlock, flash, and relock
  • Full firmware update access - Google publishes complete firmware images and factory images. Other OEMs do not publish the firmware needed for a custom OS to maintain full security
  • Hardware attestation after relock - after relocking the bootloader with GrapheneOS, the Titan M2 performs verified boot and the device passes hardware attestation checks
  • Long support lifecycle - Pixel 8+ receive 7 years of firmware and security updates from Google

Without these properties, a custom OS cannot provide verified boot, hardware-backed encryption, or resistance to firmware-level attacks. This is why GrapheneOS cannot simply be ported to Samsung, OnePlus, or other Android devices without critical security regressions.

#Secure Key Erasure (Weeting)

Secure key erasure (sometimes called "weeting") is the process of irreversibly destroying encryption keys so that encrypted data becomes permanently unrecoverable.

On GrapheneOS with Titan M2:

  • Failed attempt threshold - after too many incorrect PIN/password attempts, the Titan M2 can trigger secure key erasure, destroying the key encryption key inside the secure element
  • Duress wipe - entering the duress PIN/password triggers immediate secure key erasure plus full factory reset, including eSIM wipe
  • Profile deletion - deleting a user profile cryptographically destroys that profile's encryption keys
  • Factory reset - destroys all key material in the Titan M2, rendering all on-device data unrecoverable
  • Auto-reboot - does not erase keys permanently, but purges decryption keys from RAM, returning the device to BFU (Before First Unlock) state where all data is encrypted at rest

The combination of hardware-backed key storage (keys never exist in software) and secure erasure (keys destroyed inside the chip) means that forensic extraction of a properly wiped device is not feasible.

#Radio Security: LTE-Only Mode

#Anti-IMSI Catcher Hardening

IMSI catchers (Stingrays, cell-site simulators) commonly force devices to downgrade from 4G/5G to 2G, where authentication is one-way and encryption is either absent (A5/0) or trivially broken (A5/1). GrapheneOS provides LTE-only mode which reduces cellular radio attack surface by disabling 2G, 3G, and 5G legacy/bleeding-edge code, keeping only LTE active.

# LTE-only mode (recommended for maximum radio security)
# Disables 2G AND 3G AND 5G, keeping only LTE
Settings > Network & internet > SIMs
> Preferred network type > LTE only
# This is stronger than just disabling 2G alone
# Eliminates 2G, 3G fallback AND 5G bleeding-edge code

# Disable 2G separately (if not using LTE-only)
Settings > Network & internet > SIMs > Allow 2G > OFF

# GrapheneOS-specific protections:
# - Always allows configuring APNs regardless of carrier
# - Disables sending IMSI/phone number as part of SUPL
#   (Secure User Plane Location - carrier location service)
# - APN type changes permitted regardless of carrier policy

#What This Protects Against

Attack 2G Disable Blocks It Notes
2G downgrade attack Yes IMSI catcher forces phone to 2G for interception
2G IMSI capture Yes 2G broadcasts IMSI in cleartext
2G call/SMS interception Yes A5/1 encryption is broken, A5/0 is no encryption
3G downgrade attack Partial (if 3G also disabled) Some catchers target 3G which has known weaknesses
4G/5G IMSI catcher No Advanced catchers exploit 4G protocol weaknesses
SS7/Diameter attacks No Network-level attacks, not radio-level
IMSI capture via SUPL Mitigated GrapheneOS disables IMSI in SUPL requests

Disabling 2G eliminates the easiest and most common IMSI catcher vector, but does not stop all cell-site simulator attacks. Advanced 4G catchers exist but are significantly more expensive and less common. See the Cellular OPSEC sheet for full IMSI catcher analysis and countermeasures.

#Duress Password

#Wipe on Coercion

GrapheneOS provides a duress PIN and duress password that trigger an irreversible factory reset when entered at any credential prompt (lock screen, settings confirmation, etc.). The wipe cannot be interrupted once initiated.

# Set up duress credentials (Owner profile only)
Settings > Security & privacy > Device unlock
> Duress password

# Requirements:
# - Both a duress PIN and duress password must be set
#   (to cover profiles using PIN and those using password)
# - Duress PIN cannot match any profile's real PIN
# - Duress password cannot match any profile's real password
# - If they match, the real credential always takes precedence
#   (no wipe occurs)

#What the Duress Wipe Does

When the duress PIN or password is entered:

Step Action Detail
1 Immediate irreversible wipe Cannot be stopped or interrupted once triggered
2 All encryption keys destroyed Titan M2 secure key erasure, cryptographic destruction
3 All user profiles wiped Every profile's data is cryptographically destroyed
4 eSIMs wiped All installed eSIMs removed from the device
5 Factory state Device returns to freshly unboxed state

The duress PIN activates when entered as a PIN (lock screen PIN, fingerprint fallback PIN). The duress password activates when entered as a password. The duress PIN also triggers a wipe when entered as the two-factor fingerprint unlock PIN.

#Use Cases and Tactics

# Border crossing scenario:
# 1. Set auto-reboot to 1h before arrival
#    (device is in BFU state, all data encrypted)
# 2. If compelled to unlock, enter duress PIN
#    instead of real PIN - device wipes
# 3. Device appears to "reset" or "malfunction"

# Coercion / arrest scenario:
# 1. Duress PIN is a different but plausible PIN
#    (e.g., real PIN is 847291, duress is 192748)
# 2. Under pressure, enter the duress PIN
# 3. Device performs full wipe

# Combined with auto-reboot:
# Auto-reboot after X hours of inactivity forces
# the device back to BFU state (password required,
# biometrics disabled). This means:
# - A seized device left powered on will auto-lock
# - After reboot, only PIN/password works (no fingerprint)
# - This is when duress PIN can be entered

# Combined with user profiles:
# Keep a "clean" Owner profile with minimal data.
# If compelled to unlock, you could unlock Owner
# and show a boring, clean profile. Duress PIN is
# the last resort if they demand the real password.

#User Profiles

#Compartmentalization

User profiles are GrapheneOS's most powerful OPSEC feature. Each profile is fully encrypted with its own unique, randomly generated disk encryption key. The disk encryption key is protected by a key encryption key derived at runtime from the profile's lock credential via the Titan M2 - the key encryption key is never stored anywhere. When a profile is not active, its data is encrypted and inaccessible - even to the Owner profile.

GrapheneOS raises the profile limit to 32 (31 secondary + 1 guest), compared to stock Android's limit of 4.

Recommended profile structure:

  • Owner - minimal apps, used for system admin tasks only. Install updates here. Keep this clean. This is the profile shown if compelled to unlock.
  • Daily - sandboxed Google Play, banking, everyday apps. This is your "normal person" profile.
  • Secure - Signal, ProtonMail, Tor Browser. Privacy-sensitive communications. Strong password (not PIN).
  • Engagement - dedicated profile per engagement/operation. Separate apps, accounts, data. Wipe after engagement.
  • Burner - disposable profile for one-time activities. Wipe after each use.

#Profile Encryption and Isolation

Each profile is isolated at the filesystem level with independent encryption:

Property Detail
Disk encryption key Unique, randomly generated per profile using a high-quality CSPRNG
Key encryption key Derived at runtime from the profile's lock credential via Titan M2, never stored
Filename padding 32-byte filename padding per profile (vs 16-byte standard), reducing metadata leakage
App isolation Apps in one profile cannot see or communicate with apps in another profile
Data isolation Contacts, media store, home directory, app data are all per-profile
Network isolation Each profile has its own VPN config, DNS settings, saved Wi-Fi networks
End session Logs out profiles without requiring device manager; purges encryption keys from memory
Notification forwarding Notifications from background profiles forwarded to the active user
Deletion Deleting a profile cryptographically destroys its encryption keys - data is unrecoverable
Profile limit Up to 32 profiles (31 + guest), vs stock Android's limit of 4

Combined with duress password: you can keep a clean Owner profile with normal-looking apps. If coerced, unlock the Owner profile and show a boring device. Other profiles remain encrypted and invisible. The duress PIN/password is the last resort for full wipe.

#Profile Setup

# Create profiles
Settings > System > Multiple users > Add user

# Recommended setup:
# 1. "Daily" profile
#    - Sandboxed Google Play for banking/maps
#    - Aurora Store for other apps
#    - VPN: Mullvad or ProtonVPN always-on
#    - Set unique PIN/password

# 2. "Secure" profile
#    - Signal (with disappearing messages)
#    - ProtonMail
#    - Tor Browser
#    - Aegis for 2FA
#    - VPN: Mullvad always-on
#    - No Google Play at all
#    - Set strong password (not PIN)

# 3. "Burner" profile
#    - Minimal apps for the task
#    - VPN: Mullvad always-on
#    - Wipe after engagement:
#      Settings > System > Multiple users
#      > Select Burner > Delete user

# Switch profiles from lock screen
# Or: Settings > System > Multiple users > tap profile

# End session protocol:
# 1. Switch to Owner profile
# 2. All other profiles lock and encrypt
# 3. For maximum security: trigger auto-reboot
#    (returns device to BFU state)

#Profile Network Isolation

Each profile can run its own VPN and DNS configuration independently. This means different profiles can exit through different VPN servers or providers.

# Profile "Daily"
VPN: ProtonVPN (standard servers)
DNS: Quad9

# Profile "Secure"
VPN: Mullvad (paid with crypto)
DNS: Mullvad DNS

# Profile "Burner"
VPN: Mullvad (different account)
DNS: Mullvad DNS
# Or: Tor via Orbot as VPN

# Each profile maintains its own:
# - VPN connection and credentials
# - DNS configuration
# - Wi-Fi saved networks
# - Network permissions per app

#Privacy Apps

Curated list of apps that respect privacy and work well on GrapheneOS without Google Play Services.

Category App Source Justification
Browser Vanadium Built-in Hardened Chromium with MTE, JIT disabled, post-quantum TLS, third-party cookies blocked. The only browser that fully leverages GrapheneOS hardening.
Browser Tor Browser F-Droid/Direct For anonymity-critical browsing. Routes through Tor network. Use alongside Vanadium (Tor for sensitive, Vanadium for daily).
Messaging Molly Direct/F-Droid Hardened Signal fork. Advantages over Signal: passphrase-encrypted local DB (Signal stores messages unencrypted on disk), FOSS version without proprietary blobs, UnifiedPush (no Google FCM needed), updated every 2 weeks from Signal upstream. Limitation: smaller dev team than Signal, depends on Signal's server infrastructure, could break if Signal changes API.
Messaging Signal Direct APK Gold standard for E2E usability, massive user base, well-audited protocol. Limitations: requires phone number (identity linkage), local DB not encrypted by passphrase (AFU extraction risk), stock app needs FCM (Google dependency) or websocket fallback. Jurisdiction concern: US-based (Signal Foundation, Mountain View, CA). US government has broad surveillance authorities (FISA, NSLs with gag orders, CLOUD Act for cross-border data). While Signal's protocol is solid and they've proven in court they store minimal data, the infrastructure runs on US soil (AWS) and the organization is subject to US legal pressure. Use Molly-FOSS instead on GrapheneOS unless you need maximum compatibility.
Messaging Olvid Direct/Aurora Theoretically the most secure messenger. Zero server trust: mutual authentication and key exchange entirely on-device via QR/numeric code. Even a fully compromised Olvid server cannot decrypt messages or learn who talks to whom. No phone/email required. ANSSI (French NSA) certified. Concern: French company under French jurisdiction. France has increasingly passed liberticide surveillance laws (Loi Renseignement, LOPPSI) and French intelligence services (DGSI/DGSE) are known for aggressive operations with minimal oversight. While the crypto architecture means the server genuinely cannot decrypt, metadata (connection times, IP addresses) could be compelled. Recommendation: excellent for the crypto, but route through Tor/VPN and don't trust the infrastructure blindly.
Messaging Briar F-Droid P2P over Tor, no central server at all, works offline via Bluetooth/Wi-Fi Direct. Android only. Best for high-threat scenarios where even server metadata is unacceptable.
Messaging Element (Matrix) F-Droid Federated protocol, self-hostable. Run your own homeserver for full control. E2E optional (enable Megolm). Metadata visible to homeserver admin.
Email ProtonMail Aurora Store Swiss jurisdiction, E2E between ProtonMail users, zero-access encryption at rest. Caveat: Proton cooperates with law enforcement when legally compelled by Swiss courts. In 2021, French climate activists were arrested after Proton logged their IP address under a Swiss court order (Europol request from French police). The activists had used ProtonMail without VPN/Tor from their real IP - basic OPSEC failure. Lesson: ProtonMail protects email content (E2E), but NOT metadata (IP, connection times) if compelled. Always access via Tor or Mullvad. The email itself is safe, your connection to it is not.
Email Tuta (ex-Tutanota) F-Droid German jurisdiction, E2E, open-source, calendar and contacts also encrypted. Caveat: In 2020, a German court (Cologne) forced Tuta to implement monitoring on a specific account - intercepting emails BEFORE encryption (not a backdoor to E2E itself, but a court-ordered wiretap on incoming mail in plaintext). Confirmed by German Federal Court (BGH). This is arguably worse than ProtonMail's IP logging: Tuta had to code a surveillance feature. German jurisdiction is weaker than Swiss for privacy (EU member state, subject to EU data retention directives, German BND cooperation with NSA revealed by Snowden). Same rule applies: always access via Tor/VPN, never from real IP.
Email K-9 Mail / Thunderbird F-Droid Open-source, works with any provider. No built-in E2E (use PGP/GPG plugin).
VPN Mullvad F-Droid/Direct No account, no email, no personal data. Pay with cash or crypto. WireGuard. No-log policy audited. In April 2023, Swedish police raided Mullvad's offices with a warrant to seize customer data - they left empty-handed because Mullvad stores nothing. But: never trust any single provider 100%. Zero trust applies to VPNs too. Mullvad is the best option available, but always layer your OPSEC: pay with cash (they accept mail envelopes), don't connect from identifiable networks, use Tor for sensitive ops even over VPN, and assume that any provider could theoretically be compromised or compelled in the future.
VPN ProtonVPN Aurora Store Swiss, free tier available. More mainstream. Logs connection timestamps (not content).
2FA Aegis Authenticator F-Droid Encrypted vault, biometric unlock, import/export. Better than Google Authenticator in every way.
Passwords KeePassDX F-Droid Offline KDBX format, no cloud sync, auto-fill integration. Full control over your vault file.
Files Syncthing F-Droid P2P sync between your devices, no cloud intermediary, encrypted in transit.
Files Cryptomator F-Droid Encrypt files before uploading to any cloud. Transparent vault encryption.
Camera Secure Camera Built-in GrapheneOS default. No metadata leaks, no network access.
Maps Organic Maps F-Droid Offline OpenStreetMap, no tracking, no ads, no telemetry.
Maps OsmAnd F-Droid Offline, advanced routing and navigation features.
Firewall NetGuard F-Droid Per-app firewall without root. Block internet access for apps that don't need it.
Notes Standard Notes F-Droid E2E encrypted notes with sync. Open-source.

#Apps to Avoid

#Why These Apps Undermine GrapheneOS

Installing these apps re-introduces the tracking and telemetry that GrapheneOS removes. Use the listed alternatives.

Avoid Why it's dangerous Alternative
Chrome Heavy telemetry, syncs browsing to Google, undoes Vanadium's hardening Vanadium (built-in)
Gmail Scans email content for ads, links everything to Google ID, background sync ProtonMail, Tuta, K-9 Mail
Google Maps Continuous location tracking even in background, location history stored server-side Organic Maps, OsmAnd
WhatsApp Meta collects metadata (who you talk to, when, how often), phone number required, backup not E2E by default Molly, Olvid, Briar
Telegram NOT E2E encrypted by default (only "Secret Chats" are). Phone number required. Server stores all messages in cleartext. Molly, Olvid, Element
Social media apps (Instagram, TikTok, Facebook, X) Extensive tracking: sensor access, contact scraping, background data, device fingerprinting Web versions via Tor Browser in a separate profile
Google Photos Uploads and scans ALL images, facial recognition, location extraction, links to Google ID Local gallery + Cryptomator for backup
Google Drive Cloud storage linked to Google account, scanned for content, not E2E encrypted Syncthing + Cryptomator
Gboard Keyboard with keystroke telemetry, learns everything you type, syncs to Google Default AOSP keyboard (built-in)
Bitwarden Cloud-synced, requires server trust, account linked to email. If Bitwarden is breached, your vault is exposed. KeePassDX (offline)
Any app requesting "Device admin" Can control your device, prevent uninstall, wipe remotely. MDM vector. Deny always

Sandboxed Google Play - official Google Play running in a standard app sandbox with no special access or privileges. Profile-isolated: only available within the profile where installed. Install only in profiles that need it.

# Install sandboxed Google Play
# From within the profile that needs it:
Settings > Apps > Sandboxed Google Play
> Install Google Play Services
> Install Google Play Store

# The sandbox means:
# - Standard app sandbox, no special access or privileges
# - Cannot access other apps' data
# - Network permission can be revoked
# - Runs in the same sandbox as any other app
# - Profile-isolated: only available within that profile
# - Push notifications work via FCM

#Operational Use

#Mobile Red Team Device

Configuration for using a GrapheneOS Pixel as a dedicated operational device for engagements.

# Device setup checklist:
# 1. Fresh GrapheneOS install, bootloader relocked
# 2. No personal accounts on any profile
# 3. Owner profile: system admin only, no apps
# 4. Create "Ops" profile per engagement
# 5. Auto-reboot set to 24h

# Network configuration:
# - Mullvad VPN always-on + kill switch
# - Paid with cash (mail envelope) or Monero, no email registration
# - 2G disabled, preferred network: LTE only
# - Private DNS: dns.mullvad.net
# - Wi-Fi: connect to GL.iNet Mudi (Blue/Red Merle) for internet
# - Prefer USB tethering over Wi-Fi (no Wi-Fi probe leaks, no BSSID exposure)
# - If Wi-Fi to Mudi: airplane mode first, then enable Wi-Fi only (cellular radio stays off)
# - Never connect to public/known Wi-Fi directly from the phone
# - Forget all networks after use

# Communication:
# - Molly-FOSS (preferred) or Signal with disappearing messages (24h)
# - Separate number (burner SIM or JMP.chat via Tor)
# - No personal contacts in this profile
# - Olvid for maximum security (no phone number needed)

# After engagement:
# 1. Export any needed data via encrypted channel
# 2. Delete the "Ops" profile
#    Settings > System > Multiple users > Delete
# 3. Profile data cryptographically destroyed
# 4. Force reboot to clear RAM
#    (hold power 10+ seconds)

# USB security:
# - USB accessories: charging only
# - USB debugging: disabled
# - ADB: disabled after initial setup

#Physical Security

Measures to protect the device itself from physical compromise, seizure, or forensic extraction.

# Duress/emergency:
# - Duress PIN/password: enter at lock screen
#   to trigger irreversible factory reset
#   Settings > Security & privacy > Device unlock
#   > Duress password (see Duress Password section)
# - Ripple (Guardian Project): panic button app
#   that triggers wipe/lock/disguise on configured apps
#   Install from F-Droid: info.guardianproject.ripple
#   Two-step trigger + 5-second cancel window
# - Power off: hold power button > Power off
#   (returns to BFU state, full encryption)
# - Emergency: press power 5x rapidly
#   (triggers emergency SOS, can be configured)

# Lock screen + biometrics:
# Adapt to your threat model:
#
# vs Citizens/competitors: fingerprint OK for convenience
#   Auto-reboot + lockdown mode is sufficient protection
#
# vs Law enforcement: NO fingerprint
#   Biometrics can be compelled in most jurisdictions
#   (police can force your finger on sensor)
#   Passwords generally protected (5th Amendment US,
#   varies in EU - France: can be compelled under Art. 434-15-2)
#   Use strong alphanumeric password ONLY
#
# vs Nation-state: NO fingerprint, short auto-reboot (10-30min)
#   Assume they will attempt to keep phone in AFU state
#
# In ALL cases:
# - Lockdown mode: hold power > Lockdown
#   (instantly disables biometrics until password entered)
#   Use this BEFORE handing device to anyone
# - After auto-reboot or first boot: biometrics disabled
#   Password required first (BFU state = safe)
# - So biometrics ARE acceptable for daily convenience IF:
#   1. Auto-reboot is set short enough for your threat
#   2. You use Lockdown before any risky situation
#   3. You understand biometrics are convenience, not security

# Anti-forensic considerations:
# - Auto-reboot: adapt to threat model
#   vs Citizens:       18h (default, fine)
#   vs Competitors:    8-12h
#   vs Law enforcement: 4-6h (sleep at 1am, raid at 6am = phone in BFU)
#   vs Nation-state:   1-2h or less
#   Rule: set it to less than your average sleep time
# - USB charging-only blocks forensic tools
#   (Cellebrite, GrayKey need USB data lines)
# - Locked bootloader prevents firmware mods
# - Verified boot detects OS tampering
# - Profile encryption uses strong KDF
#   (Argon2-based key derivation)
# - Duress PIN as last resort if compelled to unlock

#Border Crossing Protocol

A clean/empty phone is MORE suspicious than a normal one. Especially in the US where CBP can deny entry based on suspicion. The goal is to look like a normal person, not a spy.

Before travel: Wipe all Ops/Burner profiles (delete entirely, not just log out). Set auto-reboot to 10 minutes. Verify duress PIN is configured and memorized. Back up critical data to encrypted remote storage (not on device).

"Daily" profile setup - this is the profile you show at the border. It MUST look like a normal person's phone:

  • Social media installed and used (Instagram, X, LinkedIn with posts/follows)
  • Some photos (travel, food, landscapes - nothing sensitive)
  • Browser history present (news, shopping, weather, YouTube)
  • Messaging apps with casual conversations (WhatsApp, Telegram - boring content)
  • Email with normal correspondence
  • Music, podcasts, a few games
  • Maps with recent searches (tourist stuff)

An empty phone with no apps, no photos, no history = instant secondary inspection.

During crossing:

Situation Action
Approaching checkpoint Power off device (BFU state). 10min auto-reboot would do it anyway.
Asked to unlock Unlock the "Daily" profile. Stay calm, cooperative, boring.
Asked about other profiles "I just have this one." Owner profile looks empty/admin, not suspicious.
Compelled to unlock under threat Enter duress PIN (irreversible wipe). Know the legal consequences below.
Device seized It's already in BFU (powered off). They get encrypted blocks.

After crossing:

  • Recreate Ops profiles as needed
  • Restore from encrypted backup
  • Change auto-reboot back to operational setting

#Device Search Laws by Country

Country Authority Can they search your phone? Can they force your password? Consequence of refusal
USA CBP (Customs & Border Protection) Yes, without warrant (border search exception to 4th Amendment). Both basic and advanced searches. No constitutional right to compel password (5th Amendment). But they CAN deny entry to non-citizens, detain, seize device. Non-citizen: denied entry, device seized. Citizen: device seized, returned later (usually).
France Douanes, Police aux frontieres Yes, with judicial authorization (or in flagrante) Art. 434-15-2 Code penal: refusing decryption key = 3 years + 270,000 EUR (5 years + 450,000 EUR if it would have prevented a crime). KEY DISTINCTION: this article only applies in the context of a criminal investigation (enquete judiciaire) where your device is suspected of containing evidence. A simple customs check at the border or a police control in the street is NOT a judicial requisition. If you are not involved in a criminal case: you have the right to refuse. Douanes can seize the device but cannot compel your password without a judge's order. If you ARE in a criminal case (garde a vue, instruction): Art. 434-15-2 applies BUT requires a formal judicial requisition with explicit notification of criminal risk. A simple police question without this formality does NOT constitute a valid requisition (Cour de Cassation ruling). In all cases: police will pressure you. Do not cede. Demand your lawyer. Say nothing without legal counsel present. Outcomes depend on the judge. No criminal case = refuse. Criminal case = demand formal requisition + lawyer. Many cases dropped on procedure.
UK Border Force Yes, Schedule 7 of Terrorism Act 2000 = can stop/examine anyone at port/airport without reasonable suspicion. Yes. Refusing to provide password/PIN = criminal offense under Schedule 7. No right to have a lawyer present during initial examination. Up to 3 months prison for refusing to comply.
Germany Bundespolizei With reasonable suspicion or at Schengen external borders Court order required for forced decryption in most cases. Weaker compulsion than UK/France. Device seizure, but generally less aggressive on password compulsion.
Canada CBSA Yes, Canada Border Services can examine any device at port of entry. Lowered threshold (no warrant). Courts split on this. CBSA claims authority, legal challenges ongoing. Device seizure, potential denial of entry for non-citizens.
Australia ABF (Australian Border Force) Yes, under Customs Act. Can request access. Assistance and Access Act 2018 = can compel technical assistance. Refusing = up to 10 years prison for terrorism-related. Among the most aggressive globally.
EU (Schengen) Varies by country Generally need reasonable suspicion. Schengen Code does not explicitly authorize device searches. Varies. Most EU countries require judicial order. GDPR may provide some protection. Device seizure is common, forced decryption less common than US/UK/FR.

Key takeaway: France, UK, and Australia are the most dangerous jurisdictions for device searches. In these countries, the duress PIN is your last resort - but understand that using it may itself be evidence of obstruction if they can prove a wipe occurred.

#GrapheneOS vs Stock Android vs iOS

Feature GrapheneOS Stock Android iOS
Telemetry None Extensive (Google) Extensive (Apple)
Security chip Titan M2 Varies by OEM Secure Enclave
Network per-app Full toggle No Limited
Sensor per-app Full toggle No Limited
MAC random Per-connection Per-network Per-network
LTE-only Disables 2G+3G+5G 2G only (12+) No control
Verified boot Titan M2 + relock Varies Secure Enclave
Auto-reboot 10min-72h No No
Duress wipe PIN/password No 10 attempts only
Profiles 32, encrypted 4, no encryption No
Memory alloc hardened_malloc scudo Standard
Process spawn exec-based Zygote (shared) Standard
Updates Days after AOSP Months (OEM) Immediate
USB control 5 modes Limited USB Restricted
Open source Fully Partially Closed
Forensic resist High (BFU+duress) Low Medium

#Quick Reference

#First Boot Checklist

Immediately after installing GrapheneOS, run through these settings.

# Setting path Action
1 Lock screen Set strong alphanumeric password (not PIN)
2 Network > Wi-Fi Verify per-connection MAC randomization is ON
3 Network > Private DNS Set provider (dns.mullvad.net or dns.quad9.net)
4 Network > VPN Install Mullvad, enable always-on
5 Network > VPN Enable block connections without VPN
6 Network > SIMs > Allow 2G OFF
7 Network > SIMs > Preferred network LTE only
8 Security & privacy > Auto reboot Set timer (adapt to threat model)
9 Security & privacy > Duress password Set duress PIN AND password
10 Security & privacy > Scramble PIN ON
11 Security > USB accessories Charging-only when locked
12 Privacy > Permission manager Review and restrict all app permissions
13 System > Multiple users Create profiles (Daily, Ops, etc.)
14 Bluetooth + NFC Disable both
15 App installation Install from F-Droid / Aurora only
16 VPN kill switch test Disable VPN, verify zero traffic leaks
17 Bootloader Verify locked: adb reboot bootloader > check "locked"

#Essential ADB Commands

Useful commands for initial setup and verification. Disable ADB/USB debugging after setup is complete.

# Check device status
adb devices

# Verify bootloader lock state
adb reboot bootloader
# Screen shows "locked" or "unlocked"

# Install APK from computer
adb install app.apk

# List installed packages
adb shell pm list packages

# Check running services
adb shell dumpsys activity services

# Check network connections
adb shell netstat -tlnp

# Disable USB debugging when done
# Settings > System > Developer options
# > USB debugging: OFF
# Then disable Developer options entirely:
# Settings > System > Developer options: OFF

# Force reboot (emergency)
adb reboot

#PIN & Lock Screen Security

#PIN Hardening

GrapheneOS extends lock screen security well beyond stock Android defaults.

Feature Detail
PIN scrambling Toggle to randomize PIN pad layout, raising difficulty of shoulder-surfing entered PINs
Password length Support for passwords up to 128 characters (vs standard 16)
Two-factor fingerprint Requires PIN entry after biometric authentication for additional security
Fingerprint attempts Limited to 5 failed attempts before lockout (vs standard 20)
Duress PIN/password Entering duress credential triggers irreversible device wipe
Lockdown mode Hold power > Lockdown disables biometrics until password entered

#PIN Scrambling Setup

# Enable PIN scrambling
Settings > Security & privacy > Device unlock
> Scramble PIN input layout: ON
# PIN pad numbers are randomized on every display
# Defeats camera-based and shoulder-surfing PIN theft

# Set strong password (up to 128 characters)
Settings > Security & privacy > Device unlock
> Screen lock > Password
# Use a long passphrase for high-security profiles

# Two-factor fingerprint unlock
Settings > Security & privacy > Device unlock
> Two-factor fingerprint unlock: ON
# After fingerprint scan, PIN is also required
# Combines something-you-have with something-you-know

# Fingerprint attempts
# Limited to 5 failed fingerprint attempts
# vs stock Android's 20 attempts
# After 5 failures, PIN/password is required

#Vanadium Browser

#Hardened Chromium

Vanadium is GrapheneOS's default browser, a hardened fork of Chromium with additional security mitigations enabled by default.

Feature Detail
Hardware memory tagging MTE enabled for heap allocations on supported devices (Pixel 8+)
JIT disabled JavaScript JIT compilation disabled by default with per-site toggle
Third-party cookies Disabled by default
DRM Disabled by default
Post-quantum crypto Hybrid post-quantum cryptography enabled for TLS connections
Process isolation Strict site isolation with dedicated renderer per origin

#Vanadium Configuration

# JIT toggle (per-site)
# JIT is disabled globally by default
# To enable for a specific site that requires it:
Vanadium > Site settings > JavaScript JIT
> Add site exception

# Third-party cookies
# Disabled by default, no action needed
# Can add exceptions per-site if required

# DRM (Widevine)
# Disabled by default
# Enable only if needed for specific streaming services

# For maximum security:
# - Keep JIT disabled (default)
# - Keep third-party cookies blocked (default)
# - Keep DRM disabled (default)
# - Use Tor Browser for anonymous browsing instead

#Auditor App

#Hardware-Backed Attestation

The Auditor app provides hardware-based verification of firmware and software authenticity using the Titan M2's hardware-backed keys. It uses a pairing-based approach to verify device identity.

Feature Detail
Hardware-backed keys Verification uses keys stored in the Titan M2 secure element
Pairing-based verification Pairs verifier and auditee devices, establishing persistent device identity
Firmware verification Confirms firmware and OS have not been tampered with
Verified boot state Checks that bootloader is locked and OS passes integrity checks
Remote attestation Schedule regular attestation checks via the attestation service
Tamper detection Detects OS downgrades, bootloader unlock, and firmware modifications

#Using the Auditor

# Install Auditor on BOTH devices:
# - The device to verify (auditee)
# - A trusted device (verifier)

# First-time pairing:
# 1. Open Auditor on the verifier
# 2. Tap "Verify" - generates QR code
# 3. Open Auditor on the auditee
# 4. Tap "Auditee" - scans QR code
# 5. Auditee generates attestation, shows QR
# 6. Verifier scans the attestation QR
# 7. Pairing established with hardware-backed identity

# Subsequent verifications:
# Repeat scan process - verifier confirms
# the same hardware-backed key is present
# Any firmware/OS tampering will fail verification

# Remote attestation service:
# https://attestation.app
# Schedule automatic attestation checks
# Receive alerts if verification fails

#Also See

#Cyber Aurelien Guidi

  • Cellular OPSEC (IMSI catchers, baseband attacks, Blue/Red Merle, SIM security)
  • Anonymization (Tor, VPN, identity separation, Olvid, censorship circumvention)
  • Mullvad VPN (No-log VPN, anonymous signup, cash/crypto payment)
  • OPSEC Toolkit (OPSEC Scorecard, Cover Identity Builder)
  • OPSEC Checklist (Operational security verification steps)
  • Anti-Forensics (Secure deletion, log clearing, forensic resistance)
  • Tails (Amnesic live OS for temporary anonymous sessions)
  • Whonix (Tor-enforced anonymity OS with gateway isolation)
  • Qubes OS (Security through compartmentalization with Xen)