v151 · Storage · Privacy Leak Explainer

Privacy Leak Explainer

How the storage quota leak worked, why it was a reliable Incognito detector, and exactly what Chrome 151 changed to close it.

the attack

Incognito (Chrome < 151)

~120 MB

Quota = fraction of available RAM (e.g. 1/10th of 16 GiB ≈ 1.6 GiB capped at ~120 MB)

Normal mode (Chrome < 151)

~10 GiB+

Quota = max(10 GiB, ceil(disk_quota_GiB)) — always at or above the 10 GiB floor

Any script could call navigator.storage.estimate() and check if the quota was below 500 MB — with near certainty, that indicated Incognito mode.

Live StorageManager.estimate() readout

This reads the same API surface the old detector used and compares the returned quota with the old fingerprint threshold and the 10 GiB floor Chrome 151 applies in both browsing modes.

quota not run
usage not run
available not run
Click “Run live estimate” to call navigator.storage.estimate().
Waiting for API call.
// Detection script (worked on Chrome < 151)
const { quota } = await navigator.storage.estimate();
if (quota < 500 * 1024 * 1024) {
  // quota < 500 MB → almost certainly Incognito mode
  console.log('User is in Incognito');
}

why the leak existed

see also

implementation reference

Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗