
It doesn't make sense to go into so much detail about the past generation devices, especially now that the specialized Pixel Visual Core and Pixel Neural Core have been replaced with the standard DSP hardware.
772 lines
53 KiB
HTML
772 lines
53 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en" prefix="og: https://ogp.me/ns#">
|
|
<head>
|
|
<meta charset="utf-8"/>
|
|
<title>Usage guide | GrapheneOS</title>
|
|
<meta name="description" content="Usage instructions for GrapheneOS, a security and privacy focused mobile OS with Android app compatibility."/>
|
|
<meta name="theme-color" content="#212121"/>
|
|
<meta name="color-scheme" content="dark light"/>
|
|
<meta name="msapplication-TileColor" content="#ffffff"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<meta name="twitter:site" content="@GrapheneOS"/>
|
|
<meta name="twitter:creator" content="@GrapheneOS"/>
|
|
<meta property="og:title" content="GrapheneOS usage guide"/>
|
|
<meta property="og:description" content="Usage instructions for GrapheneOS, a security and privacy focused mobile OS with Android app compatibility."/>
|
|
<meta property="og:type" content="website"/>
|
|
<meta property="og:image" content="https://grapheneos.org/opengraph.png"/>
|
|
<meta property="og:image:width" content="512"/>
|
|
<meta property="og:image:height" content="512"/>
|
|
<meta property="og:image:alt" content="GrapheneOS logo"/>
|
|
<meta property="og:site_name" content="GrapheneOS"/>
|
|
<meta property="og:url" content="https://grapheneos.org/usage"/>
|
|
<link rel="canonical" href="https://grapheneos.org/usage"/>
|
|
<link rel="icon" href="/favicon.ico"/>
|
|
<link rel="icon" sizes="any" type="image/svg+xml" href="/favicon.svg"/>
|
|
<link rel="mask-icon" href="/mask-icon.svg" color="#1a1a1a"/>
|
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
|
|
<link rel="stylesheet" href="/main.css"/>
|
|
<link rel="manifest" href="/manifest.webmanifest"/>
|
|
<link rel="license" href="/LICENSE.txt"/>
|
|
<script type="module" src="/js/redirect.js"></script>
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<nav id="site-menu">
|
|
<ul>
|
|
<li><a href="/"><img src="/mask-icon.svg" alt=""/>GrapheneOS</a></li>
|
|
<li><a href="/features">Features</a></li>
|
|
<li><a href="/install/">Install</a></li>
|
|
<li><a href="/build">Build</a></li>
|
|
<li aria-current="page"><a href="/usage">Usage</a></li>
|
|
<li><a href="/faq">FAQ</a></li>
|
|
<li><a href="/releases">Releases</a></li>
|
|
<li><a href="/source">Source</a></li>
|
|
<li><a href="/history/">History</a></li>
|
|
<li><a href="/articles/">Articles</a></li>
|
|
<li><a href="/donate">Donate</a></li>
|
|
<li><a href="/contact">Contact</a></li>
|
|
</ul>
|
|
</nav>
|
|
</header>
|
|
<main id="usage">
|
|
<h1><a href="#usage">Usage guide</a></h1>
|
|
<p>This is a guide covering some aspects of using GrapheneOS. See the
|
|
<a href="/features">features page</a> for a list of GrapheneOS features.</p>
|
|
|
|
<nav id="table-of-contents">
|
|
<h2><a href="#table-of-contents">Table of contents</a></h2>
|
|
<ul>
|
|
<li>
|
|
<a href="#system-navigation">System navigation</a>
|
|
<ul>
|
|
<li><a href="#gesture-navigation">Gesture navigation</a></li>
|
|
<li><a href="#2-button-navigation">2-button navigation</a></li>
|
|
<li><a href="#3-button-navigation">3-button navigation</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#accessibility">Accessibility</a></li>
|
|
<li><a href="#auditor">Auditor</a></li>
|
|
<li>
|
|
<a href="#updates">Updates</a>
|
|
<ul>
|
|
<li><a href="#updates-settings">Settings</a></li>
|
|
<li><a href="#updates-security">Security</a></li>
|
|
<li><a href="#updates-disabling">Disabling</a></li>
|
|
<li><a href="#updates-sideloading">Sideloading</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#web-browsing">Web browsing</a></li>
|
|
<li><a href="#camera">Camera</a></li>
|
|
<li><a href="#exec-spawning">Exec spawning</a></li>
|
|
<li><a href="#bugs-uncovered-by-security-features">Bugs uncovered by security features</a></li>
|
|
<li>
|
|
<a href="#wifi-privacy">Wi-Fi privacy</a>
|
|
<ul>
|
|
<li><a href="#wifi-privacy-scanning">Scanning</a></li>
|
|
<li><a href="#wifi-privacy-associated">Associated with an Access Point (AP)</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#lte-only-mode">LTE-only mode</a></li>
|
|
<li>
|
|
<a href="#sandboxed-play-services">Sandboxed Play services (experimental)</a>
|
|
<ul>
|
|
<li><a href="#sandboxed-play-services-limitations">Limitations</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
|
|
<section id="system-navigation">
|
|
<h2><a href="#system-navigation">System navigation</a></h2>
|
|
|
|
<p>By default, GrapheneOS uses gesture-based navigation. We recommend reading our
|
|
guide on gesture navigation and giving it a chance even if you think you won't
|
|
like it. Our experience is that when armed with the appropriate knowledge, the
|
|
vast majority of users prefer the newer gesture navigation approach.</p>
|
|
|
|
<p>The system navigation mode can be configured in Settings → System → Gestures →
|
|
System navigation. The same menu is also available in Settings → Accessibility →
|
|
System navigation.</p>
|
|
|
|
<section id="gesture-navigation">
|
|
<h3><a href="#gesture-navigation">Gesture navigation</a></h3>
|
|
|
|
<p>The bottom of the screen is a reserved touch zone for system navigation. A
|
|
line is displayed in the center to show that the navigation bar is present
|
|
across the entire bottom of the screen. In most apps, this area will display
|
|
padding. Modern apps are able to tell the OS that they can handle not having
|
|
the padding to display app content there while still not being able to receive
|
|
touches from it. Open up the Settings app for an example.</p>
|
|
|
|
<p>Swiping up from the navigation bar while removing your finger from the
|
|
screen is the <strong>Home</strong> gesture.</p>
|
|
|
|
<p>Swiping up from the navigation bar while holding your finger on the screen
|
|
before releasing is the <strong>Recent Apps</strong> gesture. The most
|
|
recently opened activity is always on the furthest right. Each step left goes
|
|
one step back through the history of recently opened apps. Opening an app with
|
|
the recent apps activity will place it on the furthest right in the recent
|
|
apps order just like a new app being opened.</p>
|
|
|
|
<p>The recent apps activity has a screenshot button as an alternative to
|
|
holding power and volume down while using an app.</p>
|
|
|
|
<p>Rather than opening the recent apps activity, you can swipe left on the
|
|
navigation bar for the <strong>Previous</strong> app and swipe right for the
|
|
<strong>Next</strong> app. This will not change the recent apps order. This is
|
|
usually the best way to navigate through recent apps.</p>
|
|
|
|
<p>Swiping from either the left or the right of the screen within the app (not
|
|
the navigation bar) is the <strong>Back</strong> gesture. Apps are supposed to
|
|
avoid implementing conflicting gestures, but have the option to override this
|
|
gesture if they truly need to get rid of it. However, many apps without active
|
|
development of their UI design still haven't addressed this despite gestures
|
|
being the default for 2 years on Google Android. You can avoid triggering the
|
|
back gesture in one of 2 easy ways: avoid swiping from right near the edge or
|
|
hold your finger on the side of the screen for a moment before swiping. The
|
|
more advanced option is using a diagonal swipe pointing sharply to the bottom
|
|
of the screen since this will bypass the back gesture but will still trigger
|
|
most app gestures. The advanced option is the most convenient approach once
|
|
you get used to doing it.</p>
|
|
|
|
<p>The launcher uses a swipe up gesture starting anywhere on the screen to
|
|
open the app drawer from the home screen. You need to start that gesture above
|
|
the system navigation bar since any gesture starting on the navigation bar is
|
|
handled by the OS as a system navigation gesture.</p>
|
|
</section>
|
|
|
|
<section id="2-button-navigation">
|
|
<h3><a href="#2-button-navigation">2-button navigation</a></h3>
|
|
|
|
<p>2-button navigation is a legacy mode not supported anymore by Google
|
|
Android on the Pixel 4 and later. It will likely be removed in a future
|
|
release of GrapheneOS. You should use <a href="#3-button-navigation">3-button
|
|
navigation</a> if you want the traditional button-based navigation.</p>
|
|
|
|
<p>A large row across the bottom of the screen is reserved for navigation
|
|
buttons. The <strong>Back</strong> button is on the left and the
|
|
<strong>Home</strong> button is in the center.</p>
|
|
|
|
<p>Swiping up from the navigation bar while removing your finger from the
|
|
screen is the <strong>Recent apps</strong> gesture. The most recently opened
|
|
activity is always on the furthest right. Each step left goes one step back
|
|
through the history of recently opened apps. Opening an app with the recent
|
|
apps activity will place it on the furthest right in the recent apps
|
|
order just like a new app being opened.</p>
|
|
|
|
<p>2-button navigation provides the recent apps activity with the launcher. It
|
|
shows the recent apps above the bottom row of the home screen and the search
|
|
integration not used in GrapheneOS. The usual launcher features work including
|
|
swiping up anywhere on the screen to open the app drawer. Due to the launcher
|
|
integration, the screenshot button available in the other modes isn't present.
|
|
Instead, a screenshot button is added to the global action menu accessed by
|
|
holding the power button.</p>
|
|
</section>
|
|
|
|
<section id="3-button-navigation">
|
|
<h3><a href="#3-button-navigation">3-button navigation</a></h3>
|
|
|
|
<p>3-button navigation is Android's oldest touchscreen-based navigation
|
|
system. It will remain supported for the foreseeable future to provide
|
|
accessibility for users unable to easily use the gestures. It's older than
|
|
2-button navigation but isn't considered a legacy feature.</p>
|
|
|
|
<p>A large row across the bottom of the screen is reserved for navigation
|
|
buttons. The <strong>Back</strong> button is on the left, the
|
|
<strong>Home</strong> button is in the center and the <strong>Recent
|
|
Apps</strong> button is on the right.</p>
|
|
|
|
<p>In the recent apps activity, the most recently opened activity is always on
|
|
the furthest right. Each step left goes one step back through the history of
|
|
recently opened apps. Opening an app with the recent apps activity will place
|
|
it on the furthest right in the recent apps order just like a new app being
|
|
opened.</p>
|
|
|
|
<p>The recent apps activity has a screenshot button as an alternative to
|
|
holding power and volume down while using an app.</p>
|
|
</section>
|
|
</section>
|
|
|
|
<section id="accessibility">
|
|
<h2><a href="#accessibility">Accessibility</a></h2>
|
|
|
|
<p>GrapheneOS includes all of the accessibility features from the Android Open
|
|
Source Project and strives to fill in the gaps from not including Google apps and
|
|
services. We include our own fork of the open source TalkBack and Switch Access
|
|
accessibility services along with a Monochromacy option for the standard color
|
|
correction menu.</p>
|
|
|
|
<p>GrapheneOS does not yet include a text-to-speech (TTS) service in the base OS
|
|
due to limitations of the available options. Including one is planned in the
|
|
future when a suitable option is available. RHVoice and eSpeak NG are both open
|
|
source and are the most common choices by GrapheneOS users. Both of these mostly
|
|
work fine but have licensing issues and don't support Direct Boot so they cannot
|
|
be used before the initial unlock of the device. Installing and setting up either
|
|
one of these or another TTS app will get TalkBack working. TalkBack itself
|
|
supports Direct Boot and works before the first unlock but it needs to have a TTS
|
|
app supporting it in order to do more than playing the activation sound before the
|
|
first unlock. After installing a TTS service, you need to select it in the OS
|
|
configuration to accept activating it. The OS will display one of them as already
|
|
selected, but it won't simply work from being installed as that wouldn't be safe.
|
|
This is the same as the stock OS but it comes with one set up already.</p>
|
|
|
|
<p>GrapheneOS disables showing the characters as passwords are typed by default.
|
|
You can enable this in Settings ➔ Privacy.</p>
|
|
|
|
<p>Third party accessibility services can be installed and activated. This
|
|
includes the ones made by Google. Most of these will work but some may have a hard
|
|
dependency on functionality from Google Play services for some of their
|
|
functionality or to run at all. Accessibility services are very powerful and we
|
|
strongly recommend against using third party implementations if you can get by
|
|
well without them. We plan to add safeguards in this area while still keeping them
|
|
working without problematic barriers.</p>
|
|
</section>
|
|
|
|
<section id="auditor">
|
|
<h2><a href="#auditor">Auditor</a></h2>
|
|
<p>See the <a href="https://attestation.app/tutorial">tutorial page on the site for the attestation sub-project</a>.</p>
|
|
</section>
|
|
|
|
<section id="updates">
|
|
<h2><a href="#updates">Updates</a></h2>
|
|
|
|
<p>The update system implements automatic background updates. It checks for updates
|
|
approximately once every four hours when there's network connectivity and then
|
|
downloads and installs updates in the background. It will pick up where it left off if
|
|
downloads are interrupted, so you don't need to worry about interrupting it.
|
|
Similarly, interrupting the installation isn't a risk because updates are installed to
|
|
a secondary installation of GrapheneOS which only becomes the active installation
|
|
after the update is complete. Once the update is complete, you'll be informed with a
|
|
notification and simply need to reboot with the button in the notification or via a
|
|
normal reboot. If the new version fails to boot, the OS will be rolled back to the
|
|
past version and the updater will attempt to download and install the update
|
|
again.</p>
|
|
|
|
<p>The updater will use incremental (delta) updates to download only changes rather
|
|
than the whole OS when one is available to go directly from the installed version to
|
|
the latest version. As long as you have working network connectivity on a regular
|
|
basis and reboot when asked, you'll almost always be on one of the past couple
|
|
versions of the OS which will minimize bandwidth usage since incrementals will always
|
|
be available.</p>
|
|
|
|
<p>The updater works while the device is locked / idle, including before the first
|
|
unlock since it's explicitly designed to be able to run before decryption of user
|
|
data.</p>
|
|
|
|
<p>Release changelogs are available <a href="/releases#changelog">in a section on the releases page</a>.</p>
|
|
|
|
<section id="updates-settings">
|
|
<h3><a href="#updates-settings">Settings</a></h3>
|
|
|
|
<p>The settings are available in the Settings app in System ➔ Advanced ➔ Update
|
|
settings.</p>
|
|
|
|
<p>The "Check for updates" option will manually trigger an update check as soon as
|
|
possible. It will still wait for the configuration conditions listed below to be
|
|
satisfied, such as being connected to the internet via one of the permitted network
|
|
types.</p>
|
|
|
|
<p>The "Release channel" setting can be changed from the default Stable channel to the
|
|
Beta channel if you want to help with testing. The Beta channel will usually simply
|
|
follow the Stable channel, but the Beta channel may be used to experiment with new
|
|
features.</p>
|
|
|
|
<p>The "Permitted networks" setting controls which networks will be used to perform
|
|
updates. It defaults to using any network connection. It can be set to "Non-roaming"
|
|
to disable it when the cellular service is marked as roaming or "Unmetered" to disable
|
|
it on cellular networks and also Wi-Fi networks marked as metered.</p>
|
|
|
|
<p>The "Require battery above warning level" setting controls whether updates will
|
|
only be performed when the battery is above the level where the warning message is
|
|
shown. The standard value is at 15% capacity.</p>
|
|
|
|
<p>Enabling the opt-in "Automatic reboot" setting allows the updater to reboot the
|
|
device after an update once it has been idle for a long time. When this setting is
|
|
enabled, a device can take care of any number of updates completely automatically even
|
|
if it's left completely idle.</p>
|
|
</section>
|
|
|
|
<section id="updates-security">
|
|
<h3><a href="#updates-security">Security</a></h3>
|
|
|
|
<p>The update server isn't a trusted party since updates are signed and verified along
|
|
with downgrade attacks being prevented. The update protocol doesn't send identifiable
|
|
information to the update server and works well over a VPN / Tor. GrapheneOS isn't
|
|
able to comply with a government order to build, sign and ship a malicious update to a
|
|
specific user's device based on information like the IMEI, serial number, etc. The
|
|
update server only ends up knowing the IP address used to connect to it and the
|
|
version being upgraded from based on the requested incremental.</p>
|
|
|
|
<p>Android updates can support serialno constraints to make them validate only on a
|
|
certain device but GrapheneOS rejects any update with a serialno constraint for both
|
|
over-the-air updates (Updater app) and sideloaded updates (recovery).</p>
|
|
</section>
|
|
|
|
<section id="updates-disabling">
|
|
<h3><a href="#updates-disabling">Disabling</a></h3>
|
|
|
|
<p>It's highly recommended to leave automatic updates enabled and to configure the
|
|
permitted networks if the bandwidth usage is a problem on your mobile data connection.
|
|
However, it's possible to turn off the update client by going to Settings ➔ Apps,
|
|
enabling Show system via the menu, selecting Seamless Update Client and disabling the
|
|
app. If you do this, you'll need to remember to enable it again to start receiving
|
|
updates.</p>
|
|
</section>
|
|
|
|
<section id="updates-sideloading">
|
|
<h3><a href="#updates-sideloading">Sideloading</a></h3>
|
|
|
|
<p>Updates can be downloaded via
|
|
<a href="https://grapheneos.org/releases">the releases page</a> and installed via recovery
|
|
with adb sideloading. The zip files are signed and verified by recovery, just as they
|
|
are by the update client within the OS. This includes providing downgrade protection,
|
|
which prevents attempting to downgrade the version. If recovery didn't enforce these
|
|
things, they would still be enforced via verified boot including downgrade protection
|
|
and the attempted update would just fail to boot and be rolled back.</p>
|
|
|
|
<p>To install one by sideloading, first, boot into recovery. You may do this either by
|
|
using <code>adb reboot recovery</code> from the operating system, or by selecting the
|
|
"Recovery" option in the bootloader interface.</p>
|
|
|
|
<p>You should see the green Android lying on its back being repaired, with the text "No
|
|
command" meaning that no command has been passed to recovery.</p>
|
|
|
|
<p>Next, access the recovery menu by holding down the power button and pressing the volume
|
|
up button a single time. This key combination toggles between the GUI and text-based mode
|
|
with the menu and log output.</p>
|
|
|
|
<p>Finally, select the "Apply update from ADB" option in the recovery menu and
|
|
sideload the update with adb. For example:</p>
|
|
|
|
<pre>adb sideload blueline-ota_update-2019.07.01.21.zip</pre>
|
|
|
|
<p><strong>You do not need to have adb enabled within the OS or the host's ADB key
|
|
whitelisted within the OS to sideload an update to recovery. Recovery mode does not
|
|
trust the attached computer and this can be considered a production feature. Trusting
|
|
a computer with ADB access within the OS is much different and exposes the device to a
|
|
huge amount of attack surface and control by the trusted computer.</strong></p>
|
|
</section>
|
|
</section>
|
|
|
|
<section id="usb-peripherals">
|
|
<h2><a href="#usb-peripherals">USB peripherals</a></h2>
|
|
|
|
<p>GrapheneOS defaults to ignoring connected USB peripherals when the device is
|
|
already booted and the screen is locked. A USB device already connected at boot
|
|
will still work. The purpose is reducing attack surface for a locked device with
|
|
active login sessions to user profiles to protect data that's not at rest. This
|
|
can be controlled in Settings ➔ Security ➔ USB accessories. The options are:</p>
|
|
|
|
<ul>
|
|
<li>Disallow new USB peripherals</li>
|
|
<li>Allow new USB peripherals when unlocked (default)</li>
|
|
<li>Allow new USB peripherals (like stock Android)</li>
|
|
</ul>
|
|
|
|
<p>This option has no impact on the device acting as a USB peripheral itself when
|
|
connected to a computer. Android defaults to charge only mode and requires opt-in
|
|
to the device being used for file transfer, USB tethering, MIDI or PTP.</p>
|
|
</section>
|
|
|
|
<section id="web-browsing">
|
|
<h2><a href="#web-browsing">Web browsing</a></h2>
|
|
|
|
<p>GrapheneOS includes a Vanadium subproject providing privacy and security enhanced
|
|
releases of Chromium. Vanadium is both the user-facing browser included in the OS and
|
|
the provider of the WebView used by other apps to render web content. The WebView is
|
|
the browser engine used by the vast majority of web browsers and nearly all other apps
|
|
embedding web content or using web technologies for other uses.</p>
|
|
|
|
<p>Using Vanadium is highly recommended. Bromite is a solid alternative and is the
|
|
only other browser we recommend. Bromite provides integrated ad-blocking and more
|
|
advanced anti-fingerprinting. For now, Vanadium is more focused on security hardening
|
|
and Bromite is more focused on anti-fingerprinting. The projects are collaborating
|
|
together and will likely converge to providing more of the same features. Vanadium
|
|
will be providing content filtering and anti-fingerprinting, but it needs to be done
|
|
in a way that meets the standards of the project, which takes time.</p>
|
|
|
|
<p>Vanadium is designed for use on GrapheneOS and does not duplicate the OS privacy
|
|
and security features such as the hardened malloc implementation. This leads to some
|
|
of the differences from Bromite, such as relying on OS support for encrypted DNS
|
|
rather than enabling Chromium's DNS-over-HTTPS support.</p>
|
|
|
|
<p>Chromium-based browsers like Vanadium and Bromite provide the strongest sandbox
|
|
implementation, leagues ahead of the alternatives. It is much harder to escape from
|
|
the sandbox and it provides much more than acting as a barrier to compromising the
|
|
rest of the OS. Site isolation enforces security boundaries around each site using the
|
|
sandbox by placing each site into an isolated sandbox. It required a huge overhaul of
|
|
the browser since it has to enforce these rules on all the IPC APIs. Site isolation is
|
|
important even without a compromise, due to side channels. Browsers without site
|
|
isolation are very vulnerable to attacks like Spectre. On mobile, due to the lack of
|
|
memory available to apps, there are different modes for site isolation. Vanadium turns
|
|
on strict site isolation, matching Chromium on the desktop. Bromite enables strict
|
|
site isolation on high memory devices, including all the devices that are officially
|
|
supported by GrapheneOS.</p>
|
|
|
|
<p>Chromium has decent exploit mitigations, unlike the available alternatives. This is
|
|
improved upon in Vanadium by enabling further mitigations, including those developed
|
|
upstream but not yet fully enabled due to code size, memory usage or performance. For
|
|
example, it enables type-based CFI like Chromium on the desktop, uses a stronger SSP
|
|
configuration, zero initializes variables by default, etc. Some of the mitigations are
|
|
inherited from the OS itself, which also applies to other browsers, at least if they
|
|
don't do things to break them.</p>
|
|
|
|
<p>We recommend against trying to achieve browser privacy and security through piling
|
|
on browser extensions and modifications. Most privacy features for browsers are
|
|
privacy theater without a clear threat model and these features often reduce privacy
|
|
by aiding fingerprinting and adding more state shared between sites. Every change you
|
|
make results in you standing out from the crowd and generally provides more ways to
|
|
track you. Enumerating badness via content filtering is not a viable approach to
|
|
achieving decent privacy, just as AntiVirus isn't a viable way to achieving decent
|
|
security. These are losing battles, and are at best a stopgap reducing exposure while
|
|
waiting for real privacy and security features.</p>
|
|
|
|
<p>Vanadium will be following the school of thought where hiding the IP address
|
|
through Tor or a trusted VPN shared between many users is the essential baseline, with
|
|
the browser partitioning state based on site and mitigating fingerprinting to avoid
|
|
that being trivially bypassed. The Tor Browser's approach is the only one with any
|
|
real potential, however flawed the current implementation may be. This work is
|
|
currently in a very early stage and it is largely being implemented upstream with the
|
|
strongest available implementation of state partitioning. Chromium is using Network
|
|
Isolation Keys to divide up connection pools, caches and other state based on site and
|
|
this will be the foundation for privacy. Chromium itself aims to prevent tracking
|
|
through mechanisms other than cookies, greatly narrowing the scope downstream work
|
|
needs to cover. Bromite is doing a lot of work in these areas and Vanadium will be
|
|
benefiting from that along with this upstream work. The focus is currently on research
|
|
since we don't see much benefit in deploying bits and pieces of this before everything
|
|
is ready to come together. At the moment, the only browser with any semblance of
|
|
privacy is the Tor Browser but there are many ways to bypass the anti-fingerprinting
|
|
and state partitioning. The Tor Browser's security is weak which makes the privacy
|
|
protection weak. The need to avoid diversity (fingerprinting) creates a monoculture
|
|
for the most interesting targets. This needs to change, especially since Tor itself
|
|
makes people into much more of a target (both locally and by the exit nodes).</p>
|
|
|
|
<p>WebView-based browsers use the hardened Vanadium rendering engine, but they can't
|
|
offer as much privacy and control due to being limited to the capabilities supported
|
|
by the WebView widget. For example, they can't provide a setting for toggling sensors
|
|
access because the feature is fairly new and the WebView WebSettings API doesn't yet
|
|
include support for it as it does for JavaScript, location, cookies, DOM storage and
|
|
other older features. For sensors, the Sensors app permission added by GrapheneOS can
|
|
be toggled off for the browser app as a whole instead. The WebView sandbox also
|
|
currently runs every instance within the same sandbox and doesn't support site
|
|
isolation.</p>
|
|
|
|
<p>Avoid Gecko-based browsers like Firefox as they're currently much more vulnerable
|
|
to exploitation and inherently add a huge amount of attack surface. Gecko doesn't have
|
|
a WebView implementation (GeckoView is not a WebView implementation), so it has to be
|
|
used alongside the Chromium-based WebView rather than instead of Chromium, which means
|
|
having the remote attack surface of two separate browser engines instead of only one.
|
|
Firefox / Gecko also bypass or cripple a fair bit of the upstream and GrapheneOS
|
|
hardening work for apps. Worst of all, Firefox runs as a single process on mobile and
|
|
has no sandbox beyond the OS sandbox. This is despite the fact that Chromium semantic
|
|
sandbox layer on Android is implemented via the OS <code>isolatedProcess</code>
|
|
feature, which is a very easy to use boolean property for app service processes to
|
|
provide strong isolation with only the ability to communicate with the app running
|
|
them via the standard service API. Even in the desktop version, Firefox's sandbox is
|
|
still substantially weaker (especially on Linux, where it can hardly be considered a
|
|
sandbox at all) and lacks support for isolating sites from each other rather than only
|
|
containing content as a whole.</p>
|
|
</section>
|
|
|
|
<section id="camera">
|
|
<h2><a href="#camera">Camera</a></h2>
|
|
|
|
<p>GrapheneOS itself has the same camera capabilities and quality as the stock OS.
|
|
It will match the stock OS when comparing the same app on each OS.</p>
|
|
|
|
<p>The Camera app included in GrapheneOS is very basic and can't take full advantage
|
|
of the hardware. It doesn't offer much in the way of configuration. In the long term,
|
|
it's going to be replaced. In the short term, there are other apps available providing
|
|
more capabilities and better support for taking advantage of the hardware.</p>
|
|
|
|
<p>Open Camera is somewhat more advanced and much more configurable. You should
|
|
make sure to configure it to use the Camera2 API since it uses the legacy camera
|
|
APIs by default for broader compatibility with devices. It isn't currently able to
|
|
make use of special purpose cameras and doesn't have any advanced image capturing
|
|
or processing technology. It has a traditional software-based HDR mode which
|
|
captures 3 images and merges them in a way that isn't at all intelligent and
|
|
causes a lot of blur and distortion. You probably don't want to use this unless
|
|
you have a way to mount the phone in a stable position and aren't taking a picture
|
|
of anything that's not almost entirely still.</p>
|
|
|
|
<p>Google Camera can be used with the <a href="#sandboxed-play-services">sandboxed
|
|
Play services compatibility layer</a> and can take full advantage of the available
|
|
cameras and image processing hardware as it can on the stock OS. Other camera apps
|
|
could provide the same image quality and features but there aren't any comparable
|
|
alternatives in practice. HDR+ is enabled by default and is a much more advanced
|
|
replacement for HDR taking bursts of pictures and intelligently combining those
|
|
which is what makes the image quality so much higher, especially for low light.
|
|
The Night Sight feature is essentially the same thing, but with the light of the
|
|
picture unnaturally increased through combining the data.</p>
|
|
|
|
<p>Since there isn't a project making a serious, high quality open source camera
|
|
app able to even compete with Google Camera without HDR+ and the fancy features,
|
|
GrapheneOS is considering funding the creation of a new app as a replacement for
|
|
the AOSP Camera app.</p>
|
|
</section>
|
|
|
|
<section id="exec-spawning">
|
|
<h2><a href="#exec-spawning">Exec spawning</a></h2>
|
|
|
|
<p>GrapheneOS creates fresh processes (via exec) when spawning applications instead of
|
|
using the traditional Zygote spawning model. This improves privacy and security at the
|
|
expense of higher cold start app spawning time and higher initial memory usage. It
|
|
doesn't impact runtime performance beyond the initial spawning time. It adds somewhere
|
|
in the ballpark of 100ms to app spawning time on the flagship devices and is only very
|
|
noticeable on lower-end devices with a weaker CPU and slower storage. The spawning
|
|
time impact only applies when the app doesn't already have an app process and the OS
|
|
will try to keep app processes cached in the background until memory pressure forces
|
|
it to start killing them.</p>
|
|
|
|
<p>In the typical Zygote model, a template app process is created during boot and
|
|
every app is spawned as a clone of it. This results in every app sharing the same
|
|
initial memory content and layout, including sharing secrets that are meant to be
|
|
randomized for each process. It saves time by reusing the initialization work. The
|
|
initial memory usage is reduced due to copy-on-write semantics resulting in memory
|
|
written only during initialization being shared between app processes.</p>
|
|
|
|
<p>The Zygote model weakens the security provided by features based on random secrets
|
|
including Address Space Layout Randomization (ASLR), stack canaries, heap canaries,
|
|
randomized heap layout and memory tags. It cripples these security features since
|
|
every app has the values for every other app and the values don't change for fresh app
|
|
processes until reboot. Much of the OS itself is implemented via non-user-facing apps
|
|
with privileges reserved for OS components. The Zygote template is reused across user
|
|
profiles, so it also provides a temporary set of device identifiers across profiles
|
|
for each boot via the shared randomized values.</p>
|
|
</section>
|
|
|
|
<section id="bugs-uncovered-by-security-features">
|
|
<h2><a href="#bugs-uncovered-by-security-features">Bugs uncovered by security features</a></h2>
|
|
|
|
<p>GrapheneOS substantially expands the standard mitigations for memory corruption
|
|
vulnerabilities. Some of these features are designed to directly catch the memory
|
|
corruption bugs either via an explicit check or memory protection and abort the
|
|
program in order to prevent them from being exploited. Other features mitigate issues
|
|
a bit less directly such as zeroing data immediately upon free, isolated memory
|
|
regions, heap randomization, etc. and can also lead to latent memory corruption bugs
|
|
crashing instead of the program continuing onwards with corrupted memory. This means
|
|
that many latent memory corruption bugs in apps are caught along with some in the OS
|
|
itself. These bugs are not caused by GrapheneOS, but rather already existed and are
|
|
uncovered by the features. The features are aimed at preventing or hindering exploits,
|
|
not finding bugs, but they do that as part of doing their actual job.</p>
|
|
|
|
<p>Similarly, some of the other privacy and security improvements reduce the access
|
|
available to applications and they may crash. Some of these features are always
|
|
enabled under the hood, while others like the Network and Sensors toggles are
|
|
controlled by users via opt-in or opt-out toggles. Apps may not handle having access
|
|
taken away like this, although it generally doesn't cause any issues as it's all
|
|
designed to be friendly to apps and fully compatible rather than killing the
|
|
application when it violates the rules.</p>
|
|
|
|
<p>If you run into an application aborting, try to come up with a process for
|
|
reproducing the issue and then capture a bug report via the 'Take bug report'
|
|
feature in Developer options. Report an issue to <a
|
|
href="https://github.com/GrapheneOS/os-issue-tracker/issues">the GrapheneOS OS
|
|
issue tracker</a> and email the bug report capture zip to contact@grapheneos.org
|
|
with the issue tracker number in the subject like "Bug report capture for issue
|
|
#104". The bug report capture includes plain text 'tombstones' with logs,
|
|
tracebacks, address space layout, register content and a tiny bit of context
|
|
from memory from areas that are interesting for debugging. This may contain
|
|
some sensitive data. Feel free to provide only the tombstone for the relevant
|
|
crash and filter out information you don't want to send. However, it will be
|
|
more difficult to debug if you provide less of the information. If the app
|
|
doesn't work with sensitive information, just send the whole tombstone.</p>
|
|
</section>
|
|
|
|
<section id="wifi-privacy">
|
|
<h2><a href="#wifi-privacy">Wi-Fi privacy</a></h2>
|
|
|
|
<p>Wi-Fi on GrapheneOS is very privacy-friendly and is essentially anonymous as long
|
|
as apps do not leak uniquely identifying information to the network. GrapheneOS avoids
|
|
allowing itself to be fingerprinted as GrapheneOS, other than connections which are
|
|
documented (see the FAQ) and can be easily disabled or forced through a VPN
|
|
service.</p>
|
|
|
|
<section id="wifi-privacy-scanning">
|
|
<h3><a href="#wifi-privacy-scanning">Scanning</a></h3>
|
|
|
|
<p>MAC randomization is always performed for Wi-Fi scanning. Pixel
|
|
phones have firmware support for scanning MAC randomization going
|
|
<a href="https://android-developers.googleblog.com/2017/04/changes-to-device-identifiers-in.html">significantly beyond a naive implementation</a>.
|
|
On many other devices, there are identifiers exposed by Wi-Fi scanning beyond the MAC
|
|
address such as the packet sequence number and assorted identifying information in the
|
|
probe requests.</p>
|
|
|
|
<p>Avoid using hidden APs (i.e. APs not broadcasting their SSID) since all
|
|
known hidden SSIDs end up being broadcast as part of scanning for networks to
|
|
find them again. SSIDs are not broadcast for standard non-hidden APs. Hidden
|
|
APs are only hidden when no devices are connected. It makes little sense as a
|
|
privacy feature, especially for a non-mobile AP where knowing the AP exists
|
|
can't be used for tracking it since it doesn't move. The feature reduces your
|
|
privacy rather than increasing it. If you need to use a hidden AP, make sure
|
|
to delete the saved network afterwards.</p>
|
|
|
|
<p>Wi-Fi and Bluetooth scanning for improving location detection are disabled by
|
|
default, unlike the stock OS. These can be toggled in Settings ➔ Location ➔ Wi-Fi and
|
|
Bluetooth scanning. These features enable scanning even when Wi-Fi or Bluetooth is
|
|
disabled, so these need to be kept disabled to fully disable the radios when Wi-Fi and
|
|
Bluetooth are disabled. GrapheneOS doesn't yet have an implementation of a coarse
|
|
location service to supplement GPS location, so enabling these options doesn't
|
|
actually do anything at the moment. Implementing a supplementary location service is
|
|
planned but we need a robust, secure and private implementation via a local database.
|
|
The initial focus will likely be a cell phone tower database, so these features still
|
|
wouldn't be relevant.</p>
|
|
</section>
|
|
|
|
<section id="wifi-privacy-associated">
|
|
<h3><a href="#wifi-privacy-associated">Associated with an Access Point (AP)</a></h3>
|
|
|
|
<p>Associated MAC randomization is performed by default. This can be controlled
|
|
per-network with Settings ➔ Network & Internet ➔ Wi-Fi ➔ <network> ➔
|
|
Advanced ➔ Privacy.</p>
|
|
|
|
<p>In the stock OS, the default is to use a unique persistent random MAC address for
|
|
each network. It has 2 options available: "Use randomized MAC (default)" and "Use
|
|
device MAC". In GrapheneOS, the default is generating a new random MAC address when
|
|
connecting to a network. It has 3 options available: "Use fully randomized MAC
|
|
(default)", "Use per-network randomized MAC" and "Use device MAC".</p>
|
|
|
|
<p>The DHCP client uses the anonymity profile rather than sending a hostname
|
|
so it doesn't compromise the privacy offered by MAC randomization. When the
|
|
per-connection MAC randomization added by GrapheneOS is being used, DHCP
|
|
client state is flushed before reconnecting to a network to avoid revealing
|
|
that it's likely the same device as before.</p>
|
|
|
|
<p>GrapheneOS also disables support for stable link-local IPv6 addresses, since these
|
|
have the potential to be used as identifiers. It's more sensible to use typical
|
|
link-local address generation based on the (randomized) MAC address since link-local
|
|
devices have access to both. As of Android 11, Android only uses stable link-local
|
|
privacy addresses when MAC randomization is disabled, so we no longer need to disable
|
|
the feature.</p>
|
|
</section>
|
|
</section>
|
|
|
|
<section id="lte-only-mode">
|
|
<h2><a href="#lte-only-mode">LTE-only mode</a></h2>
|
|
|
|
<p>If you have a reliable LTE connection from your carrier, you can reduce attack
|
|
surface by disabling 2G / 3G connectivity in Settings ➔ Network & Internet ➔
|
|
Mobile network ➔ Preferred network type. Traditional voice calls will only work in
|
|
the LTE-only mode if you have either an LTE connection and VoLTE (Voice over LTE)
|
|
support or a Wi-Fi connection and VoWi-Fi (Voice over Wi-Fi) support. VoLTE /
|
|
VoWi-Fi works on GrapheneOS for most carriers unless they restrict it to carrier
|
|
phones. US carriers other than T-Mobile tend to be missing these features due to
|
|
us not including their proprietary apps.</p>
|
|
|
|
<p>This feature is not intended to improve the confidentiality of traditional calls and
|
|
texts, but it might somewhat raise the bar for some forms of interception. It's not a
|
|
substitute for end-to-end encrypted calls / texts or even transport layer encryption.
|
|
LTE does provide basic network authentication / encryption, but it's for the network
|
|
itself. The intention of the LTE-only feature is only hardening against remote
|
|
exploitation by disabling an enormous amount of legacy code.</p>
|
|
</section>
|
|
|
|
<section id="sandboxed-play-services">
|
|
<h2><a href="#sandboxed-play-services">Sandboxed Play services (experimental)</a></h2>
|
|
|
|
<p>GrapheneOS has experimental support for installing the official releases of
|
|
com.android.vending (Google Play Store), com.google.android.gms (Google Play
|
|
services), com.google.android.gsf (Google Services Framework) as regular sandboxed
|
|
apps in a specific profile. These receive no special privileges and the OS itself
|
|
doesn't use them for anything. They run as unprivileged, sandboxed apps like any
|
|
others. GrapheneOS simply provides fallback code teaching them how to run without
|
|
any of the special privileged permissions and SELinux policy they depend on
|
|
having. Even within the same profile, apps not explicitly choosing to use Google
|
|
services won't use them because the OS doesn't integrate support for it or use it
|
|
as the backend for APIs in the OS like the stock OS.</p>
|
|
|
|
<p>The core functionality and APIs are almost entirely supported already since
|
|
GrapheneOS largely only has to coerce these apps into continuing to run without
|
|
being able to use any of the usual invasive OS integration. A compatibility layer
|
|
is also provided to support dynamically downloaded/loaded modules (dynamite
|
|
modules).</p>
|
|
|
|
<p>You can obtain the apps from the apps.grapheneos.org repository. We don't yet
|
|
have a client app for our repository so you'll need to install the APKs manually.
|
|
The Play Store APK has multiple split APKs which need to be installed together
|
|
rather than separately, so you'll need to use an app providing split APK
|
|
installation support. Once we have a client app for our repository, you'll be able
|
|
to install these and receive automatic updates through the app.</p>
|
|
|
|
<p>Install com.google.android.gsf, then com.google.android.gms and finally
|
|
com.android.vending via a split APK installer. Make sure to install all 3 in the
|
|
correct order and don't skip installing the Play Store since it provides services
|
|
used by apps depending on Play.</p>
|
|
|
|
<ul>
|
|
<li><a href="https://apps.grapheneos.org/packages/com.google.android.gsf/">com.google.android.gsf</a></li>
|
|
<li><a href="https://apps.grapheneos.org/packages/com.google.android.gms/">com.google.android.gms</a></li>
|
|
<li><a href="https://apps.grapheneos.org/packages/com.android.vending/">com.android.vending</a></li>
|
|
</ul>
|
|
|
|
<p>You should give a battery optimization exception to Google Play services for
|
|
features like push notifications to work properly in the background. It isn't
|
|
needed for the other 2 apps.</p>
|
|
|
|
<p>After installing the apps, you should open the Play Store and press sign in to
|
|
trigger initialization. Signing into an account is optional and it will work fine
|
|
without it, but you do need to get it initialized and this is currently the best
|
|
way to mimic the initialization done by the stock OS setup wizard.</p>
|
|
|
|
<section id="sandboxed-play-services-limitations">
|
|
<h3><a href="#sandboxed-play-services-limitations">Limitations</a></h3>
|
|
|
|
<p>There's currently a known issue with apps not being able to see that Play
|
|
services is installed in the profile in some cases. This is being worked on
|
|
and it should be resolved soon.</p>
|
|
|
|
<p>Functionality depending on privileged access such as special access to
|
|
hardware isn't available. We would need to implement compatibility layers
|
|
teaching it how to function as a regular app. This currently isn't within the
|
|
scope of the project beyond the existing support for dynamite modules and
|
|
partially implemented support for Play Store app installation/updates.</p>
|
|
|
|
<p>The Play Store app cannot install and update apps as it normally would
|
|
since it depends entirely on privileged permissions for unattended app
|
|
installation, updates and removal. GrapheneOS includes a partial
|
|
implementation of fallback code to get this working. It currently isn't fully
|
|
wired up and leads to the Play Store stalling and needing to be force stopped.
|
|
For the time being, it's easier to use the alternative Aurora Store frontend
|
|
to the Play Store.</p>
|
|
|
|
<p>Play Store feature delivery isn't currently supported, but this isn't
|
|
broadly used by current generation apps aside from large games.</p>
|
|
|
|
<p>Since there's no OS integration beyond fallback code to make it function
|
|
without any special privileges, there isn't a way to launch the settings
|
|
activity. We'll need to make a tiny app providing a way to launch it.</p>
|
|
</section>
|
|
</section>
|
|
</main>
|
|
<footer>
|
|
<a href="/"><img src="/mask-icon.svg" width="512" height="512" alt=""/>GrapheneOS</a>
|
|
<ul id="social">
|
|
<li><a href="https://twitter.com/GrapheneOS">Twitter</a></li>
|
|
<li><a href="https://github.com/GrapheneOS">GitHub</a></li>
|
|
<li><a href="https://reddit.com/r/GrapheneOS">Reddit</a></li>
|
|
<li><a href="https://www.linkedin.com/company/grapheneos/">LinkedIn</a></li>
|
|
</ul>
|
|
</footer>
|
|
</body>
|
|
</html>
|