blob: ab338be64d9967a01e79c0cc7c6bbe3f253ccd01 [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
Vlad Tsyrklevichee4629b2019-10-24 20:07:068It is also known by its recursive backronym, GWP-ASan Will Provide Allocation
9Sanity.
10
Henrique Ferreiro2dca1a492024-05-02 11:23:5611To read a more in-depth explanation of GWP-ASan see [this
12post](https://www.chromium.org/Home/chromium-security/articles/gwp-asan).
Vlad Tsyrklevichff3290ed2019-11-16 07:45:1813
Vlad Tsyrklevich08bc05252018-12-04 06:58:5414## Allocator
15
16The GuardedPageAllocator returns allocations on pages buffered on both sides by
17guard pages. The allocations are either left- or right-aligned to detect buffer
18overflows and underflows. When an allocation is freed, the page is marked
19inaccessible so use-after-frees cause an exception (until that page is reused
20for another allocation.)
21
22The allocator saves stack traces on every allocation and deallocation to
23preserve debug context if that allocation results in a memory error.
24
Vlad Tsyrklevichdc1a9a5e82018-12-18 18:04:0125The allocator implements a quarantine mechanism by allocating virtual memory for
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4326more allocations than the total number of physical pages it can return at any
27given time. The difference forms a rudimentary quarantine.
28
29Because pages are re-used for allocations, it's possible that a long-lived
30use-after-free will cause a crash long after the original allocation has been
31replaced. In order to decrease the likelihood of incorrect stack traces being
32reported, we allocate a lot of virtual memory but don't store metadata for every
33allocation. That way though we may not be able to report the metadata for an old
34allocation, we will not report incorrect stack traces.
Vlad Tsyrklevichdc1a9a5e82018-12-18 18:04:0135
Vlad Tsyrklevich08bc05252018-12-04 06:58:5436## Crash handler
37
38The allocator is designed so that memory errors with GWP-ASan allocations
39intentionally trigger invalid access exceptions. A hook in the crashpad crash
40handler process inspects crashes, determines if they are GWP-ASan exceptions,
41and adds additional debug information to the crash minidump if so.
42
43The crash handler hook determines if the exception was related to GWP-ASan by
44reading the allocator internals and seeing if the exception address was within
45the bounds of the allocator region. If it is, the crash handler hook extracts
46debug information about that allocation, such as thread IDs and stack traces
47for allocation (and deallocation, if relevant) and writes it to the crash dump.
48
49The crash handler runs with elevated privileges so parsing information from a
50lesser-privileged process is security sensitive. The GWP-ASan hook is specially
51structured to minimize the amount of allocator logic it relies on and to
52validate the allocator internals before reasoning about them.
53
54## Status
55
Vlad Tsyrklevichee4629b2019-10-24 20:07:0656GWP-ASan is implemented for malloc and PartitionAlloc. It is enabled by default
57on Windows and macOS. The allocator parameters can be manually modified by using
58an invocation like the following:
Vlad Tsyrklevich08bc05252018-12-04 06:58:5459
60```shell
61chrome --enable-features="GwpAsanMalloc<Study" \
62 --force-fieldtrials=Study/Group1 \
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4363 --force-fieldtrial-params=Study.Group1:MaxAllocations/128/MaxMetadata/255/TotalPages/4096/AllocationSamplingFrequency/1000/ProcessSamplingProbability/1.0
Vlad Tsyrklevich08bc05252018-12-04 06:58:5464```
65
Vlad Tsyrklevich04d86642019-05-21 00:22:5066GWP-ASan is tuned more aggressively in canary/dev, to increase the likelihood we
67catch newly introduced bugs, and for specific processes depending on the
68particular allocator.
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:4369
Vlad Tsyrklevich6e6402a2019-01-22 07:50:2070A [hotlist of bugs discovered by by GWP-ASan](https://bugs.chromium.org/p/chromium/issues/list?can=1&q=Hotlist%3DGWP-ASan)
Vlad Tsyrklevichff3290ed2019-11-16 07:45:1871exists, though GWP-ASan crashes are filed Bug-Security, e.g. without external
72visibility, by default.
Vlad Tsyrklevich6e6402a2019-01-22 07:50:2073
Vlad Tsyrklevich04d86642019-05-21 00:22:5074## Limitations
75
76- GWP-ASan is configured with a small fixed-size amount of memory, so
77 long-lived allocations can quickly deplete the page pool and lead the
78 allocator to run out of memory. Depending on the sampling frequency and
79 distribution of allocation lifetimes this may lead to only allocations early
80 in the process lifetime being sampled.
81- Allocations over a page in size are not sampled.
82- The allocator skips zero-size allocations. Zero-size allocations on some
83 platforms return valid pointers and may be subject to lifetime and bounds
84 issues.
85- GWP-ASan does not intercept allocations for Oilpan or the v8 GC.
86- GWP-ASan does not hook PDFium's fork of PartitionAlloc.
87- Right-aligned allocations to catch overflows are not perfectly right-aligned,
88 so small out-of-bounds accesses may be missed.
Vlad Tsyrklevichee4629b2019-10-24 20:07:0689- GWP-ASan does not sample some early allocations that occur before field trial
90 initialization.
91- Depending on the platform, GWP-ASan may or may not hook malloc allocations
92 that occur in code not linked directly against Chrome.
Vlad Tsyrklevich04d86642019-05-21 00:22:5093
Vlad Tsyrklevich08bc05252018-12-04 06:58:5494## Testing
95
96There is [not yet](https://crbug.com/910751) a way to intentionally trigger a
97GWP-ASan exception.
98
99There is [not yet](https://crbug.com/910749) a way to inspect GWP-ASan data in
Vlad Tsyrklevich4a2e4d202019-04-25 00:22:43100a minidump (crash report) without access to Google's crash service.
Kalvin Leed1ab7ea92023-08-08 04:14:51101
102## Appendix: Probabilities
103
104The question "shall we enable GWP-ASan at all in this process?" is
105answered by
106
107`base::RandDouble()` &lt; `ProcessSamplingProbability` &times;
108`ProcessSamplingBoost2`
109
110where
111
112* 0.0 &le; `ProcessSamplingProbability` &le; 1.0,
113
114* `ProcessSamplingBoost2` &ge; 1, and
115
116* `base::RandDouble()` has range [0, 1).
117
118The question "on average, how many allocations shall occur before
119GWP-ASan takes a sample?" is answered by
120
121`AllocationSamplingMultiplier` &times; (`AllocationSamplingRange`
122&lowast;&lowast; `base::RandDouble()`)
123
124where
125
126* `AllocationSamplingMultiplier` &ge; 1,
127
128* `AllocationSamplingRange` &ge; 1, and
129
130* the final expression is &lt; `max(size_t)`.
131
132As an example, on Linux, using the default parameters and
133`base::RandDouble() == 0.5`, we get
134
1351500 &times; (16 &lowast;&lowast; 0.5) = 6000