blob: 059b76007bc7ef28c2f181747c2ac404c2fd1b67 [file] [view]
# StarScan: Heap scanning use-after-free prevention
C++ and other languages that rely on explicit memory management using `malloc()`
and `free()` are prone to memory corruptions and the resulting security issues.
The fundamental idea behind these heap scanning algorithms is to intercept an
underlying allocator and delay releasing of memory until the corresponding
memory block is provably unreachable from application code.
The basic ingredients for such algorithms are:
1. *Quarantine*: When an object is deemed unused with a `free()` call, it is
put into quarantine instead of being returned to the allocator. The object
is not actually freed by the underlying allocator and cannot be used for
future allocation requests until it is found that no pointers are pointing
to the given memory block.
2. *Scan*: When the quarantine reaches a certain quarantine limit (e.g. based
on memory size of quarantine list entries), the quarantine scan is
triggered. The scan iterates over the application memory and checks if
references are pointing to quarantined memory. If objects in the quarantine
are still referenced then they are kept in quarantine, if not they are
flagged to be released.
3. *Sweep*: All objects that are flagged to be released are actually returned
to the underlying memory allocator.
[Heap scanning algorithms](http://bit.ly/conservative-heap-scan) come in
different flavors that offer different performance and security characteristics.
*Probabilistic conservative scan (PCScan)* (`pcscan.{h,cc}`) is one particular
kind of heap scanning algorithm implemented on top of
[PartitionAlloc](../PartitionAlloc.md) with the following properties:
* Memory blocks are scanned conservatively for pointers.
* Scanning and sweeping are generally performed on a separate thread to
maximize application performance.
* Lazy safe points prohibit certain operations from modifying the memory graph
and provide convenient entry points for scanning the stack.
PCScan is currently considered **experimental** - please do not use it in
production code just yet. It can be enabled in the following configurations via
`--enable-features` on builds that use PartitionAlloc as the
[main allocator](../../README.md):
* `PartitionAllocPCScan`: All processes and all supporting partitions enable
PCScan.
* `PartitionAllocPCScanBrowserOnly`: Enables PCScan in the browser process
for the default malloc partition.