GrapheneOS privacy-focused mobile OS. Installation, hardening, app sandboxing, network permissions, sensor controls, and operational mobile security.
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:
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 |
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.
The recommended method. Uses WebUSB in Chrome/Chromium to flash directly from the browser - no CLI tools needed.
Prerequisites:
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.
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)
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.
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)
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:
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:
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
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 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:
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:
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:
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 |
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 |
GrapheneOS requires hardware features that only Pixel devices (and select partner devices) provide:
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 (sometimes called "weeting") is the process of irreversibly destroying encryption keys so that encrypted data becomes permanently unrecoverable.
On GrapheneOS with Titan M2:
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.
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
| 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.
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)
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.
# 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 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:
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.
# 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)
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
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. |
| 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. | |
| 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. | |
| 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. |
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 |
| 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
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
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
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:
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:
| 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.
| Feature | GrapheneOS | Stock Android | iOS |
|---|---|---|---|
| Telemetry | |||
| Security chip | |||
| Network per-app | |||
| Sensor per-app | |||
| MAC random | |||
| LTE-only | |||
| Verified boot | |||
| Auto-reboot | |||
| Duress wipe | |||
| Profiles | |||
| Memory alloc | Standard | ||
| Process spawn | Standard | ||
| Updates | |||
| USB control | |||
| Open source | |||
| Forensic resist |
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" |
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
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 |
# 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 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 |
# 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
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 |
# 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