Mobile OS Security Comparison (Extended)
Table of Contents
Mobile OS security comparison (extended) #
Date accessed: 2026-08-30 (America/Belize, UTC−6).
OSes: GrapheneOS, stock Android (Pixel as the high-end reference), CalyxOS, LineageOS, postmarketOS (with Ubuntu Touch as a Linux footnote).
Method: Official docs, forums, and depth-1 clones of focused security repos. Full AOSP / Chromium / kernels were not cloned. Claims below are sourced; community takes are labeled.
1. What each OS is optimizing for #
| OS | Threat model in one line | 2026 snapshot |
|---|---|---|
| GrapheneOS | Resist unknown 0-days and persistent compromise on current Pixel hardware; privacy as a side effect of sandboxing and attack-surface cuts. | Android 17 since 2026061800; regular tag 2026081300; Pixels 6–10a; Motorola hardware promised 2027. |
| Stock Android (Pixel) | Certified, hardware-backed platform with privileged Google services, Play Protect, and same-day bulletins. | Android 17; Pixel 8+ promised 7 years of OS+security; Titan M2 StrongBox; MTE hardware on 8–10a, not default-on for apps. |
| CalyxOS | De-Googled daily driver with relockable AVB on Pixels, optional microG, firewall, Seedvault. Not a GrapheneOS-class exploit-mitigation fork. | Shipping 7.2.4.x / Android 16 (7.2.4.50, 2026-08-28). Official again after an ~11-month update freeze (2025-08 → 2026-07). Android 17 port in tree, not shipping. |
| LineageOS | Broad-device custom ROM: extra privacy UX, SELinux enforcing, no GMS. Charter requires userdebug and disabled system verity. | 23.2 / Android 16; 24 (Android 17) in progress, no ETA. |
| postmarketOS | Alpine Linux on phones; e-waste reuse and mainline kernels. Different threat model from “daily driver vs Cellebrite.” | v25.06 + systemd; Duranium immutable variant is WIP. Secure Boot not implemented. |
Stock Android on a generic OEM (Samsung, Xiaomi, …) is usually weaker than Pixel stock: slower vendor/GPU patches, extra privileged preloads, and often no user-settable AVB key. Samsung One UI 8 bootloader-unlock removal was widely reported in Jul 2025 (Samsung did not confirm to The Verge at publication). Xiaomi unlock is account/quota gated; many CN SKUs cannot unlock.
2. Feature table (detailed) #
Legend: Yes = product default or official requirement. Partial = exists but limited, opt-in, device-class specific, or unfinished. No = not present or deliberately disabled. AOSP = inherited Android baseline, not an extra.
Boot integrity #
| GrapheneOS | Pixel stock | CalyxOS | LineageOS | postmarketOS | |
|---|---|---|---|---|---|
| Relocked bootloader in normal use | Yes (required) | Yes | Yes on Pixel; Fairphone/Motorola/SHIFT: do not relock without extra checks | No (FAQ: do not relock) | No (unlocked BL typical) |
| Android Verified Boot with OS key | Yes (custom key in SE; yellow state; full SHA-256 on Pixel 6+) | Yes (OEM key; Pixel also has avb_custom_key) | Yes (WITH_AVB := true, SHA 9fbd5656…) | No (charter: disable system verity on userdebug) | Opposite: avbtool --flags 2 disables verification (pmbootstrap flash_vbmeta) |
| Rollback protection | Yes (SE index from SPL) | Yes | Yes (AVB; HSM-signed after 7.2.2.0) | Zip signatures only (update_verifier 9ffcf56a…); not AVB rollback | Duranium A/B slot fallback; not hardware anti-rollback |
| Hardware attestation of OS identity | Yes (Auditor, protocol v7; StrongBox; TOFU; https://attestation.app) | Yes via KeyMint/Play Integrity (certified) | Not an advertised product | Not an advertised product | None |
| Build type | user | user | user (official) | Must be userdebug | N/A (Alpine) |
Sources: GrapheneOS features, install/web, AOSP device-state, CalyxOS bootloader-lock, LineageOS charter SHA 33d1853d…, LineageOS FAQ, pmbootstrap flash_vbmeta.
Memory safety / exploit mitigations #
| GrapheneOS | Pixel stock | CalyxOS | LineageOS | postmarketOS | |
|---|---|---|---|---|---|
| Heap allocator | hardened_malloc default on LP64 (h_malloc.c canaries, zero-on-free, quarantine, guard slabs, slab MTE). Scudo only as fallback (32-bit, SurfaceFlinger, camera provider, per-app compat). | Scudo since Android 11 (not jemalloc except low-RAM). AOSP default ZeroContents=false. Independent write-ups say production quarantine is often off. | No evidence of hardened_malloc in cloned trees or docs. AOSP Scudo. | AOSP Scudo | musl malloc (Alpine); not hardened_malloc-everywhere |
| Userspace MTE default | Yes on Pixel 8+ for base OS + compatible apps; per-app opt-out | Hardware on 8–10a. AOSP (2026-06-17): kernel MTE recommended off in production; small privileged userspace list in async; apps opt in / Developer Options | Stock Pixel pattern (persist.arm64.memtag.system_server=off on user builds in device snippets). Not GrapheneOS-style default-on. | Follows device trees; no product claim | Not a product default |
| CFI / PAC / BTI / SCS | AOSP CFI/SCS plus userspace BTI+PAC; kernel BTI+CFI and SCS+PAC together (project claim; kernel tree not cloned here) | System CFI on by default (arm64). PAC/BTI recommended in NDK; not independently binary-audited for every OS binary | AOSP/Lineage baseline | AOSP/Lineage baseline | Community kconfig: CFI, SCS (aarch64), Yama, lockdown available; SDM845 opts into force-integrity lockdown |
| Zygote / ASLR secrets | Exec spawning (fresh exec, per-app since 2026071100) | Shared Zygote | Shared Zygote | Shared Zygote | N/A |
| JIT / dynamic code (base OS) | ART JIT off (AOT); dynamic loading blocked for nearly entire base OS; per-app WebView JIT / DCL toggles | ART JIT on; Play dynamite modules load dynamically by design | Not claimed | Not claimed | N/A |
| ptrace | Blocked for bundled apps; optional block for user apps | Allowed (normal Android debugging) | Not claimed extra | userdebug increases debug surface | Unix ptrace; Yama optional |
Code check (GrapheneOS hardened_malloc 714abf5a…): canary mask forces a leading zero; fatal_error("canary corrupted"|"double free"|"detected write after free"); zero-on-free; MTE reserved tag 0; canaries skipped when MTE is on. Android.bp uses the aggressive preset (N_ARENA=1), not light.mk. platform_bionic b95b0888…: LP64 Malloc → h_*; compile error without USE_H_MALLOC; unprivileged apps can flip /proc/self/attr/grapheneos_flags bit 1<<10 to Scudo.
Stock Chrome on Pixel has memtagMode=async per AOSP MTE docs (partial catch-up). Vanadium still disables JS JIT by default and sets is_cfi = true (args.gn 150a27e2…).
Sandbox, Google, network #
| GrapheneOS | Pixel stock | CalyxOS | LineageOS | postmarketOS | |
|---|---|---|---|---|---|
| Per-app UID + SELinux + seccomp | AOSP + tighter policy (project claim; full sepolicy diff not dumped) | AOSP (seccomp since 8; per-app SELinux since 9 for target 28+) | Lineage-derived sepolicy (b59f1764… merging lineage-24.0) | SELinux enforcing required; Lineage Trust extras | No. apk apps run as the Unix user. SELinux kconfig is opt-in, not in community alias. Duranium: Flatpak + bubblewrap |
| Google services | Optional sandboxed official Play (unprivileged app; not OS backend) | Privileged GMS priv-app + Play Protect + Play Integrity | Optional privileged microG with restricted signature spoofing (GmsCore + Store only); default: on, no Google account, FCM on | None official. MindTheGapps unsupported. microG is a separate fork (LineageOS for microG; Dec 2025 key leak disclosed) | None. Waydroid = privileged LXC (AppArmor often complain mode) |
| Play Integrity | BASIC only; no spoofing; DEVICE/STRONG fail | STRONG possible on locked certified Pixel with recent SPL | Not Google-certified | Charter: MUST NOT alter Play Integrity responses | N/A |
| Network control | Runtime Network permission (incl. localhost) | No user Network toggle | Datura firewall (per-app / transport / VPN-only) | Framework per-app firewall + Trust | nftables default (incoming deny on wwan) |
| Extra sensors toggle | Yes (zeroed IMU etc.) | Camera/Mic/Body/Activity only | Not GrapheneOS-style Sensors permission | Not claimed | Portals if Flatpak |
| Storage/Contact Scopes | Yes | Scoped storage / photo picker (related, not the same) | Not claimed | Not claimed | N/A |
GrapheneOS will never ship Play or microG as a privileged implementation (homepage). CalyxOS FAQ says restricted spoofing is “not a security risk”; GrapheneOS, Privacy Guides (dropped CalyxOS 2022), and discuss.grapheneos.org disagree. Overlap that is not partisan: CalyxOS does ship privileged microG, does spoof a hardcoded signature, does talk to mtalk.google.com when push is on.
Encryption, lockscreen, local ports #
| GrapheneOS | Pixel stock | CalyxOS | LineageOS | postmarketOS | |
|---|---|---|---|---|---|
| Disk encryption | FBE AES-256-XTS + metadata; filename pad 32 B; Weaver 20 attempts | FBE mandatory on 10+ launch; metadata encryption mandatory on 11+ launch; Titan/Weaver on Pixel | AOSP FBE (Pixel hardware when on Pixel) | AOSP FBE; vendor TEE quality varies | Optional LUKS (default off). Duranium: mandatory LUKS2, but first boot uses an empty key until the user sets a passphrase |
| Auto-reboot to BFU | Yes (default 18 h, in init) | No equivalent product default | Yes (privacy UX) | Not a Lineage product default | Reboot is the only way to drop LUKS keys |
| Duress credential | Yes (wipe device + eSIMs) | No | Not claimed | Not claimed | No |
| PIN scramble | Optional | No | Yes | Not claimed | unl0kr on-screen keyboard (not scramble) |
| USB when locked | 5 modes; default charging-only when locked; HW + kernel deny | USB HAL toggle (weaker per GrapheneOS) | Restrict USB / Trust USB (ro.boot.system_supports_restrict_usb=1) | Trust USB restrict | Initramfs USB gadget + optional telnet debug (unudhcpd); Duranium emergency telnetd |
| Hardware-backed PIN throttle | Weaver / Titan M | Weaver / Titan M2 on Pixel | Pixel: same hardware. Fairphone/moto: OEM TEE | Whatever OEM blobs provide | None (software LUKS + cryptsetup iter-time) |
Ubuntu Touch (footnote): fscrypt of /home-class trees, rootfs unencrypted; experimental in 24.04-1.0. AppArmor click confinement. Privileged Halium Android LXC. Not GrapheneOS-class AVB.
Browser, updates, hardware #
| GrapheneOS | Pixel stock | CalyxOS | LineageOS | postmarketOS | |
|---|---|---|---|---|---|
| Browser / WebView | Vanadium (Chromium fork): JIT off by default, CFI, DrumBrake, patch 0234 re-enables WebView MTE | Chrome / Trichrome; Chrome Play build uses MTE async; JIT on | Calyx Trichrome Chromium 151.x (historically Bromite-derived). Hardening depth vs Vanadium not re-audited | Jelly + system WebView (Chromium). 23.0 launch shipped WebView 140 (Oct 2025); later branches update separately | Distro browsers / Flatpak |
| OS update model | Seamless A/B ~every 6 h; BFU-capable; optional security preview (…01) with future ASB patches | Pixel bulletin same-day OTA start; Mainline APEX | Automatic OTA from 7.2.2.0; express → beta → stable | Weekly nightlies when the roster runs; 2026 Updater rewrite; user-initiated historically | apk (mutable) or systemd-sysupdate A/B (Duranium) |
| Patch completeness | Matches Pixel SPL in 2026 changelogs; extra GKI LTS; several UAFs/OOB they say MTE caught. Firmware still waits on Google. “Patches months earlier than Pixel” example on features page is 2023-11-06 — not re-measured for 2026. | Fastest certified Android. GPU/modem still in Pixel bulletins. AOSP source now Q2/Q4 only (2026). | OSS patches when public; QPR proprietary firmware lag documented by CalyxOS. ~11-month freeze 2025–26. | Platform ASB when public; vendor/bootloader/modem Lineage cannot update unless in the zip. Older branches: 16/17 patched through Nov 2025 SPL only. | Mainline kernel CVEs can be newer than vendor Android (SDM845 at Linux 7.1-rc1). No monthly OEM firmware cadence on PinePhone / OP6 / Pixel 3a. |
| Official devices | Pixel 6–10a (phones, Fold, Tablet). Skip Pixel 11 (no MTE). Motorola 2027. | Any Pixel; 8+ have 7-year support. Pixel 11 listed on Google Help. | Pixel 6–9a family + Tablet/Fold; FP4/5 + FP6 from 7.2.4.50; several Motorola; SHIFTphone 8. Pixel 10a (stallion) in scripts, not yet a shipping-note device. | Very broad (20+ OEMs). Quality is per-maintainer. | Community mainline: PinePhone, OP6, Pixel 3a, Fairphone 4, Librem 5, many more. |
3. Code-review notes (what was actually cloned) #
Unmodified --depth 1 clones. No full platform trees.
GrapheneOS #
| Repo | HEAD | What was verified |
|---|---|---|
| hardened_malloc | 714abf5a47258090016984e43c7bfbccdeb99fc7 (2026-08-08) | Design matches features page. Production threat model in README (not a bug-finding tool). |
| platform_bionic (malloc sparse) | b95b08888b9eb6465c21d5840cce59dc463bfdef (2026-07-28) | hardened_malloc is default LP64; Scudo fallback paths match the usage-guide compatibility mode. malloc_info still says jemalloc-1 for tooling — not evidence jemalloc is in use. |
| Auditor | f1bb2ac9d72c0448a054ff829c65d5cb5b3d2ec6 (2026-08-27) | Protocol v7; locked + VERIFIED/SELF_SIGNED; StrongBox for new pairings; VB fingerprints Pixel 6–10a; USB mode 0–4 and auto-reboot in OS extras. |
| AttestationServer | 2ef88a32865836afc163b3b02c8792e6cff3f211 (2026-08-28) | /auditor/challenge + /auditor/verify; SMTPS alerts. |
| Vanadium (patches/README/args.gn only) | 150a27e23302cc265baf8a7fb7c0f0112bddf2fd (2026-08-25) | Does not replace malloc. is_cfi = true; DrumBrake on; patch 0234 re-enables WebView MTE. |
Not verified: kernel MTE/CFI/lockdown, full Chromium, device sepolicy trees.
CalyxOS / LineageOS #
| Tree | HEAD | What was verified |
|---|---|---|
CalyxOS vendor_calyx | 9fbd5656da6f2c8e5b47aa27615ec65aa1c1ead7 | WITH_AVB := true; packages GmsCore/Datura/Seedvault/Trichrome; ro.control_privapp_permissions=enforce; HSM signing scripts. No hardened_malloc/MTE product flags in config/*.mk. |
CalyxOS device_calyx_sepolicy | b59f1764c6ad2a0f3ab89d391f2aa890a0cd02d0 | Lineage sepolicy fork; merging lineage-24.0 / Android 17. |
| CalyxOS website | 6c3b4517df514fb33a2203d043dc00e31b43ec0a | Matches calyxos.org; 7.2.4.50 post 2026-08-28. |
LineageOS charter | 33d1853d9460695036e9ef384f76f7543e2f1d28 | userdebug MUST; system verity MUST be disabled. |
LineageOS update_verifier | 9ffcf56a0fe152467da2971f0e6b2b79a42f7890 | Official zip signature check. |
Trail of Bits (Jan 2026) on CalyxOS HSM ceremony: 1 medium (rogue admin keys), 2 informational. ToB library.
postmarketOS #
| Repo | HEAD |
|---|---|
| pmaports | 99ef80cba00e02345ee91c22f37127326360eb4c (2026-08-30) |
| pmbootstrap | defc77469193c62916d945752b620c1fb0a34c89 (2026-08-30) |
| buffybox (unl0kr) | 4015e49742de10fd0efeb92897efafa160c79e73 (2026-08-30) |
flash_vbmeta comment: Generate vbmeta image with “disable verification” flag. Duranium blog (2026-03-17): “Secure Boot and verified boot are not yet implemented, but are planned.” Wiki.postmarketos.org was Anubis-blocked during this pass; facts taken from git + official blog.
Stock Android source #
AOSP gitiles ?format=TEXT returned HTTP 400 for Scudo README. AVB README was read from a LineageOS GitHub mirror of android_external_avb (not a live AOSP HEAD SHA). Bionic MTE notes from aosp-mirror docs/mte.md. Android Security Papers 2024/2026 PDFs are listed on Google’s reports page; guessed download URLs 404. Year in Review archive on that page still ends at 2018.
4. Limitations and criticisms (labeled) #
GrapheneOS (project-acknowledged): Pixel-only until Motorola 2027; firmware/drivers still Google’s; Pixel 11 skipped for missing MTE; Play Integrity DEVICE/STRONG will not pass (no spoofing); VPN leak blocking “not complete”; Seedvault to be replaced; no FRP; exec-spawn ~200 ms extra cold start; carrier SKUs often cannot unlock. Duress-PIN legal incident reported by Ars Technica, Aug 2026 — not GrapheneOS docs. Hardware attestation still chains to Google roots (Titan/SoC not GrapheneOS-controlled).
Pixel stock: Privileged GMS is a large TCB and patch channel at once. GPU/vendor drivers remain the main 2023–2026 local-privesc path even on patched Pixels (Project Zero Mali/KGSL work; independent Mali dirty-pagetable on stock Pixel 7 Pro, CVE-2025-8045). GrapheneOS on the same Pixel shares that GPU IOCTL surface; hardening raises the cost of userspace memory corruption, it does not delete /dev/mali0.
CalyxOS: Confirmed ~11-month security freeze after Merrill/Desai left (letter 2025-08-01). Shipping again 2026-07-01. Privacy Guides dropped CalyxOS in 2022 (privileged microG fails their “no system modification for Play” rule) and still lists only GrapheneOS. Kuketz 2023 traffic capture is dated; do not treat SUPL-IMSI as current. Relock is not uniform across device classes.
LineageOS: Charter + FAQ confirm unlocked BL, userdebug, system verity off — below stock on physical tamper / persistent malware. Kuketz 2023 titled it “neither secure nor privacy-friendly”; 2026 Updater/ASB tooling improved, VB policy did not. Vendor SPL = whatever blobs the maintainer extracted.
postmarketOS / Ubuntu Touch: Honest gap vs Android: no hardware RoT for the whole OS, no Weaver, no mandatory app sandbox, no monthly firmware ASB. Duranium is the project’s own attempt to close dm-verity//usr; they say Secure Boot is unfinished. Waydroid/Halium add a privileged Android userspace. Good for e-waste and mainline kernels; not a GrapheneOS substitute for AFU forensic resistance. Project disclaimer (v25.06): not Android/iOS polish.
iodéOS /e/OS (not table columns): LineageOS + microG + extra firewall/cloud. Same VB/userdebug caveats as LOS, plus privileged microG. LineageOS for microG is a separate fork (Dec 2025 key leak; APEX test-keys still documented as open).
5. Practical reading #
- Highest exploit resistance on a phone you can buy today: GrapheneOS on Pixel 8–10a (MTE + 7-year OEM window). Relocked AVB, Auditor, hardened_malloc, default MTE, sandboxed Play. Cost: Pixel lock-in, Play Integrity, banking apps, Google firmware TCB.
- Highest “normal Android” security with app compatibility: Pixel stock. Same hardware RoT and bulletins, privileged GMS, MTE not default-on, no Network/Sensors toggles.
- De-Google with relocked VB on more than just Pixels: CalyxOS, with the 2025–26 freeze and microG privilege as the two load-bearing caveats. Treat as privacy-UX on AOSP, not a hardening OS.
- Old or odd hardware, know the bootloader stays open: LineageOS. Do not call it more secure than stock on the same device.
- Linux on a phone: postmarketOS (or UT). Different OS class. Do not expect Android verified boot, TEE throttling, or a malicious-app sandbox.
6. Source list #
All accessed 2026-08-30 unless a page carries its own date. Fuller per-OS bibliographies are in the four findings.md files.
Official docs #
- https://grapheneos.org/features
- https://grapheneos.org/faq
- https://grapheneos.org/usage
- https://grapheneos.org/releases
- https://grapheneos.org/install/web
- https://grapheneos.org/articles/attestation-compatibility-guide
- https://attestation.app/about
- https://source.android.com/docs/security/features/verifiedboot
- https://source.android.com/docs/security/features/verifiedboot/avb
- https://source.android.com/docs/security/features/verifiedboot/device-state
- https://source.android.com/docs/security/test/scudo
- https://source.android.com/docs/security/test/memory-safety/mte-configuration (updated 2026-06-17)
- https://source.android.com/docs/security/test/cfi
- https://source.android.com/docs/security/bulletin/pixel
- https://developer.android.com/google/play/integrity/overview
- https://calyxos.org/features/list/
- https://calyxos.org/docs/guide/security/bootloader-lock/
- https://calyxos.org/docs/tech/microg-details/
- https://calyxos.org/news/2026/07/01/calyxos-official-release-is-back/
- https://calyxos.org/news/2026/08/28/august-feature-update/
- https://calyxos.org/news/2025/08/01/a-letter-to-our-community/
- https://wiki.lineageos.org/faq
- https://github.com/LineageOS/charter
- https://lineageos.org/Changelog-30/
- https://lineageos.org/Infrastructure-Apps-Updates/
- https://postmarketos.org/blog/2025/06/22/v25.06-release/
- https://postmarketos.org/blog/2026/03/17/introducing-duranium/
- https://docs.ubports.com/en/latest/appdev/platform/apparmor.html
- https://docs.ubports.com/en/latest/porting/configure_test_fix/Fscrypt.html
Code (cloned) #
- hardened_malloc
714abf5a…— https://github.com/GrapheneOS/hardened_malloc - platform_bionic
b95b0888…— https://github.com/GrapheneOS/platform_bionic - Auditor
f1bb2ac9…— https://github.com/GrapheneOS/Auditor - Vanadium
150a27e2…— https://github.com/GrapheneOS/Vanadium - vendor_calyx
9fbd5656…— CalyxOS GitLab - LineageOS charter
33d1853d… - pmaports
99ef80cb…— https://gitlab.postmarketos.org/postmarketOS/pmaports.git - pmbootstrap
defc7746…
Forums / research / press (used where labeled) #
- https://discuss.grapheneos.org/d/23977-workaround-for-play-integrity-on-grapheneos-possible
- https://discuss.grapheneos.org/d/32656-motorola-partnership-announcement
- https://grapheneos.social/@GrapheneOS/117179621198542373 (Pixel 11 / MTE, 2026-08-29)
- https://www.privacyguides.org/en/android/distributions/
- https://www.privacyguides.org/articles/2022/04/21/grapheneos-or-calyxos/ (dated 2022)
- https://www.kuketz-blog.de/calyxos-de-googled-geht-anders-custom-roms-teil2/
- https://www.kuketz-blog.de/lineageos-weder-sicher-noch-datenschutzfreundlich-custom-roms-teil4/
- https://projectzero.google/2023/11/first-handset-with-mte-on-the-market.html
- https://projectzero.google/2022/11/mind-the-gap.html
- https://kuzey.rs/posts/MaliDF/ (CVE-2025-8045 on stock Pixel 7 Pro)
- https://9to5google.com/2026/03/01/motorola-confirms-grapheneos-partnership-for-a-future-smartphone-porting-features/
- https://arstechnica.com/gadgets/2026/08/motorolas-grapheneos-phones-will-launch-in-2027-priced-higher-than-pixels/
- https://www.theverge.com/news/714902/samsung-one-ui-8-bootloader-unlocking-android-roms
- https://trailofbits.com/library/calyx-institute-hsm-provisioning-ceremony-scripts/
Method caveats #
- Discord (GrapheneOS) was not scraped; contact page says it is the active chat and is not bridged to Matrix.
- postmarketOS wiki HTML was Anubis-blocked.
- “GrapheneOS patches faster than Pixel” is not treated as a 2026 measured fact (features-page example is 2023-11-06).
- Kernel and full Chromium trees were not reviewed.