improve documentation on process spawning model
This commit is contained in:
parent
77dab97e4d
commit
cb73e3ce62
@ -340,16 +340,31 @@
|
|||||||
<a href="#exec-spawning">Exec spawning</a>
|
<a href="#exec-spawning">Exec spawning</a>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<p>You may notice that cold start app spawning time takes a bit longer (i.e. in the
|
<p>GrapheneOS creates fresh processes (via exec) when spawning applications instead of
|
||||||
ballpark of 100ms) than stock Android, along with higher app memory usage. This is due
|
using the traditional Zygote spawning model. This improves privacy and security at the
|
||||||
to security centric exec spawning model used by GrapheneOS to provide each application
|
expense of higher cold start app spawning time and higher initial memory usage. It
|
||||||
with a unique address space layout, random hardened_malloc heap layout and unique keys
|
doesn't impact runtime performance beyond the initial spawning time. It adds somewhere
|
||||||
/ seeds for other probabilistic exploit mitigations like stack canaries, setjmp
|
in the ballpark of 100ms to app spawning time on the flagship devices and is only very
|
||||||
protection and future features like randomized memory tags. Exec spawning doesn't
|
noticeable on lower-end devices with a weaker CPU and slower storage. The spawning
|
||||||
cause a performance cost after launching an app, and similarly doesn't cause any extra
|
time impact only applies when the app doesn't already have an app process and the OS
|
||||||
latency for app spawning if the app was already running / cached in the background. It
|
will try to keep app processes cached in the background until memory pressure forces
|
||||||
isn't very noticeable on flagship devices with a high end CPU like a Pixel 3, and is a
|
it to start killing them.</p>
|
||||||
lot more noticeable on a lower end device like a Pixel 3a.</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 for 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>
|
||||||
|
|
||||||
<h2 id="bugs-uncovered-by-security-features">
|
<h2 id="bugs-uncovered-by-security-features">
|
||||||
<a href="#bugs-uncovered-by-security-features">Bugs uncovered by security features</a>
|
<a href="#bugs-uncovered-by-security-features">Bugs uncovered by security features</a>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user