blob: 55d2153ad707576ca729ae39f8f794b1685c2d2b [file] [log] [blame] [view]
Vlad Tsyrklevich08bc05252018-12-04 06:58:541# GWP-ASan
2
3GWP-ASan is a debug tool intended to detect heap memory errors in the wild. It
Vlad Tsyrklevichf9c90652018-12-28 21:15:034samples allocations to a debug allocator, similar to ElectricFence or Page Heap,
Vlad Tsyrklevich6e6402a2019-01-22 07:50:205causing memory errors to crash and report additional debugging context about
6the error.
Vlad Tsyrklevich08bc05252018-12-04 06:58:547
8## Allocator
9
10The GuardedPageAllocator returns allocations on pages buffered on both sides by
11guard pages. The allocations are either left- or right-aligned to detect buffer
12overflows and underflows. When an allocation is freed, the page is marked
13inaccessible so use-after-frees cause an exception (until that page is reused
14for another allocation.)
15
16The allocator saves stack traces on every allocation and deallocation to
17preserve debug context if that allocation results in a memory error.
18
Vlad Tsyrklevichdc1a9a5e82018-12-18 18:04:0119The allocator implements a quarantine mechanism by allocating virtual memory for
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4320more allocations than the total number of physical pages it can return at any
21given time. The difference forms a rudimentary quarantine.
22
23Because pages are re-used for allocations, it's possible that a long-lived
24use-after-free will cause a crash long after the original allocation has been
25replaced. In order to decrease the likelihood of incorrect stack traces being
26reported, we allocate a lot of virtual memory but don't store metadata for every
27allocation. That way though we may not be able to report the metadata for an old
28allocation, we will not report incorrect stack traces.
Vlad Tsyrklevichdc1a9a5e82018-12-18 18:04:0129
Vlad Tsyrklevich08bc05252018-12-04 06:58:5430Allocations are sampled to the GuardedPageAllocator using an [allocator shim.](/base/allocator/README.md)
31
32## Crash handler
33
34The allocator is designed so that memory errors with GWP-ASan allocations
35intentionally trigger invalid access exceptions. A hook in the crashpad crash
36handler process inspects crashes, determines if they are GWP-ASan exceptions,
37and adds additional debug information to the crash minidump if so.
38
39The crash handler hook determines if the exception was related to GWP-ASan by
40reading the allocator internals and seeing if the exception address was within
41the bounds of the allocator region. If it is, the crash handler hook extracts
42debug information about that allocation, such as thread IDs and stack traces
43for allocation (and deallocation, if relevant) and writes it to the crash dump.
44
45The crash handler runs with elevated privileges so parsing information from a
46lesser-privileged process is security sensitive. The GWP-ASan hook is specially
47structured to minimize the amount of allocator logic it relies on and to
48validate the allocator internals before reasoning about them.
49
50## Status
51
52GWP-ASan is currently only implemented for the system allocator (e.g. not
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4353PartitionAlloc/Oilpan/v8) on Windows and macOS. It is currently enabled by
54default. The allocator parameters can be manually modified by using the
55following invocation:
Vlad Tsyrklevich08bc05252018-12-04 06:58:5456
57```shell
58chrome --enable-features="GwpAsanMalloc<Study" \
59 --force-fieldtrials=Study/Group1 \
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4360 --force-fieldtrial-params=Study.Group1:MaxAllocations/128/MaxMetadata/255/TotalPages/4096/AllocationSamplingFrequency/1000/ProcessSamplingProbability/1.0
Vlad Tsyrklevich08bc05252018-12-04 06:58:5461```
62
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4363GWP-ASan is tuned more aggressively in canary/dev (to increase the likelihood we
64catch newly introduced bugs) and for the browser process (because of its
65importance and sheer number of allocations.)
66
Vlad Tsyrklevich6e6402a2019-01-22 07:50:2067A [hotlist of bugs discovered by by GWP-ASan](https://bugs.chromium.org/p/chromium/issues/list?can=1&q=Hotlist%3DGWP-ASan)
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4368exists, though GWP-ASan crashes are filed without external visibility by
69default.
Vlad Tsyrklevich6e6402a2019-01-22 07:50:2070
Vlad Tsyrklevich08bc05252018-12-04 06:58:5471## Testing
72
73There is [not yet](https://crbug.com/910751) a way to intentionally trigger a
74GWP-ASan exception.
75
76There is [not yet](https://crbug.com/910749) a way to inspect GWP-ASan data in
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4377a minidump (crash report) without access to Google's crash service.